InterpAsm-armv7-a.S revision 9a3147c7412f4794434b4c2604aa2ba784867774
1/*
2 * This file was generated automatically by gen-mterp.py for 'armv7-a'.
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_fp]
86#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_fp]
87#define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
88#define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
89
90/*
91 * "export" the PC to the stack frame, f/b/o future exception objects.  Must
92 * be done *before* something throws.
93 *
94 * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
95 * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
96 *
97 * It's okay to do this more than once.
98 */
99#define EXPORT_PC() \
100    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
101
102/*
103 * Given a frame pointer, find the stack save area.
104 *
105 * In C this is "((StackSaveArea*)(_fp) -1)".
106 */
107#define SAVEAREA_FROM_FP(_reg, _fpreg) \
108    sub     _reg, _fpreg, #sizeofStackSaveArea
109
110/*
111 * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
112 */
113#define FETCH_INST()            ldrh    rINST, [rPC]
114
115/*
116 * Fetch the next instruction from the specified offset.  Advances rPC
117 * to point to the next instruction.  "_count" is in 16-bit code units.
118 *
119 * Because of the limited size of immediate constants on ARM, this is only
120 * suitable for small forward movements (i.e. don't try to implement "goto"
121 * with this).
122 *
123 * This must come AFTER anything that can throw an exception, or the
124 * exception catch may miss.  (This also implies that it must come after
125 * EXPORT_PC().)
126 */
127#define FETCH_ADVANCE_INST(_count) ldrh    rINST, [rPC, #((_count)*2)]!
128
129/*
130 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
131 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
132 */
133#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
134        ldrh    _dreg, [_sreg, #((_count)*2)]!
135
136/*
137 * Fetch the next instruction from an offset specified by _reg.  Updates
138 * rPC to point to the next instruction.  "_reg" must specify the distance
139 * in bytes, *not* 16-bit code units, and may be a signed value.
140 *
141 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
142 * bits that hold the shift distance are used for the half/byte/sign flags.
143 * In some cases we can pre-double _reg for free, so we require a byte offset
144 * here.
145 */
146#define FETCH_ADVANCE_INST_RB(_reg) ldrh    rINST, [rPC, _reg]!
147
148/*
149 * Fetch a half-word code unit from an offset past the current PC.  The
150 * "_count" value is in 16-bit code units.  Does not advance rPC.
151 *
152 * The "_S" variant works the same but treats the value as signed.
153 */
154#define FETCH(_reg, _count)     ldrh    _reg, [rPC, #((_count)*2)]
155#define FETCH_S(_reg, _count)   ldrsh   _reg, [rPC, #((_count)*2)]
156
157/*
158 * Fetch one byte from an offset past the current PC.  Pass in the same
159 * "_count" as you would for FETCH, and an additional 0/1 indicating which
160 * byte of the halfword you want (lo/hi).
161 */
162#define FETCH_B(_reg, _count, _byte) ldrb     _reg, [rPC, #((_count)*2+(_byte))]
163
164/*
165 * Put the instruction's opcode field into the specified register.
166 */
167#define GET_INST_OPCODE(_reg)   and     _reg, rINST, #255
168
169/*
170 * Put the prefetched instruction's opcode field into the specified register.
171 */
172#define GET_PREFETCHED_OPCODE(_oreg, _ireg)   and     _oreg, _ireg, #255
173
174/*
175 * Begin executing the opcode in _reg.  Because this only jumps within the
176 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
177 */
178#define GOTO_OPCODE(_reg)       add     pc, rIBASE, _reg, lsl #6
179#define GOTO_OPCODE_BASE(_base,_reg)  add     pc, _base, _reg, lsl #6
180#define GOTO_OPCODE_IFEQ(_reg)  addeq   pc, rIBASE, _reg, lsl #6
181#define GOTO_OPCODE_IFNE(_reg)  addne   pc, rIBASE, _reg, lsl #6
182
183/*
184 * Get/set the 32-bit value from a Dalvik register.
185 */
186#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
187#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
188
189/*
190 * Convert a virtual register index into an address.
191 */
192#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
193        add     _reg, rFP, _vreg, lsl #2
194
195/*
196 * This is a #include, not a %include, because we want the C pre-processor
197 * to expand the macros into assembler assignment statements.
198 */
199#include "../common/asm-constants.h"
200
201#if defined(WITH_JIT)
202#include "../common/jit-config.h"
203#endif
204
205/* File: armv7-a/platform.S */
206/*
207 * ===========================================================================
208 *  CPU-version-specific defines
209 * ===========================================================================
210 */
211
212#if !defined(ANDROID_SMP)
213# error "Must define ANDROID_SMP"
214#endif
215
216/*
217 * Macro for data memory barrier.
218 */
219.macro  SMP_DMB
220#if ANDROID_SMP != 0
221    dmb
222#else
223    /* not SMP */
224#endif
225.endm
226
227/*
228 * Macro for data memory barrier (store/store variant).
229 */
230.macro  SMP_DMB_ST
231#if ANDROID_SMP != 0
232    dmb     st
233#else
234    /* not SMP */
235#endif
236.endm
237
238/* File: armv5te/entry.S */
239/*
240 * Copyright (C) 2008 The Android Open Source Project
241 *
242 * Licensed under the Apache License, Version 2.0 (the "License");
243 * you may not use this file except in compliance with the License.
244 * You may obtain a copy of the License at
245 *
246 *      http://www.apache.org/licenses/LICENSE-2.0
247 *
248 * Unless required by applicable law or agreed to in writing, software
249 * distributed under the License is distributed on an "AS IS" BASIS,
250 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
251 * See the License for the specific language governing permissions and
252 * limitations under the License.
253 */
254/*
255 * Interpreter entry point.
256 */
257
258/*
259 * We don't have formal stack frames, so gdb scans upward in the code
260 * to find the start of the function (a label with the %function type),
261 * and then looks at the next few instructions to figure out what
262 * got pushed onto the stack.  From this it figures out how to restore
263 * the registers, including PC, for the previous stack frame.  If gdb
264 * sees a non-function label, it stops scanning, so either we need to
265 * have nothing but assembler-local labels between the entry point and
266 * the break, or we need to fake it out.
267 *
268 * When this is defined, we add some stuff to make gdb less confused.
269 */
270#define ASSIST_DEBUGGER 1
271
272    .text
273    .align  2
274    .global dvmMterpStdRun
275    .type   dvmMterpStdRun, %function
276
277/*
278 * On entry:
279 *  r0  Thread* self
280 *
281 * The return comes via a call to dvmMterpStdBail().
282 */
283dvmMterpStdRun:
284#define MTERP_ENTRY1 \
285    .save {r4-r10,fp,lr}; \
286    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
287#define MTERP_ENTRY2 \
288    .pad    #4; \
289    sub     sp, sp, #4                  @ align 64
290
291    .fnstart
292    MTERP_ENTRY1
293    MTERP_ENTRY2
294
295    /* save stack pointer, add magic word for debuggerd */
296    str     sp, [r0, #offThread_bailPtr]  @ save SP for eventual return
297
298    /* set up "named" registers, figure out entry point */
299    mov     rSELF, r0                   @ set rSELF
300    LOAD_PC_FP_FROM_SELF()              @ load rPC and rFP from "thread"
301    ldr     rIBASE, [rSELF, #offThread_curHandlerTable] @ set rIBASE
302
303#if defined(WITH_JIT)
304.LentryInstr:
305    /* Entry is always a possible trace start */
306    ldr     r0, [rSELF, #offThread_pJitProfTable]
307    FETCH_INST()
308    mov     r1, #0                      @ prepare the value for the new state
309    str     r1, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
310    cmp     r0,#0                       @ is profiling disabled?
311#if !defined(WITH_SELF_VERIFICATION)
312    bne     common_updateProfile        @ profiling is enabled
313#else
314    ldr     r2, [rSELF, #offThread_shadowSpace] @ to find out the jit exit state
315    beq     1f                          @ profiling is disabled
316    ldr     r3, [r2, #offShadowSpace_jitExitState]  @ jit exit state
317    cmp     r3, #kSVSTraceSelect        @ hot trace following?
318    moveq   r2,#kJitTSelectRequestHot   @ ask for trace selection
319    beq     common_selectTrace          @ go build the trace
320    cmp     r3, #kSVSNoProfile          @ don't profile the next instruction?
321    beq     1f                          @ intrepret the next instruction
322    b       common_updateProfile        @ collect profiles
323#endif
3241:
325    GET_INST_OPCODE(ip)
326    GOTO_OPCODE(ip)
327#else
328    /* start executing the instruction at rPC */
329    FETCH_INST()                        @ load rINST from rPC
330    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
331    GOTO_OPCODE(ip)                     @ jump to next instruction
332#endif
333
334.Lbad_arg:
335    ldr     r0, strBadEntryPoint
336    @ r1 holds value of entryPoint
337    bl      printf
338    bl      dvmAbort
339    .fnend
340    .size   dvmMterpStdRun, .-dvmMterpStdRun
341
342
343    .global dvmMterpStdBail
344    .type   dvmMterpStdBail, %function
345
346/*
347 * Restore the stack pointer and PC from the save point established on entry.
348 * This is essentially the same as a longjmp, but should be cheaper.  The
349 * last instruction causes us to return to whoever called dvmMterpStdRun.
350 *
351 * We pushed some registers on the stack in dvmMterpStdRun, then saved
352 * SP and LR.  Here we restore SP, restore the registers, and then restore
353 * LR to PC.
354 *
355 * On entry:
356 *  r0  Thread* self
357 */
358dvmMterpStdBail:
359    ldr     sp, [r0, #offThread_bailPtr]    @ sp<- saved SP
360    add     sp, sp, #4                      @ un-align 64
361    ldmfd   sp!, {r4-r10,fp,pc}             @ restore 9 regs and return
362
363
364/*
365 * String references.
366 */
367strBadEntryPoint:
368    .word   .LstrBadEntryPoint
369
370
371    .global dvmAsmInstructionStart
372    .type   dvmAsmInstructionStart, %function
373dvmAsmInstructionStart = .L_OP_NOP
374    .text
375
376/* ------------------------------ */
377    .balign 64
378.L_OP_NOP: /* 0x00 */
379/* File: armv5te/OP_NOP.S */
380    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
381    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
382    GOTO_OPCODE(ip)                     @ execute it
383
384#ifdef ASSIST_DEBUGGER
385    /* insert fake function header to help gdb find the stack frame */
386    .type   dalvik_inst, %function
387dalvik_inst:
388    .fnstart
389    MTERP_ENTRY1
390    MTERP_ENTRY2
391    .fnend
392#endif
393
394/* ------------------------------ */
395    .balign 64
396.L_OP_MOVE: /* 0x01 */
397/* File: armv6t2/OP_MOVE.S */
398    /* for move, move-object, long-to-int */
399    /* op vA, vB */
400    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
401    ubfx    r0, rINST, #8, #4           @ r0<- A from 11:8
402    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
403    GET_VREG(r2, r1)                    @ r2<- fp[B]
404    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
405    SET_VREG(r2, r0)                    @ fp[A]<- r2
406    GOTO_OPCODE(ip)                     @ execute next instruction
407
408/* ------------------------------ */
409    .balign 64
410.L_OP_MOVE_FROM16: /* 0x02 */
411/* File: armv5te/OP_MOVE_FROM16.S */
412    /* for: move/from16, move-object/from16 */
413    /* op vAA, vBBBB */
414    FETCH(r1, 1)                        @ r1<- BBBB
415    mov     r0, rINST, lsr #8           @ r0<- AA
416    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
417    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
418    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
419    SET_VREG(r2, r0)                    @ fp[AA]<- r2
420    GOTO_OPCODE(ip)                     @ jump to next instruction
421
422/* ------------------------------ */
423    .balign 64
424.L_OP_MOVE_16: /* 0x03 */
425/* File: armv5te/OP_MOVE_16.S */
426    /* for: move/16, move-object/16 */
427    /* op vAAAA, vBBBB */
428    FETCH(r1, 2)                        @ r1<- BBBB
429    FETCH(r0, 1)                        @ r0<- AAAA
430    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
431    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
432    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
433    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
434    GOTO_OPCODE(ip)                     @ jump to next instruction
435
436/* ------------------------------ */
437    .balign 64
438.L_OP_MOVE_WIDE: /* 0x04 */
439/* File: armv6t2/OP_MOVE_WIDE.S */
440    /* move-wide vA, vB */
441    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
442    mov     r3, rINST, lsr #12          @ r3<- B
443    ubfx    r2, rINST, #8, #4           @ r2<- A
444    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
445    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
446    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
447    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
448    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
449    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
450    GOTO_OPCODE(ip)                     @ jump to next instruction
451
452/* ------------------------------ */
453    .balign 64
454.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
455/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
456    /* move-wide/from16 vAA, vBBBB */
457    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
458    FETCH(r3, 1)                        @ r3<- BBBB
459    mov     r2, rINST, lsr #8           @ r2<- AA
460    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
461    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
462    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
463    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
464    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
465    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
466    GOTO_OPCODE(ip)                     @ jump to next instruction
467
468/* ------------------------------ */
469    .balign 64
470.L_OP_MOVE_WIDE_16: /* 0x06 */
471/* File: armv5te/OP_MOVE_WIDE_16.S */
472    /* move-wide/16 vAAAA, vBBBB */
473    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
474    FETCH(r3, 2)                        @ r3<- BBBB
475    FETCH(r2, 1)                        @ r2<- AAAA
476    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
477    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
478    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
479    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
480    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
481    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
482    GOTO_OPCODE(ip)                     @ jump to next instruction
483
484/* ------------------------------ */
485    .balign 64
486.L_OP_MOVE_OBJECT: /* 0x07 */
487/* File: armv5te/OP_MOVE_OBJECT.S */
488/* File: armv5te/OP_MOVE.S */
489    /* for move, move-object, long-to-int */
490    /* op vA, vB */
491    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
492    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
493    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
494    GET_VREG(r2, r1)                    @ r2<- fp[B]
495    and     r0, r0, #15
496    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
497    SET_VREG(r2, r0)                    @ fp[A]<- r2
498    GOTO_OPCODE(ip)                     @ execute next instruction
499
500
501/* ------------------------------ */
502    .balign 64
503.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
504/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
505/* File: armv5te/OP_MOVE_FROM16.S */
506    /* for: move/from16, move-object/from16 */
507    /* op vAA, vBBBB */
508    FETCH(r1, 1)                        @ r1<- BBBB
509    mov     r0, rINST, lsr #8           @ r0<- AA
510    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
511    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
512    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
513    SET_VREG(r2, r0)                    @ fp[AA]<- r2
514    GOTO_OPCODE(ip)                     @ jump to next instruction
515
516
517/* ------------------------------ */
518    .balign 64
519.L_OP_MOVE_OBJECT_16: /* 0x09 */
520/* File: armv5te/OP_MOVE_OBJECT_16.S */
521/* File: armv5te/OP_MOVE_16.S */
522    /* for: move/16, move-object/16 */
523    /* op vAAAA, vBBBB */
524    FETCH(r1, 2)                        @ r1<- BBBB
525    FETCH(r0, 1)                        @ r0<- AAAA
526    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
527    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
528    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
529    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
530    GOTO_OPCODE(ip)                     @ jump to next instruction
531
532
533/* ------------------------------ */
534    .balign 64
535.L_OP_MOVE_RESULT: /* 0x0a */
536/* File: armv5te/OP_MOVE_RESULT.S */
537    /* for: move-result, move-result-object */
538    /* op vAA */
539    mov     r2, rINST, lsr #8           @ r2<- AA
540    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
541    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
542    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
543    SET_VREG(r0, r2)                    @ fp[AA]<- r0
544    GOTO_OPCODE(ip)                     @ jump to next instruction
545
546/* ------------------------------ */
547    .balign 64
548.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
549/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
550    /* move-result-wide vAA */
551    mov     r2, rINST, lsr #8           @ r2<- AA
552    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
553    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
554    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
555    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
556    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
557    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
558    GOTO_OPCODE(ip)                     @ jump to next instruction
559
560/* ------------------------------ */
561    .balign 64
562.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
563/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
564/* File: armv5te/OP_MOVE_RESULT.S */
565    /* for: move-result, move-result-object */
566    /* op vAA */
567    mov     r2, rINST, lsr #8           @ r2<- AA
568    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
569    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
570    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
571    SET_VREG(r0, r2)                    @ fp[AA]<- r0
572    GOTO_OPCODE(ip)                     @ jump to next instruction
573
574
575/* ------------------------------ */
576    .balign 64
577.L_OP_MOVE_EXCEPTION: /* 0x0d */
578/* File: armv5te/OP_MOVE_EXCEPTION.S */
579    /* move-exception vAA */
580    mov     r2, rINST, lsr #8           @ r2<- AA
581    ldr     r3, [rSELF, #offThread_exception]  @ r3<- dvmGetException bypass
582    mov     r1, #0                      @ r1<- 0
583    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
584    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
585    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
586    str     r1, [rSELF, #offThread_exception]  @ dvmClearException bypass
587    GOTO_OPCODE(ip)                     @ jump to next instruction
588
589/* ------------------------------ */
590    .balign 64
591.L_OP_RETURN_VOID: /* 0x0e */
592/* File: armv5te/OP_RETURN_VOID.S */
593    b       common_returnFromMethod
594
595/* ------------------------------ */
596    .balign 64
597.L_OP_RETURN: /* 0x0f */
598/* File: armv5te/OP_RETURN.S */
599    /*
600     * Return a 32-bit value.  Copies the return value into the "thread"
601     * structure, then jumps to the return handler.
602     *
603     * for: return, return-object
604     */
605    /* op vAA */
606    mov     r2, rINST, lsr #8           @ r2<- AA
607    GET_VREG(r0, r2)                    @ r0<- vAA
608    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
609    b       common_returnFromMethod
610
611/* ------------------------------ */
612    .balign 64
613.L_OP_RETURN_WIDE: /* 0x10 */
614/* File: armv5te/OP_RETURN_WIDE.S */
615    /*
616     * Return a 64-bit value.  Copies the return value into the "thread"
617     * structure, then jumps to the return handler.
618     */
619    /* return-wide vAA */
620    mov     r2, rINST, lsr #8           @ r2<- AA
621    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
622    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
623    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
624    stmia   r3, {r0-r1}                 @ retval<- r0/r1
625    b       common_returnFromMethod
626
627/* ------------------------------ */
628    .balign 64
629.L_OP_RETURN_OBJECT: /* 0x11 */
630/* File: armv5te/OP_RETURN_OBJECT.S */
631/* File: armv5te/OP_RETURN.S */
632    /*
633     * Return a 32-bit value.  Copies the return value into the "thread"
634     * structure, then jumps to the return handler.
635     *
636     * for: return, return-object
637     */
638    /* op vAA */
639    mov     r2, rINST, lsr #8           @ r2<- AA
640    GET_VREG(r0, r2)                    @ r0<- vAA
641    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
642    b       common_returnFromMethod
643
644
645/* ------------------------------ */
646    .balign 64
647.L_OP_CONST_4: /* 0x12 */
648/* File: armv6t2/OP_CONST_4.S */
649    /* const/4 vA, #+B */
650    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
651    ubfx    r0, rINST, #8, #4           @ r0<- A
652    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
653    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
654    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
655    SET_VREG(r1, r0)                    @ fp[A]<- r1
656    GOTO_OPCODE(ip)                     @ execute next instruction
657
658/* ------------------------------ */
659    .balign 64
660.L_OP_CONST_16: /* 0x13 */
661/* File: armv5te/OP_CONST_16.S */
662    /* const/16 vAA, #+BBBB */
663    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
664    mov     r3, rINST, lsr #8           @ r3<- AA
665    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
666    SET_VREG(r0, r3)                    @ vAA<- r0
667    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
668    GOTO_OPCODE(ip)                     @ jump to next instruction
669
670/* ------------------------------ */
671    .balign 64
672.L_OP_CONST: /* 0x14 */
673/* File: armv5te/OP_CONST.S */
674    /* const vAA, #+BBBBbbbb */
675    mov     r3, rINST, lsr #8           @ r3<- AA
676    FETCH(r0, 1)                        @ r0<- bbbb (low)
677    FETCH(r1, 2)                        @ r1<- BBBB (high)
678    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
679    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
680    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
681    SET_VREG(r0, r3)                    @ vAA<- r0
682    GOTO_OPCODE(ip)                     @ jump to next instruction
683
684/* ------------------------------ */
685    .balign 64
686.L_OP_CONST_HIGH16: /* 0x15 */
687/* File: armv5te/OP_CONST_HIGH16.S */
688    /* const/high16 vAA, #+BBBB0000 */
689    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
690    mov     r3, rINST, lsr #8           @ r3<- AA
691    mov     r0, r0, lsl #16             @ r0<- BBBB0000
692    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
693    SET_VREG(r0, r3)                    @ vAA<- r0
694    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
695    GOTO_OPCODE(ip)                     @ jump to next instruction
696
697/* ------------------------------ */
698    .balign 64
699.L_OP_CONST_WIDE_16: /* 0x16 */
700/* File: armv5te/OP_CONST_WIDE_16.S */
701    /* const-wide/16 vAA, #+BBBB */
702    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
703    mov     r3, rINST, lsr #8           @ r3<- AA
704    mov     r1, r0, asr #31             @ r1<- ssssssss
705    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
706    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
707    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
708    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
709    GOTO_OPCODE(ip)                     @ jump to next instruction
710
711/* ------------------------------ */
712    .balign 64
713.L_OP_CONST_WIDE_32: /* 0x17 */
714/* File: armv5te/OP_CONST_WIDE_32.S */
715    /* const-wide/32 vAA, #+BBBBbbbb */
716    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
717    mov     r3, rINST, lsr #8           @ r3<- AA
718    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
719    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
720    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
721    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
722    mov     r1, r0, asr #31             @ r1<- ssssssss
723    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
724    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
725    GOTO_OPCODE(ip)                     @ jump to next instruction
726
727/* ------------------------------ */
728    .balign 64
729.L_OP_CONST_WIDE: /* 0x18 */
730/* File: armv5te/OP_CONST_WIDE.S */
731    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
732    FETCH(r0, 1)                        @ r0<- bbbb (low)
733    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
734    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
735    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
736    FETCH(r3, 4)                        @ r3<- HHHH (high)
737    mov     r9, rINST, lsr #8           @ r9<- AA
738    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
739    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
740    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
741    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
742    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
743    GOTO_OPCODE(ip)                     @ jump to next instruction
744
745/* ------------------------------ */
746    .balign 64
747.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
748/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
749    /* const-wide/high16 vAA, #+BBBB000000000000 */
750    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
751    mov     r3, rINST, lsr #8           @ r3<- AA
752    mov     r0, #0                      @ r0<- 00000000
753    mov     r1, r1, lsl #16             @ r1<- BBBB0000
754    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
755    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
756    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
757    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
758    GOTO_OPCODE(ip)                     @ jump to next instruction
759
760/* ------------------------------ */
761    .balign 64
762.L_OP_CONST_STRING: /* 0x1a */
763/* File: armv5te/OP_CONST_STRING.S */
764    /* const/string vAA, String@BBBB */
765    FETCH(r1, 1)                        @ r1<- BBBB
766    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
767    mov     r9, rINST, lsr #8           @ r9<- AA
768    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
769    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
770    cmp     r0, #0                      @ not yet resolved?
771    beq     .LOP_CONST_STRING_resolve
772    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
773    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
774    SET_VREG(r0, r9)                    @ vAA<- r0
775    GOTO_OPCODE(ip)                     @ jump to next instruction
776
777/* ------------------------------ */
778    .balign 64
779.L_OP_CONST_STRING_JUMBO: /* 0x1b */
780/* File: armv5te/OP_CONST_STRING_JUMBO.S */
781    /* const/string vAA, String@BBBBBBBB */
782    FETCH(r0, 1)                        @ r0<- bbbb (low)
783    FETCH(r1, 2)                        @ r1<- BBBB (high)
784    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
785    mov     r9, rINST, lsr #8           @ r9<- AA
786    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
787    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
788    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
789    cmp     r0, #0
790    beq     .LOP_CONST_STRING_JUMBO_resolve
791    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
792    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
793    SET_VREG(r0, r9)                    @ vAA<- r0
794    GOTO_OPCODE(ip)                     @ jump to next instruction
795
796/* ------------------------------ */
797    .balign 64
798.L_OP_CONST_CLASS: /* 0x1c */
799/* File: armv5te/OP_CONST_CLASS.S */
800    /* const/class vAA, Class@BBBB */
801    FETCH(r1, 1)                        @ r1<- BBBB
802    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
803    mov     r9, rINST, lsr #8           @ r9<- AA
804    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
805    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
806    cmp     r0, #0                      @ not yet resolved?
807    beq     .LOP_CONST_CLASS_resolve
808    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
809    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
810    SET_VREG(r0, r9)                    @ vAA<- r0
811    GOTO_OPCODE(ip)                     @ jump to next instruction
812
813/* ------------------------------ */
814    .balign 64
815.L_OP_MONITOR_ENTER: /* 0x1d */
816/* File: armv5te/OP_MONITOR_ENTER.S */
817    /*
818     * Synchronize on an object.
819     */
820    /* monitor-enter vAA */
821    mov     r2, rINST, lsr #8           @ r2<- AA
822    GET_VREG(r1, r2)                    @ r1<- vAA (object)
823    mov     r0, rSELF                   @ r0<- self
824    cmp     r1, #0                      @ null object?
825    EXPORT_PC()                         @ need for precise GC
826    beq     common_errNullObject        @ null object, throw an exception
827    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
828    bl      dvmLockObject               @ call(self, obj)
829    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
830    GOTO_OPCODE(ip)                     @ jump to next instruction
831
832/* ------------------------------ */
833    .balign 64
834.L_OP_MONITOR_EXIT: /* 0x1e */
835/* File: armv5te/OP_MONITOR_EXIT.S */
836    /*
837     * Unlock an object.
838     *
839     * Exceptions that occur when unlocking a monitor need to appear as
840     * if they happened at the following instruction.  See the Dalvik
841     * instruction spec.
842     */
843    /* monitor-exit vAA */
844    mov     r2, rINST, lsr #8           @ r2<- AA
845    EXPORT_PC()                         @ before fetch: export the PC
846    GET_VREG(r1, r2)                    @ r1<- vAA (object)
847    cmp     r1, #0                      @ null object?
848    beq     1f                          @ yes
849    mov     r0, rSELF                   @ r0<- self
850    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
851    cmp     r0, #0                      @ failed?
852    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
853    beq     common_exceptionThrown      @ yes, exception is pending
854    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
855    GOTO_OPCODE(ip)                     @ jump to next instruction
8561:
857    FETCH_ADVANCE_INST(1)               @ advance before throw
858    b      common_errNullObject
859
860/* ------------------------------ */
861    .balign 64
862.L_OP_CHECK_CAST: /* 0x1f */
863/* File: armv5te/OP_CHECK_CAST.S */
864    /*
865     * Check to see if a cast from one class to another is allowed.
866     */
867    /* check-cast vAA, class@BBBB */
868    mov     r3, rINST, lsr #8           @ r3<- AA
869    FETCH(r2, 1)                        @ r2<- BBBB
870    GET_VREG(r9, r3)                    @ r9<- object
871    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
872    cmp     r9, #0                      @ is object null?
873    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
874    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
875    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
876    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
877    cmp     r1, #0                      @ have we resolved this before?
878    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
879.LOP_CHECK_CAST_resolved:
880    cmp     r0, r1                      @ same class (trivial success)?
881    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
882.LOP_CHECK_CAST_okay:
883    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
884    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
885    GOTO_OPCODE(ip)                     @ jump to next instruction
886
887/* ------------------------------ */
888    .balign 64
889.L_OP_INSTANCE_OF: /* 0x20 */
890/* File: armv5te/OP_INSTANCE_OF.S */
891    /*
892     * Check to see if an object reference is an instance of a class.
893     *
894     * Most common situation is a non-null object, being compared against
895     * an already-resolved class.
896     */
897    /* instance-of vA, vB, class@CCCC */
898    mov     r3, rINST, lsr #12          @ r3<- B
899    mov     r9, rINST, lsr #8           @ r9<- A+
900    GET_VREG(r0, r3)                    @ r0<- vB (object)
901    and     r9, r9, #15                 @ r9<- A
902    cmp     r0, #0                      @ is object null?
903    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
904    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
905    FETCH(r3, 1)                        @ r3<- CCCC
906    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
907    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
908    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
909    cmp     r1, #0                      @ have we resolved this before?
910    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
911.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
912    cmp     r0, r1                      @ same class (trivial success)?
913    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
914    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
915
916/* ------------------------------ */
917    .balign 64
918.L_OP_ARRAY_LENGTH: /* 0x21 */
919/* File: armv6t2/OP_ARRAY_LENGTH.S */
920    /*
921     * Return the length of an array.
922     */
923    mov     r1, rINST, lsr #12          @ r1<- B
924    ubfx    r2, rINST, #8, #4           @ r2<- A
925    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
926    cmp     r0, #0                      @ is object null?
927    beq     common_errNullObject        @ yup, fail
928    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
929    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
930    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
931    SET_VREG(r3, r2)                    @ vB<- length
932    GOTO_OPCODE(ip)                     @ jump to next instruction
933
934/* ------------------------------ */
935    .balign 64
936.L_OP_NEW_INSTANCE: /* 0x22 */
937/* File: armv5te/OP_NEW_INSTANCE.S */
938    /*
939     * Create a new instance of a class.
940     */
941    /* new-instance vAA, class@BBBB */
942    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
943    FETCH(r1, 1)                        @ r1<- BBBB
944    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
945    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
946#if defined(WITH_JIT)
947    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
948#endif
949    EXPORT_PC()                         @ req'd for init, resolve, alloc
950    cmp     r0, #0                      @ already resolved?
951    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
952.LOP_NEW_INSTANCE_resolved:   @ r0=class
953    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
954    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
955    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
956.LOP_NEW_INSTANCE_initialized: @ r0=class
957    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
958    bl      dvmAllocObject              @ r0<- new object
959    b       .LOP_NEW_INSTANCE_finish          @ continue
960
961/* ------------------------------ */
962    .balign 64
963.L_OP_NEW_ARRAY: /* 0x23 */
964/* File: armv5te/OP_NEW_ARRAY.S */
965    /*
966     * Allocate an array of objects, specified with the array class
967     * and a count.
968     *
969     * The verifier guarantees that this is an array class, so we don't
970     * check for it here.
971     */
972    /* new-array vA, vB, class@CCCC */
973    mov     r0, rINST, lsr #12          @ r0<- B
974    FETCH(r2, 1)                        @ r2<- CCCC
975    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
976    GET_VREG(r1, r0)                    @ r1<- vB (array length)
977    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
978    cmp     r1, #0                      @ check length
979    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
980    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
981    cmp     r0, #0                      @ already resolved?
982    EXPORT_PC()                         @ req'd for resolve, alloc
983    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
984    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
985
986/* ------------------------------ */
987    .balign 64
988.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
989/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
990    /*
991     * Create a new array with elements filled from registers.
992     *
993     * for: filled-new-array, filled-new-array/range
994     */
995    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
996    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
997    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
998    FETCH(r1, 1)                        @ r1<- BBBB
999    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1000    EXPORT_PC()                         @ need for resolve and alloc
1001    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1002    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1003    cmp     r0, #0                      @ already resolved?
1004    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
10058:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1006    mov     r2, #0                      @ r2<- false
1007    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1008    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1009    cmp     r0, #0                      @ got null?
1010    beq     common_exceptionThrown      @ yes, handle exception
1011    b       .LOP_FILLED_NEW_ARRAY_continue
1012
1013/* ------------------------------ */
1014    .balign 64
1015.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1016/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1017/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1018    /*
1019     * Create a new array with elements filled from registers.
1020     *
1021     * for: filled-new-array, filled-new-array/range
1022     */
1023    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1024    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1025    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
1026    FETCH(r1, 1)                        @ r1<- BBBB
1027    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1028    EXPORT_PC()                         @ need for resolve and alloc
1029    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1030    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1031    cmp     r0, #0                      @ already resolved?
1032    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
10338:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1034    mov     r2, #0                      @ r2<- false
1035    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1036    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1037    cmp     r0, #0                      @ got null?
1038    beq     common_exceptionThrown      @ yes, handle exception
1039    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1040
1041
1042/* ------------------------------ */
1043    .balign 64
1044.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1045/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1046    /* fill-array-data vAA, +BBBBBBBB */
1047    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1048    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1049    mov     r3, rINST, lsr #8           @ r3<- AA
1050    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1051    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1052    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1053    EXPORT_PC();
1054    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1055    cmp     r0, #0                      @ 0 means an exception is thrown
1056    beq     common_exceptionThrown      @ has exception
1057    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1058    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1059    GOTO_OPCODE(ip)                     @ jump to next instruction
1060
1061/* ------------------------------ */
1062    .balign 64
1063.L_OP_THROW: /* 0x27 */
1064/* File: armv5te/OP_THROW.S */
1065    /*
1066     * Throw an exception object in the current thread.
1067     */
1068    /* throw vAA */
1069    mov     r2, rINST, lsr #8           @ r2<- AA
1070    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1071    EXPORT_PC()                         @ exception handler can throw
1072    cmp     r1, #0                      @ null object?
1073    beq     common_errNullObject        @ yes, throw an NPE instead
1074    @ bypass dvmSetException, just store it
1075    str     r1, [rSELF, #offThread_exception]  @ thread->exception<- obj
1076    b       common_exceptionThrown
1077
1078/* ------------------------------ */
1079    .balign 64
1080.L_OP_GOTO: /* 0x28 */
1081/* File: armv5te/OP_GOTO.S */
1082    /*
1083     * Unconditional branch, 8-bit offset.
1084     *
1085     * The branch distance is a signed code-unit offset, which we need to
1086     * double to get a byte offset.
1087     */
1088    /* goto +AA */
1089    /* tuning: use sbfx for 6t2+ targets */
1090    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1091    movs    r1, r0, asr #24             @ r1<- ssssssAA (sign-extended)
1092    add     r2, r1, r1                  @ r2<- byte offset, set flags
1093       @ If backwards branch refresh rIBASE
1094    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1095    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1096#if defined(WITH_JIT)
1097    ldr     r0, [rSELF, #offThread_pJitProfTable]
1098    bmi     common_testUpdateProfile    @ (r0) check for trace hotness
1099#endif
1100    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1101    GOTO_OPCODE(ip)                     @ jump to next instruction
1102
1103/* ------------------------------ */
1104    .balign 64
1105.L_OP_GOTO_16: /* 0x29 */
1106/* File: armv5te/OP_GOTO_16.S */
1107    /*
1108     * Unconditional branch, 16-bit offset.
1109     *
1110     * The branch distance is a signed code-unit offset, which we need to
1111     * double to get a byte offset.
1112     */
1113    /* goto/16 +AAAA */
1114    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1115    adds    r1, r0, r0                  @ r1<- byte offset, flags set
1116    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1117    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1118#if defined(WITH_JIT)
1119    ldr     r0, [rSELF, #offThread_pJitProfTable]
1120    bmi     common_testUpdateProfile    @ (r0) hot trace head?
1121#endif
1122    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1123    GOTO_OPCODE(ip)                     @ jump to next instruction
1124
1125/* ------------------------------ */
1126    .balign 64
1127.L_OP_GOTO_32: /* 0x2a */
1128/* File: armv5te/OP_GOTO_32.S */
1129    /*
1130     * Unconditional branch, 32-bit offset.
1131     *
1132     * The branch distance is a signed code-unit offset, which we need to
1133     * double to get a byte offset.
1134     *
1135     * Unlike most opcodes, this one is allowed to branch to itself, so
1136     * our "backward branch" test must be "<=0" instead of "<0".  Because
1137     * we need the V bit set, we'll use an adds to convert from Dalvik
1138     * offset to byte offset.
1139     */
1140    /* goto/32 +AAAAAAAA */
1141    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1142    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1143    orr     r0, r0, r1, lsl #16         @ r0<- AAAAaaaa
1144    adds    r1, r0, r0                  @ r1<- byte offset
1145#if defined(WITH_JIT)
1146    ldr     r0, [rSELF, #offThread_pJitProfTable]
1147    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1148    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1149    ble     common_testUpdateProfile    @ (r0) hot trace head?
1150#else
1151    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1152    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1153#endif
1154    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1155    GOTO_OPCODE(ip)                     @ jump to next instruction
1156
1157/* ------------------------------ */
1158    .balign 64
1159.L_OP_PACKED_SWITCH: /* 0x2b */
1160/* File: armv5te/OP_PACKED_SWITCH.S */
1161    /*
1162     * Handle a packed-switch or sparse-switch instruction.  In both cases
1163     * we decode it and hand it off to a helper function.
1164     *
1165     * We don't really expect backward branches in a switch statement, but
1166     * they're perfectly legal, so we check for them here.
1167     *
1168     * When the JIT is present, all targets are considered treated as
1169     * a potential trace heads regardless of branch direction.
1170     *
1171     * for: packed-switch, sparse-switch
1172     */
1173    /* op vAA, +BBBB */
1174    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1175    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1176    mov     r3, rINST, lsr #8           @ r3<- AA
1177    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1178    GET_VREG(r1, r3)                    @ r1<- vAA
1179    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1180    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1181    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1182#if defined(WITH_JIT)
1183    ldr     r0, [rSELF, #offThread_pJitProfTable]
1184    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1185    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1186    cmp     r0, #0
1187    bne     common_updateProfile
1188#else
1189    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1190    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1191#endif
1192    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1193    GOTO_OPCODE(ip)                     @ jump to next instruction
1194
1195/* ------------------------------ */
1196    .balign 64
1197.L_OP_SPARSE_SWITCH: /* 0x2c */
1198/* File: armv5te/OP_SPARSE_SWITCH.S */
1199/* File: armv5te/OP_PACKED_SWITCH.S */
1200    /*
1201     * Handle a packed-switch or sparse-switch instruction.  In both cases
1202     * we decode it and hand it off to a helper function.
1203     *
1204     * We don't really expect backward branches in a switch statement, but
1205     * they're perfectly legal, so we check for them here.
1206     *
1207     * When the JIT is present, all targets are considered treated as
1208     * a potential trace heads regardless of branch direction.
1209     *
1210     * for: packed-switch, sparse-switch
1211     */
1212    /* op vAA, +BBBB */
1213    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1214    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1215    mov     r3, rINST, lsr #8           @ r3<- AA
1216    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1217    GET_VREG(r1, r3)                    @ r1<- vAA
1218    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1219    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1220    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1221#if defined(WITH_JIT)
1222    ldr     r0, [rSELF, #offThread_pJitProfTable]
1223    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1224    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1225    cmp     r0, #0
1226    bne     common_updateProfile
1227#else
1228    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1229    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1230#endif
1231    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1232    GOTO_OPCODE(ip)                     @ jump to next instruction
1233
1234
1235/* ------------------------------ */
1236    .balign 64
1237.L_OP_CMPL_FLOAT: /* 0x2d */
1238/* File: arm-vfp/OP_CMPL_FLOAT.S */
1239    /*
1240     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1241     * destination register based on the results of the comparison.
1242     *
1243     * int compare(x, y) {
1244     *     if (x == y) {
1245     *         return 0;
1246     *     } else if (x > y) {
1247     *         return 1;
1248     *     } else if (x < y) {
1249     *         return -1;
1250     *     } else {
1251     *         return -1;
1252     *     }
1253     * }
1254     */
1255    /* op vAA, vBB, vCC */
1256    FETCH(r0, 1)                        @ r0<- CCBB
1257    mov     r9, rINST, lsr #8           @ r9<- AA
1258    and     r2, r0, #255                @ r2<- BB
1259    mov     r3, r0, lsr #8              @ r3<- CC
1260    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1261    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1262    flds    s0, [r2]                    @ s0<- vBB
1263    flds    s1, [r3]                    @ s1<- vCC
1264    fcmpes  s0, s1                      @ compare (vBB, vCC)
1265    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1266    mvn     r0, #0                      @ r0<- -1 (default)
1267    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1268    fmstat                              @ export status flags
1269    movgt   r0, #1                      @ (greater than) r1<- 1
1270    moveq   r0, #0                      @ (equal) r1<- 0
1271    b       .LOP_CMPL_FLOAT_finish          @ argh
1272
1273
1274/* ------------------------------ */
1275    .balign 64
1276.L_OP_CMPG_FLOAT: /* 0x2e */
1277/* File: arm-vfp/OP_CMPG_FLOAT.S */
1278    /*
1279     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1280     * destination register based on the results of the comparison.
1281     *
1282     * int compare(x, y) {
1283     *     if (x == y) {
1284     *         return 0;
1285     *     } else if (x < y) {
1286     *         return -1;
1287     *     } else if (x > y) {
1288     *         return 1;
1289     *     } else {
1290     *         return 1;
1291     *     }
1292     * }
1293     */
1294    /* op vAA, vBB, vCC */
1295    FETCH(r0, 1)                        @ r0<- CCBB
1296    mov     r9, rINST, lsr #8           @ r9<- AA
1297    and     r2, r0, #255                @ r2<- BB
1298    mov     r3, r0, lsr #8              @ r3<- CC
1299    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1300    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1301    flds    s0, [r2]                    @ s0<- vBB
1302    flds    s1, [r3]                    @ s1<- vCC
1303    fcmpes  s0, s1                      @ compare (vBB, vCC)
1304    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1305    mov     r0, #1                      @ r0<- 1 (default)
1306    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1307    fmstat                              @ export status flags
1308    mvnmi   r0, #0                      @ (less than) r1<- -1
1309    moveq   r0, #0                      @ (equal) r1<- 0
1310    b       .LOP_CMPG_FLOAT_finish          @ argh
1311
1312
1313/* ------------------------------ */
1314    .balign 64
1315.L_OP_CMPL_DOUBLE: /* 0x2f */
1316/* File: arm-vfp/OP_CMPL_DOUBLE.S */
1317    /*
1318     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1319     * destination register based on the results of the comparison.
1320     *
1321     * int compare(x, y) {
1322     *     if (x == y) {
1323     *         return 0;
1324     *     } else if (x > y) {
1325     *         return 1;
1326     *     } else if (x < y) {
1327     *         return -1;
1328     *     } else {
1329     *         return -1;
1330     *     }
1331     * }
1332     */
1333    /* op vAA, vBB, vCC */
1334    FETCH(r0, 1)                        @ r0<- CCBB
1335    mov     r9, rINST, lsr #8           @ r9<- AA
1336    and     r2, r0, #255                @ r2<- BB
1337    mov     r3, r0, lsr #8              @ r3<- CC
1338    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1339    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1340    fldd    d0, [r2]                    @ d0<- vBB
1341    fldd    d1, [r3]                    @ d1<- vCC
1342    fcmped  d0, d1                      @ compare (vBB, vCC)
1343    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1344    mvn     r0, #0                      @ r0<- -1 (default)
1345    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1346    fmstat                              @ export status flags
1347    movgt   r0, #1                      @ (greater than) r1<- 1
1348    moveq   r0, #0                      @ (equal) r1<- 0
1349    b       .LOP_CMPL_DOUBLE_finish          @ argh
1350
1351
1352/* ------------------------------ */
1353    .balign 64
1354.L_OP_CMPG_DOUBLE: /* 0x30 */
1355/* File: arm-vfp/OP_CMPG_DOUBLE.S */
1356    /*
1357     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1358     * destination register based on the results of the comparison.
1359     *
1360     * int compare(x, y) {
1361     *     if (x == y) {
1362     *         return 0;
1363     *     } else if (x < y) {
1364     *         return -1;
1365     *     } else if (x > y) {
1366     *         return 1;
1367     *     } else {
1368     *         return 1;
1369     *     }
1370     * }
1371     */
1372    /* op vAA, vBB, vCC */
1373    FETCH(r0, 1)                        @ r0<- CCBB
1374    mov     r9, rINST, lsr #8           @ r9<- AA
1375    and     r2, r0, #255                @ r2<- BB
1376    mov     r3, r0, lsr #8              @ r3<- CC
1377    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1378    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1379    fldd    d0, [r2]                    @ d0<- vBB
1380    fldd    d1, [r3]                    @ d1<- vCC
1381    fcmped  d0, d1                      @ compare (vBB, vCC)
1382    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1383    mov     r0, #1                      @ r0<- 1 (default)
1384    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1385    fmstat                              @ export status flags
1386    mvnmi   r0, #0                      @ (less than) r1<- -1
1387    moveq   r0, #0                      @ (equal) r1<- 0
1388    b       .LOP_CMPG_DOUBLE_finish          @ argh
1389
1390
1391/* ------------------------------ */
1392    .balign 64
1393.L_OP_CMP_LONG: /* 0x31 */
1394/* File: armv5te/OP_CMP_LONG.S */
1395    /*
1396     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1397     * register based on the results of the comparison.
1398     *
1399     * We load the full values with LDM, but in practice many values could
1400     * be resolved by only looking at the high word.  This could be made
1401     * faster or slower by splitting the LDM into a pair of LDRs.
1402     *
1403     * If we just wanted to set condition flags, we could do this:
1404     *  subs    ip, r0, r2
1405     *  sbcs    ip, r1, r3
1406     *  subeqs  ip, r0, r2
1407     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1408     * integer value, which we can do with 2 conditional mov/mvn instructions
1409     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1410     * us a constant 5-cycle path plus a branch at the end to the
1411     * instruction epilogue code.  The multi-compare approach below needs
1412     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1413     * in the worst case (the 64-bit values are equal).
1414     */
1415    /* cmp-long vAA, vBB, vCC */
1416    FETCH(r0, 1)                        @ r0<- CCBB
1417    mov     r9, rINST, lsr #8           @ r9<- AA
1418    and     r2, r0, #255                @ r2<- BB
1419    mov     r3, r0, lsr #8              @ r3<- CC
1420    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1421    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1422    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1423    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1424    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1425    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1426    bgt     .LOP_CMP_LONG_greater
1427    subs    r1, r0, r2                  @ r1<- r0 - r2
1428    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1429    bne     .LOP_CMP_LONG_less
1430    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1431
1432/* ------------------------------ */
1433    .balign 64
1434.L_OP_IF_EQ: /* 0x32 */
1435/* File: armv6t2/OP_IF_EQ.S */
1436/* File: armv6t2/bincmp.S */
1437    /*
1438     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1439     * fragment that specifies the *reverse* comparison to perform, e.g.
1440     * for "if-le" you would use "gt".
1441     *
1442     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1443     */
1444    /* if-cmp vA, vB, +CCCC */
1445    mov     r1, rINST, lsr #12          @ r1<- B
1446    ubfx    r0, rINST, #8, #4           @ r0<- A
1447    GET_VREG(r3, r1)                    @ r3<- vB
1448    GET_VREG(r2, r0)                    @ r2<- vA
1449    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1450    cmp     r2, r3                      @ compare (vA, vB)
1451    movne r1, #2                 @ r1<- BYTE branch dist for not-taken
1452    adds    r2, r1, r1                  @ convert to bytes, check sign
1453    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1454#if defined(WITH_JIT)
1455    ldr     r0, [rSELF, #offThread_pJitProfTable]
1456    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1457    cmp     r0, #0
1458    bne     common_updateProfile
1459#else
1460    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1461#endif
1462    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1463    GOTO_OPCODE(ip)                     @ jump to next instruction
1464
1465
1466/* ------------------------------ */
1467    .balign 64
1468.L_OP_IF_NE: /* 0x33 */
1469/* File: armv6t2/OP_IF_NE.S */
1470/* File: armv6t2/bincmp.S */
1471    /*
1472     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1473     * fragment that specifies the *reverse* comparison to perform, e.g.
1474     * for "if-le" you would use "gt".
1475     *
1476     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1477     */
1478    /* if-cmp vA, vB, +CCCC */
1479    mov     r1, rINST, lsr #12          @ r1<- B
1480    ubfx    r0, rINST, #8, #4           @ r0<- A
1481    GET_VREG(r3, r1)                    @ r3<- vB
1482    GET_VREG(r2, r0)                    @ r2<- vA
1483    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1484    cmp     r2, r3                      @ compare (vA, vB)
1485    moveq r1, #2                 @ r1<- BYTE branch dist for not-taken
1486    adds    r2, r1, r1                  @ convert to bytes, check sign
1487    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1488#if defined(WITH_JIT)
1489    ldr     r0, [rSELF, #offThread_pJitProfTable]
1490    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1491    cmp     r0, #0
1492    bne     common_updateProfile
1493#else
1494    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1495#endif
1496    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1497    GOTO_OPCODE(ip)                     @ jump to next instruction
1498
1499
1500/* ------------------------------ */
1501    .balign 64
1502.L_OP_IF_LT: /* 0x34 */
1503/* File: armv6t2/OP_IF_LT.S */
1504/* File: armv6t2/bincmp.S */
1505    /*
1506     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1507     * fragment that specifies the *reverse* comparison to perform, e.g.
1508     * for "if-le" you would use "gt".
1509     *
1510     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1511     */
1512    /* if-cmp vA, vB, +CCCC */
1513    mov     r1, rINST, lsr #12          @ r1<- B
1514    ubfx    r0, rINST, #8, #4           @ r0<- A
1515    GET_VREG(r3, r1)                    @ r3<- vB
1516    GET_VREG(r2, r0)                    @ r2<- vA
1517    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1518    cmp     r2, r3                      @ compare (vA, vB)
1519    movge r1, #2                 @ r1<- BYTE branch dist for not-taken
1520    adds    r2, r1, r1                  @ convert to bytes, check sign
1521    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1522#if defined(WITH_JIT)
1523    ldr     r0, [rSELF, #offThread_pJitProfTable]
1524    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1525    cmp     r0, #0
1526    bne     common_updateProfile
1527#else
1528    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1529#endif
1530    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1531    GOTO_OPCODE(ip)                     @ jump to next instruction
1532
1533
1534/* ------------------------------ */
1535    .balign 64
1536.L_OP_IF_GE: /* 0x35 */
1537/* File: armv6t2/OP_IF_GE.S */
1538/* File: armv6t2/bincmp.S */
1539    /*
1540     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1541     * fragment that specifies the *reverse* comparison to perform, e.g.
1542     * for "if-le" you would use "gt".
1543     *
1544     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1545     */
1546    /* if-cmp vA, vB, +CCCC */
1547    mov     r1, rINST, lsr #12          @ r1<- B
1548    ubfx    r0, rINST, #8, #4           @ r0<- A
1549    GET_VREG(r3, r1)                    @ r3<- vB
1550    GET_VREG(r2, r0)                    @ r2<- vA
1551    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1552    cmp     r2, r3                      @ compare (vA, vB)
1553    movlt r1, #2                 @ r1<- BYTE branch dist for not-taken
1554    adds    r2, r1, r1                  @ convert to bytes, check sign
1555    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1556#if defined(WITH_JIT)
1557    ldr     r0, [rSELF, #offThread_pJitProfTable]
1558    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1559    cmp     r0, #0
1560    bne     common_updateProfile
1561#else
1562    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1563#endif
1564    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1565    GOTO_OPCODE(ip)                     @ jump to next instruction
1566
1567
1568/* ------------------------------ */
1569    .balign 64
1570.L_OP_IF_GT: /* 0x36 */
1571/* File: armv6t2/OP_IF_GT.S */
1572/* File: armv6t2/bincmp.S */
1573    /*
1574     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1575     * fragment that specifies the *reverse* comparison to perform, e.g.
1576     * for "if-le" you would use "gt".
1577     *
1578     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1579     */
1580    /* if-cmp vA, vB, +CCCC */
1581    mov     r1, rINST, lsr #12          @ r1<- B
1582    ubfx    r0, rINST, #8, #4           @ r0<- A
1583    GET_VREG(r3, r1)                    @ r3<- vB
1584    GET_VREG(r2, r0)                    @ r2<- vA
1585    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1586    cmp     r2, r3                      @ compare (vA, vB)
1587    movle r1, #2                 @ r1<- BYTE branch dist for not-taken
1588    adds    r2, r1, r1                  @ convert to bytes, check sign
1589    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1590#if defined(WITH_JIT)
1591    ldr     r0, [rSELF, #offThread_pJitProfTable]
1592    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1593    cmp     r0, #0
1594    bne     common_updateProfile
1595#else
1596    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1597#endif
1598    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1599    GOTO_OPCODE(ip)                     @ jump to next instruction
1600
1601
1602/* ------------------------------ */
1603    .balign 64
1604.L_OP_IF_LE: /* 0x37 */
1605/* File: armv6t2/OP_IF_LE.S */
1606/* File: armv6t2/bincmp.S */
1607    /*
1608     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1609     * fragment that specifies the *reverse* comparison to perform, e.g.
1610     * for "if-le" you would use "gt".
1611     *
1612     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1613     */
1614    /* if-cmp vA, vB, +CCCC */
1615    mov     r1, rINST, lsr #12          @ r1<- B
1616    ubfx    r0, rINST, #8, #4           @ r0<- A
1617    GET_VREG(r3, r1)                    @ r3<- vB
1618    GET_VREG(r2, r0)                    @ r2<- vA
1619    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1620    cmp     r2, r3                      @ compare (vA, vB)
1621    movgt r1, #2                 @ r1<- BYTE branch dist for not-taken
1622    adds    r2, r1, r1                  @ convert to bytes, check sign
1623    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1624#if defined(WITH_JIT)
1625    ldr     r0, [rSELF, #offThread_pJitProfTable]
1626    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1627    cmp     r0, #0
1628    bne     common_updateProfile
1629#else
1630    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1631#endif
1632    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1633    GOTO_OPCODE(ip)                     @ jump to next instruction
1634
1635
1636/* ------------------------------ */
1637    .balign 64
1638.L_OP_IF_EQZ: /* 0x38 */
1639/* File: armv5te/OP_IF_EQZ.S */
1640/* File: armv5te/zcmp.S */
1641    /*
1642     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1643     * fragment that specifies the *reverse* comparison to perform, e.g.
1644     * for "if-le" you would use "gt".
1645     *
1646     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1647     */
1648    /* if-cmp vAA, +BBBB */
1649    mov     r0, rINST, lsr #8           @ r0<- AA
1650    GET_VREG(r2, r0)                    @ r2<- vAA
1651    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1652    cmp     r2, #0                      @ compare (vA, 0)
1653    movne r1, #2                 @ r1<- inst branch dist for not-taken
1654    adds    r1, r1, r1                  @ convert to bytes & set flags
1655    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1656#if defined(WITH_JIT)
1657    ldr     r0, [rSELF, #offThread_pJitProfTable]
1658    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1659    cmp     r0,#0
1660    bne     common_updateProfile        @ test for JIT off at target
1661#else
1662    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1663#endif
1664    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1665    GOTO_OPCODE(ip)                     @ jump to next instruction
1666
1667
1668/* ------------------------------ */
1669    .balign 64
1670.L_OP_IF_NEZ: /* 0x39 */
1671/* File: armv5te/OP_IF_NEZ.S */
1672/* File: armv5te/zcmp.S */
1673    /*
1674     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1675     * fragment that specifies the *reverse* comparison to perform, e.g.
1676     * for "if-le" you would use "gt".
1677     *
1678     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1679     */
1680    /* if-cmp vAA, +BBBB */
1681    mov     r0, rINST, lsr #8           @ r0<- AA
1682    GET_VREG(r2, r0)                    @ r2<- vAA
1683    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1684    cmp     r2, #0                      @ compare (vA, 0)
1685    moveq r1, #2                 @ r1<- inst branch dist for not-taken
1686    adds    r1, r1, r1                  @ convert to bytes & set flags
1687    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1688#if defined(WITH_JIT)
1689    ldr     r0, [rSELF, #offThread_pJitProfTable]
1690    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1691    cmp     r0,#0
1692    bne     common_updateProfile        @ test for JIT off at target
1693#else
1694    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1695#endif
1696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1697    GOTO_OPCODE(ip)                     @ jump to next instruction
1698
1699
1700/* ------------------------------ */
1701    .balign 64
1702.L_OP_IF_LTZ: /* 0x3a */
1703/* File: armv5te/OP_IF_LTZ.S */
1704/* File: armv5te/zcmp.S */
1705    /*
1706     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1707     * fragment that specifies the *reverse* comparison to perform, e.g.
1708     * for "if-le" you would use "gt".
1709     *
1710     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1711     */
1712    /* if-cmp vAA, +BBBB */
1713    mov     r0, rINST, lsr #8           @ r0<- AA
1714    GET_VREG(r2, r0)                    @ r2<- vAA
1715    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1716    cmp     r2, #0                      @ compare (vA, 0)
1717    movge r1, #2                 @ r1<- inst branch dist for not-taken
1718    adds    r1, r1, r1                  @ convert to bytes & set flags
1719    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1720#if defined(WITH_JIT)
1721    ldr     r0, [rSELF, #offThread_pJitProfTable]
1722    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1723    cmp     r0,#0
1724    bne     common_updateProfile        @ test for JIT off at target
1725#else
1726    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1727#endif
1728    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1729    GOTO_OPCODE(ip)                     @ jump to next instruction
1730
1731
1732/* ------------------------------ */
1733    .balign 64
1734.L_OP_IF_GEZ: /* 0x3b */
1735/* File: armv5te/OP_IF_GEZ.S */
1736/* File: armv5te/zcmp.S */
1737    /*
1738     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1739     * fragment that specifies the *reverse* comparison to perform, e.g.
1740     * for "if-le" you would use "gt".
1741     *
1742     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1743     */
1744    /* if-cmp vAA, +BBBB */
1745    mov     r0, rINST, lsr #8           @ r0<- AA
1746    GET_VREG(r2, r0)                    @ r2<- vAA
1747    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1748    cmp     r2, #0                      @ compare (vA, 0)
1749    movlt r1, #2                 @ r1<- inst branch dist for not-taken
1750    adds    r1, r1, r1                  @ convert to bytes & set flags
1751    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1752#if defined(WITH_JIT)
1753    ldr     r0, [rSELF, #offThread_pJitProfTable]
1754    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1755    cmp     r0,#0
1756    bne     common_updateProfile        @ test for JIT off at target
1757#else
1758    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1759#endif
1760    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1761    GOTO_OPCODE(ip)                     @ jump to next instruction
1762
1763
1764/* ------------------------------ */
1765    .balign 64
1766.L_OP_IF_GTZ: /* 0x3c */
1767/* File: armv5te/OP_IF_GTZ.S */
1768/* File: armv5te/zcmp.S */
1769    /*
1770     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1771     * fragment that specifies the *reverse* comparison to perform, e.g.
1772     * for "if-le" you would use "gt".
1773     *
1774     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1775     */
1776    /* if-cmp vAA, +BBBB */
1777    mov     r0, rINST, lsr #8           @ r0<- AA
1778    GET_VREG(r2, r0)                    @ r2<- vAA
1779    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1780    cmp     r2, #0                      @ compare (vA, 0)
1781    movle r1, #2                 @ r1<- inst branch dist for not-taken
1782    adds    r1, r1, r1                  @ convert to bytes & set flags
1783    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1784#if defined(WITH_JIT)
1785    ldr     r0, [rSELF, #offThread_pJitProfTable]
1786    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1787    cmp     r0,#0
1788    bne     common_updateProfile        @ test for JIT off at target
1789#else
1790    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1791#endif
1792    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1793    GOTO_OPCODE(ip)                     @ jump to next instruction
1794
1795
1796/* ------------------------------ */
1797    .balign 64
1798.L_OP_IF_LEZ: /* 0x3d */
1799/* File: armv5te/OP_IF_LEZ.S */
1800/* File: armv5te/zcmp.S */
1801    /*
1802     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1803     * fragment that specifies the *reverse* comparison to perform, e.g.
1804     * for "if-le" you would use "gt".
1805     *
1806     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1807     */
1808    /* if-cmp vAA, +BBBB */
1809    mov     r0, rINST, lsr #8           @ r0<- AA
1810    GET_VREG(r2, r0)                    @ r2<- vAA
1811    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1812    cmp     r2, #0                      @ compare (vA, 0)
1813    movgt r1, #2                 @ r1<- inst branch dist for not-taken
1814    adds    r1, r1, r1                  @ convert to bytes & set flags
1815    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1816#if defined(WITH_JIT)
1817    ldr     r0, [rSELF, #offThread_pJitProfTable]
1818    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1819    cmp     r0,#0
1820    bne     common_updateProfile        @ test for JIT off at target
1821#else
1822    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1823#endif
1824    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1825    GOTO_OPCODE(ip)                     @ jump to next instruction
1826
1827
1828/* ------------------------------ */
1829    .balign 64
1830.L_OP_UNUSED_3E: /* 0x3e */
1831/* File: armv5te/OP_UNUSED_3E.S */
1832/* File: armv5te/unused.S */
1833    bl      common_abort
1834
1835
1836/* ------------------------------ */
1837    .balign 64
1838.L_OP_UNUSED_3F: /* 0x3f */
1839/* File: armv5te/OP_UNUSED_3F.S */
1840/* File: armv5te/unused.S */
1841    bl      common_abort
1842
1843
1844/* ------------------------------ */
1845    .balign 64
1846.L_OP_UNUSED_40: /* 0x40 */
1847/* File: armv5te/OP_UNUSED_40.S */
1848/* File: armv5te/unused.S */
1849    bl      common_abort
1850
1851
1852/* ------------------------------ */
1853    .balign 64
1854.L_OP_UNUSED_41: /* 0x41 */
1855/* File: armv5te/OP_UNUSED_41.S */
1856/* File: armv5te/unused.S */
1857    bl      common_abort
1858
1859
1860/* ------------------------------ */
1861    .balign 64
1862.L_OP_UNUSED_42: /* 0x42 */
1863/* File: armv5te/OP_UNUSED_42.S */
1864/* File: armv5te/unused.S */
1865    bl      common_abort
1866
1867
1868/* ------------------------------ */
1869    .balign 64
1870.L_OP_UNUSED_43: /* 0x43 */
1871/* File: armv5te/OP_UNUSED_43.S */
1872/* File: armv5te/unused.S */
1873    bl      common_abort
1874
1875
1876/* ------------------------------ */
1877    .balign 64
1878.L_OP_AGET: /* 0x44 */
1879/* File: armv5te/OP_AGET.S */
1880    /*
1881     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1882     *
1883     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1884     * instructions.  We use a pair of FETCH_Bs instead.
1885     *
1886     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1887     */
1888    /* op vAA, vBB, vCC */
1889    FETCH_B(r2, 1, 0)                   @ r2<- BB
1890    mov     r9, rINST, lsr #8           @ r9<- AA
1891    FETCH_B(r3, 1, 1)                   @ r3<- CC
1892    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1893    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1894    cmp     r0, #0                      @ null array object?
1895    beq     common_errNullObject        @ yes, bail
1896    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1897    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1898    cmp     r1, r3                      @ compare unsigned index, length
1899    bcs     common_errArrayIndex        @ index >= length, bail
1900    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1901    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1902    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1903    SET_VREG(r2, r9)                    @ vAA<- r2
1904    GOTO_OPCODE(ip)                     @ jump to next instruction
1905
1906/* ------------------------------ */
1907    .balign 64
1908.L_OP_AGET_WIDE: /* 0x45 */
1909/* File: armv5te/OP_AGET_WIDE.S */
1910    /*
1911     * Array get, 64 bits.  vAA <- vBB[vCC].
1912     *
1913     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
1914     */
1915    /* aget-wide vAA, vBB, vCC */
1916    FETCH(r0, 1)                        @ r0<- CCBB
1917    mov     r9, rINST, lsr #8           @ r9<- AA
1918    and     r2, r0, #255                @ r2<- BB
1919    mov     r3, r0, lsr #8              @ r3<- CC
1920    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1921    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1922    cmp     r0, #0                      @ null array object?
1923    beq     common_errNullObject        @ yes, bail
1924    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1925    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
1926    cmp     r1, r3                      @ compare unsigned index, length
1927    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
1928    b       common_errArrayIndex        @ index >= length, bail
1929    @ May want to swap the order of these two branches depending on how the
1930    @ branch prediction (if any) handles conditional forward branches vs.
1931    @ unconditional forward branches.
1932
1933/* ------------------------------ */
1934    .balign 64
1935.L_OP_AGET_OBJECT: /* 0x46 */
1936/* File: armv5te/OP_AGET_OBJECT.S */
1937/* File: armv5te/OP_AGET.S */
1938    /*
1939     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1940     *
1941     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1942     * instructions.  We use a pair of FETCH_Bs instead.
1943     *
1944     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1945     */
1946    /* op vAA, vBB, vCC */
1947    FETCH_B(r2, 1, 0)                   @ r2<- BB
1948    mov     r9, rINST, lsr #8           @ r9<- AA
1949    FETCH_B(r3, 1, 1)                   @ r3<- CC
1950    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1951    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1952    cmp     r0, #0                      @ null array object?
1953    beq     common_errNullObject        @ yes, bail
1954    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1955    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1956    cmp     r1, r3                      @ compare unsigned index, length
1957    bcs     common_errArrayIndex        @ index >= length, bail
1958    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1959    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1960    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1961    SET_VREG(r2, r9)                    @ vAA<- r2
1962    GOTO_OPCODE(ip)                     @ jump to next instruction
1963
1964
1965/* ------------------------------ */
1966    .balign 64
1967.L_OP_AGET_BOOLEAN: /* 0x47 */
1968/* File: armv5te/OP_AGET_BOOLEAN.S */
1969/* File: armv5te/OP_AGET.S */
1970    /*
1971     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1972     *
1973     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1974     * instructions.  We use a pair of FETCH_Bs instead.
1975     *
1976     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1977     */
1978    /* op vAA, vBB, vCC */
1979    FETCH_B(r2, 1, 0)                   @ r2<- BB
1980    mov     r9, rINST, lsr #8           @ r9<- AA
1981    FETCH_B(r3, 1, 1)                   @ r3<- CC
1982    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1983    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1984    cmp     r0, #0                      @ null array object?
1985    beq     common_errNullObject        @ yes, bail
1986    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1987    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
1988    cmp     r1, r3                      @ compare unsigned index, length
1989    bcs     common_errArrayIndex        @ index >= length, bail
1990    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1991    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1992    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1993    SET_VREG(r2, r9)                    @ vAA<- r2
1994    GOTO_OPCODE(ip)                     @ jump to next instruction
1995
1996
1997/* ------------------------------ */
1998    .balign 64
1999.L_OP_AGET_BYTE: /* 0x48 */
2000/* File: armv5te/OP_AGET_BYTE.S */
2001/* File: armv5te/OP_AGET.S */
2002    /*
2003     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2004     *
2005     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2006     * instructions.  We use a pair of FETCH_Bs instead.
2007     *
2008     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2009     */
2010    /* op vAA, vBB, vCC */
2011    FETCH_B(r2, 1, 0)                   @ r2<- BB
2012    mov     r9, rINST, lsr #8           @ r9<- AA
2013    FETCH_B(r3, 1, 1)                   @ r3<- CC
2014    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2015    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2016    cmp     r0, #0                      @ null array object?
2017    beq     common_errNullObject        @ yes, bail
2018    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2019    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2020    cmp     r1, r3                      @ compare unsigned index, length
2021    bcs     common_errArrayIndex        @ index >= length, bail
2022    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2023    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2024    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2025    SET_VREG(r2, r9)                    @ vAA<- r2
2026    GOTO_OPCODE(ip)                     @ jump to next instruction
2027
2028
2029/* ------------------------------ */
2030    .balign 64
2031.L_OP_AGET_CHAR: /* 0x49 */
2032/* File: armv5te/OP_AGET_CHAR.S */
2033/* File: armv5te/OP_AGET.S */
2034    /*
2035     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2036     *
2037     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2038     * instructions.  We use a pair of FETCH_Bs instead.
2039     *
2040     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2041     */
2042    /* op vAA, vBB, vCC */
2043    FETCH_B(r2, 1, 0)                   @ r2<- BB
2044    mov     r9, rINST, lsr #8           @ r9<- AA
2045    FETCH_B(r3, 1, 1)                   @ r3<- CC
2046    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2047    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2048    cmp     r0, #0                      @ null array object?
2049    beq     common_errNullObject        @ yes, bail
2050    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2051    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2052    cmp     r1, r3                      @ compare unsigned index, length
2053    bcs     common_errArrayIndex        @ index >= length, bail
2054    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2055    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2056    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2057    SET_VREG(r2, r9)                    @ vAA<- r2
2058    GOTO_OPCODE(ip)                     @ jump to next instruction
2059
2060
2061/* ------------------------------ */
2062    .balign 64
2063.L_OP_AGET_SHORT: /* 0x4a */
2064/* File: armv5te/OP_AGET_SHORT.S */
2065/* File: armv5te/OP_AGET.S */
2066    /*
2067     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2068     *
2069     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2070     * instructions.  We use a pair of FETCH_Bs instead.
2071     *
2072     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2073     */
2074    /* op vAA, vBB, vCC */
2075    FETCH_B(r2, 1, 0)                   @ r2<- BB
2076    mov     r9, rINST, lsr #8           @ r9<- AA
2077    FETCH_B(r3, 1, 1)                   @ r3<- CC
2078    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2079    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2080    cmp     r0, #0                      @ null array object?
2081    beq     common_errNullObject        @ yes, bail
2082    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2083    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2084    cmp     r1, r3                      @ compare unsigned index, length
2085    bcs     common_errArrayIndex        @ index >= length, bail
2086    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2087    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2088    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2089    SET_VREG(r2, r9)                    @ vAA<- r2
2090    GOTO_OPCODE(ip)                     @ jump to next instruction
2091
2092
2093/* ------------------------------ */
2094    .balign 64
2095.L_OP_APUT: /* 0x4b */
2096/* File: armv5te/OP_APUT.S */
2097    /*
2098     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2099     *
2100     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2101     * instructions.  We use a pair of FETCH_Bs instead.
2102     *
2103     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2104     */
2105    /* op vAA, vBB, vCC */
2106    FETCH_B(r2, 1, 0)                   @ r2<- BB
2107    mov     r9, rINST, lsr #8           @ r9<- AA
2108    FETCH_B(r3, 1, 1)                   @ r3<- CC
2109    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2110    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2111    cmp     r0, #0                      @ null array object?
2112    beq     common_errNullObject        @ yes, bail
2113    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2114    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2115    cmp     r1, r3                      @ compare unsigned index, length
2116    bcs     common_errArrayIndex        @ index >= length, bail
2117    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2118    GET_VREG(r2, r9)                    @ r2<- vAA
2119    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2120    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2121    GOTO_OPCODE(ip)                     @ jump to next instruction
2122
2123/* ------------------------------ */
2124    .balign 64
2125.L_OP_APUT_WIDE: /* 0x4c */
2126/* File: armv5te/OP_APUT_WIDE.S */
2127    /*
2128     * Array put, 64 bits.  vBB[vCC] <- vAA.
2129     *
2130     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2131     */
2132    /* aput-wide vAA, vBB, vCC */
2133    FETCH(r0, 1)                        @ r0<- CCBB
2134    mov     r9, rINST, lsr #8           @ r9<- AA
2135    and     r2, r0, #255                @ r2<- BB
2136    mov     r3, r0, lsr #8              @ r3<- CC
2137    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2138    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2139    cmp     r0, #0                      @ null array object?
2140    beq     common_errNullObject        @ yes, bail
2141    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2142    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2143    cmp     r1, r3                      @ compare unsigned index, length
2144    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2145    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2146    b       common_errArrayIndex        @ index >= length, bail
2147    @ May want to swap the order of these two branches depending on how the
2148    @ branch prediction (if any) handles conditional forward branches vs.
2149    @ unconditional forward branches.
2150
2151/* ------------------------------ */
2152    .balign 64
2153.L_OP_APUT_OBJECT: /* 0x4d */
2154/* File: armv5te/OP_APUT_OBJECT.S */
2155    /*
2156     * Store an object into an array.  vBB[vCC] <- vAA.
2157     */
2158    /* op vAA, vBB, vCC */
2159    FETCH(r0, 1)                        @ r0<- CCBB
2160    mov     r9, rINST, lsr #8           @ r9<- AA
2161    and     r2, r0, #255                @ r2<- BB
2162    mov     r3, r0, lsr #8              @ r3<- CC
2163    GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
2164    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2165    cmp     rINST, #0                   @ null array object?
2166    GET_VREG(r9, r9)                    @ r9<- vAA
2167    beq     common_errNullObject        @ yes, bail
2168    ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
2169    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
2170    cmp     r1, r3                      @ compare unsigned index, length
2171    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2172    b       common_errArrayIndex        @ index >= length, bail
2173
2174
2175/* ------------------------------ */
2176    .balign 64
2177.L_OP_APUT_BOOLEAN: /* 0x4e */
2178/* File: armv5te/OP_APUT_BOOLEAN.S */
2179/* File: armv5te/OP_APUT.S */
2180    /*
2181     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2182     *
2183     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2184     * instructions.  We use a pair of FETCH_Bs instead.
2185     *
2186     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2187     */
2188    /* op vAA, vBB, vCC */
2189    FETCH_B(r2, 1, 0)                   @ r2<- BB
2190    mov     r9, rINST, lsr #8           @ r9<- AA
2191    FETCH_B(r3, 1, 1)                   @ r3<- CC
2192    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2193    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2194    cmp     r0, #0                      @ null array object?
2195    beq     common_errNullObject        @ yes, bail
2196    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2197    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2198    cmp     r1, r3                      @ compare unsigned index, length
2199    bcs     common_errArrayIndex        @ index >= length, bail
2200    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2201    GET_VREG(r2, r9)                    @ r2<- vAA
2202    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2203    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2204    GOTO_OPCODE(ip)                     @ jump to next instruction
2205
2206
2207/* ------------------------------ */
2208    .balign 64
2209.L_OP_APUT_BYTE: /* 0x4f */
2210/* File: armv5te/OP_APUT_BYTE.S */
2211/* File: armv5te/OP_APUT.S */
2212    /*
2213     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2214     *
2215     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2216     * instructions.  We use a pair of FETCH_Bs instead.
2217     *
2218     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2219     */
2220    /* op vAA, vBB, vCC */
2221    FETCH_B(r2, 1, 0)                   @ r2<- BB
2222    mov     r9, rINST, lsr #8           @ r9<- AA
2223    FETCH_B(r3, 1, 1)                   @ r3<- CC
2224    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2225    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2226    cmp     r0, #0                      @ null array object?
2227    beq     common_errNullObject        @ yes, bail
2228    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2229    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2230    cmp     r1, r3                      @ compare unsigned index, length
2231    bcs     common_errArrayIndex        @ index >= length, bail
2232    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2233    GET_VREG(r2, r9)                    @ r2<- vAA
2234    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2235    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2236    GOTO_OPCODE(ip)                     @ jump to next instruction
2237
2238
2239/* ------------------------------ */
2240    .balign 64
2241.L_OP_APUT_CHAR: /* 0x50 */
2242/* File: armv5te/OP_APUT_CHAR.S */
2243/* File: armv5te/OP_APUT.S */
2244    /*
2245     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2246     *
2247     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2248     * instructions.  We use a pair of FETCH_Bs instead.
2249     *
2250     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2251     */
2252    /* op vAA, vBB, vCC */
2253    FETCH_B(r2, 1, 0)                   @ r2<- BB
2254    mov     r9, rINST, lsr #8           @ r9<- AA
2255    FETCH_B(r3, 1, 1)                   @ r3<- CC
2256    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2257    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2258    cmp     r0, #0                      @ null array object?
2259    beq     common_errNullObject        @ yes, bail
2260    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2261    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2262    cmp     r1, r3                      @ compare unsigned index, length
2263    bcs     common_errArrayIndex        @ index >= length, bail
2264    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2265    GET_VREG(r2, r9)                    @ r2<- vAA
2266    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2267    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2268    GOTO_OPCODE(ip)                     @ jump to next instruction
2269
2270
2271/* ------------------------------ */
2272    .balign 64
2273.L_OP_APUT_SHORT: /* 0x51 */
2274/* File: armv5te/OP_APUT_SHORT.S */
2275/* File: armv5te/OP_APUT.S */
2276    /*
2277     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2278     *
2279     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2280     * instructions.  We use a pair of FETCH_Bs instead.
2281     *
2282     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2283     */
2284    /* op vAA, vBB, vCC */
2285    FETCH_B(r2, 1, 0)                   @ r2<- BB
2286    mov     r9, rINST, lsr #8           @ r9<- AA
2287    FETCH_B(r3, 1, 1)                   @ r3<- CC
2288    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2289    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2290    cmp     r0, #0                      @ null array object?
2291    beq     common_errNullObject        @ yes, bail
2292    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2293    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2294    cmp     r1, r3                      @ compare unsigned index, length
2295    bcs     common_errArrayIndex        @ index >= length, bail
2296    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2297    GET_VREG(r2, r9)                    @ r2<- vAA
2298    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2299    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2300    GOTO_OPCODE(ip)                     @ jump to next instruction
2301
2302
2303/* ------------------------------ */
2304    .balign 64
2305.L_OP_IGET: /* 0x52 */
2306/* File: armv6t2/OP_IGET.S */
2307    /*
2308     * General 32-bit instance field get.
2309     *
2310     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2311     */
2312    /* op vA, vB, field@CCCC */
2313    mov     r0, rINST, lsr #12          @ r0<- B
2314    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2315    FETCH(r1, 1)                        @ r1<- field ref CCCC
2316    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2317    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2318    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2319    cmp     r0, #0                      @ is resolved entry null?
2320    bne     .LOP_IGET_finish          @ no, already resolved
23218:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2322    EXPORT_PC()                         @ resolve() could throw
2323    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2324    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2325    cmp     r0, #0
2326    bne     .LOP_IGET_finish
2327    b       common_exceptionThrown
2328
2329/* ------------------------------ */
2330    .balign 64
2331.L_OP_IGET_WIDE: /* 0x53 */
2332/* File: armv6t2/OP_IGET_WIDE.S */
2333    /*
2334     * Wide 32-bit instance field get.
2335     */
2336    /* iget-wide vA, vB, field@CCCC */
2337    mov     r0, rINST, lsr #12          @ r0<- B
2338    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2339    FETCH(r1, 1)                        @ r1<- field ref CCCC
2340    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2341    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2342    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2343    cmp     r0, #0                      @ is resolved entry null?
2344    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
23458:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2346    EXPORT_PC()                         @ resolve() could throw
2347    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2348    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2349    cmp     r0, #0
2350    bne     .LOP_IGET_WIDE_finish
2351    b       common_exceptionThrown
2352
2353/* ------------------------------ */
2354    .balign 64
2355.L_OP_IGET_OBJECT: /* 0x54 */
2356/* File: armv5te/OP_IGET_OBJECT.S */
2357/* File: armv5te/OP_IGET.S */
2358    /*
2359     * General 32-bit instance field get.
2360     *
2361     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2362     */
2363    /* op vA, vB, field@CCCC */
2364    mov     r0, rINST, lsr #12          @ r0<- B
2365    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2366    FETCH(r1, 1)                        @ r1<- field ref CCCC
2367    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2368    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2369    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2370    cmp     r0, #0                      @ is resolved entry null?
2371    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
23728:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2373    EXPORT_PC()                         @ resolve() could throw
2374    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2375    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2376    cmp     r0, #0
2377    bne     .LOP_IGET_OBJECT_finish
2378    b       common_exceptionThrown
2379
2380
2381/* ------------------------------ */
2382    .balign 64
2383.L_OP_IGET_BOOLEAN: /* 0x55 */
2384/* File: armv5te/OP_IGET_BOOLEAN.S */
2385@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2386/* File: armv5te/OP_IGET.S */
2387    /*
2388     * General 32-bit instance field get.
2389     *
2390     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2391     */
2392    /* op vA, vB, field@CCCC */
2393    mov     r0, rINST, lsr #12          @ r0<- B
2394    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2395    FETCH(r1, 1)                        @ r1<- field ref CCCC
2396    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2397    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2398    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2399    cmp     r0, #0                      @ is resolved entry null?
2400    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
24018:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2402    EXPORT_PC()                         @ resolve() could throw
2403    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2404    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2405    cmp     r0, #0
2406    bne     .LOP_IGET_BOOLEAN_finish
2407    b       common_exceptionThrown
2408
2409
2410/* ------------------------------ */
2411    .balign 64
2412.L_OP_IGET_BYTE: /* 0x56 */
2413/* File: armv5te/OP_IGET_BYTE.S */
2414@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2415/* File: armv5te/OP_IGET.S */
2416    /*
2417     * General 32-bit instance field get.
2418     *
2419     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2420     */
2421    /* op vA, vB, field@CCCC */
2422    mov     r0, rINST, lsr #12          @ r0<- B
2423    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2424    FETCH(r1, 1)                        @ r1<- field ref CCCC
2425    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2426    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2427    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2428    cmp     r0, #0                      @ is resolved entry null?
2429    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
24308:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2431    EXPORT_PC()                         @ resolve() could throw
2432    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2433    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2434    cmp     r0, #0
2435    bne     .LOP_IGET_BYTE_finish
2436    b       common_exceptionThrown
2437
2438
2439/* ------------------------------ */
2440    .balign 64
2441.L_OP_IGET_CHAR: /* 0x57 */
2442/* File: armv5te/OP_IGET_CHAR.S */
2443@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2444/* File: armv5te/OP_IGET.S */
2445    /*
2446     * General 32-bit instance field get.
2447     *
2448     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2449     */
2450    /* op vA, vB, field@CCCC */
2451    mov     r0, rINST, lsr #12          @ r0<- B
2452    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2453    FETCH(r1, 1)                        @ r1<- field ref CCCC
2454    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2455    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2456    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2457    cmp     r0, #0                      @ is resolved entry null?
2458    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
24598:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2460    EXPORT_PC()                         @ resolve() could throw
2461    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2462    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2463    cmp     r0, #0
2464    bne     .LOP_IGET_CHAR_finish
2465    b       common_exceptionThrown
2466
2467
2468/* ------------------------------ */
2469    .balign 64
2470.L_OP_IGET_SHORT: /* 0x58 */
2471/* File: armv5te/OP_IGET_SHORT.S */
2472@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2473/* File: armv5te/OP_IGET.S */
2474    /*
2475     * General 32-bit instance field get.
2476     *
2477     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2478     */
2479    /* op vA, vB, field@CCCC */
2480    mov     r0, rINST, lsr #12          @ r0<- B
2481    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2482    FETCH(r1, 1)                        @ r1<- field ref CCCC
2483    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2484    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2485    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2486    cmp     r0, #0                      @ is resolved entry null?
2487    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
24888:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2489    EXPORT_PC()                         @ resolve() could throw
2490    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2491    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2492    cmp     r0, #0
2493    bne     .LOP_IGET_SHORT_finish
2494    b       common_exceptionThrown
2495
2496
2497/* ------------------------------ */
2498    .balign 64
2499.L_OP_IPUT: /* 0x59 */
2500/* File: armv6t2/OP_IPUT.S */
2501    /*
2502     * General 32-bit instance field put.
2503     *
2504     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2505     */
2506    /* op vA, vB, field@CCCC */
2507    mov     r0, rINST, lsr #12          @ r0<- B
2508    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2509    FETCH(r1, 1)                        @ r1<- field ref CCCC
2510    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2511    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2512    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2513    cmp     r0, #0                      @ is resolved entry null?
2514    bne     .LOP_IPUT_finish          @ no, already resolved
25158:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2516    EXPORT_PC()                         @ resolve() could throw
2517    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2518    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2519    cmp     r0, #0                      @ success?
2520    bne     .LOP_IPUT_finish          @ yes, finish up
2521    b       common_exceptionThrown
2522
2523/* ------------------------------ */
2524    .balign 64
2525.L_OP_IPUT_WIDE: /* 0x5a */
2526/* File: armv6t2/OP_IPUT_WIDE.S */
2527    /* iput-wide vA, vB, field@CCCC */
2528    mov     r0, rINST, lsr #12          @ r0<- B
2529    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2530    FETCH(r1, 1)                        @ r1<- field ref CCCC
2531    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2532    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2533    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2534    cmp     r0, #0                      @ is resolved entry null?
2535    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
25368:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2537    EXPORT_PC()                         @ resolve() could throw
2538    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2539    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2540    cmp     r0, #0                      @ success?
2541    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2542    b       common_exceptionThrown
2543
2544/* ------------------------------ */
2545    .balign 64
2546.L_OP_IPUT_OBJECT: /* 0x5b */
2547/* File: armv5te/OP_IPUT_OBJECT.S */
2548    /*
2549     * 32-bit instance field put.
2550     *
2551     * for: iput-object, iput-object-volatile
2552     */
2553    /* op vA, vB, field@CCCC */
2554    mov     r0, rINST, lsr #12          @ r0<- B
2555    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2556    FETCH(r1, 1)                        @ r1<- field ref CCCC
2557    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2558    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2559    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2560    cmp     r0, #0                      @ is resolved entry null?
2561    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
25628:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2563    EXPORT_PC()                         @ resolve() could throw
2564    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2565    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2566    cmp     r0, #0                      @ success?
2567    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2568    b       common_exceptionThrown
2569
2570/* ------------------------------ */
2571    .balign 64
2572.L_OP_IPUT_BOOLEAN: /* 0x5c */
2573/* File: armv5te/OP_IPUT_BOOLEAN.S */
2574@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2575/* File: armv5te/OP_IPUT.S */
2576    /*
2577     * General 32-bit instance field put.
2578     *
2579     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2580     */
2581    /* op vA, vB, field@CCCC */
2582    mov     r0, rINST, lsr #12          @ r0<- B
2583    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2584    FETCH(r1, 1)                        @ r1<- field ref CCCC
2585    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2586    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2587    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2588    cmp     r0, #0                      @ is resolved entry null?
2589    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
25908:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2591    EXPORT_PC()                         @ resolve() could throw
2592    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2593    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2594    cmp     r0, #0                      @ success?
2595    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2596    b       common_exceptionThrown
2597
2598
2599/* ------------------------------ */
2600    .balign 64
2601.L_OP_IPUT_BYTE: /* 0x5d */
2602/* File: armv5te/OP_IPUT_BYTE.S */
2603@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2604/* File: armv5te/OP_IPUT.S */
2605    /*
2606     * General 32-bit instance field put.
2607     *
2608     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2609     */
2610    /* op vA, vB, field@CCCC */
2611    mov     r0, rINST, lsr #12          @ r0<- B
2612    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2613    FETCH(r1, 1)                        @ r1<- field ref CCCC
2614    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2615    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2616    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2617    cmp     r0, #0                      @ is resolved entry null?
2618    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
26198:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2620    EXPORT_PC()                         @ resolve() could throw
2621    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2622    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2623    cmp     r0, #0                      @ success?
2624    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2625    b       common_exceptionThrown
2626
2627
2628/* ------------------------------ */
2629    .balign 64
2630.L_OP_IPUT_CHAR: /* 0x5e */
2631/* File: armv5te/OP_IPUT_CHAR.S */
2632@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2633/* File: armv5te/OP_IPUT.S */
2634    /*
2635     * General 32-bit instance field put.
2636     *
2637     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2638     */
2639    /* op vA, vB, field@CCCC */
2640    mov     r0, rINST, lsr #12          @ r0<- B
2641    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2642    FETCH(r1, 1)                        @ r1<- field ref CCCC
2643    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2644    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2645    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2646    cmp     r0, #0                      @ is resolved entry null?
2647    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
26488:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2649    EXPORT_PC()                         @ resolve() could throw
2650    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2651    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2652    cmp     r0, #0                      @ success?
2653    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2654    b       common_exceptionThrown
2655
2656
2657/* ------------------------------ */
2658    .balign 64
2659.L_OP_IPUT_SHORT: /* 0x5f */
2660/* File: armv5te/OP_IPUT_SHORT.S */
2661@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2662/* File: armv5te/OP_IPUT.S */
2663    /*
2664     * General 32-bit instance field put.
2665     *
2666     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2667     */
2668    /* op vA, vB, field@CCCC */
2669    mov     r0, rINST, lsr #12          @ r0<- B
2670    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2671    FETCH(r1, 1)                        @ r1<- field ref CCCC
2672    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2673    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2674    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2675    cmp     r0, #0                      @ is resolved entry null?
2676    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
26778:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2678    EXPORT_PC()                         @ resolve() could throw
2679    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2680    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2681    cmp     r0, #0                      @ success?
2682    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2683    b       common_exceptionThrown
2684
2685
2686/* ------------------------------ */
2687    .balign 64
2688.L_OP_SGET: /* 0x60 */
2689/* File: armv5te/OP_SGET.S */
2690    /*
2691     * General 32-bit SGET handler.
2692     *
2693     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2694     */
2695    /* op vAA, field@BBBB */
2696    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2697    FETCH(r1, 1)                        @ r1<- field ref BBBB
2698    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2699    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2700    cmp     r0, #0                      @ is resolved entry null?
2701    beq     .LOP_SGET_resolve         @ yes, do resolve
2702.LOP_SGET_finish: @ field ptr in r0
2703    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2704    @ no-op                             @ acquiring load
2705    mov     r2, rINST, lsr #8           @ r2<- AA
2706    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2707    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2708    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2709    GOTO_OPCODE(ip)                     @ jump to next instruction
2710
2711/* ------------------------------ */
2712    .balign 64
2713.L_OP_SGET_WIDE: /* 0x61 */
2714/* File: armv5te/OP_SGET_WIDE.S */
2715    /*
2716     * 64-bit SGET handler.
2717     */
2718    /* sget-wide vAA, field@BBBB */
2719    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2720    FETCH(r1, 1)                        @ r1<- field ref BBBB
2721    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2722    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2723    cmp     r0, #0                      @ is resolved entry null?
2724    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2725.LOP_SGET_WIDE_finish:
2726    mov     r9, rINST, lsr #8           @ r9<- AA
2727    .if 0
2728    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2729    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
2730    .else
2731    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2732    .endif
2733    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2734    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2735    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2736    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2737    GOTO_OPCODE(ip)                     @ jump to next instruction
2738
2739/* ------------------------------ */
2740    .balign 64
2741.L_OP_SGET_OBJECT: /* 0x62 */
2742/* File: armv5te/OP_SGET_OBJECT.S */
2743/* File: armv5te/OP_SGET.S */
2744    /*
2745     * General 32-bit SGET handler.
2746     *
2747     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2748     */
2749    /* op vAA, field@BBBB */
2750    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2751    FETCH(r1, 1)                        @ r1<- field ref BBBB
2752    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2753    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2754    cmp     r0, #0                      @ is resolved entry null?
2755    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2756.LOP_SGET_OBJECT_finish: @ field ptr in r0
2757    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2758    @ no-op                             @ acquiring load
2759    mov     r2, rINST, lsr #8           @ r2<- AA
2760    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2761    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2762    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2763    GOTO_OPCODE(ip)                     @ jump to next instruction
2764
2765
2766/* ------------------------------ */
2767    .balign 64
2768.L_OP_SGET_BOOLEAN: /* 0x63 */
2769/* File: armv5te/OP_SGET_BOOLEAN.S */
2770/* File: armv5te/OP_SGET.S */
2771    /*
2772     * General 32-bit SGET handler.
2773     *
2774     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2775     */
2776    /* op vAA, field@BBBB */
2777    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2778    FETCH(r1, 1)                        @ r1<- field ref BBBB
2779    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2780    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2781    cmp     r0, #0                      @ is resolved entry null?
2782    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2783.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2784    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2785    @ no-op                             @ acquiring load
2786    mov     r2, rINST, lsr #8           @ r2<- AA
2787    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2788    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2789    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2790    GOTO_OPCODE(ip)                     @ jump to next instruction
2791
2792
2793/* ------------------------------ */
2794    .balign 64
2795.L_OP_SGET_BYTE: /* 0x64 */
2796/* File: armv5te/OP_SGET_BYTE.S */
2797/* File: armv5te/OP_SGET.S */
2798    /*
2799     * General 32-bit SGET handler.
2800     *
2801     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2802     */
2803    /* op vAA, field@BBBB */
2804    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2805    FETCH(r1, 1)                        @ r1<- field ref BBBB
2806    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2807    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2808    cmp     r0, #0                      @ is resolved entry null?
2809    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2810.LOP_SGET_BYTE_finish: @ field ptr in r0
2811    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2812    @ no-op                             @ acquiring load
2813    mov     r2, rINST, lsr #8           @ r2<- AA
2814    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2815    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2816    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2817    GOTO_OPCODE(ip)                     @ jump to next instruction
2818
2819
2820/* ------------------------------ */
2821    .balign 64
2822.L_OP_SGET_CHAR: /* 0x65 */
2823/* File: armv5te/OP_SGET_CHAR.S */
2824/* File: armv5te/OP_SGET.S */
2825    /*
2826     * General 32-bit SGET handler.
2827     *
2828     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2829     */
2830    /* op vAA, field@BBBB */
2831    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2832    FETCH(r1, 1)                        @ r1<- field ref BBBB
2833    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2834    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2835    cmp     r0, #0                      @ is resolved entry null?
2836    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2837.LOP_SGET_CHAR_finish: @ field ptr in r0
2838    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2839    @ no-op                             @ acquiring load
2840    mov     r2, rINST, lsr #8           @ r2<- AA
2841    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2842    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2844    GOTO_OPCODE(ip)                     @ jump to next instruction
2845
2846
2847/* ------------------------------ */
2848    .balign 64
2849.L_OP_SGET_SHORT: /* 0x66 */
2850/* File: armv5te/OP_SGET_SHORT.S */
2851/* File: armv5te/OP_SGET.S */
2852    /*
2853     * General 32-bit SGET handler.
2854     *
2855     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2856     */
2857    /* op vAA, field@BBBB */
2858    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2859    FETCH(r1, 1)                        @ r1<- field ref BBBB
2860    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2861    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2862    cmp     r0, #0                      @ is resolved entry null?
2863    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
2864.LOP_SGET_SHORT_finish: @ field ptr in r0
2865    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2866    @ no-op                             @ acquiring load
2867    mov     r2, rINST, lsr #8           @ r2<- AA
2868    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2869    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2870    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2871    GOTO_OPCODE(ip)                     @ jump to next instruction
2872
2873
2874/* ------------------------------ */
2875    .balign 64
2876.L_OP_SPUT: /* 0x67 */
2877/* File: armv5te/OP_SPUT.S */
2878    /*
2879     * General 32-bit SPUT handler.
2880     *
2881     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2882     */
2883    /* op vAA, field@BBBB */
2884    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2885    FETCH(r1, 1)                        @ r1<- field ref BBBB
2886    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2887    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2888    cmp     r0, #0                      @ is resolved entry null?
2889    beq     .LOP_SPUT_resolve         @ yes, do resolve
2890.LOP_SPUT_finish:   @ field ptr in r0
2891    mov     r2, rINST, lsr #8           @ r2<- AA
2892    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2893    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2894    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2895    @ no-op                             @ releasing store
2896    str     r1, [r0, #offStaticField_value] @ field<- vAA
2897    GOTO_OPCODE(ip)                     @ jump to next instruction
2898
2899/* ------------------------------ */
2900    .balign 64
2901.L_OP_SPUT_WIDE: /* 0x68 */
2902/* File: armv5te/OP_SPUT_WIDE.S */
2903    /*
2904     * 64-bit SPUT handler.
2905     */
2906    /* sput-wide vAA, field@BBBB */
2907    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
2908    FETCH(r1, 1)                        @ r1<- field ref BBBB
2909    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2910    mov     r9, rINST, lsr #8           @ r9<- AA
2911    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
2912    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2913    cmp     r2, #0                      @ is resolved entry null?
2914    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
2915.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
2916    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2917    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
2918    GET_INST_OPCODE(r10)                @ extract opcode from rINST
2919    .if 0
2920    add     r2, r2, #offStaticField_value @ r2<- pointer to data
2921    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
2922    .else
2923    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
2924    .endif
2925    GOTO_OPCODE(r10)                    @ jump to next instruction
2926
2927/* ------------------------------ */
2928    .balign 64
2929.L_OP_SPUT_OBJECT: /* 0x69 */
2930/* File: armv5te/OP_SPUT_OBJECT.S */
2931    /*
2932     * 32-bit SPUT handler for objects
2933     *
2934     * for: sput-object, sput-object-volatile
2935     */
2936    /* op vAA, field@BBBB */
2937    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2938    FETCH(r1, 1)                        @ r1<- field ref BBBB
2939    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2940    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2941    cmp     r0, #0                      @ is resolved entry null?
2942    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
2943.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
2944    mov     r2, rINST, lsr #8           @ r2<- AA
2945    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2946    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2947    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
2948    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
2949    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2950    @ no-op                             @ releasing store
2951    b       .LOP_SPUT_OBJECT_end
2952
2953/* ------------------------------ */
2954    .balign 64
2955.L_OP_SPUT_BOOLEAN: /* 0x6a */
2956/* File: armv5te/OP_SPUT_BOOLEAN.S */
2957/* File: armv5te/OP_SPUT.S */
2958    /*
2959     * General 32-bit SPUT handler.
2960     *
2961     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2962     */
2963    /* op vAA, field@BBBB */
2964    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2965    FETCH(r1, 1)                        @ r1<- field ref BBBB
2966    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2967    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2968    cmp     r0, #0                      @ is resolved entry null?
2969    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
2970.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
2971    mov     r2, rINST, lsr #8           @ r2<- AA
2972    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2973    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2974    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2975    @ no-op                             @ releasing store
2976    str     r1, [r0, #offStaticField_value] @ field<- vAA
2977    GOTO_OPCODE(ip)                     @ jump to next instruction
2978
2979
2980/* ------------------------------ */
2981    .balign 64
2982.L_OP_SPUT_BYTE: /* 0x6b */
2983/* File: armv5te/OP_SPUT_BYTE.S */
2984/* File: armv5te/OP_SPUT.S */
2985    /*
2986     * General 32-bit SPUT handler.
2987     *
2988     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2989     */
2990    /* op vAA, field@BBBB */
2991    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2992    FETCH(r1, 1)                        @ r1<- field ref BBBB
2993    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2994    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2995    cmp     r0, #0                      @ is resolved entry null?
2996    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
2997.LOP_SPUT_BYTE_finish:   @ field ptr in r0
2998    mov     r2, rINST, lsr #8           @ r2<- AA
2999    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3000    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3001    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3002    @ no-op                             @ releasing store
3003    str     r1, [r0, #offStaticField_value] @ field<- vAA
3004    GOTO_OPCODE(ip)                     @ jump to next instruction
3005
3006
3007/* ------------------------------ */
3008    .balign 64
3009.L_OP_SPUT_CHAR: /* 0x6c */
3010/* File: armv5te/OP_SPUT_CHAR.S */
3011/* File: armv5te/OP_SPUT.S */
3012    /*
3013     * General 32-bit SPUT handler.
3014     *
3015     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3016     */
3017    /* op vAA, field@BBBB */
3018    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3019    FETCH(r1, 1)                        @ r1<- field ref BBBB
3020    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3021    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3022    cmp     r0, #0                      @ is resolved entry null?
3023    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3024.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3025    mov     r2, rINST, lsr #8           @ r2<- AA
3026    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3027    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3028    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3029    @ no-op                             @ releasing store
3030    str     r1, [r0, #offStaticField_value] @ field<- vAA
3031    GOTO_OPCODE(ip)                     @ jump to next instruction
3032
3033
3034/* ------------------------------ */
3035    .balign 64
3036.L_OP_SPUT_SHORT: /* 0x6d */
3037/* File: armv5te/OP_SPUT_SHORT.S */
3038/* File: armv5te/OP_SPUT.S */
3039    /*
3040     * General 32-bit SPUT handler.
3041     *
3042     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3043     */
3044    /* op vAA, field@BBBB */
3045    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3046    FETCH(r1, 1)                        @ r1<- field ref BBBB
3047    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3048    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3049    cmp     r0, #0                      @ is resolved entry null?
3050    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3051.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3052    mov     r2, rINST, lsr #8           @ r2<- AA
3053    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3054    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3055    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3056    @ no-op                             @ releasing store
3057    str     r1, [r0, #offStaticField_value] @ field<- vAA
3058    GOTO_OPCODE(ip)                     @ jump to next instruction
3059
3060
3061/* ------------------------------ */
3062    .balign 64
3063.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3064/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3065    /*
3066     * Handle a virtual method call.
3067     *
3068     * for: invoke-virtual, invoke-virtual/range
3069     */
3070    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3071    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3072    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3073    FETCH(r1, 1)                        @ r1<- BBBB
3074    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3075    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3076    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3077    .if     (!0)
3078    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3079    .endif
3080    cmp     r0, #0                      @ already resolved?
3081    EXPORT_PC()                         @ must export for invoke
3082    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3083    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3084    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3085    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3086    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3087    cmp     r0, #0                      @ got null?
3088    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3089    b       common_exceptionThrown      @ yes, handle exception
3090
3091/* ------------------------------ */
3092    .balign 64
3093.L_OP_INVOKE_SUPER: /* 0x6f */
3094/* File: armv5te/OP_INVOKE_SUPER.S */
3095    /*
3096     * Handle a "super" method call.
3097     *
3098     * for: invoke-super, invoke-super/range
3099     */
3100    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3101    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3102    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3103    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3104    .if     (!0)
3105    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3106    .endif
3107    FETCH(r1, 1)                        @ r1<- BBBB
3108    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3109    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3110    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3111    cmp     r9, #0                      @ null "this"?
3112    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3113    beq     common_errNullObject        @ null "this", throw exception
3114    cmp     r0, #0                      @ already resolved?
3115    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3116    EXPORT_PC()                         @ must export for invoke
3117    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3118    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3119
3120/* ------------------------------ */
3121    .balign 64
3122.L_OP_INVOKE_DIRECT: /* 0x70 */
3123/* File: armv5te/OP_INVOKE_DIRECT.S */
3124    /*
3125     * Handle a direct method call.
3126     *
3127     * (We could defer the "is 'this' pointer null" test to the common
3128     * method invocation code, and use a flag to indicate that static
3129     * calls don't count.  If we do this as part of copying the arguments
3130     * out we could avoiding loading the first arg twice.)
3131     *
3132     * for: invoke-direct, invoke-direct/range
3133     */
3134    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3135    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3136    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3137    FETCH(r1, 1)                        @ r1<- BBBB
3138    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3139    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3140    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3141    .if     (!0)
3142    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3143    .endif
3144    cmp     r0, #0                      @ already resolved?
3145    EXPORT_PC()                         @ must export for invoke
3146    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3147    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3148.LOP_INVOKE_DIRECT_finish:
3149    cmp     r9, #0                      @ null "this" ref?
3150    bne     common_invokeMethodNoRange   @ r0=method, r9="this"
3151    b       common_errNullObject        @ yes, throw exception
3152
3153/* ------------------------------ */
3154    .balign 64
3155.L_OP_INVOKE_STATIC: /* 0x71 */
3156/* File: armv5te/OP_INVOKE_STATIC.S */
3157    /*
3158     * Handle a static method call.
3159     *
3160     * for: invoke-static, invoke-static/range
3161     */
3162    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3163    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3164    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3165    FETCH(r1, 1)                        @ r1<- BBBB
3166    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3167    mov     r9, #0                      @ null "this" in delay slot
3168    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3169#if defined(WITH_JIT)
3170    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3171#endif
3172    cmp     r0, #0                      @ already resolved?
3173    EXPORT_PC()                         @ must export for invoke
3174    bne     common_invokeMethodNoRange @ yes, continue on
3175    b       .LOP_INVOKE_STATIC_resolve
3176
3177/* ------------------------------ */
3178    .balign 64
3179.L_OP_INVOKE_INTERFACE: /* 0x72 */
3180/* File: armv5te/OP_INVOKE_INTERFACE.S */
3181    /*
3182     * Handle an interface method call.
3183     *
3184     * for: invoke-interface, invoke-interface/range
3185     */
3186    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3187    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3188    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3189    FETCH(r1, 1)                        @ r1<- BBBB
3190    .if     (!0)
3191    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3192    .endif
3193    EXPORT_PC()                         @ must export for invoke
3194    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3195    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3196    cmp     r9, #0                      @ null obj?
3197    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3198    beq     common_errNullObject        @ yes, fail
3199    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3200    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3201    cmp     r0, #0                      @ failed?
3202    beq     common_exceptionThrown      @ yes, handle exception
3203    b       common_invokeMethodNoRange @ (r0=method, r9="this")
3204
3205/* ------------------------------ */
3206    .balign 64
3207.L_OP_UNUSED_73: /* 0x73 */
3208/* File: armv5te/OP_UNUSED_73.S */
3209/* File: armv5te/unused.S */
3210    bl      common_abort
3211
3212
3213/* ------------------------------ */
3214    .balign 64
3215.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3216/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3217/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3218    /*
3219     * Handle a virtual method call.
3220     *
3221     * for: invoke-virtual, invoke-virtual/range
3222     */
3223    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3224    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3225    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3226    FETCH(r1, 1)                        @ r1<- BBBB
3227    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3228    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3229    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3230    .if     (!1)
3231    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3232    .endif
3233    cmp     r0, #0                      @ already resolved?
3234    EXPORT_PC()                         @ must export for invoke
3235    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3236    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3237    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3238    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3239    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3240    cmp     r0, #0                      @ got null?
3241    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3242    b       common_exceptionThrown      @ yes, handle exception
3243
3244
3245/* ------------------------------ */
3246    .balign 64
3247.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3248/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3249/* File: armv5te/OP_INVOKE_SUPER.S */
3250    /*
3251     * Handle a "super" method call.
3252     *
3253     * for: invoke-super, invoke-super/range
3254     */
3255    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3256    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3257    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3258    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3259    .if     (!1)
3260    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3261    .endif
3262    FETCH(r1, 1)                        @ r1<- BBBB
3263    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3264    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3265    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3266    cmp     r9, #0                      @ null "this"?
3267    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3268    beq     common_errNullObject        @ null "this", throw exception
3269    cmp     r0, #0                      @ already resolved?
3270    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3271    EXPORT_PC()                         @ must export for invoke
3272    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3273    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3274
3275
3276/* ------------------------------ */
3277    .balign 64
3278.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3279/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3280/* File: armv5te/OP_INVOKE_DIRECT.S */
3281    /*
3282     * Handle a direct method call.
3283     *
3284     * (We could defer the "is 'this' pointer null" test to the common
3285     * method invocation code, and use a flag to indicate that static
3286     * calls don't count.  If we do this as part of copying the arguments
3287     * out we could avoiding loading the first arg twice.)
3288     *
3289     * for: invoke-direct, invoke-direct/range
3290     */
3291    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3292    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3293    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3294    FETCH(r1, 1)                        @ r1<- BBBB
3295    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3296    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3297    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3298    .if     (!1)
3299    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3300    .endif
3301    cmp     r0, #0                      @ already resolved?
3302    EXPORT_PC()                         @ must export for invoke
3303    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3304    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3305.LOP_INVOKE_DIRECT_RANGE_finish:
3306    cmp     r9, #0                      @ null "this" ref?
3307    bne     common_invokeMethodRange   @ r0=method, r9="this"
3308    b       common_errNullObject        @ yes, throw exception
3309
3310
3311/* ------------------------------ */
3312    .balign 64
3313.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3314/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3315/* File: armv5te/OP_INVOKE_STATIC.S */
3316    /*
3317     * Handle a static method call.
3318     *
3319     * for: invoke-static, invoke-static/range
3320     */
3321    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3322    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3323    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3324    FETCH(r1, 1)                        @ r1<- BBBB
3325    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3326    mov     r9, #0                      @ null "this" in delay slot
3327    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3328#if defined(WITH_JIT)
3329    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3330#endif
3331    cmp     r0, #0                      @ already resolved?
3332    EXPORT_PC()                         @ must export for invoke
3333    bne     common_invokeMethodRange @ yes, continue on
3334    b       .LOP_INVOKE_STATIC_RANGE_resolve
3335
3336
3337/* ------------------------------ */
3338    .balign 64
3339.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3340/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3341/* File: armv5te/OP_INVOKE_INTERFACE.S */
3342    /*
3343     * Handle an interface method call.
3344     *
3345     * for: invoke-interface, invoke-interface/range
3346     */
3347    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3348    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3349    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3350    FETCH(r1, 1)                        @ r1<- BBBB
3351    .if     (!1)
3352    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3353    .endif
3354    EXPORT_PC()                         @ must export for invoke
3355    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3356    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3357    cmp     r9, #0                      @ null obj?
3358    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3359    beq     common_errNullObject        @ yes, fail
3360    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3361    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3362    cmp     r0, #0                      @ failed?
3363    beq     common_exceptionThrown      @ yes, handle exception
3364    b       common_invokeMethodRange @ (r0=method, r9="this")
3365
3366
3367/* ------------------------------ */
3368    .balign 64
3369.L_OP_UNUSED_79: /* 0x79 */
3370/* File: armv5te/OP_UNUSED_79.S */
3371/* File: armv5te/unused.S */
3372    bl      common_abort
3373
3374
3375/* ------------------------------ */
3376    .balign 64
3377.L_OP_UNUSED_7A: /* 0x7a */
3378/* File: armv5te/OP_UNUSED_7A.S */
3379/* File: armv5te/unused.S */
3380    bl      common_abort
3381
3382
3383/* ------------------------------ */
3384    .balign 64
3385.L_OP_NEG_INT: /* 0x7b */
3386/* File: armv6t2/OP_NEG_INT.S */
3387/* File: armv6t2/unop.S */
3388    /*
3389     * Generic 32-bit unary operation.  Provide an "instr" line that
3390     * specifies an instruction that performs "result = op r0".
3391     * This could be an ARM instruction or a function call.
3392     *
3393     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3394     *      int-to-byte, int-to-char, int-to-short
3395     */
3396    /* unop vA, vB */
3397    mov     r3, rINST, lsr #12          @ r3<- B
3398    ubfx    r9, rINST, #8, #4           @ r9<- A
3399    GET_VREG(r0, r3)                    @ r0<- vB
3400                               @ optional op; may set condition codes
3401    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3402    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3403    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3404    SET_VREG(r0, r9)                    @ vAA<- r0
3405    GOTO_OPCODE(ip)                     @ jump to next instruction
3406    /* 8-9 instructions */
3407
3408
3409/* ------------------------------ */
3410    .balign 64
3411.L_OP_NOT_INT: /* 0x7c */
3412/* File: armv6t2/OP_NOT_INT.S */
3413/* File: armv6t2/unop.S */
3414    /*
3415     * Generic 32-bit unary operation.  Provide an "instr" line that
3416     * specifies an instruction that performs "result = op r0".
3417     * This could be an ARM instruction or a function call.
3418     *
3419     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3420     *      int-to-byte, int-to-char, int-to-short
3421     */
3422    /* unop vA, vB */
3423    mov     r3, rINST, lsr #12          @ r3<- B
3424    ubfx    r9, rINST, #8, #4           @ r9<- A
3425    GET_VREG(r0, r3)                    @ r0<- vB
3426                               @ optional op; may set condition codes
3427    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3428    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3429    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3430    SET_VREG(r0, r9)                    @ vAA<- r0
3431    GOTO_OPCODE(ip)                     @ jump to next instruction
3432    /* 8-9 instructions */
3433
3434
3435/* ------------------------------ */
3436    .balign 64
3437.L_OP_NEG_LONG: /* 0x7d */
3438/* File: armv6t2/OP_NEG_LONG.S */
3439/* File: armv6t2/unopWide.S */
3440    /*
3441     * Generic 64-bit unary operation.  Provide an "instr" line that
3442     * specifies an instruction that performs "result = op r0/r1".
3443     * This could be an ARM instruction or a function call.
3444     *
3445     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3446     */
3447    /* unop vA, vB */
3448    mov     r3, rINST, lsr #12          @ r3<- B
3449    ubfx    r9, rINST, #8, #4           @ r9<- A
3450    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3451    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3452    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3453    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3454    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3455    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3456    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3457    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3458    GOTO_OPCODE(ip)                     @ jump to next instruction
3459    /* 10-11 instructions */
3460
3461
3462/* ------------------------------ */
3463    .balign 64
3464.L_OP_NOT_LONG: /* 0x7e */
3465/* File: armv6t2/OP_NOT_LONG.S */
3466/* File: armv6t2/unopWide.S */
3467    /*
3468     * Generic 64-bit unary operation.  Provide an "instr" line that
3469     * specifies an instruction that performs "result = op r0/r1".
3470     * This could be an ARM instruction or a function call.
3471     *
3472     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3473     */
3474    /* unop vA, vB */
3475    mov     r3, rINST, lsr #12          @ r3<- B
3476    ubfx    r9, rINST, #8, #4           @ r9<- A
3477    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3478    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3479    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3480    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3481    mvn     r0, r0                           @ optional op; may set condition codes
3482    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3483    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3484    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3485    GOTO_OPCODE(ip)                     @ jump to next instruction
3486    /* 10-11 instructions */
3487
3488
3489/* ------------------------------ */
3490    .balign 64
3491.L_OP_NEG_FLOAT: /* 0x7f */
3492/* File: armv6t2/OP_NEG_FLOAT.S */
3493/* File: armv6t2/unop.S */
3494    /*
3495     * Generic 32-bit unary operation.  Provide an "instr" line that
3496     * specifies an instruction that performs "result = op r0".
3497     * This could be an ARM instruction or a function call.
3498     *
3499     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3500     *      int-to-byte, int-to-char, int-to-short
3501     */
3502    /* unop vA, vB */
3503    mov     r3, rINST, lsr #12          @ r3<- B
3504    ubfx    r9, rINST, #8, #4           @ r9<- A
3505    GET_VREG(r0, r3)                    @ r0<- vB
3506                               @ optional op; may set condition codes
3507    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3508    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3509    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3510    SET_VREG(r0, r9)                    @ vAA<- r0
3511    GOTO_OPCODE(ip)                     @ jump to next instruction
3512    /* 8-9 instructions */
3513
3514
3515/* ------------------------------ */
3516    .balign 64
3517.L_OP_NEG_DOUBLE: /* 0x80 */
3518/* File: armv6t2/OP_NEG_DOUBLE.S */
3519/* File: armv6t2/unopWide.S */
3520    /*
3521     * Generic 64-bit unary operation.  Provide an "instr" line that
3522     * specifies an instruction that performs "result = op r0/r1".
3523     * This could be an ARM instruction or a function call.
3524     *
3525     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3526     */
3527    /* unop vA, vB */
3528    mov     r3, rINST, lsr #12          @ r3<- B
3529    ubfx    r9, rINST, #8, #4           @ r9<- A
3530    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3531    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3532    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3533    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3534                               @ optional op; may set condition codes
3535    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3536    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3537    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3538    GOTO_OPCODE(ip)                     @ jump to next instruction
3539    /* 10-11 instructions */
3540
3541
3542/* ------------------------------ */
3543    .balign 64
3544.L_OP_INT_TO_LONG: /* 0x81 */
3545/* File: armv6t2/OP_INT_TO_LONG.S */
3546/* File: armv6t2/unopWider.S */
3547    /*
3548     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3549     * that specifies an instruction that performs "result = op r0", where
3550     * "result" is a 64-bit quantity in r0/r1.
3551     *
3552     * For: int-to-long, int-to-double, float-to-long, float-to-double
3553     */
3554    /* unop vA, vB */
3555    mov     r3, rINST, lsr #12          @ r3<- B
3556    ubfx    r9, rINST, #8, #4           @ r9<- A
3557    GET_VREG(r0, r3)                    @ r0<- vB
3558    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3559                               @ optional op; may set condition codes
3560    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3561    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3562    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3563    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3564    GOTO_OPCODE(ip)                     @ jump to next instruction
3565    /* 9-10 instructions */
3566
3567
3568/* ------------------------------ */
3569    .balign 64
3570.L_OP_INT_TO_FLOAT: /* 0x82 */
3571/* File: arm-vfp/OP_INT_TO_FLOAT.S */
3572/* File: arm-vfp/funop.S */
3573    /*
3574     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3575     * line that specifies an instruction that performs "s1 = op s0".
3576     *
3577     * for: int-to-float, float-to-int
3578     */
3579    /* unop vA, vB */
3580    mov     r3, rINST, lsr #12          @ r3<- B
3581    mov     r9, rINST, lsr #8           @ r9<- A+
3582    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3583    flds    s0, [r3]                    @ s0<- vB
3584    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3585    and     r9, r9, #15                 @ r9<- A
3586    fsitos  s1, s0                              @ s1<- op
3587    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3588    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3589    fsts    s1, [r9]                    @ vA<- s1
3590    GOTO_OPCODE(ip)                     @ jump to next instruction
3591
3592
3593/* ------------------------------ */
3594    .balign 64
3595.L_OP_INT_TO_DOUBLE: /* 0x83 */
3596/* File: arm-vfp/OP_INT_TO_DOUBLE.S */
3597/* File: arm-vfp/funopWider.S */
3598    /*
3599     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3600     * "instr" line that specifies an instruction that performs "d0 = op s0".
3601     *
3602     * For: int-to-double, float-to-double
3603     */
3604    /* unop vA, vB */
3605    mov     r3, rINST, lsr #12          @ r3<- B
3606    mov     r9, rINST, lsr #8           @ r9<- A+
3607    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3608    flds    s0, [r3]                    @ s0<- vB
3609    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3610    and     r9, r9, #15                 @ r9<- A
3611    fsitod  d0, s0                              @ d0<- op
3612    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3613    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3614    fstd    d0, [r9]                    @ vA<- d0
3615    GOTO_OPCODE(ip)                     @ jump to next instruction
3616
3617
3618/* ------------------------------ */
3619    .balign 64
3620.L_OP_LONG_TO_INT: /* 0x84 */
3621/* File: armv5te/OP_LONG_TO_INT.S */
3622/* we ignore the high word, making this equivalent to a 32-bit reg move */
3623/* File: armv5te/OP_MOVE.S */
3624    /* for move, move-object, long-to-int */
3625    /* op vA, vB */
3626    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3627    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3628    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3629    GET_VREG(r2, r1)                    @ r2<- fp[B]
3630    and     r0, r0, #15
3631    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3632    SET_VREG(r2, r0)                    @ fp[A]<- r2
3633    GOTO_OPCODE(ip)                     @ execute next instruction
3634
3635
3636/* ------------------------------ */
3637    .balign 64
3638.L_OP_LONG_TO_FLOAT: /* 0x85 */
3639/* File: armv6t2/OP_LONG_TO_FLOAT.S */
3640/* File: armv6t2/unopNarrower.S */
3641    /*
3642     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3643     * that specifies an instruction that performs "result = op r0/r1", where
3644     * "result" is a 32-bit quantity in r0.
3645     *
3646     * For: long-to-float, double-to-int, double-to-float
3647     *
3648     * (This would work for long-to-int, but that instruction is actually
3649     * an exact match for OP_MOVE.)
3650     */
3651    /* unop vA, vB */
3652    mov     r3, rINST, lsr #12          @ r3<- B
3653    ubfx    r9, rINST, #8, #4           @ r9<- A
3654    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3655    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3656    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3657                               @ optional op; may set condition codes
3658    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3659    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3660    SET_VREG(r0, r9)                    @ vA<- r0
3661    GOTO_OPCODE(ip)                     @ jump to next instruction
3662    /* 9-10 instructions */
3663
3664
3665/* ------------------------------ */
3666    .balign 64
3667.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3668/* File: armv6t2/OP_LONG_TO_DOUBLE.S */
3669/* File: armv6t2/unopWide.S */
3670    /*
3671     * Generic 64-bit unary operation.  Provide an "instr" line that
3672     * specifies an instruction that performs "result = op r0/r1".
3673     * This could be an ARM instruction or a function call.
3674     *
3675     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3676     */
3677    /* unop vA, vB */
3678    mov     r3, rINST, lsr #12          @ r3<- B
3679    ubfx    r9, rINST, #8, #4           @ r9<- A
3680    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3681    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3682    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3683    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3684                               @ optional op; may set condition codes
3685    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3686    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3687    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3688    GOTO_OPCODE(ip)                     @ jump to next instruction
3689    /* 10-11 instructions */
3690
3691
3692/* ------------------------------ */
3693    .balign 64
3694.L_OP_FLOAT_TO_INT: /* 0x87 */
3695/* File: arm-vfp/OP_FLOAT_TO_INT.S */
3696/* File: arm-vfp/funop.S */
3697    /*
3698     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3699     * line that specifies an instruction that performs "s1 = op s0".
3700     *
3701     * for: int-to-float, float-to-int
3702     */
3703    /* unop vA, vB */
3704    mov     r3, rINST, lsr #12          @ r3<- B
3705    mov     r9, rINST, lsr #8           @ r9<- A+
3706    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3707    flds    s0, [r3]                    @ s0<- vB
3708    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3709    and     r9, r9, #15                 @ r9<- A
3710    ftosizs s1, s0                              @ s1<- op
3711    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3712    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3713    fsts    s1, [r9]                    @ vA<- s1
3714    GOTO_OPCODE(ip)                     @ jump to next instruction
3715
3716
3717/* ------------------------------ */
3718    .balign 64
3719.L_OP_FLOAT_TO_LONG: /* 0x88 */
3720/* File: armv6t2/OP_FLOAT_TO_LONG.S */
3721@include "armv6t2/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3722/* File: armv6t2/unopWider.S */
3723    /*
3724     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3725     * that specifies an instruction that performs "result = op r0", where
3726     * "result" is a 64-bit quantity in r0/r1.
3727     *
3728     * For: int-to-long, int-to-double, float-to-long, float-to-double
3729     */
3730    /* unop vA, vB */
3731    mov     r3, rINST, lsr #12          @ r3<- B
3732    ubfx    r9, rINST, #8, #4           @ r9<- A
3733    GET_VREG(r0, r3)                    @ r0<- vB
3734    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3735                               @ optional op; may set condition codes
3736    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3737    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3738    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3739    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3740    GOTO_OPCODE(ip)                     @ jump to next instruction
3741    /* 9-10 instructions */
3742
3743
3744
3745/* ------------------------------ */
3746    .balign 64
3747.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3748/* File: arm-vfp/OP_FLOAT_TO_DOUBLE.S */
3749/* File: arm-vfp/funopWider.S */
3750    /*
3751     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3752     * "instr" line that specifies an instruction that performs "d0 = op s0".
3753     *
3754     * For: int-to-double, float-to-double
3755     */
3756    /* unop vA, vB */
3757    mov     r3, rINST, lsr #12          @ r3<- B
3758    mov     r9, rINST, lsr #8           @ r9<- A+
3759    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3760    flds    s0, [r3]                    @ s0<- vB
3761    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3762    and     r9, r9, #15                 @ r9<- A
3763    fcvtds  d0, s0                              @ d0<- op
3764    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3765    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3766    fstd    d0, [r9]                    @ vA<- d0
3767    GOTO_OPCODE(ip)                     @ jump to next instruction
3768
3769
3770/* ------------------------------ */
3771    .balign 64
3772.L_OP_DOUBLE_TO_INT: /* 0x8a */
3773/* File: arm-vfp/OP_DOUBLE_TO_INT.S */
3774/* File: arm-vfp/funopNarrower.S */
3775    /*
3776     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3777     * "instr" line that specifies an instruction that performs "s0 = op d0".
3778     *
3779     * For: double-to-int, double-to-float
3780     */
3781    /* unop vA, vB */
3782    mov     r3, rINST, lsr #12          @ r3<- B
3783    mov     r9, rINST, lsr #8           @ r9<- A+
3784    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3785    fldd    d0, [r3]                    @ d0<- vB
3786    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3787    and     r9, r9, #15                 @ r9<- A
3788    ftosizd  s0, d0                              @ s0<- op
3789    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3790    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3791    fsts    s0, [r9]                    @ vA<- s0
3792    GOTO_OPCODE(ip)                     @ jump to next instruction
3793
3794
3795/* ------------------------------ */
3796    .balign 64
3797.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3798/* File: armv6t2/OP_DOUBLE_TO_LONG.S */
3799@include "armv6t2/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
3800/* File: armv6t2/unopWide.S */
3801    /*
3802     * Generic 64-bit unary operation.  Provide an "instr" line that
3803     * specifies an instruction that performs "result = op r0/r1".
3804     * This could be an ARM instruction or a function call.
3805     *
3806     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3807     */
3808    /* unop vA, vB */
3809    mov     r3, rINST, lsr #12          @ r3<- B
3810    ubfx    r9, rINST, #8, #4           @ r9<- A
3811    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3812    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3813    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3814    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3815                               @ optional op; may set condition codes
3816    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
3817    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3818    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3819    GOTO_OPCODE(ip)                     @ jump to next instruction
3820    /* 10-11 instructions */
3821
3822
3823
3824/* ------------------------------ */
3825    .balign 64
3826.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3827/* File: arm-vfp/OP_DOUBLE_TO_FLOAT.S */
3828/* File: arm-vfp/funopNarrower.S */
3829    /*
3830     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3831     * "instr" line that specifies an instruction that performs "s0 = op d0".
3832     *
3833     * For: double-to-int, double-to-float
3834     */
3835    /* unop vA, vB */
3836    mov     r3, rINST, lsr #12          @ r3<- B
3837    mov     r9, rINST, lsr #8           @ r9<- A+
3838    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3839    fldd    d0, [r3]                    @ d0<- vB
3840    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3841    and     r9, r9, #15                 @ r9<- A
3842    fcvtsd  s0, d0                              @ s0<- op
3843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3844    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3845    fsts    s0, [r9]                    @ vA<- s0
3846    GOTO_OPCODE(ip)                     @ jump to next instruction
3847
3848
3849/* ------------------------------ */
3850    .balign 64
3851.L_OP_INT_TO_BYTE: /* 0x8d */
3852/* File: armv6t2/OP_INT_TO_BYTE.S */
3853/* File: armv6t2/unop.S */
3854    /*
3855     * Generic 32-bit unary operation.  Provide an "instr" line that
3856     * specifies an instruction that performs "result = op r0".
3857     * This could be an ARM instruction or a function call.
3858     *
3859     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3860     *      int-to-byte, int-to-char, int-to-short
3861     */
3862    /* unop vA, vB */
3863    mov     r3, rINST, lsr #12          @ r3<- B
3864    ubfx    r9, rINST, #8, #4           @ r9<- A
3865    GET_VREG(r0, r3)                    @ r0<- vB
3866                               @ optional op; may set condition codes
3867    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3868    sxtb    r0, r0                              @ r0<- op, r0-r3 changed
3869    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3870    SET_VREG(r0, r9)                    @ vAA<- r0
3871    GOTO_OPCODE(ip)                     @ jump to next instruction
3872    /* 8-9 instructions */
3873
3874
3875/* ------------------------------ */
3876    .balign 64
3877.L_OP_INT_TO_CHAR: /* 0x8e */
3878/* File: armv6t2/OP_INT_TO_CHAR.S */
3879/* File: armv6t2/unop.S */
3880    /*
3881     * Generic 32-bit unary operation.  Provide an "instr" line that
3882     * specifies an instruction that performs "result = op r0".
3883     * This could be an ARM instruction or a function call.
3884     *
3885     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3886     *      int-to-byte, int-to-char, int-to-short
3887     */
3888    /* unop vA, vB */
3889    mov     r3, rINST, lsr #12          @ r3<- B
3890    ubfx    r9, rINST, #8, #4           @ r9<- A
3891    GET_VREG(r0, r3)                    @ r0<- vB
3892                               @ optional op; may set condition codes
3893    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3894    uxth    r0, r0                              @ r0<- op, r0-r3 changed
3895    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3896    SET_VREG(r0, r9)                    @ vAA<- r0
3897    GOTO_OPCODE(ip)                     @ jump to next instruction
3898    /* 8-9 instructions */
3899
3900
3901/* ------------------------------ */
3902    .balign 64
3903.L_OP_INT_TO_SHORT: /* 0x8f */
3904/* File: armv6t2/OP_INT_TO_SHORT.S */
3905/* File: armv6t2/unop.S */
3906    /*
3907     * Generic 32-bit unary operation.  Provide an "instr" line that
3908     * specifies an instruction that performs "result = op r0".
3909     * This could be an ARM instruction or a function call.
3910     *
3911     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3912     *      int-to-byte, int-to-char, int-to-short
3913     */
3914    /* unop vA, vB */
3915    mov     r3, rINST, lsr #12          @ r3<- B
3916    ubfx    r9, rINST, #8, #4           @ r9<- A
3917    GET_VREG(r0, r3)                    @ r0<- vB
3918                               @ optional op; may set condition codes
3919    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3920    sxth    r0, r0                              @ r0<- op, r0-r3 changed
3921    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3922    SET_VREG(r0, r9)                    @ vAA<- r0
3923    GOTO_OPCODE(ip)                     @ jump to next instruction
3924    /* 8-9 instructions */
3925
3926
3927/* ------------------------------ */
3928    .balign 64
3929.L_OP_ADD_INT: /* 0x90 */
3930/* File: armv5te/OP_ADD_INT.S */
3931/* File: armv5te/binop.S */
3932    /*
3933     * Generic 32-bit binary operation.  Provide an "instr" line that
3934     * specifies an instruction that performs "result = r0 op r1".
3935     * This could be an ARM instruction or a function call.  (If the result
3936     * comes back in a register other than r0, you can override "result".)
3937     *
3938     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3939     * vCC (r1).  Useful for integer division and modulus.  Note that we
3940     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3941     * handles it correctly.
3942     *
3943     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3944     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3945     *      mul-float, div-float, rem-float
3946     */
3947    /* binop vAA, vBB, vCC */
3948    FETCH(r0, 1)                        @ r0<- CCBB
3949    mov     r9, rINST, lsr #8           @ r9<- AA
3950    mov     r3, r0, lsr #8              @ r3<- CC
3951    and     r2, r0, #255                @ r2<- BB
3952    GET_VREG(r1, r3)                    @ r1<- vCC
3953    GET_VREG(r0, r2)                    @ r0<- vBB
3954    .if 0
3955    cmp     r1, #0                      @ is second operand zero?
3956    beq     common_errDivideByZero
3957    .endif
3958
3959    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3960                               @ optional op; may set condition codes
3961    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
3962    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3963    SET_VREG(r0, r9)               @ vAA<- r0
3964    GOTO_OPCODE(ip)                     @ jump to next instruction
3965    /* 11-14 instructions */
3966
3967
3968/* ------------------------------ */
3969    .balign 64
3970.L_OP_SUB_INT: /* 0x91 */
3971/* File: armv5te/OP_SUB_INT.S */
3972/* File: armv5te/binop.S */
3973    /*
3974     * Generic 32-bit binary operation.  Provide an "instr" line that
3975     * specifies an instruction that performs "result = r0 op r1".
3976     * This could be an ARM instruction or a function call.  (If the result
3977     * comes back in a register other than r0, you can override "result".)
3978     *
3979     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3980     * vCC (r1).  Useful for integer division and modulus.  Note that we
3981     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3982     * handles it correctly.
3983     *
3984     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3985     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3986     *      mul-float, div-float, rem-float
3987     */
3988    /* binop vAA, vBB, vCC */
3989    FETCH(r0, 1)                        @ r0<- CCBB
3990    mov     r9, rINST, lsr #8           @ r9<- AA
3991    mov     r3, r0, lsr #8              @ r3<- CC
3992    and     r2, r0, #255                @ r2<- BB
3993    GET_VREG(r1, r3)                    @ r1<- vCC
3994    GET_VREG(r0, r2)                    @ r0<- vBB
3995    .if 0
3996    cmp     r1, #0                      @ is second operand zero?
3997    beq     common_errDivideByZero
3998    .endif
3999
4000    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4001                               @ optional op; may set condition codes
4002    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4003    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4004    SET_VREG(r0, r9)               @ vAA<- r0
4005    GOTO_OPCODE(ip)                     @ jump to next instruction
4006    /* 11-14 instructions */
4007
4008
4009/* ------------------------------ */
4010    .balign 64
4011.L_OP_MUL_INT: /* 0x92 */
4012/* File: armv5te/OP_MUL_INT.S */
4013/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4014/* File: armv5te/binop.S */
4015    /*
4016     * Generic 32-bit binary operation.  Provide an "instr" line that
4017     * specifies an instruction that performs "result = r0 op r1".
4018     * This could be an ARM instruction or a function call.  (If the result
4019     * comes back in a register other than r0, you can override "result".)
4020     *
4021     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4022     * vCC (r1).  Useful for integer division and modulus.  Note that we
4023     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4024     * handles it correctly.
4025     *
4026     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4027     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4028     *      mul-float, div-float, rem-float
4029     */
4030    /* binop vAA, vBB, vCC */
4031    FETCH(r0, 1)                        @ r0<- CCBB
4032    mov     r9, rINST, lsr #8           @ r9<- AA
4033    mov     r3, r0, lsr #8              @ r3<- CC
4034    and     r2, r0, #255                @ r2<- BB
4035    GET_VREG(r1, r3)                    @ r1<- vCC
4036    GET_VREG(r0, r2)                    @ r0<- vBB
4037    .if 0
4038    cmp     r1, #0                      @ is second operand zero?
4039    beq     common_errDivideByZero
4040    .endif
4041
4042    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4043                               @ optional op; may set condition codes
4044    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4045    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4046    SET_VREG(r0, r9)               @ vAA<- r0
4047    GOTO_OPCODE(ip)                     @ jump to next instruction
4048    /* 11-14 instructions */
4049
4050
4051/* ------------------------------ */
4052    .balign 64
4053.L_OP_DIV_INT: /* 0x93 */
4054/* File: armv5te/OP_DIV_INT.S */
4055/* File: armv5te/binop.S */
4056    /*
4057     * Generic 32-bit binary operation.  Provide an "instr" line that
4058     * specifies an instruction that performs "result = r0 op r1".
4059     * This could be an ARM instruction or a function call.  (If the result
4060     * comes back in a register other than r0, you can override "result".)
4061     *
4062     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4063     * vCC (r1).  Useful for integer division and modulus.  Note that we
4064     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4065     * handles it correctly.
4066     *
4067     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4068     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4069     *      mul-float, div-float, rem-float
4070     */
4071    /* binop vAA, vBB, vCC */
4072    FETCH(r0, 1)                        @ r0<- CCBB
4073    mov     r9, rINST, lsr #8           @ r9<- AA
4074    mov     r3, r0, lsr #8              @ r3<- CC
4075    and     r2, r0, #255                @ r2<- BB
4076    GET_VREG(r1, r3)                    @ r1<- vCC
4077    GET_VREG(r0, r2)                    @ r0<- vBB
4078    .if 1
4079    cmp     r1, #0                      @ is second operand zero?
4080    beq     common_errDivideByZero
4081    .endif
4082
4083    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4084                               @ optional op; may set condition codes
4085    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4086    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4087    SET_VREG(r0, r9)               @ vAA<- r0
4088    GOTO_OPCODE(ip)                     @ jump to next instruction
4089    /* 11-14 instructions */
4090
4091
4092/* ------------------------------ */
4093    .balign 64
4094.L_OP_REM_INT: /* 0x94 */
4095/* File: armv5te/OP_REM_INT.S */
4096/* idivmod returns quotient in r0 and remainder in r1 */
4097/* File: armv5te/binop.S */
4098    /*
4099     * Generic 32-bit binary operation.  Provide an "instr" line that
4100     * specifies an instruction that performs "result = r0 op r1".
4101     * This could be an ARM instruction or a function call.  (If the result
4102     * comes back in a register other than r0, you can override "result".)
4103     *
4104     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4105     * vCC (r1).  Useful for integer division and modulus.  Note that we
4106     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4107     * handles it correctly.
4108     *
4109     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4110     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4111     *      mul-float, div-float, rem-float
4112     */
4113    /* binop vAA, vBB, vCC */
4114    FETCH(r0, 1)                        @ r0<- CCBB
4115    mov     r9, rINST, lsr #8           @ r9<- AA
4116    mov     r3, r0, lsr #8              @ r3<- CC
4117    and     r2, r0, #255                @ r2<- BB
4118    GET_VREG(r1, r3)                    @ r1<- vCC
4119    GET_VREG(r0, r2)                    @ r0<- vBB
4120    .if 1
4121    cmp     r1, #0                      @ is second operand zero?
4122    beq     common_errDivideByZero
4123    .endif
4124
4125    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4126                               @ optional op; may set condition codes
4127    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4128    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4129    SET_VREG(r1, r9)               @ vAA<- r1
4130    GOTO_OPCODE(ip)                     @ jump to next instruction
4131    /* 11-14 instructions */
4132
4133
4134/* ------------------------------ */
4135    .balign 64
4136.L_OP_AND_INT: /* 0x95 */
4137/* File: armv5te/OP_AND_INT.S */
4138/* File: armv5te/binop.S */
4139    /*
4140     * Generic 32-bit binary operation.  Provide an "instr" line that
4141     * specifies an instruction that performs "result = r0 op r1".
4142     * This could be an ARM instruction or a function call.  (If the result
4143     * comes back in a register other than r0, you can override "result".)
4144     *
4145     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4146     * vCC (r1).  Useful for integer division and modulus.  Note that we
4147     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4148     * handles it correctly.
4149     *
4150     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4151     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4152     *      mul-float, div-float, rem-float
4153     */
4154    /* binop vAA, vBB, vCC */
4155    FETCH(r0, 1)                        @ r0<- CCBB
4156    mov     r9, rINST, lsr #8           @ r9<- AA
4157    mov     r3, r0, lsr #8              @ r3<- CC
4158    and     r2, r0, #255                @ r2<- BB
4159    GET_VREG(r1, r3)                    @ r1<- vCC
4160    GET_VREG(r0, r2)                    @ r0<- vBB
4161    .if 0
4162    cmp     r1, #0                      @ is second operand zero?
4163    beq     common_errDivideByZero
4164    .endif
4165
4166    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4167                               @ optional op; may set condition codes
4168    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4169    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4170    SET_VREG(r0, r9)               @ vAA<- r0
4171    GOTO_OPCODE(ip)                     @ jump to next instruction
4172    /* 11-14 instructions */
4173
4174
4175/* ------------------------------ */
4176    .balign 64
4177.L_OP_OR_INT: /* 0x96 */
4178/* File: armv5te/OP_OR_INT.S */
4179/* File: armv5te/binop.S */
4180    /*
4181     * Generic 32-bit binary operation.  Provide an "instr" line that
4182     * specifies an instruction that performs "result = r0 op r1".
4183     * This could be an ARM instruction or a function call.  (If the result
4184     * comes back in a register other than r0, you can override "result".)
4185     *
4186     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4187     * vCC (r1).  Useful for integer division and modulus.  Note that we
4188     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4189     * handles it correctly.
4190     *
4191     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4192     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4193     *      mul-float, div-float, rem-float
4194     */
4195    /* binop vAA, vBB, vCC */
4196    FETCH(r0, 1)                        @ r0<- CCBB
4197    mov     r9, rINST, lsr #8           @ r9<- AA
4198    mov     r3, r0, lsr #8              @ r3<- CC
4199    and     r2, r0, #255                @ r2<- BB
4200    GET_VREG(r1, r3)                    @ r1<- vCC
4201    GET_VREG(r0, r2)                    @ r0<- vBB
4202    .if 0
4203    cmp     r1, #0                      @ is second operand zero?
4204    beq     common_errDivideByZero
4205    .endif
4206
4207    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4208                               @ optional op; may set condition codes
4209    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4210    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4211    SET_VREG(r0, r9)               @ vAA<- r0
4212    GOTO_OPCODE(ip)                     @ jump to next instruction
4213    /* 11-14 instructions */
4214
4215
4216/* ------------------------------ */
4217    .balign 64
4218.L_OP_XOR_INT: /* 0x97 */
4219/* File: armv5te/OP_XOR_INT.S */
4220/* File: armv5te/binop.S */
4221    /*
4222     * Generic 32-bit binary operation.  Provide an "instr" line that
4223     * specifies an instruction that performs "result = r0 op r1".
4224     * This could be an ARM instruction or a function call.  (If the result
4225     * comes back in a register other than r0, you can override "result".)
4226     *
4227     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4228     * vCC (r1).  Useful for integer division and modulus.  Note that we
4229     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4230     * handles it correctly.
4231     *
4232     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4233     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4234     *      mul-float, div-float, rem-float
4235     */
4236    /* binop vAA, vBB, vCC */
4237    FETCH(r0, 1)                        @ r0<- CCBB
4238    mov     r9, rINST, lsr #8           @ r9<- AA
4239    mov     r3, r0, lsr #8              @ r3<- CC
4240    and     r2, r0, #255                @ r2<- BB
4241    GET_VREG(r1, r3)                    @ r1<- vCC
4242    GET_VREG(r0, r2)                    @ r0<- vBB
4243    .if 0
4244    cmp     r1, #0                      @ is second operand zero?
4245    beq     common_errDivideByZero
4246    .endif
4247
4248    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4249                               @ optional op; may set condition codes
4250    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4251    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4252    SET_VREG(r0, r9)               @ vAA<- r0
4253    GOTO_OPCODE(ip)                     @ jump to next instruction
4254    /* 11-14 instructions */
4255
4256
4257/* ------------------------------ */
4258    .balign 64
4259.L_OP_SHL_INT: /* 0x98 */
4260/* File: armv5te/OP_SHL_INT.S */
4261/* File: armv5te/binop.S */
4262    /*
4263     * Generic 32-bit binary operation.  Provide an "instr" line that
4264     * specifies an instruction that performs "result = r0 op r1".
4265     * This could be an ARM instruction or a function call.  (If the result
4266     * comes back in a register other than r0, you can override "result".)
4267     *
4268     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4269     * vCC (r1).  Useful for integer division and modulus.  Note that we
4270     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4271     * handles it correctly.
4272     *
4273     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4274     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4275     *      mul-float, div-float, rem-float
4276     */
4277    /* binop vAA, vBB, vCC */
4278    FETCH(r0, 1)                        @ r0<- CCBB
4279    mov     r9, rINST, lsr #8           @ r9<- AA
4280    mov     r3, r0, lsr #8              @ r3<- CC
4281    and     r2, r0, #255                @ r2<- BB
4282    GET_VREG(r1, r3)                    @ r1<- vCC
4283    GET_VREG(r0, r2)                    @ r0<- vBB
4284    .if 0
4285    cmp     r1, #0                      @ is second operand zero?
4286    beq     common_errDivideByZero
4287    .endif
4288
4289    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4290    and     r1, r1, #31                           @ optional op; may set condition codes
4291    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4292    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4293    SET_VREG(r0, r9)               @ vAA<- r0
4294    GOTO_OPCODE(ip)                     @ jump to next instruction
4295    /* 11-14 instructions */
4296
4297
4298/* ------------------------------ */
4299    .balign 64
4300.L_OP_SHR_INT: /* 0x99 */
4301/* File: armv5te/OP_SHR_INT.S */
4302/* File: armv5te/binop.S */
4303    /*
4304     * Generic 32-bit binary operation.  Provide an "instr" line that
4305     * specifies an instruction that performs "result = r0 op r1".
4306     * This could be an ARM instruction or a function call.  (If the result
4307     * comes back in a register other than r0, you can override "result".)
4308     *
4309     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4310     * vCC (r1).  Useful for integer division and modulus.  Note that we
4311     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4312     * handles it correctly.
4313     *
4314     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4315     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4316     *      mul-float, div-float, rem-float
4317     */
4318    /* binop vAA, vBB, vCC */
4319    FETCH(r0, 1)                        @ r0<- CCBB
4320    mov     r9, rINST, lsr #8           @ r9<- AA
4321    mov     r3, r0, lsr #8              @ r3<- CC
4322    and     r2, r0, #255                @ r2<- BB
4323    GET_VREG(r1, r3)                    @ r1<- vCC
4324    GET_VREG(r0, r2)                    @ r0<- vBB
4325    .if 0
4326    cmp     r1, #0                      @ is second operand zero?
4327    beq     common_errDivideByZero
4328    .endif
4329
4330    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4331    and     r1, r1, #31                           @ optional op; may set condition codes
4332    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4333    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4334    SET_VREG(r0, r9)               @ vAA<- r0
4335    GOTO_OPCODE(ip)                     @ jump to next instruction
4336    /* 11-14 instructions */
4337
4338
4339/* ------------------------------ */
4340    .balign 64
4341.L_OP_USHR_INT: /* 0x9a */
4342/* File: armv5te/OP_USHR_INT.S */
4343/* File: armv5te/binop.S */
4344    /*
4345     * Generic 32-bit binary operation.  Provide an "instr" line that
4346     * specifies an instruction that performs "result = r0 op r1".
4347     * This could be an ARM instruction or a function call.  (If the result
4348     * comes back in a register other than r0, you can override "result".)
4349     *
4350     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4351     * vCC (r1).  Useful for integer division and modulus.  Note that we
4352     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4353     * handles it correctly.
4354     *
4355     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4356     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4357     *      mul-float, div-float, rem-float
4358     */
4359    /* binop vAA, vBB, vCC */
4360    FETCH(r0, 1)                        @ r0<- CCBB
4361    mov     r9, rINST, lsr #8           @ r9<- AA
4362    mov     r3, r0, lsr #8              @ r3<- CC
4363    and     r2, r0, #255                @ r2<- BB
4364    GET_VREG(r1, r3)                    @ r1<- vCC
4365    GET_VREG(r0, r2)                    @ r0<- vBB
4366    .if 0
4367    cmp     r1, #0                      @ is second operand zero?
4368    beq     common_errDivideByZero
4369    .endif
4370
4371    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4372    and     r1, r1, #31                           @ optional op; may set condition codes
4373    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4374    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4375    SET_VREG(r0, r9)               @ vAA<- r0
4376    GOTO_OPCODE(ip)                     @ jump to next instruction
4377    /* 11-14 instructions */
4378
4379
4380/* ------------------------------ */
4381    .balign 64
4382.L_OP_ADD_LONG: /* 0x9b */
4383/* File: armv5te/OP_ADD_LONG.S */
4384/* File: armv5te/binopWide.S */
4385    /*
4386     * Generic 64-bit binary operation.  Provide an "instr" line that
4387     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4388     * This could be an ARM instruction or a function call.  (If the result
4389     * comes back in a register other than r0, you can override "result".)
4390     *
4391     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4392     * vCC (r1).  Useful for integer division and modulus.
4393     *
4394     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4395     *      xor-long, add-double, sub-double, mul-double, div-double,
4396     *      rem-double
4397     *
4398     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4399     */
4400    /* binop vAA, vBB, vCC */
4401    FETCH(r0, 1)                        @ r0<- CCBB
4402    mov     r9, rINST, lsr #8           @ r9<- AA
4403    and     r2, r0, #255                @ r2<- BB
4404    mov     r3, r0, lsr #8              @ r3<- CC
4405    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4406    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4407    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4408    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4409    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4410    .if 0
4411    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4412    beq     common_errDivideByZero
4413    .endif
4414    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4415
4416    adds    r0, r0, r2                           @ optional op; may set condition codes
4417    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4418    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4419    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4420    GOTO_OPCODE(ip)                     @ jump to next instruction
4421    /* 14-17 instructions */
4422
4423
4424/* ------------------------------ */
4425    .balign 64
4426.L_OP_SUB_LONG: /* 0x9c */
4427/* File: armv5te/OP_SUB_LONG.S */
4428/* File: armv5te/binopWide.S */
4429    /*
4430     * Generic 64-bit binary operation.  Provide an "instr" line that
4431     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4432     * This could be an ARM instruction or a function call.  (If the result
4433     * comes back in a register other than r0, you can override "result".)
4434     *
4435     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4436     * vCC (r1).  Useful for integer division and modulus.
4437     *
4438     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4439     *      xor-long, add-double, sub-double, mul-double, div-double,
4440     *      rem-double
4441     *
4442     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4443     */
4444    /* binop vAA, vBB, vCC */
4445    FETCH(r0, 1)                        @ r0<- CCBB
4446    mov     r9, rINST, lsr #8           @ r9<- AA
4447    and     r2, r0, #255                @ r2<- BB
4448    mov     r3, r0, lsr #8              @ r3<- CC
4449    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4450    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4451    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4452    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4453    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4454    .if 0
4455    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4456    beq     common_errDivideByZero
4457    .endif
4458    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4459
4460    subs    r0, r0, r2                           @ optional op; may set condition codes
4461    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4462    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4463    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4464    GOTO_OPCODE(ip)                     @ jump to next instruction
4465    /* 14-17 instructions */
4466
4467
4468/* ------------------------------ */
4469    .balign 64
4470.L_OP_MUL_LONG: /* 0x9d */
4471/* File: armv5te/OP_MUL_LONG.S */
4472    /*
4473     * Signed 64-bit integer multiply.
4474     *
4475     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4476     *        WX
4477     *      x YZ
4478     *  --------
4479     *     ZW ZX
4480     *  YW YX
4481     *
4482     * The low word of the result holds ZX, the high word holds
4483     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4484     * it doesn't fit in the low 64 bits.
4485     *
4486     * Unlike most ARM math operations, multiply instructions have
4487     * restrictions on using the same register more than once (Rd and Rm
4488     * cannot be the same).
4489     */
4490    /* mul-long vAA, vBB, vCC */
4491    FETCH(r0, 1)                        @ r0<- CCBB
4492    and     r2, r0, #255                @ r2<- BB
4493    mov     r3, r0, lsr #8              @ r3<- CC
4494    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4495    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4496    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4497    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4498    mul     ip, r2, r1                  @  ip<- ZxW
4499    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4500    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4501    mov     r0, rINST, lsr #8           @ r0<- AA
4502    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4503    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4504    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4505    b       .LOP_MUL_LONG_finish
4506
4507/* ------------------------------ */
4508    .balign 64
4509.L_OP_DIV_LONG: /* 0x9e */
4510/* File: armv5te/OP_DIV_LONG.S */
4511/* File: armv5te/binopWide.S */
4512    /*
4513     * Generic 64-bit binary operation.  Provide an "instr" line that
4514     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4515     * This could be an ARM instruction or a function call.  (If the result
4516     * comes back in a register other than r0, you can override "result".)
4517     *
4518     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4519     * vCC (r1).  Useful for integer division and modulus.
4520     *
4521     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4522     *      xor-long, add-double, sub-double, mul-double, div-double,
4523     *      rem-double
4524     *
4525     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4526     */
4527    /* binop vAA, vBB, vCC */
4528    FETCH(r0, 1)                        @ r0<- CCBB
4529    mov     r9, rINST, lsr #8           @ r9<- AA
4530    and     r2, r0, #255                @ r2<- BB
4531    mov     r3, r0, lsr #8              @ r3<- CC
4532    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4533    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4534    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4535    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4536    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4537    .if 1
4538    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4539    beq     common_errDivideByZero
4540    .endif
4541    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4542
4543                               @ optional op; may set condition codes
4544    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4545    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4546    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4547    GOTO_OPCODE(ip)                     @ jump to next instruction
4548    /* 14-17 instructions */
4549
4550
4551/* ------------------------------ */
4552    .balign 64
4553.L_OP_REM_LONG: /* 0x9f */
4554/* File: armv5te/OP_REM_LONG.S */
4555/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4556/* File: armv5te/binopWide.S */
4557    /*
4558     * Generic 64-bit binary operation.  Provide an "instr" line that
4559     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4560     * This could be an ARM instruction or a function call.  (If the result
4561     * comes back in a register other than r0, you can override "result".)
4562     *
4563     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4564     * vCC (r1).  Useful for integer division and modulus.
4565     *
4566     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4567     *      xor-long, add-double, sub-double, mul-double, div-double,
4568     *      rem-double
4569     *
4570     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4571     */
4572    /* binop vAA, vBB, vCC */
4573    FETCH(r0, 1)                        @ r0<- CCBB
4574    mov     r9, rINST, lsr #8           @ r9<- AA
4575    and     r2, r0, #255                @ r2<- BB
4576    mov     r3, r0, lsr #8              @ r3<- CC
4577    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4578    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4579    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4580    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4581    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4582    .if 1
4583    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4584    beq     common_errDivideByZero
4585    .endif
4586    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4587
4588                               @ optional op; may set condition codes
4589    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4590    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4591    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4592    GOTO_OPCODE(ip)                     @ jump to next instruction
4593    /* 14-17 instructions */
4594
4595
4596/* ------------------------------ */
4597    .balign 64
4598.L_OP_AND_LONG: /* 0xa0 */
4599/* File: armv5te/OP_AND_LONG.S */
4600/* File: armv5te/binopWide.S */
4601    /*
4602     * Generic 64-bit binary operation.  Provide an "instr" line that
4603     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4604     * This could be an ARM instruction or a function call.  (If the result
4605     * comes back in a register other than r0, you can override "result".)
4606     *
4607     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4608     * vCC (r1).  Useful for integer division and modulus.
4609     *
4610     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4611     *      xor-long, add-double, sub-double, mul-double, div-double,
4612     *      rem-double
4613     *
4614     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4615     */
4616    /* binop vAA, vBB, vCC */
4617    FETCH(r0, 1)                        @ r0<- CCBB
4618    mov     r9, rINST, lsr #8           @ r9<- AA
4619    and     r2, r0, #255                @ r2<- BB
4620    mov     r3, r0, lsr #8              @ r3<- CC
4621    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4622    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4623    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4624    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4625    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4626    .if 0
4627    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4628    beq     common_errDivideByZero
4629    .endif
4630    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4631
4632    and     r0, r0, r2                           @ optional op; may set condition codes
4633    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4634    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4635    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4636    GOTO_OPCODE(ip)                     @ jump to next instruction
4637    /* 14-17 instructions */
4638
4639
4640/* ------------------------------ */
4641    .balign 64
4642.L_OP_OR_LONG: /* 0xa1 */
4643/* File: armv5te/OP_OR_LONG.S */
4644/* File: armv5te/binopWide.S */
4645    /*
4646     * Generic 64-bit binary operation.  Provide an "instr" line that
4647     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4648     * This could be an ARM instruction or a function call.  (If the result
4649     * comes back in a register other than r0, you can override "result".)
4650     *
4651     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4652     * vCC (r1).  Useful for integer division and modulus.
4653     *
4654     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4655     *      xor-long, add-double, sub-double, mul-double, div-double,
4656     *      rem-double
4657     *
4658     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4659     */
4660    /* binop vAA, vBB, vCC */
4661    FETCH(r0, 1)                        @ r0<- CCBB
4662    mov     r9, rINST, lsr #8           @ r9<- AA
4663    and     r2, r0, #255                @ r2<- BB
4664    mov     r3, r0, lsr #8              @ r3<- CC
4665    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4666    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4667    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4668    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4669    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4670    .if 0
4671    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4672    beq     common_errDivideByZero
4673    .endif
4674    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4675
4676    orr     r0, r0, r2                           @ optional op; may set condition codes
4677    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4678    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4679    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4680    GOTO_OPCODE(ip)                     @ jump to next instruction
4681    /* 14-17 instructions */
4682
4683
4684/* ------------------------------ */
4685    .balign 64
4686.L_OP_XOR_LONG: /* 0xa2 */
4687/* File: armv5te/OP_XOR_LONG.S */
4688/* File: armv5te/binopWide.S */
4689    /*
4690     * Generic 64-bit binary operation.  Provide an "instr" line that
4691     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4692     * This could be an ARM instruction or a function call.  (If the result
4693     * comes back in a register other than r0, you can override "result".)
4694     *
4695     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4696     * vCC (r1).  Useful for integer division and modulus.
4697     *
4698     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4699     *      xor-long, add-double, sub-double, mul-double, div-double,
4700     *      rem-double
4701     *
4702     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4703     */
4704    /* binop vAA, vBB, vCC */
4705    FETCH(r0, 1)                        @ r0<- CCBB
4706    mov     r9, rINST, lsr #8           @ r9<- AA
4707    and     r2, r0, #255                @ r2<- BB
4708    mov     r3, r0, lsr #8              @ r3<- CC
4709    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4710    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4711    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4712    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4713    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4714    .if 0
4715    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4716    beq     common_errDivideByZero
4717    .endif
4718    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4719
4720    eor     r0, r0, r2                           @ optional op; may set condition codes
4721    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4722    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4723    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4724    GOTO_OPCODE(ip)                     @ jump to next instruction
4725    /* 14-17 instructions */
4726
4727
4728/* ------------------------------ */
4729    .balign 64
4730.L_OP_SHL_LONG: /* 0xa3 */
4731/* File: armv5te/OP_SHL_LONG.S */
4732    /*
4733     * Long integer shift.  This is different from the generic 32/64-bit
4734     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4735     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4736     * 6 bits of the shift distance.
4737     */
4738    /* shl-long vAA, vBB, vCC */
4739    FETCH(r0, 1)                        @ r0<- CCBB
4740    mov     r9, rINST, lsr #8           @ r9<- AA
4741    and     r3, r0, #255                @ r3<- BB
4742    mov     r0, r0, lsr #8              @ r0<- CC
4743    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4744    GET_VREG(r2, r0)                    @ r2<- vCC
4745    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4746    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4747    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4748
4749    mov     r1, r1, asl r2              @  r1<- r1 << r2
4750    rsb     r3, r2, #32                 @  r3<- 32 - r2
4751    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
4752    subs    ip, r2, #32                 @  ip<- r2 - 32
4753    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
4754    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4755    b       .LOP_SHL_LONG_finish
4756
4757/* ------------------------------ */
4758    .balign 64
4759.L_OP_SHR_LONG: /* 0xa4 */
4760/* File: armv5te/OP_SHR_LONG.S */
4761    /*
4762     * Long integer shift.  This is different from the generic 32/64-bit
4763     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4764     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4765     * 6 bits of the shift distance.
4766     */
4767    /* shr-long vAA, vBB, vCC */
4768    FETCH(r0, 1)                        @ r0<- CCBB
4769    mov     r9, rINST, lsr #8           @ r9<- AA
4770    and     r3, r0, #255                @ r3<- BB
4771    mov     r0, r0, lsr #8              @ r0<- CC
4772    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4773    GET_VREG(r2, r0)                    @ r2<- vCC
4774    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4775    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4776    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4777
4778    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4779    rsb     r3, r2, #32                 @  r3<- 32 - r2
4780    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4781    subs    ip, r2, #32                 @  ip<- r2 - 32
4782    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
4783    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4784    b       .LOP_SHR_LONG_finish
4785
4786/* ------------------------------ */
4787    .balign 64
4788.L_OP_USHR_LONG: /* 0xa5 */
4789/* File: armv5te/OP_USHR_LONG.S */
4790    /*
4791     * Long integer shift.  This is different from the generic 32/64-bit
4792     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4793     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4794     * 6 bits of the shift distance.
4795     */
4796    /* ushr-long vAA, vBB, vCC */
4797    FETCH(r0, 1)                        @ r0<- CCBB
4798    mov     r9, rINST, lsr #8           @ r9<- AA
4799    and     r3, r0, #255                @ r3<- BB
4800    mov     r0, r0, lsr #8              @ r0<- CC
4801    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4802    GET_VREG(r2, r0)                    @ r2<- vCC
4803    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4804    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4805    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4806
4807    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4808    rsb     r3, r2, #32                 @  r3<- 32 - r2
4809    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4810    subs    ip, r2, #32                 @  ip<- r2 - 32
4811    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
4812    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4813    b       .LOP_USHR_LONG_finish
4814
4815/* ------------------------------ */
4816    .balign 64
4817.L_OP_ADD_FLOAT: /* 0xa6 */
4818/* File: arm-vfp/OP_ADD_FLOAT.S */
4819/* File: arm-vfp/fbinop.S */
4820    /*
4821     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4822     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4823     * use the "softfp" ABI, this must be an instruction, not a function call.
4824     *
4825     * For: add-float, sub-float, mul-float, div-float
4826     */
4827    /* floatop vAA, vBB, vCC */
4828    FETCH(r0, 1)                        @ r0<- CCBB
4829    mov     r9, rINST, lsr #8           @ r9<- AA
4830    mov     r3, r0, lsr #8              @ r3<- CC
4831    and     r2, r0, #255                @ r2<- BB
4832    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4833    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4834    flds    s1, [r3]                    @ s1<- vCC
4835    flds    s0, [r2]                    @ s0<- vBB
4836
4837    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4838    fadds   s2, s0, s1                              @ s2<- op
4839    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4840    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4841    fsts    s2, [r9]                    @ vAA<- s2
4842    GOTO_OPCODE(ip)                     @ jump to next instruction
4843
4844
4845/* ------------------------------ */
4846    .balign 64
4847.L_OP_SUB_FLOAT: /* 0xa7 */
4848/* File: arm-vfp/OP_SUB_FLOAT.S */
4849/* File: arm-vfp/fbinop.S */
4850    /*
4851     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4852     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4853     * use the "softfp" ABI, this must be an instruction, not a function call.
4854     *
4855     * For: add-float, sub-float, mul-float, div-float
4856     */
4857    /* floatop vAA, vBB, vCC */
4858    FETCH(r0, 1)                        @ r0<- CCBB
4859    mov     r9, rINST, lsr #8           @ r9<- AA
4860    mov     r3, r0, lsr #8              @ r3<- CC
4861    and     r2, r0, #255                @ r2<- BB
4862    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4863    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4864    flds    s1, [r3]                    @ s1<- vCC
4865    flds    s0, [r2]                    @ s0<- vBB
4866
4867    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4868    fsubs   s2, s0, s1                              @ s2<- op
4869    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4870    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4871    fsts    s2, [r9]                    @ vAA<- s2
4872    GOTO_OPCODE(ip)                     @ jump to next instruction
4873
4874
4875/* ------------------------------ */
4876    .balign 64
4877.L_OP_MUL_FLOAT: /* 0xa8 */
4878/* File: arm-vfp/OP_MUL_FLOAT.S */
4879/* File: arm-vfp/fbinop.S */
4880    /*
4881     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4882     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4883     * use the "softfp" ABI, this must be an instruction, not a function call.
4884     *
4885     * For: add-float, sub-float, mul-float, div-float
4886     */
4887    /* floatop vAA, vBB, vCC */
4888    FETCH(r0, 1)                        @ r0<- CCBB
4889    mov     r9, rINST, lsr #8           @ r9<- AA
4890    mov     r3, r0, lsr #8              @ r3<- CC
4891    and     r2, r0, #255                @ r2<- BB
4892    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4893    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4894    flds    s1, [r3]                    @ s1<- vCC
4895    flds    s0, [r2]                    @ s0<- vBB
4896
4897    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4898    fmuls   s2, s0, s1                              @ s2<- op
4899    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4900    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4901    fsts    s2, [r9]                    @ vAA<- s2
4902    GOTO_OPCODE(ip)                     @ jump to next instruction
4903
4904
4905/* ------------------------------ */
4906    .balign 64
4907.L_OP_DIV_FLOAT: /* 0xa9 */
4908/* File: arm-vfp/OP_DIV_FLOAT.S */
4909/* File: arm-vfp/fbinop.S */
4910    /*
4911     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4912     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4913     * use the "softfp" ABI, this must be an instruction, not a function call.
4914     *
4915     * For: add-float, sub-float, mul-float, div-float
4916     */
4917    /* floatop vAA, vBB, vCC */
4918    FETCH(r0, 1)                        @ r0<- CCBB
4919    mov     r9, rINST, lsr #8           @ r9<- AA
4920    mov     r3, r0, lsr #8              @ r3<- CC
4921    and     r2, r0, #255                @ r2<- BB
4922    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4923    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4924    flds    s1, [r3]                    @ s1<- vCC
4925    flds    s0, [r2]                    @ s0<- vBB
4926
4927    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4928    fdivs   s2, s0, s1                              @ s2<- op
4929    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4930    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4931    fsts    s2, [r9]                    @ vAA<- s2
4932    GOTO_OPCODE(ip)                     @ jump to next instruction
4933
4934
4935/* ------------------------------ */
4936    .balign 64
4937.L_OP_REM_FLOAT: /* 0xaa */
4938/* File: armv5te/OP_REM_FLOAT.S */
4939/* EABI doesn't define a float remainder function, but libm does */
4940/* File: armv5te/binop.S */
4941    /*
4942     * Generic 32-bit binary operation.  Provide an "instr" line that
4943     * specifies an instruction that performs "result = r0 op r1".
4944     * This could be an ARM instruction or a function call.  (If the result
4945     * comes back in a register other than r0, you can override "result".)
4946     *
4947     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4948     * vCC (r1).  Useful for integer division and modulus.  Note that we
4949     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4950     * handles it correctly.
4951     *
4952     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4953     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4954     *      mul-float, div-float, rem-float
4955     */
4956    /* binop vAA, vBB, vCC */
4957    FETCH(r0, 1)                        @ r0<- CCBB
4958    mov     r9, rINST, lsr #8           @ r9<- AA
4959    mov     r3, r0, lsr #8              @ r3<- CC
4960    and     r2, r0, #255                @ r2<- BB
4961    GET_VREG(r1, r3)                    @ r1<- vCC
4962    GET_VREG(r0, r2)                    @ r0<- vBB
4963    .if 0
4964    cmp     r1, #0                      @ is second operand zero?
4965    beq     common_errDivideByZero
4966    .endif
4967
4968    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4969                               @ optional op; may set condition codes
4970    bl      fmodf                              @ r0<- op, r0-r3 changed
4971    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4972    SET_VREG(r0, r9)               @ vAA<- r0
4973    GOTO_OPCODE(ip)                     @ jump to next instruction
4974    /* 11-14 instructions */
4975
4976
4977/* ------------------------------ */
4978    .balign 64
4979.L_OP_ADD_DOUBLE: /* 0xab */
4980/* File: arm-vfp/OP_ADD_DOUBLE.S */
4981/* File: arm-vfp/fbinopWide.S */
4982    /*
4983     * Generic 64-bit double-precision floating point binary operation.
4984     * Provide an "instr" line that specifies an instruction that performs
4985     * "d2 = d0 op d1".
4986     *
4987     * for: add-double, sub-double, mul-double, div-double
4988     */
4989    /* doubleop vAA, vBB, vCC */
4990    FETCH(r0, 1)                        @ r0<- CCBB
4991    mov     r9, rINST, lsr #8           @ r9<- AA
4992    mov     r3, r0, lsr #8              @ r3<- CC
4993    and     r2, r0, #255                @ r2<- BB
4994    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4995    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4996    fldd    d1, [r3]                    @ d1<- vCC
4997    fldd    d0, [r2]                    @ d0<- vBB
4998
4999    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5000    faddd   d2, d0, d1                              @ s2<- op
5001    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5002    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5003    fstd    d2, [r9]                    @ vAA<- d2
5004    GOTO_OPCODE(ip)                     @ jump to next instruction
5005
5006
5007/* ------------------------------ */
5008    .balign 64
5009.L_OP_SUB_DOUBLE: /* 0xac */
5010/* File: arm-vfp/OP_SUB_DOUBLE.S */
5011/* File: arm-vfp/fbinopWide.S */
5012    /*
5013     * Generic 64-bit double-precision floating point binary operation.
5014     * Provide an "instr" line that specifies an instruction that performs
5015     * "d2 = d0 op d1".
5016     *
5017     * for: add-double, sub-double, mul-double, div-double
5018     */
5019    /* doubleop vAA, vBB, vCC */
5020    FETCH(r0, 1)                        @ r0<- CCBB
5021    mov     r9, rINST, lsr #8           @ r9<- AA
5022    mov     r3, r0, lsr #8              @ r3<- CC
5023    and     r2, r0, #255                @ r2<- BB
5024    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5025    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5026    fldd    d1, [r3]                    @ d1<- vCC
5027    fldd    d0, [r2]                    @ d0<- vBB
5028
5029    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5030    fsubd   d2, d0, d1                              @ s2<- op
5031    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5032    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5033    fstd    d2, [r9]                    @ vAA<- d2
5034    GOTO_OPCODE(ip)                     @ jump to next instruction
5035
5036
5037/* ------------------------------ */
5038    .balign 64
5039.L_OP_MUL_DOUBLE: /* 0xad */
5040/* File: arm-vfp/OP_MUL_DOUBLE.S */
5041/* File: arm-vfp/fbinopWide.S */
5042    /*
5043     * Generic 64-bit double-precision floating point binary operation.
5044     * Provide an "instr" line that specifies an instruction that performs
5045     * "d2 = d0 op d1".
5046     *
5047     * for: add-double, sub-double, mul-double, div-double
5048     */
5049    /* doubleop vAA, vBB, vCC */
5050    FETCH(r0, 1)                        @ r0<- CCBB
5051    mov     r9, rINST, lsr #8           @ r9<- AA
5052    mov     r3, r0, lsr #8              @ r3<- CC
5053    and     r2, r0, #255                @ r2<- BB
5054    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5055    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5056    fldd    d1, [r3]                    @ d1<- vCC
5057    fldd    d0, [r2]                    @ d0<- vBB
5058
5059    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5060    fmuld   d2, d0, d1                              @ s2<- op
5061    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5062    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5063    fstd    d2, [r9]                    @ vAA<- d2
5064    GOTO_OPCODE(ip)                     @ jump to next instruction
5065
5066
5067/* ------------------------------ */
5068    .balign 64
5069.L_OP_DIV_DOUBLE: /* 0xae */
5070/* File: arm-vfp/OP_DIV_DOUBLE.S */
5071/* File: arm-vfp/fbinopWide.S */
5072    /*
5073     * Generic 64-bit double-precision floating point binary operation.
5074     * Provide an "instr" line that specifies an instruction that performs
5075     * "d2 = d0 op d1".
5076     *
5077     * for: add-double, sub-double, mul-double, div-double
5078     */
5079    /* doubleop vAA, vBB, vCC */
5080    FETCH(r0, 1)                        @ r0<- CCBB
5081    mov     r9, rINST, lsr #8           @ r9<- AA
5082    mov     r3, r0, lsr #8              @ r3<- CC
5083    and     r2, r0, #255                @ r2<- BB
5084    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5085    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5086    fldd    d1, [r3]                    @ d1<- vCC
5087    fldd    d0, [r2]                    @ d0<- vBB
5088
5089    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5090    fdivd   d2, d0, d1                              @ s2<- op
5091    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5092    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5093    fstd    d2, [r9]                    @ vAA<- d2
5094    GOTO_OPCODE(ip)                     @ jump to next instruction
5095
5096
5097/* ------------------------------ */
5098    .balign 64
5099.L_OP_REM_DOUBLE: /* 0xaf */
5100/* File: armv5te/OP_REM_DOUBLE.S */
5101/* EABI doesn't define a double remainder function, but libm does */
5102/* File: armv5te/binopWide.S */
5103    /*
5104     * Generic 64-bit binary operation.  Provide an "instr" line that
5105     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5106     * This could be an ARM instruction or a function call.  (If the result
5107     * comes back in a register other than r0, you can override "result".)
5108     *
5109     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5110     * vCC (r1).  Useful for integer division and modulus.
5111     *
5112     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5113     *      xor-long, add-double, sub-double, mul-double, div-double,
5114     *      rem-double
5115     *
5116     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5117     */
5118    /* binop vAA, vBB, vCC */
5119    FETCH(r0, 1)                        @ r0<- CCBB
5120    mov     r9, rINST, lsr #8           @ r9<- AA
5121    and     r2, r0, #255                @ r2<- BB
5122    mov     r3, r0, lsr #8              @ r3<- CC
5123    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5124    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5125    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5126    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5127    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5128    .if 0
5129    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5130    beq     common_errDivideByZero
5131    .endif
5132    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5133
5134                               @ optional op; may set condition codes
5135    bl      fmod                              @ result<- op, r0-r3 changed
5136    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5137    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5138    GOTO_OPCODE(ip)                     @ jump to next instruction
5139    /* 14-17 instructions */
5140
5141
5142/* ------------------------------ */
5143    .balign 64
5144.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5145/* File: armv6t2/OP_ADD_INT_2ADDR.S */
5146/* File: armv6t2/binop2addr.S */
5147    /*
5148     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5149     * that specifies an instruction that performs "result = r0 op r1".
5150     * This could be an ARM instruction or a function call.  (If the result
5151     * comes back in a register other than r0, you can override "result".)
5152     *
5153     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5154     * vCC (r1).  Useful for integer division and modulus.
5155     *
5156     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5157     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5158     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5159     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5160     */
5161    /* binop/2addr vA, vB */
5162    mov     r3, rINST, lsr #12          @ r3<- B
5163    ubfx    r9, rINST, #8, #4           @ r9<- A
5164    GET_VREG(r1, r3)                    @ r1<- vB
5165    GET_VREG(r0, r9)                    @ r0<- vA
5166    .if 0
5167    cmp     r1, #0                      @ is second operand zero?
5168    beq     common_errDivideByZero
5169    .endif
5170    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5171
5172                               @ optional op; may set condition codes
5173    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5174    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5175    SET_VREG(r0, r9)               @ vAA<- r0
5176    GOTO_OPCODE(ip)                     @ jump to next instruction
5177    /* 10-13 instructions */
5178
5179
5180/* ------------------------------ */
5181    .balign 64
5182.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5183/* File: armv6t2/OP_SUB_INT_2ADDR.S */
5184/* File: armv6t2/binop2addr.S */
5185    /*
5186     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5187     * that specifies an instruction that performs "result = r0 op r1".
5188     * This could be an ARM instruction or a function call.  (If the result
5189     * comes back in a register other than r0, you can override "result".)
5190     *
5191     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5192     * vCC (r1).  Useful for integer division and modulus.
5193     *
5194     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5195     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5196     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5197     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5198     */
5199    /* binop/2addr vA, vB */
5200    mov     r3, rINST, lsr #12          @ r3<- B
5201    ubfx    r9, rINST, #8, #4           @ r9<- A
5202    GET_VREG(r1, r3)                    @ r1<- vB
5203    GET_VREG(r0, r9)                    @ r0<- vA
5204    .if 0
5205    cmp     r1, #0                      @ is second operand zero?
5206    beq     common_errDivideByZero
5207    .endif
5208    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5209
5210                               @ optional op; may set condition codes
5211    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5212    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5213    SET_VREG(r0, r9)               @ vAA<- r0
5214    GOTO_OPCODE(ip)                     @ jump to next instruction
5215    /* 10-13 instructions */
5216
5217
5218/* ------------------------------ */
5219    .balign 64
5220.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5221/* File: armv6t2/OP_MUL_INT_2ADDR.S */
5222/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5223/* File: armv6t2/binop2addr.S */
5224    /*
5225     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5226     * that specifies an instruction that performs "result = r0 op r1".
5227     * This could be an ARM instruction or a function call.  (If the result
5228     * comes back in a register other than r0, you can override "result".)
5229     *
5230     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5231     * vCC (r1).  Useful for integer division and modulus.
5232     *
5233     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5234     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5235     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5236     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5237     */
5238    /* binop/2addr vA, vB */
5239    mov     r3, rINST, lsr #12          @ r3<- B
5240    ubfx    r9, rINST, #8, #4           @ r9<- A
5241    GET_VREG(r1, r3)                    @ r1<- vB
5242    GET_VREG(r0, r9)                    @ r0<- vA
5243    .if 0
5244    cmp     r1, #0                      @ is second operand zero?
5245    beq     common_errDivideByZero
5246    .endif
5247    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5248
5249                               @ optional op; may set condition codes
5250    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5251    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5252    SET_VREG(r0, r9)               @ vAA<- r0
5253    GOTO_OPCODE(ip)                     @ jump to next instruction
5254    /* 10-13 instructions */
5255
5256
5257/* ------------------------------ */
5258    .balign 64
5259.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5260/* File: armv6t2/OP_DIV_INT_2ADDR.S */
5261/* File: armv6t2/binop2addr.S */
5262    /*
5263     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5264     * that specifies an instruction that performs "result = r0 op r1".
5265     * This could be an ARM instruction or a function call.  (If the result
5266     * comes back in a register other than r0, you can override "result".)
5267     *
5268     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5269     * vCC (r1).  Useful for integer division and modulus.
5270     *
5271     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5272     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5273     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5274     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5275     */
5276    /* binop/2addr vA, vB */
5277    mov     r3, rINST, lsr #12          @ r3<- B
5278    ubfx    r9, rINST, #8, #4           @ r9<- A
5279    GET_VREG(r1, r3)                    @ r1<- vB
5280    GET_VREG(r0, r9)                    @ r0<- vA
5281    .if 1
5282    cmp     r1, #0                      @ is second operand zero?
5283    beq     common_errDivideByZero
5284    .endif
5285    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5286
5287                               @ optional op; may set condition codes
5288    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5289    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5290    SET_VREG(r0, r9)               @ vAA<- r0
5291    GOTO_OPCODE(ip)                     @ jump to next instruction
5292    /* 10-13 instructions */
5293
5294
5295/* ------------------------------ */
5296    .balign 64
5297.L_OP_REM_INT_2ADDR: /* 0xb4 */
5298/* File: armv6t2/OP_REM_INT_2ADDR.S */
5299/* idivmod returns quotient in r0 and remainder in r1 */
5300/* File: armv6t2/binop2addr.S */
5301    /*
5302     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5303     * that specifies an instruction that performs "result = r0 op r1".
5304     * This could be an ARM instruction or a function call.  (If the result
5305     * comes back in a register other than r0, you can override "result".)
5306     *
5307     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5308     * vCC (r1).  Useful for integer division and modulus.
5309     *
5310     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5311     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5312     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5313     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5314     */
5315    /* binop/2addr vA, vB */
5316    mov     r3, rINST, lsr #12          @ r3<- B
5317    ubfx    r9, rINST, #8, #4           @ r9<- A
5318    GET_VREG(r1, r3)                    @ r1<- vB
5319    GET_VREG(r0, r9)                    @ r0<- vA
5320    .if 1
5321    cmp     r1, #0                      @ is second operand zero?
5322    beq     common_errDivideByZero
5323    .endif
5324    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5325
5326                               @ optional op; may set condition codes
5327    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5328    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5329    SET_VREG(r1, r9)               @ vAA<- r1
5330    GOTO_OPCODE(ip)                     @ jump to next instruction
5331    /* 10-13 instructions */
5332
5333
5334/* ------------------------------ */
5335    .balign 64
5336.L_OP_AND_INT_2ADDR: /* 0xb5 */
5337/* File: armv6t2/OP_AND_INT_2ADDR.S */
5338/* File: armv6t2/binop2addr.S */
5339    /*
5340     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5341     * that specifies an instruction that performs "result = r0 op r1".
5342     * This could be an ARM instruction or a function call.  (If the result
5343     * comes back in a register other than r0, you can override "result".)
5344     *
5345     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5346     * vCC (r1).  Useful for integer division and modulus.
5347     *
5348     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5349     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5350     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5351     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5352     */
5353    /* binop/2addr vA, vB */
5354    mov     r3, rINST, lsr #12          @ r3<- B
5355    ubfx    r9, rINST, #8, #4           @ r9<- A
5356    GET_VREG(r1, r3)                    @ r1<- vB
5357    GET_VREG(r0, r9)                    @ r0<- vA
5358    .if 0
5359    cmp     r1, #0                      @ is second operand zero?
5360    beq     common_errDivideByZero
5361    .endif
5362    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5363
5364                               @ optional op; may set condition codes
5365    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5366    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5367    SET_VREG(r0, r9)               @ vAA<- r0
5368    GOTO_OPCODE(ip)                     @ jump to next instruction
5369    /* 10-13 instructions */
5370
5371
5372/* ------------------------------ */
5373    .balign 64
5374.L_OP_OR_INT_2ADDR: /* 0xb6 */
5375/* File: armv6t2/OP_OR_INT_2ADDR.S */
5376/* File: armv6t2/binop2addr.S */
5377    /*
5378     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5379     * that specifies an instruction that performs "result = r0 op r1".
5380     * This could be an ARM instruction or a function call.  (If the result
5381     * comes back in a register other than r0, you can override "result".)
5382     *
5383     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5384     * vCC (r1).  Useful for integer division and modulus.
5385     *
5386     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5387     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5388     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5389     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5390     */
5391    /* binop/2addr vA, vB */
5392    mov     r3, rINST, lsr #12          @ r3<- B
5393    ubfx    r9, rINST, #8, #4           @ r9<- A
5394    GET_VREG(r1, r3)                    @ r1<- vB
5395    GET_VREG(r0, r9)                    @ r0<- vA
5396    .if 0
5397    cmp     r1, #0                      @ is second operand zero?
5398    beq     common_errDivideByZero
5399    .endif
5400    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5401
5402                               @ optional op; may set condition codes
5403    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5404    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5405    SET_VREG(r0, r9)               @ vAA<- r0
5406    GOTO_OPCODE(ip)                     @ jump to next instruction
5407    /* 10-13 instructions */
5408
5409
5410/* ------------------------------ */
5411    .balign 64
5412.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5413/* File: armv6t2/OP_XOR_INT_2ADDR.S */
5414/* File: armv6t2/binop2addr.S */
5415    /*
5416     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5417     * that specifies an instruction that performs "result = r0 op r1".
5418     * This could be an ARM instruction or a function call.  (If the result
5419     * comes back in a register other than r0, you can override "result".)
5420     *
5421     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5422     * vCC (r1).  Useful for integer division and modulus.
5423     *
5424     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5425     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5426     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5427     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5428     */
5429    /* binop/2addr vA, vB */
5430    mov     r3, rINST, lsr #12          @ r3<- B
5431    ubfx    r9, rINST, #8, #4           @ r9<- A
5432    GET_VREG(r1, r3)                    @ r1<- vB
5433    GET_VREG(r0, r9)                    @ r0<- vA
5434    .if 0
5435    cmp     r1, #0                      @ is second operand zero?
5436    beq     common_errDivideByZero
5437    .endif
5438    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5439
5440                               @ optional op; may set condition codes
5441    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5442    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5443    SET_VREG(r0, r9)               @ vAA<- r0
5444    GOTO_OPCODE(ip)                     @ jump to next instruction
5445    /* 10-13 instructions */
5446
5447
5448/* ------------------------------ */
5449    .balign 64
5450.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5451/* File: armv6t2/OP_SHL_INT_2ADDR.S */
5452/* File: armv6t2/binop2addr.S */
5453    /*
5454     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5455     * that specifies an instruction that performs "result = r0 op r1".
5456     * This could be an ARM instruction or a function call.  (If the result
5457     * comes back in a register other than r0, you can override "result".)
5458     *
5459     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5460     * vCC (r1).  Useful for integer division and modulus.
5461     *
5462     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5463     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5464     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5465     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5466     */
5467    /* binop/2addr vA, vB */
5468    mov     r3, rINST, lsr #12          @ r3<- B
5469    ubfx    r9, rINST, #8, #4           @ r9<- A
5470    GET_VREG(r1, r3)                    @ r1<- vB
5471    GET_VREG(r0, r9)                    @ r0<- vA
5472    .if 0
5473    cmp     r1, #0                      @ is second operand zero?
5474    beq     common_errDivideByZero
5475    .endif
5476    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5477
5478    and     r1, r1, #31                           @ optional op; may set condition codes
5479    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5480    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5481    SET_VREG(r0, r9)               @ vAA<- r0
5482    GOTO_OPCODE(ip)                     @ jump to next instruction
5483    /* 10-13 instructions */
5484
5485
5486/* ------------------------------ */
5487    .balign 64
5488.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5489/* File: armv6t2/OP_SHR_INT_2ADDR.S */
5490/* File: armv6t2/binop2addr.S */
5491    /*
5492     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5493     * that specifies an instruction that performs "result = r0 op r1".
5494     * This could be an ARM instruction or a function call.  (If the result
5495     * comes back in a register other than r0, you can override "result".)
5496     *
5497     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5498     * vCC (r1).  Useful for integer division and modulus.
5499     *
5500     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5501     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5502     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5503     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5504     */
5505    /* binop/2addr vA, vB */
5506    mov     r3, rINST, lsr #12          @ r3<- B
5507    ubfx    r9, rINST, #8, #4           @ r9<- A
5508    GET_VREG(r1, r3)                    @ r1<- vB
5509    GET_VREG(r0, r9)                    @ r0<- vA
5510    .if 0
5511    cmp     r1, #0                      @ is second operand zero?
5512    beq     common_errDivideByZero
5513    .endif
5514    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5515
5516    and     r1, r1, #31                           @ optional op; may set condition codes
5517    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5518    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5519    SET_VREG(r0, r9)               @ vAA<- r0
5520    GOTO_OPCODE(ip)                     @ jump to next instruction
5521    /* 10-13 instructions */
5522
5523
5524/* ------------------------------ */
5525    .balign 64
5526.L_OP_USHR_INT_2ADDR: /* 0xba */
5527/* File: armv6t2/OP_USHR_INT_2ADDR.S */
5528/* File: armv6t2/binop2addr.S */
5529    /*
5530     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5531     * that specifies an instruction that performs "result = r0 op r1".
5532     * This could be an ARM instruction or a function call.  (If the result
5533     * comes back in a register other than r0, you can override "result".)
5534     *
5535     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5536     * vCC (r1).  Useful for integer division and modulus.
5537     *
5538     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5539     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5540     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5541     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5542     */
5543    /* binop/2addr vA, vB */
5544    mov     r3, rINST, lsr #12          @ r3<- B
5545    ubfx    r9, rINST, #8, #4           @ r9<- A
5546    GET_VREG(r1, r3)                    @ r1<- vB
5547    GET_VREG(r0, r9)                    @ r0<- vA
5548    .if 0
5549    cmp     r1, #0                      @ is second operand zero?
5550    beq     common_errDivideByZero
5551    .endif
5552    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5553
5554    and     r1, r1, #31                           @ optional op; may set condition codes
5555    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5556    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5557    SET_VREG(r0, r9)               @ vAA<- r0
5558    GOTO_OPCODE(ip)                     @ jump to next instruction
5559    /* 10-13 instructions */
5560
5561
5562/* ------------------------------ */
5563    .balign 64
5564.L_OP_ADD_LONG_2ADDR: /* 0xbb */
5565/* File: armv6t2/OP_ADD_LONG_2ADDR.S */
5566/* File: armv6t2/binopWide2addr.S */
5567    /*
5568     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5569     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5570     * This could be an ARM instruction or a function call.  (If the result
5571     * comes back in a register other than r0, you can override "result".)
5572     *
5573     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5574     * vCC (r1).  Useful for integer division and modulus.
5575     *
5576     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5577     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5578     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5579     *      rem-double/2addr
5580     */
5581    /* binop/2addr vA, vB */
5582    mov     r1, rINST, lsr #12          @ r1<- B
5583    ubfx    r9, rINST, #8, #4           @ r9<- A
5584    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5585    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5586    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5587    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5588    .if 0
5589    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5590    beq     common_errDivideByZero
5591    .endif
5592    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5593
5594    adds    r0, r0, r2                           @ optional op; may set condition codes
5595    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5596    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5597    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5598    GOTO_OPCODE(ip)                     @ jump to next instruction
5599    /* 12-15 instructions */
5600
5601
5602/* ------------------------------ */
5603    .balign 64
5604.L_OP_SUB_LONG_2ADDR: /* 0xbc */
5605/* File: armv6t2/OP_SUB_LONG_2ADDR.S */
5606/* File: armv6t2/binopWide2addr.S */
5607    /*
5608     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5609     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5610     * This could be an ARM instruction or a function call.  (If the result
5611     * comes back in a register other than r0, you can override "result".)
5612     *
5613     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5614     * vCC (r1).  Useful for integer division and modulus.
5615     *
5616     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5617     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5618     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5619     *      rem-double/2addr
5620     */
5621    /* binop/2addr vA, vB */
5622    mov     r1, rINST, lsr #12          @ r1<- B
5623    ubfx    r9, rINST, #8, #4           @ r9<- A
5624    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5625    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5626    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5627    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5628    .if 0
5629    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5630    beq     common_errDivideByZero
5631    .endif
5632    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5633
5634    subs    r0, r0, r2                           @ optional op; may set condition codes
5635    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5636    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5637    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5638    GOTO_OPCODE(ip)                     @ jump to next instruction
5639    /* 12-15 instructions */
5640
5641
5642/* ------------------------------ */
5643    .balign 64
5644.L_OP_MUL_LONG_2ADDR: /* 0xbd */
5645/* File: armv6t2/OP_MUL_LONG_2ADDR.S */
5646    /*
5647     * Signed 64-bit integer multiply, "/2addr" version.
5648     *
5649     * See OP_MUL_LONG for an explanation.
5650     *
5651     * We get a little tight on registers, so to avoid looking up &fp[A]
5652     * again we stuff it into rINST.
5653     */
5654    /* mul-long/2addr vA, vB */
5655    mov     r1, rINST, lsr #12          @ r1<- B
5656    ubfx    r9, rINST, #8, #4           @ r9<- A
5657    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5658    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
5659    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5660    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
5661    mul     ip, r2, r1                  @  ip<- ZxW
5662    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
5663    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
5664    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
5665    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5666    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
5667    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5668    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
5669    GOTO_OPCODE(ip)                     @ jump to next instruction
5670
5671/* ------------------------------ */
5672    .balign 64
5673.L_OP_DIV_LONG_2ADDR: /* 0xbe */
5674/* File: armv6t2/OP_DIV_LONG_2ADDR.S */
5675/* File: armv6t2/binopWide2addr.S */
5676    /*
5677     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5678     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5679     * This could be an ARM instruction or a function call.  (If the result
5680     * comes back in a register other than r0, you can override "result".)
5681     *
5682     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5683     * vCC (r1).  Useful for integer division and modulus.
5684     *
5685     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5686     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5687     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5688     *      rem-double/2addr
5689     */
5690    /* binop/2addr vA, vB */
5691    mov     r1, rINST, lsr #12          @ r1<- B
5692    ubfx    r9, rINST, #8, #4           @ r9<- A
5693    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5694    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5695    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5696    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5697    .if 1
5698    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5699    beq     common_errDivideByZero
5700    .endif
5701    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5702
5703                               @ optional op; may set condition codes
5704    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5705    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5706    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5707    GOTO_OPCODE(ip)                     @ jump to next instruction
5708    /* 12-15 instructions */
5709
5710
5711/* ------------------------------ */
5712    .balign 64
5713.L_OP_REM_LONG_2ADDR: /* 0xbf */
5714/* File: armv6t2/OP_REM_LONG_2ADDR.S */
5715/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5716/* File: armv6t2/binopWide2addr.S */
5717    /*
5718     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5719     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5720     * This could be an ARM instruction or a function call.  (If the result
5721     * comes back in a register other than r0, you can override "result".)
5722     *
5723     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5724     * vCC (r1).  Useful for integer division and modulus.
5725     *
5726     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5727     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5728     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5729     *      rem-double/2addr
5730     */
5731    /* binop/2addr vA, vB */
5732    mov     r1, rINST, lsr #12          @ r1<- B
5733    ubfx    r9, rINST, #8, #4           @ r9<- A
5734    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5735    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5736    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5737    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5738    .if 1
5739    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5740    beq     common_errDivideByZero
5741    .endif
5742    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5743
5744                               @ optional op; may set condition codes
5745    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5746    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5747    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
5748    GOTO_OPCODE(ip)                     @ jump to next instruction
5749    /* 12-15 instructions */
5750
5751
5752/* ------------------------------ */
5753    .balign 64
5754.L_OP_AND_LONG_2ADDR: /* 0xc0 */
5755/* File: armv6t2/OP_AND_LONG_2ADDR.S */
5756/* File: armv6t2/binopWide2addr.S */
5757    /*
5758     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5759     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5760     * This could be an ARM instruction or a function call.  (If the result
5761     * comes back in a register other than r0, you can override "result".)
5762     *
5763     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5764     * vCC (r1).  Useful for integer division and modulus.
5765     *
5766     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5767     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5768     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5769     *      rem-double/2addr
5770     */
5771    /* binop/2addr vA, vB */
5772    mov     r1, rINST, lsr #12          @ r1<- B
5773    ubfx    r9, rINST, #8, #4           @ r9<- A
5774    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5775    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5776    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5777    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5778    .if 0
5779    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5780    beq     common_errDivideByZero
5781    .endif
5782    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5783
5784    and     r0, r0, r2                           @ optional op; may set condition codes
5785    and     r1, r1, r3                              @ result<- op, r0-r3 changed
5786    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5787    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5788    GOTO_OPCODE(ip)                     @ jump to next instruction
5789    /* 12-15 instructions */
5790
5791
5792/* ------------------------------ */
5793    .balign 64
5794.L_OP_OR_LONG_2ADDR: /* 0xc1 */
5795/* File: armv6t2/OP_OR_LONG_2ADDR.S */
5796/* File: armv6t2/binopWide2addr.S */
5797    /*
5798     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5799     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5800     * This could be an ARM instruction or a function call.  (If the result
5801     * comes back in a register other than r0, you can override "result".)
5802     *
5803     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5804     * vCC (r1).  Useful for integer division and modulus.
5805     *
5806     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5807     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5808     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5809     *      rem-double/2addr
5810     */
5811    /* binop/2addr vA, vB */
5812    mov     r1, rINST, lsr #12          @ r1<- B
5813    ubfx    r9, rINST, #8, #4           @ r9<- A
5814    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5815    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5816    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5817    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5818    .if 0
5819    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5820    beq     common_errDivideByZero
5821    .endif
5822    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5823
5824    orr     r0, r0, r2                           @ optional op; may set condition codes
5825    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
5826    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5827    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5828    GOTO_OPCODE(ip)                     @ jump to next instruction
5829    /* 12-15 instructions */
5830
5831
5832/* ------------------------------ */
5833    .balign 64
5834.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
5835/* File: armv6t2/OP_XOR_LONG_2ADDR.S */
5836/* File: armv6t2/binopWide2addr.S */
5837    /*
5838     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5839     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5840     * This could be an ARM instruction or a function call.  (If the result
5841     * comes back in a register other than r0, you can override "result".)
5842     *
5843     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5844     * vCC (r1).  Useful for integer division and modulus.
5845     *
5846     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5847     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5848     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5849     *      rem-double/2addr
5850     */
5851    /* binop/2addr vA, vB */
5852    mov     r1, rINST, lsr #12          @ r1<- B
5853    ubfx    r9, rINST, #8, #4           @ r9<- A
5854    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5855    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5856    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5857    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5858    .if 0
5859    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5860    beq     common_errDivideByZero
5861    .endif
5862    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5863
5864    eor     r0, r0, r2                           @ optional op; may set condition codes
5865    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
5866    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5867    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5868    GOTO_OPCODE(ip)                     @ jump to next instruction
5869    /* 12-15 instructions */
5870
5871
5872/* ------------------------------ */
5873    .balign 64
5874.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
5875/* File: armv6t2/OP_SHL_LONG_2ADDR.S */
5876    /*
5877     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5878     * 32-bit shift distance.
5879     */
5880    /* shl-long/2addr vA, vB */
5881    mov     r3, rINST, lsr #12          @ r3<- B
5882    ubfx    r9, rINST, #8, #4           @ r9<- A
5883    GET_VREG(r2, r3)                    @ r2<- vB
5884    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5885    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5886    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5887
5888    mov     r1, r1, asl r2              @  r1<- r1 << r2
5889    rsb     r3, r2, #32                 @  r3<- 32 - r2
5890    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
5891    subs    ip, r2, #32                 @  ip<- r2 - 32
5892    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5893    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
5894    mov     r0, r0, asl r2              @  r0<- r0 << r2
5895    b       .LOP_SHL_LONG_2ADDR_finish
5896
5897/* ------------------------------ */
5898    .balign 64
5899.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
5900/* File: armv6t2/OP_SHR_LONG_2ADDR.S */
5901    /*
5902     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5903     * 32-bit shift distance.
5904     */
5905    /* shr-long/2addr vA, vB */
5906    mov     r3, rINST, lsr #12          @ r3<- B
5907    ubfx    r9, rINST, #8, #4           @ r9<- A
5908    GET_VREG(r2, r3)                    @ r2<- vB
5909    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5910    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5911    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5912
5913    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5914    rsb     r3, r2, #32                 @  r3<- 32 - r2
5915    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5916    subs    ip, r2, #32                 @  ip<- r2 - 32
5917    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5918    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
5919    mov     r1, r1, asr r2              @  r1<- r1 >> r2
5920    b       .LOP_SHR_LONG_2ADDR_finish
5921
5922/* ------------------------------ */
5923    .balign 64
5924.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
5925/* File: armv6t2/OP_USHR_LONG_2ADDR.S */
5926    /*
5927     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5928     * 32-bit shift distance.
5929     */
5930    /* ushr-long/2addr vA, vB */
5931    mov     r3, rINST, lsr #12          @ r3<- B
5932    ubfx    r9, rINST, #8, #4           @ r9<- A
5933    GET_VREG(r2, r3)                    @ r2<- vB
5934    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5935    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5936    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5937
5938    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5939    rsb     r3, r2, #32                 @  r3<- 32 - r2
5940    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5941    subs    ip, r2, #32                 @  ip<- r2 - 32
5942    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5943    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
5944    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
5945    b       .LOP_USHR_LONG_2ADDR_finish
5946
5947/* ------------------------------ */
5948    .balign 64
5949.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
5950/* File: arm-vfp/OP_ADD_FLOAT_2ADDR.S */
5951/* File: arm-vfp/fbinop2addr.S */
5952    /*
5953     * Generic 32-bit floating point "/2addr" binary operation.  Provide
5954     * an "instr" line that specifies an instruction that performs
5955     * "s2 = s0 op s1".
5956     *
5957     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5958     */
5959    /* binop/2addr vA, vB */
5960    mov     r3, rINST, lsr #12          @ r3<- B
5961    mov     r9, rINST, lsr #8           @ r9<- A+
5962    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
5963    and     r9, r9, #15                 @ r9<- A
5964    flds    s1, [r3]                    @ s1<- vB
5965    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
5966    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5967    flds    s0, [r9]                    @ s0<- vA
5968
5969    fadds   s2, s0, s1                              @ s2<- op
5970    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5971    fsts    s2, [r9]                    @ vAA<- s2
5972    GOTO_OPCODE(ip)                     @ jump to next instruction
5973
5974
5975/* ------------------------------ */
5976    .balign 64
5977.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
5978/* File: arm-vfp/OP_SUB_FLOAT_2ADDR.S */
5979/* File: arm-vfp/fbinop2addr.S */
5980    /*
5981     * Generic 32-bit floating point "/2addr" binary operation.  Provide
5982     * an "instr" line that specifies an instruction that performs
5983     * "s2 = s0 op s1".
5984     *
5985     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5986     */
5987    /* binop/2addr vA, vB */
5988    mov     r3, rINST, lsr #12          @ r3<- B
5989    mov     r9, rINST, lsr #8           @ r9<- A+
5990    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
5991    and     r9, r9, #15                 @ r9<- A
5992    flds    s1, [r3]                    @ s1<- vB
5993    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
5994    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5995    flds    s0, [r9]                    @ s0<- vA
5996
5997    fsubs   s2, s0, s1                              @ s2<- op
5998    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5999    fsts    s2, [r9]                    @ vAA<- s2
6000    GOTO_OPCODE(ip)                     @ jump to next instruction
6001
6002
6003/* ------------------------------ */
6004    .balign 64
6005.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6006/* File: arm-vfp/OP_MUL_FLOAT_2ADDR.S */
6007/* File: arm-vfp/fbinop2addr.S */
6008    /*
6009     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6010     * an "instr" line that specifies an instruction that performs
6011     * "s2 = s0 op s1".
6012     *
6013     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6014     */
6015    /* binop/2addr vA, vB */
6016    mov     r3, rINST, lsr #12          @ r3<- B
6017    mov     r9, rINST, lsr #8           @ r9<- A+
6018    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6019    and     r9, r9, #15                 @ r9<- A
6020    flds    s1, [r3]                    @ s1<- vB
6021    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6022    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6023    flds    s0, [r9]                    @ s0<- vA
6024
6025    fmuls   s2, s0, s1                              @ s2<- op
6026    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6027    fsts    s2, [r9]                    @ vAA<- s2
6028    GOTO_OPCODE(ip)                     @ jump to next instruction
6029
6030
6031/* ------------------------------ */
6032    .balign 64
6033.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6034/* File: arm-vfp/OP_DIV_FLOAT_2ADDR.S */
6035/* File: arm-vfp/fbinop2addr.S */
6036    /*
6037     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6038     * an "instr" line that specifies an instruction that performs
6039     * "s2 = s0 op s1".
6040     *
6041     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6042     */
6043    /* binop/2addr vA, vB */
6044    mov     r3, rINST, lsr #12          @ r3<- B
6045    mov     r9, rINST, lsr #8           @ r9<- A+
6046    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6047    and     r9, r9, #15                 @ r9<- A
6048    flds    s1, [r3]                    @ s1<- vB
6049    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6050    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6051    flds    s0, [r9]                    @ s0<- vA
6052
6053    fdivs   s2, s0, s1                              @ s2<- op
6054    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6055    fsts    s2, [r9]                    @ vAA<- s2
6056    GOTO_OPCODE(ip)                     @ jump to next instruction
6057
6058
6059/* ------------------------------ */
6060    .balign 64
6061.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6062/* File: armv6t2/OP_REM_FLOAT_2ADDR.S */
6063/* EABI doesn't define a float remainder function, but libm does */
6064/* File: armv6t2/binop2addr.S */
6065    /*
6066     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6067     * that specifies an instruction that performs "result = r0 op r1".
6068     * This could be an ARM instruction or a function call.  (If the result
6069     * comes back in a register other than r0, you can override "result".)
6070     *
6071     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6072     * vCC (r1).  Useful for integer division and modulus.
6073     *
6074     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6075     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6076     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6077     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6078     */
6079    /* binop/2addr vA, vB */
6080    mov     r3, rINST, lsr #12          @ r3<- B
6081    ubfx    r9, rINST, #8, #4           @ r9<- A
6082    GET_VREG(r1, r3)                    @ r1<- vB
6083    GET_VREG(r0, r9)                    @ r0<- vA
6084    .if 0
6085    cmp     r1, #0                      @ is second operand zero?
6086    beq     common_errDivideByZero
6087    .endif
6088    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6089
6090                               @ optional op; may set condition codes
6091    bl      fmodf                              @ r0<- op, r0-r3 changed
6092    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6093    SET_VREG(r0, r9)               @ vAA<- r0
6094    GOTO_OPCODE(ip)                     @ jump to next instruction
6095    /* 10-13 instructions */
6096
6097
6098/* ------------------------------ */
6099    .balign 64
6100.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6101/* File: arm-vfp/OP_ADD_DOUBLE_2ADDR.S */
6102/* File: arm-vfp/fbinopWide2addr.S */
6103    /*
6104     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6105     * an "instr" line that specifies an instruction that performs
6106     * "d2 = d0 op d1".
6107     *
6108     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6109     *      div-double/2addr
6110     */
6111    /* binop/2addr vA, vB */
6112    mov     r3, rINST, lsr #12          @ r3<- B
6113    mov     r9, rINST, lsr #8           @ r9<- A+
6114    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6115    and     r9, r9, #15                 @ r9<- A
6116    fldd    d1, [r3]                    @ d1<- vB
6117    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6118    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6119    fldd    d0, [r9]                    @ d0<- vA
6120
6121    faddd   d2, d0, d1                              @ d2<- op
6122    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6123    fstd    d2, [r9]                    @ vAA<- d2
6124    GOTO_OPCODE(ip)                     @ jump to next instruction
6125
6126
6127/* ------------------------------ */
6128    .balign 64
6129.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6130/* File: arm-vfp/OP_SUB_DOUBLE_2ADDR.S */
6131/* File: arm-vfp/fbinopWide2addr.S */
6132    /*
6133     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6134     * an "instr" line that specifies an instruction that performs
6135     * "d2 = d0 op d1".
6136     *
6137     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6138     *      div-double/2addr
6139     */
6140    /* binop/2addr vA, vB */
6141    mov     r3, rINST, lsr #12          @ r3<- B
6142    mov     r9, rINST, lsr #8           @ r9<- A+
6143    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6144    and     r9, r9, #15                 @ r9<- A
6145    fldd    d1, [r3]                    @ d1<- vB
6146    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6147    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6148    fldd    d0, [r9]                    @ d0<- vA
6149
6150    fsubd   d2, d0, d1                              @ d2<- op
6151    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6152    fstd    d2, [r9]                    @ vAA<- d2
6153    GOTO_OPCODE(ip)                     @ jump to next instruction
6154
6155
6156/* ------------------------------ */
6157    .balign 64
6158.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6159/* File: arm-vfp/OP_MUL_DOUBLE_2ADDR.S */
6160/* File: arm-vfp/fbinopWide2addr.S */
6161    /*
6162     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6163     * an "instr" line that specifies an instruction that performs
6164     * "d2 = d0 op d1".
6165     *
6166     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6167     *      div-double/2addr
6168     */
6169    /* binop/2addr vA, vB */
6170    mov     r3, rINST, lsr #12          @ r3<- B
6171    mov     r9, rINST, lsr #8           @ r9<- A+
6172    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6173    and     r9, r9, #15                 @ r9<- A
6174    fldd    d1, [r3]                    @ d1<- vB
6175    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6176    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6177    fldd    d0, [r9]                    @ d0<- vA
6178
6179    fmuld   d2, d0, d1                              @ d2<- op
6180    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6181    fstd    d2, [r9]                    @ vAA<- d2
6182    GOTO_OPCODE(ip)                     @ jump to next instruction
6183
6184
6185/* ------------------------------ */
6186    .balign 64
6187.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6188/* File: arm-vfp/OP_DIV_DOUBLE_2ADDR.S */
6189/* File: arm-vfp/fbinopWide2addr.S */
6190    /*
6191     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6192     * an "instr" line that specifies an instruction that performs
6193     * "d2 = d0 op d1".
6194     *
6195     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6196     *      div-double/2addr
6197     */
6198    /* binop/2addr vA, vB */
6199    mov     r3, rINST, lsr #12          @ r3<- B
6200    mov     r9, rINST, lsr #8           @ r9<- A+
6201    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6202    and     r9, r9, #15                 @ r9<- A
6203    fldd    d1, [r3]                    @ d1<- vB
6204    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6205    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6206    fldd    d0, [r9]                    @ d0<- vA
6207
6208    fdivd   d2, d0, d1                              @ d2<- op
6209    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6210    fstd    d2, [r9]                    @ vAA<- d2
6211    GOTO_OPCODE(ip)                     @ jump to next instruction
6212
6213
6214/* ------------------------------ */
6215    .balign 64
6216.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6217/* File: armv6t2/OP_REM_DOUBLE_2ADDR.S */
6218/* EABI doesn't define a double remainder function, but libm does */
6219/* File: armv6t2/binopWide2addr.S */
6220    /*
6221     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6222     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6223     * This could be an ARM instruction or a function call.  (If the result
6224     * comes back in a register other than r0, you can override "result".)
6225     *
6226     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6227     * vCC (r1).  Useful for integer division and modulus.
6228     *
6229     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6230     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6231     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6232     *      rem-double/2addr
6233     */
6234    /* binop/2addr vA, vB */
6235    mov     r1, rINST, lsr #12          @ r1<- B
6236    ubfx    r9, rINST, #8, #4           @ r9<- A
6237    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6238    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6239    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6240    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6241    .if 0
6242    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6243    beq     common_errDivideByZero
6244    .endif
6245    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6246
6247                               @ optional op; may set condition codes
6248    bl      fmod                              @ result<- op, r0-r3 changed
6249    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6250    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6251    GOTO_OPCODE(ip)                     @ jump to next instruction
6252    /* 12-15 instructions */
6253
6254
6255/* ------------------------------ */
6256    .balign 64
6257.L_OP_ADD_INT_LIT16: /* 0xd0 */
6258/* File: armv6t2/OP_ADD_INT_LIT16.S */
6259/* File: armv6t2/binopLit16.S */
6260    /*
6261     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6262     * that specifies an instruction that performs "result = r0 op r1".
6263     * This could be an ARM instruction or a function call.  (If the result
6264     * comes back in a register other than r0, you can override "result".)
6265     *
6266     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6267     * vCC (r1).  Useful for integer division and modulus.
6268     *
6269     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6270     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6271     */
6272    /* binop/lit16 vA, vB, #+CCCC */
6273    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6274    mov     r2, rINST, lsr #12          @ r2<- B
6275    ubfx    r9, rINST, #8, #4           @ r9<- A
6276    GET_VREG(r0, r2)                    @ r0<- vB
6277    .if 0
6278    cmp     r1, #0                      @ is second operand zero?
6279    beq     common_errDivideByZero
6280    .endif
6281    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6282
6283    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6284    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6285    SET_VREG(r0, r9)               @ vAA<- r0
6286    GOTO_OPCODE(ip)                     @ jump to next instruction
6287    /* 10-13 instructions */
6288
6289
6290/* ------------------------------ */
6291    .balign 64
6292.L_OP_RSUB_INT: /* 0xd1 */
6293/* File: armv6t2/OP_RSUB_INT.S */
6294/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6295/* File: armv6t2/binopLit16.S */
6296    /*
6297     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6298     * that specifies an instruction that performs "result = r0 op r1".
6299     * This could be an ARM instruction or a function call.  (If the result
6300     * comes back in a register other than r0, you can override "result".)
6301     *
6302     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6303     * vCC (r1).  Useful for integer division and modulus.
6304     *
6305     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6306     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6307     */
6308    /* binop/lit16 vA, vB, #+CCCC */
6309    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6310    mov     r2, rINST, lsr #12          @ r2<- B
6311    ubfx    r9, rINST, #8, #4           @ r9<- A
6312    GET_VREG(r0, r2)                    @ r0<- vB
6313    .if 0
6314    cmp     r1, #0                      @ is second operand zero?
6315    beq     common_errDivideByZero
6316    .endif
6317    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6318
6319    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6320    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6321    SET_VREG(r0, r9)               @ vAA<- r0
6322    GOTO_OPCODE(ip)                     @ jump to next instruction
6323    /* 10-13 instructions */
6324
6325
6326/* ------------------------------ */
6327    .balign 64
6328.L_OP_MUL_INT_LIT16: /* 0xd2 */
6329/* File: armv6t2/OP_MUL_INT_LIT16.S */
6330/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6331/* File: armv6t2/binopLit16.S */
6332    /*
6333     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6334     * that specifies an instruction that performs "result = r0 op r1".
6335     * This could be an ARM instruction or a function call.  (If the result
6336     * comes back in a register other than r0, you can override "result".)
6337     *
6338     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6339     * vCC (r1).  Useful for integer division and modulus.
6340     *
6341     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6342     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6343     */
6344    /* binop/lit16 vA, vB, #+CCCC */
6345    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6346    mov     r2, rINST, lsr #12          @ r2<- B
6347    ubfx    r9, rINST, #8, #4           @ r9<- A
6348    GET_VREG(r0, r2)                    @ r0<- vB
6349    .if 0
6350    cmp     r1, #0                      @ is second operand zero?
6351    beq     common_errDivideByZero
6352    .endif
6353    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6354
6355    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6356    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6357    SET_VREG(r0, r9)               @ vAA<- r0
6358    GOTO_OPCODE(ip)                     @ jump to next instruction
6359    /* 10-13 instructions */
6360
6361
6362/* ------------------------------ */
6363    .balign 64
6364.L_OP_DIV_INT_LIT16: /* 0xd3 */
6365/* File: armv6t2/OP_DIV_INT_LIT16.S */
6366/* File: armv6t2/binopLit16.S */
6367    /*
6368     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6369     * that specifies an instruction that performs "result = r0 op r1".
6370     * This could be an ARM instruction or a function call.  (If the result
6371     * comes back in a register other than r0, you can override "result".)
6372     *
6373     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6374     * vCC (r1).  Useful for integer division and modulus.
6375     *
6376     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6377     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6378     */
6379    /* binop/lit16 vA, vB, #+CCCC */
6380    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6381    mov     r2, rINST, lsr #12          @ r2<- B
6382    ubfx    r9, rINST, #8, #4           @ r9<- A
6383    GET_VREG(r0, r2)                    @ r0<- vB
6384    .if 1
6385    cmp     r1, #0                      @ is second operand zero?
6386    beq     common_errDivideByZero
6387    .endif
6388    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6389
6390    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6391    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6392    SET_VREG(r0, r9)               @ vAA<- r0
6393    GOTO_OPCODE(ip)                     @ jump to next instruction
6394    /* 10-13 instructions */
6395
6396
6397/* ------------------------------ */
6398    .balign 64
6399.L_OP_REM_INT_LIT16: /* 0xd4 */
6400/* File: armv6t2/OP_REM_INT_LIT16.S */
6401/* idivmod returns quotient in r0 and remainder in r1 */
6402/* File: armv6t2/binopLit16.S */
6403    /*
6404     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6405     * that specifies an instruction that performs "result = r0 op r1".
6406     * This could be an ARM instruction or a function call.  (If the result
6407     * comes back in a register other than r0, you can override "result".)
6408     *
6409     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6410     * vCC (r1).  Useful for integer division and modulus.
6411     *
6412     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6413     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6414     */
6415    /* binop/lit16 vA, vB, #+CCCC */
6416    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6417    mov     r2, rINST, lsr #12          @ r2<- B
6418    ubfx    r9, rINST, #8, #4           @ r9<- A
6419    GET_VREG(r0, r2)                    @ r0<- vB
6420    .if 1
6421    cmp     r1, #0                      @ is second operand zero?
6422    beq     common_errDivideByZero
6423    .endif
6424    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6425
6426    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6427    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6428    SET_VREG(r1, r9)               @ vAA<- r1
6429    GOTO_OPCODE(ip)                     @ jump to next instruction
6430    /* 10-13 instructions */
6431
6432
6433/* ------------------------------ */
6434    .balign 64
6435.L_OP_AND_INT_LIT16: /* 0xd5 */
6436/* File: armv6t2/OP_AND_INT_LIT16.S */
6437/* File: armv6t2/binopLit16.S */
6438    /*
6439     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6440     * that specifies an instruction that performs "result = r0 op r1".
6441     * This could be an ARM instruction or a function call.  (If the result
6442     * comes back in a register other than r0, you can override "result".)
6443     *
6444     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6445     * vCC (r1).  Useful for integer division and modulus.
6446     *
6447     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6448     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6449     */
6450    /* binop/lit16 vA, vB, #+CCCC */
6451    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6452    mov     r2, rINST, lsr #12          @ r2<- B
6453    ubfx    r9, rINST, #8, #4           @ r9<- A
6454    GET_VREG(r0, r2)                    @ r0<- vB
6455    .if 0
6456    cmp     r1, #0                      @ is second operand zero?
6457    beq     common_errDivideByZero
6458    .endif
6459    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6460
6461    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6462    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6463    SET_VREG(r0, r9)               @ vAA<- r0
6464    GOTO_OPCODE(ip)                     @ jump to next instruction
6465    /* 10-13 instructions */
6466
6467
6468/* ------------------------------ */
6469    .balign 64
6470.L_OP_OR_INT_LIT16: /* 0xd6 */
6471/* File: armv6t2/OP_OR_INT_LIT16.S */
6472/* File: armv6t2/binopLit16.S */
6473    /*
6474     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6475     * that specifies an instruction that performs "result = r0 op r1".
6476     * This could be an ARM instruction or a function call.  (If the result
6477     * comes back in a register other than r0, you can override "result".)
6478     *
6479     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6480     * vCC (r1).  Useful for integer division and modulus.
6481     *
6482     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6483     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6484     */
6485    /* binop/lit16 vA, vB, #+CCCC */
6486    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6487    mov     r2, rINST, lsr #12          @ r2<- B
6488    ubfx    r9, rINST, #8, #4           @ r9<- A
6489    GET_VREG(r0, r2)                    @ r0<- vB
6490    .if 0
6491    cmp     r1, #0                      @ is second operand zero?
6492    beq     common_errDivideByZero
6493    .endif
6494    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6495
6496    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6497    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6498    SET_VREG(r0, r9)               @ vAA<- r0
6499    GOTO_OPCODE(ip)                     @ jump to next instruction
6500    /* 10-13 instructions */
6501
6502
6503/* ------------------------------ */
6504    .balign 64
6505.L_OP_XOR_INT_LIT16: /* 0xd7 */
6506/* File: armv6t2/OP_XOR_INT_LIT16.S */
6507/* File: armv6t2/binopLit16.S */
6508    /*
6509     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6510     * that specifies an instruction that performs "result = r0 op r1".
6511     * This could be an ARM instruction or a function call.  (If the result
6512     * comes back in a register other than r0, you can override "result".)
6513     *
6514     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6515     * vCC (r1).  Useful for integer division and modulus.
6516     *
6517     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6518     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6519     */
6520    /* binop/lit16 vA, vB, #+CCCC */
6521    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6522    mov     r2, rINST, lsr #12          @ r2<- B
6523    ubfx    r9, rINST, #8, #4           @ r9<- A
6524    GET_VREG(r0, r2)                    @ r0<- vB
6525    .if 0
6526    cmp     r1, #0                      @ is second operand zero?
6527    beq     common_errDivideByZero
6528    .endif
6529    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6530
6531    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6532    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6533    SET_VREG(r0, r9)               @ vAA<- r0
6534    GOTO_OPCODE(ip)                     @ jump to next instruction
6535    /* 10-13 instructions */
6536
6537
6538/* ------------------------------ */
6539    .balign 64
6540.L_OP_ADD_INT_LIT8: /* 0xd8 */
6541/* File: armv5te/OP_ADD_INT_LIT8.S */
6542/* File: armv5te/binopLit8.S */
6543    /*
6544     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6545     * that specifies an instruction that performs "result = r0 op r1".
6546     * This could be an ARM instruction or a function call.  (If the result
6547     * comes back in a register other than r0, you can override "result".)
6548     *
6549     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6550     * vCC (r1).  Useful for integer division and modulus.
6551     *
6552     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6553     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6554     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6555     */
6556    /* binop/lit8 vAA, vBB, #+CC */
6557    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6558    mov     r9, rINST, lsr #8           @ r9<- AA
6559    and     r2, r3, #255                @ r2<- BB
6560    GET_VREG(r0, r2)                    @ r0<- vBB
6561    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6562    .if 0
6563    @cmp     r1, #0                      @ is second operand zero?
6564    beq     common_errDivideByZero
6565    .endif
6566    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6567
6568                               @ optional op; may set condition codes
6569    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6570    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6571    SET_VREG(r0, r9)               @ vAA<- r0
6572    GOTO_OPCODE(ip)                     @ jump to next instruction
6573    /* 10-12 instructions */
6574
6575
6576/* ------------------------------ */
6577    .balign 64
6578.L_OP_RSUB_INT_LIT8: /* 0xd9 */
6579/* File: armv5te/OP_RSUB_INT_LIT8.S */
6580/* File: armv5te/binopLit8.S */
6581    /*
6582     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6583     * that specifies an instruction that performs "result = r0 op r1".
6584     * This could be an ARM instruction or a function call.  (If the result
6585     * comes back in a register other than r0, you can override "result".)
6586     *
6587     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6588     * vCC (r1).  Useful for integer division and modulus.
6589     *
6590     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6591     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6592     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6593     */
6594    /* binop/lit8 vAA, vBB, #+CC */
6595    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6596    mov     r9, rINST, lsr #8           @ r9<- AA
6597    and     r2, r3, #255                @ r2<- BB
6598    GET_VREG(r0, r2)                    @ r0<- vBB
6599    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6600    .if 0
6601    @cmp     r1, #0                      @ is second operand zero?
6602    beq     common_errDivideByZero
6603    .endif
6604    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6605
6606                               @ optional op; may set condition codes
6607    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6608    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6609    SET_VREG(r0, r9)               @ vAA<- r0
6610    GOTO_OPCODE(ip)                     @ jump to next instruction
6611    /* 10-12 instructions */
6612
6613
6614/* ------------------------------ */
6615    .balign 64
6616.L_OP_MUL_INT_LIT8: /* 0xda */
6617/* File: armv5te/OP_MUL_INT_LIT8.S */
6618/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6619/* File: armv5te/binopLit8.S */
6620    /*
6621     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6622     * that specifies an instruction that performs "result = r0 op r1".
6623     * This could be an ARM instruction or a function call.  (If the result
6624     * comes back in a register other than r0, you can override "result".)
6625     *
6626     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6627     * vCC (r1).  Useful for integer division and modulus.
6628     *
6629     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6630     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6631     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6632     */
6633    /* binop/lit8 vAA, vBB, #+CC */
6634    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6635    mov     r9, rINST, lsr #8           @ r9<- AA
6636    and     r2, r3, #255                @ r2<- BB
6637    GET_VREG(r0, r2)                    @ r0<- vBB
6638    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
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                               @ optional op; may set condition codes
6646    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6647    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6648    SET_VREG(r0, r9)               @ vAA<- r0
6649    GOTO_OPCODE(ip)                     @ jump to next instruction
6650    /* 10-12 instructions */
6651
6652
6653/* ------------------------------ */
6654    .balign 64
6655.L_OP_DIV_INT_LIT8: /* 0xdb */
6656/* File: armv5te/OP_DIV_INT_LIT8.S */
6657/* File: armv5te/binopLit8.S */
6658    /*
6659     * Generic 32-bit "lit8" 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/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6668     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6669     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6670     */
6671    /* binop/lit8 vAA, vBB, #+CC */
6672    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6673    mov     r9, rINST, lsr #8           @ r9<- AA
6674    and     r2, r3, #255                @ r2<- BB
6675    GET_VREG(r0, r2)                    @ r0<- vBB
6676    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6677    .if 1
6678    @cmp     r1, #0                      @ is second operand zero?
6679    beq     common_errDivideByZero
6680    .endif
6681    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6682
6683                               @ optional op; may set condition codes
6684    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6685    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6686    SET_VREG(r0, r9)               @ vAA<- r0
6687    GOTO_OPCODE(ip)                     @ jump to next instruction
6688    /* 10-12 instructions */
6689
6690
6691/* ------------------------------ */
6692    .balign 64
6693.L_OP_REM_INT_LIT8: /* 0xdc */
6694/* File: armv5te/OP_REM_INT_LIT8.S */
6695/* idivmod returns quotient in r0 and remainder in r1 */
6696/* File: armv5te/binopLit8.S */
6697    /*
6698     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6699     * that specifies an instruction that performs "result = r0 op r1".
6700     * This could be an ARM instruction or a function call.  (If the result
6701     * comes back in a register other than r0, you can override "result".)
6702     *
6703     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6704     * vCC (r1).  Useful for integer division and modulus.
6705     *
6706     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6707     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6708     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6709     */
6710    /* binop/lit8 vAA, vBB, #+CC */
6711    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6712    mov     r9, rINST, lsr #8           @ r9<- AA
6713    and     r2, r3, #255                @ r2<- BB
6714    GET_VREG(r0, r2)                    @ r0<- vBB
6715    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6716    .if 1
6717    @cmp     r1, #0                      @ is second operand zero?
6718    beq     common_errDivideByZero
6719    .endif
6720    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6721
6722                               @ optional op; may set condition codes
6723    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6724    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6725    SET_VREG(r1, r9)               @ vAA<- r1
6726    GOTO_OPCODE(ip)                     @ jump to next instruction
6727    /* 10-12 instructions */
6728
6729
6730/* ------------------------------ */
6731    .balign 64
6732.L_OP_AND_INT_LIT8: /* 0xdd */
6733/* File: armv5te/OP_AND_INT_LIT8.S */
6734/* File: armv5te/binopLit8.S */
6735    /*
6736     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6737     * that specifies an instruction that performs "result = r0 op r1".
6738     * This could be an ARM instruction or a function call.  (If the result
6739     * comes back in a register other than r0, you can override "result".)
6740     *
6741     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6742     * vCC (r1).  Useful for integer division and modulus.
6743     *
6744     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6745     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6746     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6747     */
6748    /* binop/lit8 vAA, vBB, #+CC */
6749    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6750    mov     r9, rINST, lsr #8           @ r9<- AA
6751    and     r2, r3, #255                @ r2<- BB
6752    GET_VREG(r0, r2)                    @ r0<- vBB
6753    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6754    .if 0
6755    @cmp     r1, #0                      @ is second operand zero?
6756    beq     common_errDivideByZero
6757    .endif
6758    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6759
6760                               @ optional op; may set condition codes
6761    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6762    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6763    SET_VREG(r0, r9)               @ vAA<- r0
6764    GOTO_OPCODE(ip)                     @ jump to next instruction
6765    /* 10-12 instructions */
6766
6767
6768/* ------------------------------ */
6769    .balign 64
6770.L_OP_OR_INT_LIT8: /* 0xde */
6771/* File: armv5te/OP_OR_INT_LIT8.S */
6772/* File: armv5te/binopLit8.S */
6773    /*
6774     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6775     * that specifies an instruction that performs "result = r0 op r1".
6776     * This could be an ARM instruction or a function call.  (If the result
6777     * comes back in a register other than r0, you can override "result".)
6778     *
6779     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6780     * vCC (r1).  Useful for integer division and modulus.
6781     *
6782     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6783     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6784     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6785     */
6786    /* binop/lit8 vAA, vBB, #+CC */
6787    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6788    mov     r9, rINST, lsr #8           @ r9<- AA
6789    and     r2, r3, #255                @ r2<- BB
6790    GET_VREG(r0, r2)                    @ r0<- vBB
6791    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6792    .if 0
6793    @cmp     r1, #0                      @ is second operand zero?
6794    beq     common_errDivideByZero
6795    .endif
6796    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6797
6798                               @ optional op; may set condition codes
6799    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6800    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6801    SET_VREG(r0, r9)               @ vAA<- r0
6802    GOTO_OPCODE(ip)                     @ jump to next instruction
6803    /* 10-12 instructions */
6804
6805
6806/* ------------------------------ */
6807    .balign 64
6808.L_OP_XOR_INT_LIT8: /* 0xdf */
6809/* File: armv5te/OP_XOR_INT_LIT8.S */
6810/* File: armv5te/binopLit8.S */
6811    /*
6812     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6813     * that specifies an instruction that performs "result = r0 op r1".
6814     * This could be an ARM instruction or a function call.  (If the result
6815     * comes back in a register other than r0, you can override "result".)
6816     *
6817     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6818     * vCC (r1).  Useful for integer division and modulus.
6819     *
6820     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6821     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6822     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6823     */
6824    /* binop/lit8 vAA, vBB, #+CC */
6825    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6826    mov     r9, rINST, lsr #8           @ r9<- AA
6827    and     r2, r3, #255                @ r2<- BB
6828    GET_VREG(r0, r2)                    @ r0<- vBB
6829    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6830    .if 0
6831    @cmp     r1, #0                      @ is second operand zero?
6832    beq     common_errDivideByZero
6833    .endif
6834    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6835
6836                               @ optional op; may set condition codes
6837    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6838    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6839    SET_VREG(r0, r9)               @ vAA<- r0
6840    GOTO_OPCODE(ip)                     @ jump to next instruction
6841    /* 10-12 instructions */
6842
6843
6844/* ------------------------------ */
6845    .balign 64
6846.L_OP_SHL_INT_LIT8: /* 0xe0 */
6847/* File: armv5te/OP_SHL_INT_LIT8.S */
6848/* File: armv5te/binopLit8.S */
6849    /*
6850     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6851     * that specifies an instruction that performs "result = r0 op r1".
6852     * This could be an ARM instruction or a function call.  (If the result
6853     * comes back in a register other than r0, you can override "result".)
6854     *
6855     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6856     * vCC (r1).  Useful for integer division and modulus.
6857     *
6858     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6859     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6860     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6861     */
6862    /* binop/lit8 vAA, vBB, #+CC */
6863    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6864    mov     r9, rINST, lsr #8           @ r9<- AA
6865    and     r2, r3, #255                @ r2<- BB
6866    GET_VREG(r0, r2)                    @ r0<- vBB
6867    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6868    .if 0
6869    @cmp     r1, #0                      @ is second operand zero?
6870    beq     common_errDivideByZero
6871    .endif
6872    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6873
6874    and     r1, r1, #31                           @ optional op; may set condition codes
6875    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
6876    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6877    SET_VREG(r0, r9)               @ vAA<- r0
6878    GOTO_OPCODE(ip)                     @ jump to next instruction
6879    /* 10-12 instructions */
6880
6881
6882/* ------------------------------ */
6883    .balign 64
6884.L_OP_SHR_INT_LIT8: /* 0xe1 */
6885/* File: armv5te/OP_SHR_INT_LIT8.S */
6886/* File: armv5te/binopLit8.S */
6887    /*
6888     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6889     * that specifies an instruction that performs "result = r0 op r1".
6890     * This could be an ARM instruction or a function call.  (If the result
6891     * comes back in a register other than r0, you can override "result".)
6892     *
6893     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6894     * vCC (r1).  Useful for integer division and modulus.
6895     *
6896     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6897     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6898     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6899     */
6900    /* binop/lit8 vAA, vBB, #+CC */
6901    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6902    mov     r9, rINST, lsr #8           @ r9<- AA
6903    and     r2, r3, #255                @ r2<- BB
6904    GET_VREG(r0, r2)                    @ r0<- vBB
6905    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6906    .if 0
6907    @cmp     r1, #0                      @ is second operand zero?
6908    beq     common_errDivideByZero
6909    .endif
6910    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6911
6912    and     r1, r1, #31                           @ optional op; may set condition codes
6913    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
6914    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6915    SET_VREG(r0, r9)               @ vAA<- r0
6916    GOTO_OPCODE(ip)                     @ jump to next instruction
6917    /* 10-12 instructions */
6918
6919
6920/* ------------------------------ */
6921    .balign 64
6922.L_OP_USHR_INT_LIT8: /* 0xe2 */
6923/* File: armv5te/OP_USHR_INT_LIT8.S */
6924/* File: armv5te/binopLit8.S */
6925    /*
6926     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6927     * that specifies an instruction that performs "result = r0 op r1".
6928     * This could be an ARM instruction or a function call.  (If the result
6929     * comes back in a register other than r0, you can override "result".)
6930     *
6931     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6932     * vCC (r1).  Useful for integer division and modulus.
6933     *
6934     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6935     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6936     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6937     */
6938    /* binop/lit8 vAA, vBB, #+CC */
6939    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6940    mov     r9, rINST, lsr #8           @ r9<- AA
6941    and     r2, r3, #255                @ r2<- BB
6942    GET_VREG(r0, r2)                    @ r0<- vBB
6943    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6944    .if 0
6945    @cmp     r1, #0                      @ is second operand zero?
6946    beq     common_errDivideByZero
6947    .endif
6948    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6949
6950    and     r1, r1, #31                           @ optional op; may set condition codes
6951    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
6952    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6953    SET_VREG(r0, r9)               @ vAA<- r0
6954    GOTO_OPCODE(ip)                     @ jump to next instruction
6955    /* 10-12 instructions */
6956
6957
6958/* ------------------------------ */
6959    .balign 64
6960.L_OP_IGET_VOLATILE: /* 0xe3 */
6961/* File: armv5te/OP_IGET_VOLATILE.S */
6962/* File: armv5te/OP_IGET.S */
6963    /*
6964     * General 32-bit instance field get.
6965     *
6966     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
6967     */
6968    /* op vA, vB, field@CCCC */
6969    mov     r0, rINST, lsr #12          @ r0<- B
6970    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
6971    FETCH(r1, 1)                        @ r1<- field ref CCCC
6972    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
6973    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
6974    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
6975    cmp     r0, #0                      @ is resolved entry null?
6976    bne     .LOP_IGET_VOLATILE_finish          @ no, already resolved
69778:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
6978    EXPORT_PC()                         @ resolve() could throw
6979    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
6980    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
6981    cmp     r0, #0
6982    bne     .LOP_IGET_VOLATILE_finish
6983    b       common_exceptionThrown
6984
6985
6986/* ------------------------------ */
6987    .balign 64
6988.L_OP_IPUT_VOLATILE: /* 0xe4 */
6989/* File: armv5te/OP_IPUT_VOLATILE.S */
6990/* File: armv5te/OP_IPUT.S */
6991    /*
6992     * General 32-bit instance field put.
6993     *
6994     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
6995     */
6996    /* op vA, vB, field@CCCC */
6997    mov     r0, rINST, lsr #12          @ r0<- B
6998    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
6999    FETCH(r1, 1)                        @ r1<- field ref CCCC
7000    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7001    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7002    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7003    cmp     r0, #0                      @ is resolved entry null?
7004    bne     .LOP_IPUT_VOLATILE_finish          @ no, already resolved
70058:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7006    EXPORT_PC()                         @ resolve() could throw
7007    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7008    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7009    cmp     r0, #0                      @ success?
7010    bne     .LOP_IPUT_VOLATILE_finish          @ yes, finish up
7011    b       common_exceptionThrown
7012
7013
7014/* ------------------------------ */
7015    .balign 64
7016.L_OP_SGET_VOLATILE: /* 0xe5 */
7017/* File: armv5te/OP_SGET_VOLATILE.S */
7018/* File: armv5te/OP_SGET.S */
7019    /*
7020     * General 32-bit SGET handler.
7021     *
7022     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7023     */
7024    /* op vAA, field@BBBB */
7025    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7026    FETCH(r1, 1)                        @ r1<- field ref BBBB
7027    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7028    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7029    cmp     r0, #0                      @ is resolved entry null?
7030    beq     .LOP_SGET_VOLATILE_resolve         @ yes, do resolve
7031.LOP_SGET_VOLATILE_finish: @ field ptr in r0
7032    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7033    SMP_DMB                            @ acquiring load
7034    mov     r2, rINST, lsr #8           @ r2<- AA
7035    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7036    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7037    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7038    GOTO_OPCODE(ip)                     @ jump to next instruction
7039
7040
7041/* ------------------------------ */
7042    .balign 64
7043.L_OP_SPUT_VOLATILE: /* 0xe6 */
7044/* File: armv5te/OP_SPUT_VOLATILE.S */
7045/* File: armv5te/OP_SPUT.S */
7046    /*
7047     * General 32-bit SPUT handler.
7048     *
7049     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
7050     */
7051    /* op vAA, field@BBBB */
7052    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7053    FETCH(r1, 1)                        @ r1<- field ref BBBB
7054    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7055    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7056    cmp     r0, #0                      @ is resolved entry null?
7057    beq     .LOP_SPUT_VOLATILE_resolve         @ yes, do resolve
7058.LOP_SPUT_VOLATILE_finish:   @ field ptr in r0
7059    mov     r2, rINST, lsr #8           @ r2<- AA
7060    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7061    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7062    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7063    SMP_DMB                            @ releasing store
7064    str     r1, [r0, #offStaticField_value] @ field<- vAA
7065    GOTO_OPCODE(ip)                     @ jump to next instruction
7066
7067
7068/* ------------------------------ */
7069    .balign 64
7070.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
7071/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */
7072/* File: armv5te/OP_IGET.S */
7073    /*
7074     * General 32-bit instance field get.
7075     *
7076     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7077     */
7078    /* op vA, vB, field@CCCC */
7079    mov     r0, rINST, lsr #12          @ r0<- B
7080    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7081    FETCH(r1, 1)                        @ r1<- field ref CCCC
7082    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7083    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7084    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7085    cmp     r0, #0                      @ is resolved entry null?
7086    bne     .LOP_IGET_OBJECT_VOLATILE_finish          @ no, already resolved
70878:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7088    EXPORT_PC()                         @ resolve() could throw
7089    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7090    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7091    cmp     r0, #0
7092    bne     .LOP_IGET_OBJECT_VOLATILE_finish
7093    b       common_exceptionThrown
7094
7095
7096/* ------------------------------ */
7097    .balign 64
7098.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
7099/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */
7100/* File: armv5te/OP_IGET_WIDE.S */
7101    /*
7102     * Wide 32-bit instance field get.
7103     */
7104    /* iget-wide vA, vB, field@CCCC */
7105    mov     r0, rINST, lsr #12          @ r0<- B
7106    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7107    FETCH(r1, 1)                        @ r1<- field ref CCCC
7108    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7109    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7110    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7111    cmp     r0, #0                      @ is resolved entry null?
7112    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
71138:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7114    EXPORT_PC()                         @ resolve() could throw
7115    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7116    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7117    cmp     r0, #0
7118    bne     .LOP_IGET_WIDE_VOLATILE_finish
7119    b       common_exceptionThrown
7120
7121
7122/* ------------------------------ */
7123    .balign 64
7124.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
7125/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */
7126/* File: armv5te/OP_IPUT_WIDE.S */
7127    /* iput-wide vA, vB, field@CCCC */
7128    mov     r0, rINST, lsr #12          @ r0<- B
7129    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7130    FETCH(r1, 1)                        @ r1<- field ref CCCC
7131    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7132    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7133    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7134    cmp     r0, #0                      @ is resolved entry null?
7135    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
71368:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7137    EXPORT_PC()                         @ resolve() could throw
7138    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7139    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7140    cmp     r0, #0                      @ success?
7141    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
7142    b       common_exceptionThrown
7143
7144
7145/* ------------------------------ */
7146    .balign 64
7147.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
7148/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */
7149/* File: armv5te/OP_SGET_WIDE.S */
7150    /*
7151     * 64-bit SGET handler.
7152     */
7153    /* sget-wide vAA, field@BBBB */
7154    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7155    FETCH(r1, 1)                        @ r1<- field ref BBBB
7156    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7157    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7158    cmp     r0, #0                      @ is resolved entry null?
7159    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
7160.LOP_SGET_WIDE_VOLATILE_finish:
7161    mov     r9, rINST, lsr #8           @ r9<- AA
7162    .if 1
7163    add     r0, r0, #offStaticField_value @ r0<- pointer to data
7164    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
7165    .else
7166    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
7167    .endif
7168    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7169    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7170    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
7171    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7172    GOTO_OPCODE(ip)                     @ jump to next instruction
7173
7174
7175/* ------------------------------ */
7176    .balign 64
7177.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
7178/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */
7179/* File: armv5te/OP_SPUT_WIDE.S */
7180    /*
7181     * 64-bit SPUT handler.
7182     */
7183    /* sput-wide vAA, field@BBBB */
7184    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
7185    FETCH(r1, 1)                        @ r1<- field ref BBBB
7186    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7187    mov     r9, rINST, lsr #8           @ r9<- AA
7188    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
7189    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7190    cmp     r2, #0                      @ is resolved entry null?
7191    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7192.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
7193    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7194    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7195    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7196    .if 1
7197    add     r2, r2, #offStaticField_value @ r2<- pointer to data
7198    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
7199    .else
7200    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
7201    .endif
7202    GOTO_OPCODE(r10)                    @ jump to next instruction
7203
7204
7205/* ------------------------------ */
7206    .balign 64
7207.L_OP_BREAKPOINT: /* 0xec */
7208/* File: armv5te/OP_BREAKPOINT.S */
7209    /*
7210     * Breakpoint handler.
7211     *
7212     * Restart this instruction with the original opcode.  By
7213     * the time we get here, the breakpoint will have already been
7214     * handled.
7215     */
7216    mov     r0, rPC
7217    bl      dvmGetOriginalOpcode        @ (rPC)
7218    FETCH(rINST, 0)                     @ reload OP_BREAKPOINT + rest of inst
7219    and     rINST, #0xff00
7220    orr     rINST, rINST, r0
7221    GOTO_OPCODE(r0)
7222
7223/* ------------------------------ */
7224    .balign 64
7225.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
7226/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
7227    /*
7228     * Handle a throw-verification-error instruction.  This throws an
7229     * exception for an error discovered during verification.  The
7230     * exception is indicated by AA, with some detail provided by BBBB.
7231     */
7232    /* op AA, ref@BBBB */
7233    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
7234    FETCH(r2, 1)                        @ r2<- BBBB
7235    EXPORT_PC()                         @ export the PC
7236    mov     r1, rINST, lsr #8           @ r1<- AA
7237    bl      dvmThrowVerificationError   @ always throws
7238    b       common_exceptionThrown      @ handle exception
7239
7240/* ------------------------------ */
7241    .balign 64
7242.L_OP_EXECUTE_INLINE: /* 0xee */
7243/* File: armv5te/OP_EXECUTE_INLINE.S */
7244    /*
7245     * Execute a "native inline" instruction.
7246     *
7247     * We need to call an InlineOp4Func:
7248     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7249     *
7250     * The first four args are in r0-r3, pointer to return value storage
7251     * is on the stack.  The function's return value is a flag that tells
7252     * us if an exception was thrown.
7253     *
7254     * TUNING: could maintain two tables, pointer in Thread and
7255     * swap if profiler/debuggger active.
7256     */
7257    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7258    ldrb    r2, [rSELF, #offThread_subMode]
7259    FETCH(r10, 1)                       @ r10<- BBBB
7260    EXPORT_PC()                         @ can throw
7261    ands    r2, #kSubModeDebugProfile   @ Any going on?
7262    bne     .LOP_EXECUTE_INLINE_debugmode       @ yes - take slow path
7263.LOP_EXECUTE_INLINE_resume:
7264    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7265    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7266    mov     r0, rINST, lsr #12          @ r0<- B
7267    str     r1, [sp]                    @ push &self->retval
7268    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7269    add     sp, sp, #8                  @ pop stack
7270    cmp     r0, #0                      @ test boolean result of inline
7271    beq     common_exceptionThrown      @ returned false, handle exception
7272    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7273    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7274    GOTO_OPCODE(ip)                     @ jump to next instruction
7275
7276/* ------------------------------ */
7277    .balign 64
7278.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7279/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7280    /*
7281     * Execute a "native inline" instruction, using "/range" semantics.
7282     * Same idea as execute-inline, but we get the args differently.
7283     *
7284     * We need to call an InlineOp4Func:
7285     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7286     *
7287     * The first four args are in r0-r3, pointer to return value storage
7288     * is on the stack.  The function's return value is a flag that tells
7289     * us if an exception was thrown.
7290     */
7291    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7292    ldrb    r2, [rSELF, #offThread_subMode]
7293    FETCH(r10, 1)                       @ r10<- BBBB
7294    EXPORT_PC()                         @ can throw
7295    ands    r2, #kSubModeDebugProfile   @ Any going on?
7296    bne     .LOP_EXECUTE_INLINE_RANGE_debugmode       @ yes - take slow path
7297.LOP_EXECUTE_INLINE_RANGE_resume:
7298    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7299    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7300    mov     r0, rINST, lsr #8           @ r0<- AA
7301    str     r1, [sp]                    @ push &self->retval
7302    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7303    add     sp, sp, #8                  @ pop stack
7304    cmp     r0, #0                      @ test boolean result of inline
7305    beq     common_exceptionThrown      @ returned false, handle exception
7306    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7307    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7308    GOTO_OPCODE(ip)                     @ jump to next instruction
7309
7310/* ------------------------------ */
7311    .balign 64
7312.L_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
7313/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
7314    /*
7315     * Invoke Object.<init> on an object.  In practice we know that
7316     * Object's nullary constructor doesn't do anything, so we just
7317     * skip it unless a debugger is active.
7318     */
7319    FETCH(r1, 2)                  @ r1<- CCCC
7320    GET_VREG(r0, r1)                    @ r0<- "this" ptr
7321    cmp     r0, #0                      @ check for NULL
7322    beq     common_errNullObject        @ export PC and throw NPE
7323    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
7324    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
7325    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
7326    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_setFinal        @ yes, go
7327.LOP_INVOKE_OBJECT_INIT_RANGE_finish:
7328    ldrb    r1, [rSELF, #offThread_subMode]
7329    ands    r1, #kSubModeDebuggerActive @ debugger active?
7330    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_debugger        @ Yes - skip optimization
7331    FETCH_ADVANCE_INST(2+1)       @ advance to next instr, load rINST
7332    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7333    GOTO_OPCODE(ip)                     @ execute it
7334
7335/* ------------------------------ */
7336    .balign 64
7337.L_OP_RETURN_VOID_BARRIER: /* 0xf1 */
7338/* File: armv5te/OP_RETURN_VOID_BARRIER.S */
7339    SMP_DMB_ST
7340    b       common_returnFromMethod
7341
7342/* ------------------------------ */
7343    .balign 64
7344.L_OP_IGET_QUICK: /* 0xf2 */
7345/* File: armv6t2/OP_IGET_QUICK.S */
7346    /* For: iget-quick, iget-object-quick */
7347    /* op vA, vB, offset@CCCC */
7348    mov     r2, rINST, lsr #12          @ r2<- B
7349    FETCH(r1, 1)                        @ r1<- field byte offset
7350    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7351    ubfx    r2, rINST, #8, #4           @ r2<- A
7352    cmp     r3, #0                      @ check object for null
7353    beq     common_errNullObject        @ object was null
7354    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7355    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7356    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7357    SET_VREG(r0, r2)                    @ fp[A]<- r0
7358    GOTO_OPCODE(ip)                     @ jump to next instruction
7359
7360/* ------------------------------ */
7361    .balign 64
7362.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7363/* File: armv6t2/OP_IGET_WIDE_QUICK.S */
7364    /* iget-wide-quick vA, vB, offset@CCCC */
7365    mov     r2, rINST, lsr #12          @ r2<- B
7366    FETCH(ip, 1)                        @ ip<- field byte offset
7367    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7368    ubfx    r2, rINST, #8, #4           @ r2<- A
7369    cmp     r3, #0                      @ check object for null
7370    beq     common_errNullObject        @ object was null
7371    ldrd    r0, [r3, ip]                @ r0<- obj.field (64 bits, aligned)
7372    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7373    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7374    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7375    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7376    GOTO_OPCODE(ip)                     @ jump to next instruction
7377
7378/* ------------------------------ */
7379    .balign 64
7380.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7381/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7382/* File: armv5te/OP_IGET_QUICK.S */
7383    /* For: iget-quick, iget-object-quick */
7384    /* op vA, vB, offset@CCCC */
7385    mov     r2, rINST, lsr #12          @ r2<- B
7386    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7387    FETCH(r1, 1)                        @ r1<- field byte offset
7388    cmp     r3, #0                      @ check object for null
7389    mov     r2, rINST, lsr #8           @ r2<- A(+)
7390    beq     common_errNullObject        @ object was null
7391    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7392    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7393    and     r2, r2, #15
7394    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7395    SET_VREG(r0, r2)                    @ fp[A]<- r0
7396    GOTO_OPCODE(ip)                     @ jump to next instruction
7397
7398
7399/* ------------------------------ */
7400    .balign 64
7401.L_OP_IPUT_QUICK: /* 0xf5 */
7402/* File: armv6t2/OP_IPUT_QUICK.S */
7403    /* For: iput-quick, iput-object-quick */
7404    /* op vA, vB, offset@CCCC */
7405    mov     r2, rINST, lsr #12          @ r2<- B
7406    FETCH(r1, 1)                        @ r1<- field byte offset
7407    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7408    ubfx    r2, rINST, #8, #4           @ r2<- A
7409    cmp     r3, #0                      @ check object for null
7410    beq     common_errNullObject        @ object was null
7411    GET_VREG(r0, r2)                    @ r0<- fp[A]
7412    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7413    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7414    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7415    GOTO_OPCODE(ip)                     @ jump to next instruction
7416
7417/* ------------------------------ */
7418    .balign 64
7419.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7420/* File: armv6t2/OP_IPUT_WIDE_QUICK.S */
7421    /* iput-wide-quick vA, vB, offset@CCCC */
7422    mov     r1, rINST, lsr #12          @ r1<- B
7423    ubfx    r0, rINST, #8, #4           @ r0<- A
7424    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7425    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7426    cmp     r2, #0                      @ check object for null
7427    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7428    beq     common_errNullObject        @ object was null
7429    FETCH(r3, 1)                        @ r3<- field byte offset
7430    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7431    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7432    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7433    GOTO_OPCODE(ip)                     @ jump to next instruction
7434
7435/* ------------------------------ */
7436    .balign 64
7437.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7438/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7439    /* For: iput-object-quick */
7440    /* op vA, vB, offset@CCCC */
7441    mov     r2, rINST, lsr #12          @ r2<- B
7442    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7443    FETCH(r1, 1)                        @ r1<- field byte offset
7444    cmp     r3, #0                      @ check object for null
7445    mov     r2, rINST, lsr #8           @ r2<- A(+)
7446    beq     common_errNullObject        @ object was null
7447    and     r2, r2, #15
7448    GET_VREG(r0, r2)                    @ r0<- fp[A]
7449    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7450    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7451    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7452    cmp     r0, #0
7453    strneb  r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
7454    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7455    GOTO_OPCODE(ip)                     @ jump to next instruction
7456
7457/* ------------------------------ */
7458    .balign 64
7459.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7460/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7461    /*
7462     * Handle an optimized virtual method call.
7463     *
7464     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7465     */
7466    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7467    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7468    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7469    FETCH(r1, 1)                        @ r1<- BBBB
7470    .if     (!0)
7471    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7472    .endif
7473    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7474    cmp     r9, #0                      @ is "this" null?
7475    beq     common_errNullObject        @ null "this", throw exception
7476    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7477    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7478    EXPORT_PC()                         @ invoke must export
7479    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7480    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7481
7482/* ------------------------------ */
7483    .balign 64
7484.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7485/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7486/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7487    /*
7488     * Handle an optimized virtual method call.
7489     *
7490     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7491     */
7492    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7493    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7494    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7495    FETCH(r1, 1)                        @ r1<- BBBB
7496    .if     (!1)
7497    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7498    .endif
7499    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7500    cmp     r9, #0                      @ is "this" null?
7501    beq     common_errNullObject        @ null "this", throw exception
7502    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7503    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7504    EXPORT_PC()                         @ invoke must export
7505    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7506    bl      common_invokeMethodRange @ (r0=method, r9="this")
7507
7508
7509/* ------------------------------ */
7510    .balign 64
7511.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7512/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7513    /*
7514     * Handle an optimized "super" method call.
7515     *
7516     * for: [opt] invoke-super-quick, invoke-super-quick/range
7517     */
7518    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7519    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7520    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7521    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7522    .if     (!0)
7523    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7524    .endif
7525    FETCH(r1, 1)                        @ r1<- BBBB
7526    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7527    EXPORT_PC()                         @ must export for invoke
7528    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7529    GET_VREG(r9, r10)                   @ r9<- "this"
7530    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7531    cmp     r9, #0                      @ null "this" ref?
7532    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7533    beq     common_errNullObject        @ "this" is null, throw exception
7534    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7535
7536/* ------------------------------ */
7537    .balign 64
7538.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7539/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
7540/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7541    /*
7542     * Handle an optimized "super" method call.
7543     *
7544     * for: [opt] invoke-super-quick, invoke-super-quick/range
7545     */
7546    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7547    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7548    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7549    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7550    .if     (!1)
7551    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7552    .endif
7553    FETCH(r1, 1)                        @ r1<- BBBB
7554    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7555    EXPORT_PC()                         @ must export for invoke
7556    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7557    GET_VREG(r9, r10)                   @ r9<- "this"
7558    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7559    cmp     r9, #0                      @ null "this" ref?
7560    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7561    beq     common_errNullObject        @ "this" is null, throw exception
7562    bl      common_invokeMethodRange @ (r0=method, r9="this")
7563
7564
7565/* ------------------------------ */
7566    .balign 64
7567.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
7568/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */
7569/* File: armv5te/OP_IPUT_OBJECT.S */
7570    /*
7571     * 32-bit instance field put.
7572     *
7573     * for: iput-object, iput-object-volatile
7574     */
7575    /* op vA, vB, field@CCCC */
7576    mov     r0, rINST, lsr #12          @ r0<- B
7577    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7578    FETCH(r1, 1)                        @ r1<- field ref CCCC
7579    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7580    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7581    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7582    cmp     r0, #0                      @ is resolved entry null?
7583    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ no, already resolved
75848:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7585    EXPORT_PC()                         @ resolve() could throw
7586    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7587    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7588    cmp     r0, #0                      @ success?
7589    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ yes, finish up
7590    b       common_exceptionThrown
7591
7592
7593/* ------------------------------ */
7594    .balign 64
7595.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
7596/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */
7597/* File: armv5te/OP_SGET.S */
7598    /*
7599     * General 32-bit SGET handler.
7600     *
7601     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7602     */
7603    /* op vAA, field@BBBB */
7604    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7605    FETCH(r1, 1)                        @ r1<- field ref BBBB
7606    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7607    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7608    cmp     r0, #0                      @ is resolved entry null?
7609    beq     .LOP_SGET_OBJECT_VOLATILE_resolve         @ yes, do resolve
7610.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0
7611    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7612    SMP_DMB                            @ acquiring load
7613    mov     r2, rINST, lsr #8           @ r2<- AA
7614    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7615    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7616    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7617    GOTO_OPCODE(ip)                     @ jump to next instruction
7618
7619
7620/* ------------------------------ */
7621    .balign 64
7622.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
7623/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */
7624/* File: armv5te/OP_SPUT_OBJECT.S */
7625    /*
7626     * 32-bit SPUT handler for objects
7627     *
7628     * for: sput-object, sput-object-volatile
7629     */
7630    /* op vAA, field@BBBB */
7631    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7632    FETCH(r1, 1)                        @ r1<- field ref BBBB
7633    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7634    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7635    cmp     r0, #0                      @ is resolved entry null?
7636    beq     .LOP_SPUT_OBJECT_VOLATILE_resolve         @ yes, do resolve
7637.LOP_SPUT_OBJECT_VOLATILE_finish:   @ field ptr in r0
7638    mov     r2, rINST, lsr #8           @ r2<- AA
7639    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7640    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7641    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7642    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
7643    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7644    SMP_DMB                            @ releasing store
7645    b       .LOP_SPUT_OBJECT_VOLATILE_end
7646
7647
7648/* ------------------------------ */
7649    .balign 64
7650.L_OP_DISPATCH_FF: /* 0xff */
7651/* File: armv5te/OP_DISPATCH_FF.S */
7652    mov     ip, rINST, lsr #8           @ ip<- extended opcode
7653    add     ip, ip, #256                @ add offset for extended opcodes
7654    GOTO_OPCODE(ip)                     @ go to proper extended handler
7655
7656
7657/* ------------------------------ */
7658    .balign 64
7659.L_OP_CONST_CLASS_JUMBO: /* 0x100 */
7660/* File: armv5te/OP_CONST_CLASS_JUMBO.S */
7661    /* const-class/jumbo vBBBB, Class@AAAAAAAA */
7662    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7663    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<-self>methodClassDex
7664    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7665    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
7666    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7667    FETCH(r9, 3)                        @ r9<- BBBB
7668    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[AAAAaaaa]
7669    cmp     r0, #0                      @ not yet resolved?
7670    beq     .LOP_CONST_CLASS_JUMBO_resolve
7671    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
7672    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7673    SET_VREG(r0, r9)                    @ vBBBB<- r0
7674    GOTO_OPCODE(ip)                     @ jump to next instruction
7675
7676/* ------------------------------ */
7677    .balign 64
7678.L_OP_CHECK_CAST_JUMBO: /* 0x101 */
7679/* File: armv5te/OP_CHECK_CAST_JUMBO.S */
7680    /*
7681     * Check to see if a cast from one class to another is allowed.
7682     */
7683    /* check-cast/jumbo vBBBB, class@AAAAAAAA */
7684    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7685    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7686    FETCH(r3, 3)                        @ r3<- BBBB
7687    orr     r2, r0, r2, lsl #16         @ r2<- AAAAaaaa
7688    GET_VREG(r9, r3)                    @ r9<- object
7689    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
7690    cmp     r9, #0                      @ is object null?
7691    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
7692    beq     .LOP_CHECK_CAST_JUMBO_okay            @ null obj, cast always succeeds
7693    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
7694    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
7695    cmp     r1, #0                      @ have we resolved this before?
7696    beq     .LOP_CHECK_CAST_JUMBO_resolve         @ not resolved, do it now
7697.LOP_CHECK_CAST_JUMBO_resolved:
7698    cmp     r0, r1                      @ same class (trivial success)?
7699    bne     .LOP_CHECK_CAST_JUMBO_fullcheck       @ no, do full check
7700    b       .LOP_CHECK_CAST_JUMBO_okay            @ yes, finish up
7701
7702/* ------------------------------ */
7703    .balign 64
7704.L_OP_INSTANCE_OF_JUMBO: /* 0x102 */
7705/* File: armv5te/OP_INSTANCE_OF_JUMBO.S */
7706    /*
7707     * Check to see if an object reference is an instance of a class.
7708     *
7709     * Most common situation is a non-null object, being compared against
7710     * an already-resolved class.
7711     *
7712     * TODO: convert most of this into a common subroutine, shared with
7713     *       OP_INSTANCE_OF.S.
7714     */
7715    /* instance-of/jumbo vBBBB, vCCCC, class@AAAAAAAA */
7716    FETCH(r3, 4)                        @ r3<- vCCCC
7717    FETCH(r9, 3)                        @ r9<- vBBBB
7718    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
7719    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
7720    cmp     r0, #0                      @ is object null?
7721    beq     .LOP_INSTANCE_OF_JUMBO_store           @ null obj, not an instance, store r0
7722    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7723    FETCH(r3, 2)                        @ r3<- AAAA (hi)
7724    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
7725    orr     r3, r1, r3, lsl #16         @ r3<- AAAAaaaa
7726    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
7727    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
7728    cmp     r1, #0                      @ have we resolved this before?
7729    beq     .LOP_INSTANCE_OF_JUMBO_resolve         @ not resolved, do it now
7730    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ resolved, continue
7731
7732/* ------------------------------ */
7733    .balign 64
7734.L_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
7735/* File: armv5te/OP_NEW_INSTANCE_JUMBO.S */
7736    /*
7737     * Create a new instance of a class.
7738     */
7739    /* new-instance/jumbo vBBBB, class@AAAAAAAA */
7740    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7741    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7742    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7743    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7744    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7745    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
7746#if defined(WITH_JIT)
7747    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
7748#endif
7749    EXPORT_PC()                         @ req'd for init, resolve, alloc
7750    cmp     r0, #0                      @ already resolved?
7751    beq     .LOP_NEW_INSTANCE_JUMBO_resolve         @ no, resolve it now
7752.LOP_NEW_INSTANCE_JUMBO_resolved:   @ r0=class
7753    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
7754    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
7755    bne     .LOP_NEW_INSTANCE_JUMBO_needinit        @ no, init class now
7756.LOP_NEW_INSTANCE_JUMBO_initialized: @ r0=class
7757    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
7758    bl      dvmAllocObject              @ r0<- new object
7759    b       .LOP_NEW_INSTANCE_JUMBO_finish          @ continue
7760
7761/* ------------------------------ */
7762    .balign 64
7763.L_OP_NEW_ARRAY_JUMBO: /* 0x104 */
7764/* File: armv5te/OP_NEW_ARRAY_JUMBO.S */
7765    /*
7766     * Allocate an array of objects, specified with the array class
7767     * and a count.
7768     *
7769     * The verifier guarantees that this is an array class, so we don't
7770     * check for it here.
7771     */
7772    /* new-array/jumbo vBBBB, vCCCC, class@AAAAAAAA */
7773    FETCH(r2, 1)                        @ r2<- aaaa (lo)
7774    FETCH(r3, 2)                        @ r3<- AAAA (hi)
7775    FETCH(r0, 4)                        @ r0<- vCCCC
7776    orr     r2, r2, r3, lsl #16         @ r2<- AAAAaaaa
7777    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7778    GET_VREG(r1, r0)                    @ r1<- vCCCC (array length)
7779    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7780    cmp     r1, #0                      @ check length
7781    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
7782    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
7783    cmp     r0, #0                      @ already resolved?
7784    EXPORT_PC()                         @ req'd for resolve, alloc
7785    bne     .LOP_NEW_ARRAY_JUMBO_finish          @ resolved, continue
7786    b       .LOP_NEW_ARRAY_JUMBO_resolve         @ do resolve now
7787
7788/* ------------------------------ */
7789    .balign 64
7790.L_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
7791/* File: armv5te/OP_FILLED_NEW_ARRAY_JUMBO.S */
7792    /*
7793     * Create a new array with elements filled from registers.
7794     *
7795     * TODO: convert most of this into a common subroutine, shared with
7796     *       OP_FILLED_NEW_ARRAY.S.
7797     */
7798    /* filled-new-array/jumbo {vCCCC..v(CCCC+BBBB-1)}, type@AAAAAAAA */
7799    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7800    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7801    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7802    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7803    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7804    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
7805    EXPORT_PC()                         @ need for resolve and alloc
7806    cmp     r0, #0                      @ already resolved?
7807    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_continue        @ yes, continue on
78088:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
7809    mov     r2, #0                      @ r2<- false
7810    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
7811    bl      dvmResolveClass             @ r0<- call(clazz, ref)
7812    cmp     r0, #0                      @ got null?
7813    beq     common_exceptionThrown      @ yes, handle exception
7814    b       .LOP_FILLED_NEW_ARRAY_JUMBO_continue
7815
7816/* ------------------------------ */
7817    .balign 64
7818.L_OP_IGET_JUMBO: /* 0x106 */
7819/* File: armv5te/OP_IGET_JUMBO.S */
7820    /*
7821     * Jumbo 32-bit instance field get.
7822     *
7823     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7824     *      iget-char/jumbo, iget-short/jumbo
7825     */
7826    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7827    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7828    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7829    FETCH(r0, 4)                        @ r0<- CCCC
7830    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7831    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7832    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7833    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7834    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7835    cmp     r0, #0                      @ is resolved entry null?
7836    bne     .LOP_IGET_JUMBO_finish          @ no, already resolved
78378:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7838    EXPORT_PC()                         @ resolve() could throw
7839    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7840    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7841    b       .LOP_IGET_JUMBO_resolved        @ resolved, continue
7842
7843/* ------------------------------ */
7844    .balign 64
7845.L_OP_IGET_WIDE_JUMBO: /* 0x107 */
7846/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
7847    /*
7848     * Jumbo 64-bit instance field get.
7849     */
7850    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
7851    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7852    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7853    FETCH(r0, 4)                        @ r0<- CCCC
7854    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7855    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7856    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7857    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7858    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7859    cmp     r0, #0                      @ is resolved entry null?
7860    bne     .LOP_IGET_WIDE_JUMBO_finish          @ no, already resolved
7861    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7862    EXPORT_PC()                         @ resolve() could throw
7863    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7864    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7865    b       .LOP_IGET_WIDE_JUMBO_resolved        @ resolved, continue
7866
7867/* ------------------------------ */
7868    .balign 64
7869.L_OP_IGET_OBJECT_JUMBO: /* 0x108 */
7870/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
7871/* File: armv5te/OP_IGET_JUMBO.S */
7872    /*
7873     * Jumbo 32-bit instance field get.
7874     *
7875     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7876     *      iget-char/jumbo, iget-short/jumbo
7877     */
7878    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7879    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7880    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7881    FETCH(r0, 4)                        @ r0<- CCCC
7882    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7883    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7884    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7885    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7886    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7887    cmp     r0, #0                      @ is resolved entry null?
7888    bne     .LOP_IGET_OBJECT_JUMBO_finish          @ no, already resolved
78898:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7890    EXPORT_PC()                         @ resolve() could throw
7891    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7892    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7893    b       .LOP_IGET_OBJECT_JUMBO_resolved        @ resolved, continue
7894
7895
7896/* ------------------------------ */
7897    .balign 64
7898.L_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
7899/* File: armv5te/OP_IGET_BOOLEAN_JUMBO.S */
7900@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrb", "sqnum":"1" }
7901/* File: armv5te/OP_IGET_JUMBO.S */
7902    /*
7903     * Jumbo 32-bit instance field get.
7904     *
7905     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7906     *      iget-char/jumbo, iget-short/jumbo
7907     */
7908    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7909    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7910    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7911    FETCH(r0, 4)                        @ r0<- CCCC
7912    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7913    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7914    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7915    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7916    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7917    cmp     r0, #0                      @ is resolved entry null?
7918    bne     .LOP_IGET_BOOLEAN_JUMBO_finish          @ no, already resolved
79198:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7920    EXPORT_PC()                         @ resolve() could throw
7921    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7922    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7923    b       .LOP_IGET_BOOLEAN_JUMBO_resolved        @ resolved, continue
7924
7925
7926/* ------------------------------ */
7927    .balign 64
7928.L_OP_IGET_BYTE_JUMBO: /* 0x10a */
7929/* File: armv5te/OP_IGET_BYTE_JUMBO.S */
7930@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsb", "sqnum":"2" }
7931/* File: armv5te/OP_IGET_JUMBO.S */
7932    /*
7933     * Jumbo 32-bit instance field get.
7934     *
7935     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7936     *      iget-char/jumbo, iget-short/jumbo
7937     */
7938    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7939    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7940    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7941    FETCH(r0, 4)                        @ r0<- CCCC
7942    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7943    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7944    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7945    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7946    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7947    cmp     r0, #0                      @ is resolved entry null?
7948    bne     .LOP_IGET_BYTE_JUMBO_finish          @ no, already resolved
79498:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7950    EXPORT_PC()                         @ resolve() could throw
7951    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7952    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7953    b       .LOP_IGET_BYTE_JUMBO_resolved        @ resolved, continue
7954
7955
7956/* ------------------------------ */
7957    .balign 64
7958.L_OP_IGET_CHAR_JUMBO: /* 0x10b */
7959/* File: armv5te/OP_IGET_CHAR_JUMBO.S */
7960@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrh", "sqnum":"3" }
7961/* File: armv5te/OP_IGET_JUMBO.S */
7962    /*
7963     * Jumbo 32-bit instance field get.
7964     *
7965     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7966     *      iget-char/jumbo, iget-short/jumbo
7967     */
7968    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7969    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7970    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7971    FETCH(r0, 4)                        @ r0<- CCCC
7972    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7973    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7974    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7975    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7976    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7977    cmp     r0, #0                      @ is resolved entry null?
7978    bne     .LOP_IGET_CHAR_JUMBO_finish          @ no, already resolved
79798:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7980    EXPORT_PC()                         @ resolve() could throw
7981    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7982    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7983    b       .LOP_IGET_CHAR_JUMBO_resolved        @ resolved, continue
7984
7985
7986/* ------------------------------ */
7987    .balign 64
7988.L_OP_IGET_SHORT_JUMBO: /* 0x10c */
7989/* File: armv5te/OP_IGET_SHORT_JUMBO.S */
7990@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsh", "sqnum":"4" }
7991/* File: armv5te/OP_IGET_JUMBO.S */
7992    /*
7993     * Jumbo 32-bit instance field get.
7994     *
7995     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7996     *      iget-char/jumbo, iget-short/jumbo
7997     */
7998    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7999    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8000    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8001    FETCH(r0, 4)                        @ r0<- CCCC
8002    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8003    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8004    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8005    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8006    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8007    cmp     r0, #0                      @ is resolved entry null?
8008    bne     .LOP_IGET_SHORT_JUMBO_finish          @ no, already resolved
80098:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8010    EXPORT_PC()                         @ resolve() could throw
8011    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8012    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8013    b       .LOP_IGET_SHORT_JUMBO_resolved        @ resolved, continue
8014
8015
8016/* ------------------------------ */
8017    .balign 64
8018.L_OP_IPUT_JUMBO: /* 0x10d */
8019/* File: armv5te/OP_IPUT_JUMBO.S */
8020    /*
8021     * Jumbo 32-bit instance field put.
8022     *
8023     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8024     *      iput-short/jumbo
8025     */
8026    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8027    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8028    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8029    FETCH(r0, 4)                        @ r0<- CCCC
8030    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8031    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8032    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8033    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8034    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8035    cmp     r0, #0                      @ is resolved entry null?
8036    bne     .LOP_IPUT_JUMBO_finish          @ no, already resolved
80378:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8038    EXPORT_PC()                         @ resolve() could throw
8039    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8040    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8041    b       .LOP_IPUT_JUMBO_resolved        @ resolved, continue
8042
8043/* ------------------------------ */
8044    .balign 64
8045.L_OP_IPUT_WIDE_JUMBO: /* 0x10e */
8046/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
8047    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8048    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8049    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8050    FETCH(r0, 4)                        @ r0<- CCCC
8051    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8052    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8053    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
8054    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
8055    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8056    cmp     r0, #0                      @ is resolved entry null?
8057    bne     .LOP_IPUT_WIDE_JUMBO_finish          @ no, already resolved
80588:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
8059    EXPORT_PC()                         @ resolve() could throw
8060    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8061    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8062    b       .LOP_IPUT_WIDE_JUMBO_resolved        @ resolved, continue
8063
8064/* ------------------------------ */
8065    .balign 64
8066.L_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
8067/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
8068    /*
8069     * Jumbo 32-bit instance field put.
8070     */
8071    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8072    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8073    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8074    FETCH(r0, 4)                        @ r0<- CCCC
8075    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8076    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8077    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8078    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8079    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8080    cmp     r0, #0                      @ is resolved entry null?
8081    bne     .LOP_IPUT_OBJECT_JUMBO_finish          @ no, already resolved
80828:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8083    EXPORT_PC()                         @ resolve() could throw
8084    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8085    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8086    b       .LOP_IPUT_OBJECT_JUMBO_resolved        @ resolved, continue
8087
8088/* ------------------------------ */
8089    .balign 64
8090.L_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
8091/* File: armv5te/OP_IPUT_BOOLEAN_JUMBO.S */
8092@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"1" }
8093/* File: armv5te/OP_IPUT_JUMBO.S */
8094    /*
8095     * Jumbo 32-bit instance field put.
8096     *
8097     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8098     *      iput-short/jumbo
8099     */
8100    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8101    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8102    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8103    FETCH(r0, 4)                        @ r0<- CCCC
8104    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8105    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8106    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8107    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8108    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8109    cmp     r0, #0                      @ is resolved entry null?
8110    bne     .LOP_IPUT_BOOLEAN_JUMBO_finish          @ no, already resolved
81118:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8112    EXPORT_PC()                         @ resolve() could throw
8113    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8114    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8115    b       .LOP_IPUT_BOOLEAN_JUMBO_resolved        @ resolved, continue
8116
8117
8118/* ------------------------------ */
8119    .balign 64
8120.L_OP_IPUT_BYTE_JUMBO: /* 0x111 */
8121/* File: armv5te/OP_IPUT_BYTE_JUMBO.S */
8122@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"2" }
8123/* File: armv5te/OP_IPUT_JUMBO.S */
8124    /*
8125     * Jumbo 32-bit instance field put.
8126     *
8127     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8128     *      iput-short/jumbo
8129     */
8130    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8131    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8132    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8133    FETCH(r0, 4)                        @ r0<- CCCC
8134    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8135    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8136    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8137    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8138    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8139    cmp     r0, #0                      @ is resolved entry null?
8140    bne     .LOP_IPUT_BYTE_JUMBO_finish          @ no, already resolved
81418:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8142    EXPORT_PC()                         @ resolve() could throw
8143    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8144    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8145    b       .LOP_IPUT_BYTE_JUMBO_resolved        @ resolved, continue
8146
8147
8148/* ------------------------------ */
8149    .balign 64
8150.L_OP_IPUT_CHAR_JUMBO: /* 0x112 */
8151/* File: armv5te/OP_IPUT_CHAR_JUMBO.S */
8152@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"3" }
8153/* File: armv5te/OP_IPUT_JUMBO.S */
8154    /*
8155     * Jumbo 32-bit instance field put.
8156     *
8157     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8158     *      iput-short/jumbo
8159     */
8160    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8161    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8162    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8163    FETCH(r0, 4)                        @ r0<- CCCC
8164    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8165    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8166    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8167    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8168    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8169    cmp     r0, #0                      @ is resolved entry null?
8170    bne     .LOP_IPUT_CHAR_JUMBO_finish          @ no, already resolved
81718:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8172    EXPORT_PC()                         @ resolve() could throw
8173    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8174    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8175    b       .LOP_IPUT_CHAR_JUMBO_resolved        @ resolved, continue
8176
8177
8178/* ------------------------------ */
8179    .balign 64
8180.L_OP_IPUT_SHORT_JUMBO: /* 0x113 */
8181/* File: armv5te/OP_IPUT_SHORT_JUMBO.S */
8182@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"4" }
8183/* File: armv5te/OP_IPUT_JUMBO.S */
8184    /*
8185     * Jumbo 32-bit instance field put.
8186     *
8187     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8188     *      iput-short/jumbo
8189     */
8190    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8191    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8192    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8193    FETCH(r0, 4)                        @ r0<- CCCC
8194    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8195    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8196    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8197    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8198    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8199    cmp     r0, #0                      @ is resolved entry null?
8200    bne     .LOP_IPUT_SHORT_JUMBO_finish          @ no, already resolved
82018:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8202    EXPORT_PC()                         @ resolve() could throw
8203    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8204    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8205    b       .LOP_IPUT_SHORT_JUMBO_resolved        @ resolved, continue
8206
8207
8208/* ------------------------------ */
8209    .balign 64
8210.L_OP_SGET_JUMBO: /* 0x114 */
8211/* File: armv5te/OP_SGET_JUMBO.S */
8212    /*
8213     * Jumbo 32-bit SGET handler.
8214     *
8215     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8216     *      sget-char/jumbo, sget-short/jumbo
8217     */
8218    /* exop vBBBB, field@AAAAAAAA */
8219    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8220    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8221    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8222    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8223    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8224    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8225    cmp     r0, #0                      @ is resolved entry null?
8226    beq     .LOP_SGET_JUMBO_resolve         @ yes, do resolve
8227.LOP_SGET_JUMBO_finish: @ field ptr in r0
8228    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8229    @ no-op                             @ acquiring load
8230    FETCH(r2, 3)                        @ r2<- BBBB
8231    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8232    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8233    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8234    GOTO_OPCODE(ip)                     @ jump to next instruction
8235
8236/* ------------------------------ */
8237    .balign 64
8238.L_OP_SGET_WIDE_JUMBO: /* 0x115 */
8239/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
8240    /*
8241     * Jumbo 64-bit SGET handler.
8242     */
8243    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
8244    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8245    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8246    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8247    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
8248    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8249    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
8250    cmp     r0, #0                      @ is resolved entry null?
8251    beq     .LOP_SGET_WIDE_JUMBO_resolve         @ yes, do resolve
8252.LOP_SGET_WIDE_JUMBO_finish:
8253    FETCH(r9, 3)                        @ r9<- BBBB
8254    .if 0
8255    add     r0, r0, #offStaticField_value @ r0<- pointer to data
8256    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
8257    .else
8258    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
8259    .endif
8260    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8261    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8262    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
8263    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8264    GOTO_OPCODE(ip)                     @ jump to next instruction
8265
8266/* ------------------------------ */
8267    .balign 64
8268.L_OP_SGET_OBJECT_JUMBO: /* 0x116 */
8269/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
8270/* File: armv5te/OP_SGET_JUMBO.S */
8271    /*
8272     * Jumbo 32-bit SGET handler.
8273     *
8274     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8275     *      sget-char/jumbo, sget-short/jumbo
8276     */
8277    /* exop vBBBB, field@AAAAAAAA */
8278    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8279    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8280    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8281    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8282    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8283    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8284    cmp     r0, #0                      @ is resolved entry null?
8285    beq     .LOP_SGET_OBJECT_JUMBO_resolve         @ yes, do resolve
8286.LOP_SGET_OBJECT_JUMBO_finish: @ field ptr in r0
8287    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8288    @ no-op                             @ acquiring load
8289    FETCH(r2, 3)                        @ r2<- BBBB
8290    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8291    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8292    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8293    GOTO_OPCODE(ip)                     @ jump to next instruction
8294
8295
8296/* ------------------------------ */
8297    .balign 64
8298.L_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
8299/* File: armv5te/OP_SGET_BOOLEAN_JUMBO.S */
8300/* File: armv5te/OP_SGET_JUMBO.S */
8301    /*
8302     * Jumbo 32-bit SGET handler.
8303     *
8304     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8305     *      sget-char/jumbo, sget-short/jumbo
8306     */
8307    /* exop vBBBB, field@AAAAAAAA */
8308    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8309    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8310    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8311    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8312    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8313    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8314    cmp     r0, #0                      @ is resolved entry null?
8315    beq     .LOP_SGET_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8316.LOP_SGET_BOOLEAN_JUMBO_finish: @ field ptr in r0
8317    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8318    @ no-op                             @ acquiring load
8319    FETCH(r2, 3)                        @ r2<- BBBB
8320    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8321    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8322    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8323    GOTO_OPCODE(ip)                     @ jump to next instruction
8324
8325
8326/* ------------------------------ */
8327    .balign 64
8328.L_OP_SGET_BYTE_JUMBO: /* 0x118 */
8329/* File: armv5te/OP_SGET_BYTE_JUMBO.S */
8330/* File: armv5te/OP_SGET_JUMBO.S */
8331    /*
8332     * Jumbo 32-bit SGET handler.
8333     *
8334     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8335     *      sget-char/jumbo, sget-short/jumbo
8336     */
8337    /* exop vBBBB, field@AAAAAAAA */
8338    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8339    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8340    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8341    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8342    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8343    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8344    cmp     r0, #0                      @ is resolved entry null?
8345    beq     .LOP_SGET_BYTE_JUMBO_resolve         @ yes, do resolve
8346.LOP_SGET_BYTE_JUMBO_finish: @ field ptr in r0
8347    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8348    @ no-op                             @ acquiring load
8349    FETCH(r2, 3)                        @ r2<- BBBB
8350    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8351    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8352    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8353    GOTO_OPCODE(ip)                     @ jump to next instruction
8354
8355
8356/* ------------------------------ */
8357    .balign 64
8358.L_OP_SGET_CHAR_JUMBO: /* 0x119 */
8359/* File: armv5te/OP_SGET_CHAR_JUMBO.S */
8360/* File: armv5te/OP_SGET_JUMBO.S */
8361    /*
8362     * Jumbo 32-bit SGET handler.
8363     *
8364     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8365     *      sget-char/jumbo, sget-short/jumbo
8366     */
8367    /* exop vBBBB, field@AAAAAAAA */
8368    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8369    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8370    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8371    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8372    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8373    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8374    cmp     r0, #0                      @ is resolved entry null?
8375    beq     .LOP_SGET_CHAR_JUMBO_resolve         @ yes, do resolve
8376.LOP_SGET_CHAR_JUMBO_finish: @ field ptr in r0
8377    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8378    @ no-op                             @ acquiring load
8379    FETCH(r2, 3)                        @ r2<- BBBB
8380    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8381    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8382    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8383    GOTO_OPCODE(ip)                     @ jump to next instruction
8384
8385
8386/* ------------------------------ */
8387    .balign 64
8388.L_OP_SGET_SHORT_JUMBO: /* 0x11a */
8389/* File: armv5te/OP_SGET_SHORT_JUMBO.S */
8390/* File: armv5te/OP_SGET_JUMBO.S */
8391    /*
8392     * Jumbo 32-bit SGET handler.
8393     *
8394     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8395     *      sget-char/jumbo, sget-short/jumbo
8396     */
8397    /* exop vBBBB, field@AAAAAAAA */
8398    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8399    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8400    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8401    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8402    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8403    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8404    cmp     r0, #0                      @ is resolved entry null?
8405    beq     .LOP_SGET_SHORT_JUMBO_resolve         @ yes, do resolve
8406.LOP_SGET_SHORT_JUMBO_finish: @ field ptr in r0
8407    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8408    @ no-op                             @ acquiring load
8409    FETCH(r2, 3)                        @ r2<- BBBB
8410    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8411    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8412    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8413    GOTO_OPCODE(ip)                     @ jump to next instruction
8414
8415
8416/* ------------------------------ */
8417    .balign 64
8418.L_OP_SPUT_JUMBO: /* 0x11b */
8419/* File: armv5te/OP_SPUT_JUMBO.S */
8420    /*
8421     * Jumbo 32-bit SPUT handler.
8422     *
8423     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8424     *      sput-short/jumbo
8425     */
8426    /* exop vBBBB, field@AAAAAAAA */
8427    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8428    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8429    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8430    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8431    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8432    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8433    cmp     r0, #0                      @ is resolved entry null?
8434    beq     .LOP_SPUT_JUMBO_resolve         @ yes, do resolve
8435.LOP_SPUT_JUMBO_finish:   @ field ptr in r0
8436    FETCH(r2, 3)                        @ r2<- BBBB
8437    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8438    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8439    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8440    @ no-op                             @ releasing store
8441    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8442    GOTO_OPCODE(ip)                     @ jump to next instruction
8443
8444/* ------------------------------ */
8445    .balign 64
8446.L_OP_SPUT_WIDE_JUMBO: /* 0x11c */
8447/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
8448    /*
8449     * Jumbo 64-bit SPUT handler.
8450     */
8451    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
8452    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
8453    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8454    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8455    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8456    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8457    FETCH(r9, 3)                        @ r9<- BBBB
8458    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
8459    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8460    cmp     r2, #0                      @ is resolved entry null?
8461    beq     .LOP_SPUT_WIDE_JUMBO_resolve         @ yes, do resolve
8462.LOP_SPUT_WIDE_JUMBO_finish: @ field ptr in r2, BBBB in r9
8463    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8464    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
8465    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8466    .if 0
8467    add     r2, r2, #offStaticField_value @ r2<- pointer to data
8468    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
8469    .else
8470    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
8471    .endif
8472    GOTO_OPCODE(r10)                    @ jump to next instruction
8473
8474/* ------------------------------ */
8475    .balign 64
8476.L_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
8477/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
8478    /*
8479     * Jumbo 32-bit SPUT handler for objects
8480     */
8481    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
8482    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8483    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8484    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8485    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8486    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8487    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8488    cmp     r0, #0                      @ is resolved entry null?
8489    beq     .LOP_SPUT_OBJECT_JUMBO_resolve         @ yes, do resolve
8490.LOP_SPUT_OBJECT_JUMBO_finish:   @ field ptr in r0
8491    FETCH(r2, 3)                        @ r2<- BBBB
8492    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8493    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8494    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8495    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
8496    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8497    @ no-op                             @ releasing store
8498    b       .LOP_SPUT_OBJECT_JUMBO_end
8499
8500/* ------------------------------ */
8501    .balign 64
8502.L_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
8503/* File: armv5te/OP_SPUT_BOOLEAN_JUMBO.S */
8504/* File: armv5te/OP_SPUT_JUMBO.S */
8505    /*
8506     * Jumbo 32-bit SPUT handler.
8507     *
8508     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8509     *      sput-short/jumbo
8510     */
8511    /* exop vBBBB, field@AAAAAAAA */
8512    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8513    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8514    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8515    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8516    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8517    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8518    cmp     r0, #0                      @ is resolved entry null?
8519    beq     .LOP_SPUT_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8520.LOP_SPUT_BOOLEAN_JUMBO_finish:   @ field ptr in r0
8521    FETCH(r2, 3)                        @ r2<- BBBB
8522    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8523    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8524    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8525    @ no-op                             @ releasing store
8526    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8527    GOTO_OPCODE(ip)                     @ jump to next instruction
8528
8529
8530/* ------------------------------ */
8531    .balign 64
8532.L_OP_SPUT_BYTE_JUMBO: /* 0x11f */
8533/* File: armv5te/OP_SPUT_BYTE_JUMBO.S */
8534/* File: armv5te/OP_SPUT_JUMBO.S */
8535    /*
8536     * Jumbo 32-bit SPUT handler.
8537     *
8538     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8539     *      sput-short/jumbo
8540     */
8541    /* exop vBBBB, field@AAAAAAAA */
8542    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8543    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8544    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8545    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8546    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8547    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8548    cmp     r0, #0                      @ is resolved entry null?
8549    beq     .LOP_SPUT_BYTE_JUMBO_resolve         @ yes, do resolve
8550.LOP_SPUT_BYTE_JUMBO_finish:   @ field ptr in r0
8551    FETCH(r2, 3)                        @ r2<- BBBB
8552    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8553    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8554    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8555    @ no-op                             @ releasing store
8556    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8557    GOTO_OPCODE(ip)                     @ jump to next instruction
8558
8559
8560/* ------------------------------ */
8561    .balign 64
8562.L_OP_SPUT_CHAR_JUMBO: /* 0x120 */
8563/* File: armv5te/OP_SPUT_CHAR_JUMBO.S */
8564/* File: armv5te/OP_SPUT_JUMBO.S */
8565    /*
8566     * Jumbo 32-bit SPUT handler.
8567     *
8568     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8569     *      sput-short/jumbo
8570     */
8571    /* exop vBBBB, field@AAAAAAAA */
8572    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8573    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8574    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8575    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8576    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8577    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8578    cmp     r0, #0                      @ is resolved entry null?
8579    beq     .LOP_SPUT_CHAR_JUMBO_resolve         @ yes, do resolve
8580.LOP_SPUT_CHAR_JUMBO_finish:   @ field ptr in r0
8581    FETCH(r2, 3)                        @ r2<- BBBB
8582    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8583    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8584    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8585    @ no-op                             @ releasing store
8586    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8587    GOTO_OPCODE(ip)                     @ jump to next instruction
8588
8589
8590/* ------------------------------ */
8591    .balign 64
8592.L_OP_SPUT_SHORT_JUMBO: /* 0x121 */
8593/* File: armv5te/OP_SPUT_SHORT_JUMBO.S */
8594/* File: armv5te/OP_SPUT_JUMBO.S */
8595    /*
8596     * Jumbo 32-bit SPUT handler.
8597     *
8598     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8599     *      sput-short/jumbo
8600     */
8601    /* exop vBBBB, field@AAAAAAAA */
8602    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8603    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8604    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8605    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8606    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8607    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8608    cmp     r0, #0                      @ is resolved entry null?
8609    beq     .LOP_SPUT_SHORT_JUMBO_resolve         @ yes, do resolve
8610.LOP_SPUT_SHORT_JUMBO_finish:   @ field ptr in r0
8611    FETCH(r2, 3)                        @ r2<- BBBB
8612    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8613    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8614    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8615    @ no-op                             @ releasing store
8616    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8617    GOTO_OPCODE(ip)                     @ jump to next instruction
8618
8619
8620/* ------------------------------ */
8621    .balign 64
8622.L_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
8623/* File: armv5te/OP_INVOKE_VIRTUAL_JUMBO.S */
8624    /*
8625     * Handle a virtual method call.
8626     */
8627    /* invoke-virtual/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8628    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8629    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8630    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8631    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8632    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8633    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
8634    cmp     r0, #0                      @ already resolved?
8635    EXPORT_PC()                         @ must export for invoke
8636    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ yes, continue on
8637    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
8638    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8639    mov     r2, #METHOD_VIRTUAL         @ resolver method type
8640    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
8641    cmp     r0, #0                      @ got null?
8642    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ no, continue
8643    b       common_exceptionThrown      @ yes, handle exception
8644
8645/* ------------------------------ */
8646    .balign 64
8647.L_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
8648/* File: armv5te/OP_INVOKE_SUPER_JUMBO.S */
8649    /*
8650     * Handle a "super" method call.
8651     */
8652    /* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8653    FETCH(r10, 4)                       @ r10<- CCCC
8654    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8655    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8656    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8657    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8658    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8659    GET_VREG(r9, r10)                   @ r9<- "this" ptr
8660    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
8661    cmp     r9, #0                      @ null "this"?
8662    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
8663    beq     common_errNullObject        @ null "this", throw exception
8664    cmp     r0, #0                      @ already resolved?
8665    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
8666    EXPORT_PC()                         @ must export for invoke
8667    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ resolved, continue on
8668    b       .LOP_INVOKE_SUPER_JUMBO_resolve         @ do resolve now
8669
8670/* ------------------------------ */
8671    .balign 64
8672.L_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
8673/* File: armv5te/OP_INVOKE_DIRECT_JUMBO.S */
8674    /*
8675     * Handle a direct method call.
8676     *
8677     * (We could defer the "is 'this' pointer null" test to the common
8678     * method invocation code, and use a flag to indicate that static
8679     * calls don't count.  If we do this as part of copying the arguments
8680     * out we could avoiding loading the first arg twice.)
8681     *
8682     */
8683    /* invoke-direct/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8684    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8685    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8686    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8687    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8688    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8689    FETCH(r10, 4)                       @ r10<- CCCC
8690    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
8691    cmp     r0, #0                      @ already resolved?
8692    EXPORT_PC()                         @ must export for invoke
8693    GET_VREG(r9, r10)                   @ r9<- "this" ptr
8694    beq     .LOP_INVOKE_DIRECT_JUMBO_resolve         @ not resolved, do it now
8695.LOP_INVOKE_DIRECT_JUMBO_finish:
8696    cmp     r9, #0                      @ null "this" ref?
8697    bne     common_invokeMethodJumbo    @ (r0=method, r9="this")
8698    b       common_errNullObject        @ yes, throw exception
8699
8700/* ------------------------------ */
8701    .balign 64
8702.L_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
8703/* File: armv5te/OP_INVOKE_STATIC_JUMBO.S */
8704    /*
8705     * Handle a static method call.
8706     */
8707    /* invoke-static/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8708    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8709    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8710    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8711    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8712    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8713    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
8714#if defined(WITH_JIT)
8715    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
8716#endif
8717    cmp     r0, #0                      @ already resolved?
8718    EXPORT_PC()                         @ must export for invoke
8719    bne     common_invokeMethodJumboNoThis   @ (r0=method)
8720    b       .LOP_INVOKE_STATIC_JUMBO_resolve
8721
8722/* ------------------------------ */
8723    .balign 64
8724.L_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
8725/* File: armv5te/OP_INVOKE_INTERFACE_JUMBO.S */
8726    /*
8727     * Handle an interface method call.
8728     */
8729    /* invoke-interface/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8730    FETCH(r2, 4)                        @ r2<- CCCC
8731    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8732    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8733    EXPORT_PC()                         @ must export for invoke
8734    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8735    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
8736    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
8737    cmp     r9, #0                      @ null obj?
8738    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
8739    beq     common_errNullObject        @ yes, fail
8740    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
8741    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
8742    cmp     r0, #0                      @ failed?
8743    beq     common_exceptionThrown      @ yes, handle exception
8744    b       common_invokeMethodJumbo    @ (r0=method, r9="this")
8745
8746/* ------------------------------ */
8747    .balign 64
8748.L_OP_UNUSED_27FF: /* 0x127 */
8749/* File: armv5te/OP_UNUSED_27FF.S */
8750/* File: armv5te/unused.S */
8751    bl      common_abort
8752
8753
8754/* ------------------------------ */
8755    .balign 64
8756.L_OP_UNUSED_28FF: /* 0x128 */
8757/* File: armv5te/OP_UNUSED_28FF.S */
8758/* File: armv5te/unused.S */
8759    bl      common_abort
8760
8761
8762/* ------------------------------ */
8763    .balign 64
8764.L_OP_UNUSED_29FF: /* 0x129 */
8765/* File: armv5te/OP_UNUSED_29FF.S */
8766/* File: armv5te/unused.S */
8767    bl      common_abort
8768
8769
8770/* ------------------------------ */
8771    .balign 64
8772.L_OP_UNUSED_2AFF: /* 0x12a */
8773/* File: armv5te/OP_UNUSED_2AFF.S */
8774/* File: armv5te/unused.S */
8775    bl      common_abort
8776
8777
8778/* ------------------------------ */
8779    .balign 64
8780.L_OP_UNUSED_2BFF: /* 0x12b */
8781/* File: armv5te/OP_UNUSED_2BFF.S */
8782/* File: armv5te/unused.S */
8783    bl      common_abort
8784
8785
8786/* ------------------------------ */
8787    .balign 64
8788.L_OP_UNUSED_2CFF: /* 0x12c */
8789/* File: armv5te/OP_UNUSED_2CFF.S */
8790/* File: armv5te/unused.S */
8791    bl      common_abort
8792
8793
8794/* ------------------------------ */
8795    .balign 64
8796.L_OP_UNUSED_2DFF: /* 0x12d */
8797/* File: armv5te/OP_UNUSED_2DFF.S */
8798/* File: armv5te/unused.S */
8799    bl      common_abort
8800
8801
8802/* ------------------------------ */
8803    .balign 64
8804.L_OP_UNUSED_2EFF: /* 0x12e */
8805/* File: armv5te/OP_UNUSED_2EFF.S */
8806/* File: armv5te/unused.S */
8807    bl      common_abort
8808
8809
8810/* ------------------------------ */
8811    .balign 64
8812.L_OP_UNUSED_2FFF: /* 0x12f */
8813/* File: armv5te/OP_UNUSED_2FFF.S */
8814/* File: armv5te/unused.S */
8815    bl      common_abort
8816
8817
8818/* ------------------------------ */
8819    .balign 64
8820.L_OP_UNUSED_30FF: /* 0x130 */
8821/* File: armv5te/OP_UNUSED_30FF.S */
8822/* File: armv5te/unused.S */
8823    bl      common_abort
8824
8825
8826/* ------------------------------ */
8827    .balign 64
8828.L_OP_UNUSED_31FF: /* 0x131 */
8829/* File: armv5te/OP_UNUSED_31FF.S */
8830/* File: armv5te/unused.S */
8831    bl      common_abort
8832
8833
8834/* ------------------------------ */
8835    .balign 64
8836.L_OP_UNUSED_32FF: /* 0x132 */
8837/* File: armv5te/OP_UNUSED_32FF.S */
8838/* File: armv5te/unused.S */
8839    bl      common_abort
8840
8841
8842/* ------------------------------ */
8843    .balign 64
8844.L_OP_UNUSED_33FF: /* 0x133 */
8845/* File: armv5te/OP_UNUSED_33FF.S */
8846/* File: armv5te/unused.S */
8847    bl      common_abort
8848
8849
8850/* ------------------------------ */
8851    .balign 64
8852.L_OP_UNUSED_34FF: /* 0x134 */
8853/* File: armv5te/OP_UNUSED_34FF.S */
8854/* File: armv5te/unused.S */
8855    bl      common_abort
8856
8857
8858/* ------------------------------ */
8859    .balign 64
8860.L_OP_UNUSED_35FF: /* 0x135 */
8861/* File: armv5te/OP_UNUSED_35FF.S */
8862/* File: armv5te/unused.S */
8863    bl      common_abort
8864
8865
8866/* ------------------------------ */
8867    .balign 64
8868.L_OP_UNUSED_36FF: /* 0x136 */
8869/* File: armv5te/OP_UNUSED_36FF.S */
8870/* File: armv5te/unused.S */
8871    bl      common_abort
8872
8873
8874/* ------------------------------ */
8875    .balign 64
8876.L_OP_UNUSED_37FF: /* 0x137 */
8877/* File: armv5te/OP_UNUSED_37FF.S */
8878/* File: armv5te/unused.S */
8879    bl      common_abort
8880
8881
8882/* ------------------------------ */
8883    .balign 64
8884.L_OP_UNUSED_38FF: /* 0x138 */
8885/* File: armv5te/OP_UNUSED_38FF.S */
8886/* File: armv5te/unused.S */
8887    bl      common_abort
8888
8889
8890/* ------------------------------ */
8891    .balign 64
8892.L_OP_UNUSED_39FF: /* 0x139 */
8893/* File: armv5te/OP_UNUSED_39FF.S */
8894/* File: armv5te/unused.S */
8895    bl      common_abort
8896
8897
8898/* ------------------------------ */
8899    .balign 64
8900.L_OP_UNUSED_3AFF: /* 0x13a */
8901/* File: armv5te/OP_UNUSED_3AFF.S */
8902/* File: armv5te/unused.S */
8903    bl      common_abort
8904
8905
8906/* ------------------------------ */
8907    .balign 64
8908.L_OP_UNUSED_3BFF: /* 0x13b */
8909/* File: armv5te/OP_UNUSED_3BFF.S */
8910/* File: armv5te/unused.S */
8911    bl      common_abort
8912
8913
8914/* ------------------------------ */
8915    .balign 64
8916.L_OP_UNUSED_3CFF: /* 0x13c */
8917/* File: armv5te/OP_UNUSED_3CFF.S */
8918/* File: armv5te/unused.S */
8919    bl      common_abort
8920
8921
8922/* ------------------------------ */
8923    .balign 64
8924.L_OP_UNUSED_3DFF: /* 0x13d */
8925/* File: armv5te/OP_UNUSED_3DFF.S */
8926/* File: armv5te/unused.S */
8927    bl      common_abort
8928
8929
8930/* ------------------------------ */
8931    .balign 64
8932.L_OP_UNUSED_3EFF: /* 0x13e */
8933/* File: armv5te/OP_UNUSED_3EFF.S */
8934/* File: armv5te/unused.S */
8935    bl      common_abort
8936
8937
8938/* ------------------------------ */
8939    .balign 64
8940.L_OP_UNUSED_3FFF: /* 0x13f */
8941/* File: armv5te/OP_UNUSED_3FFF.S */
8942/* File: armv5te/unused.S */
8943    bl      common_abort
8944
8945
8946/* ------------------------------ */
8947    .balign 64
8948.L_OP_UNUSED_40FF: /* 0x140 */
8949/* File: armv5te/OP_UNUSED_40FF.S */
8950/* File: armv5te/unused.S */
8951    bl      common_abort
8952
8953
8954/* ------------------------------ */
8955    .balign 64
8956.L_OP_UNUSED_41FF: /* 0x141 */
8957/* File: armv5te/OP_UNUSED_41FF.S */
8958/* File: armv5te/unused.S */
8959    bl      common_abort
8960
8961
8962/* ------------------------------ */
8963    .balign 64
8964.L_OP_UNUSED_42FF: /* 0x142 */
8965/* File: armv5te/OP_UNUSED_42FF.S */
8966/* File: armv5te/unused.S */
8967    bl      common_abort
8968
8969
8970/* ------------------------------ */
8971    .balign 64
8972.L_OP_UNUSED_43FF: /* 0x143 */
8973/* File: armv5te/OP_UNUSED_43FF.S */
8974/* File: armv5te/unused.S */
8975    bl      common_abort
8976
8977
8978/* ------------------------------ */
8979    .balign 64
8980.L_OP_UNUSED_44FF: /* 0x144 */
8981/* File: armv5te/OP_UNUSED_44FF.S */
8982/* File: armv5te/unused.S */
8983    bl      common_abort
8984
8985
8986/* ------------------------------ */
8987    .balign 64
8988.L_OP_UNUSED_45FF: /* 0x145 */
8989/* File: armv5te/OP_UNUSED_45FF.S */
8990/* File: armv5te/unused.S */
8991    bl      common_abort
8992
8993
8994/* ------------------------------ */
8995    .balign 64
8996.L_OP_UNUSED_46FF: /* 0x146 */
8997/* File: armv5te/OP_UNUSED_46FF.S */
8998/* File: armv5te/unused.S */
8999    bl      common_abort
9000
9001
9002/* ------------------------------ */
9003    .balign 64
9004.L_OP_UNUSED_47FF: /* 0x147 */
9005/* File: armv5te/OP_UNUSED_47FF.S */
9006/* File: armv5te/unused.S */
9007    bl      common_abort
9008
9009
9010/* ------------------------------ */
9011    .balign 64
9012.L_OP_UNUSED_48FF: /* 0x148 */
9013/* File: armv5te/OP_UNUSED_48FF.S */
9014/* File: armv5te/unused.S */
9015    bl      common_abort
9016
9017
9018/* ------------------------------ */
9019    .balign 64
9020.L_OP_UNUSED_49FF: /* 0x149 */
9021/* File: armv5te/OP_UNUSED_49FF.S */
9022/* File: armv5te/unused.S */
9023    bl      common_abort
9024
9025
9026/* ------------------------------ */
9027    .balign 64
9028.L_OP_UNUSED_4AFF: /* 0x14a */
9029/* File: armv5te/OP_UNUSED_4AFF.S */
9030/* File: armv5te/unused.S */
9031    bl      common_abort
9032
9033
9034/* ------------------------------ */
9035    .balign 64
9036.L_OP_UNUSED_4BFF: /* 0x14b */
9037/* File: armv5te/OP_UNUSED_4BFF.S */
9038/* File: armv5te/unused.S */
9039    bl      common_abort
9040
9041
9042/* ------------------------------ */
9043    .balign 64
9044.L_OP_UNUSED_4CFF: /* 0x14c */
9045/* File: armv5te/OP_UNUSED_4CFF.S */
9046/* File: armv5te/unused.S */
9047    bl      common_abort
9048
9049
9050/* ------------------------------ */
9051    .balign 64
9052.L_OP_UNUSED_4DFF: /* 0x14d */
9053/* File: armv5te/OP_UNUSED_4DFF.S */
9054/* File: armv5te/unused.S */
9055    bl      common_abort
9056
9057
9058/* ------------------------------ */
9059    .balign 64
9060.L_OP_UNUSED_4EFF: /* 0x14e */
9061/* File: armv5te/OP_UNUSED_4EFF.S */
9062/* File: armv5te/unused.S */
9063    bl      common_abort
9064
9065
9066/* ------------------------------ */
9067    .balign 64
9068.L_OP_UNUSED_4FFF: /* 0x14f */
9069/* File: armv5te/OP_UNUSED_4FFF.S */
9070/* File: armv5te/unused.S */
9071    bl      common_abort
9072
9073
9074/* ------------------------------ */
9075    .balign 64
9076.L_OP_UNUSED_50FF: /* 0x150 */
9077/* File: armv5te/OP_UNUSED_50FF.S */
9078/* File: armv5te/unused.S */
9079    bl      common_abort
9080
9081
9082/* ------------------------------ */
9083    .balign 64
9084.L_OP_UNUSED_51FF: /* 0x151 */
9085/* File: armv5te/OP_UNUSED_51FF.S */
9086/* File: armv5te/unused.S */
9087    bl      common_abort
9088
9089
9090/* ------------------------------ */
9091    .balign 64
9092.L_OP_UNUSED_52FF: /* 0x152 */
9093/* File: armv5te/OP_UNUSED_52FF.S */
9094/* File: armv5te/unused.S */
9095    bl      common_abort
9096
9097
9098/* ------------------------------ */
9099    .balign 64
9100.L_OP_UNUSED_53FF: /* 0x153 */
9101/* File: armv5te/OP_UNUSED_53FF.S */
9102/* File: armv5te/unused.S */
9103    bl      common_abort
9104
9105
9106/* ------------------------------ */
9107    .balign 64
9108.L_OP_UNUSED_54FF: /* 0x154 */
9109/* File: armv5te/OP_UNUSED_54FF.S */
9110/* File: armv5te/unused.S */
9111    bl      common_abort
9112
9113
9114/* ------------------------------ */
9115    .balign 64
9116.L_OP_UNUSED_55FF: /* 0x155 */
9117/* File: armv5te/OP_UNUSED_55FF.S */
9118/* File: armv5te/unused.S */
9119    bl      common_abort
9120
9121
9122/* ------------------------------ */
9123    .balign 64
9124.L_OP_UNUSED_56FF: /* 0x156 */
9125/* File: armv5te/OP_UNUSED_56FF.S */
9126/* File: armv5te/unused.S */
9127    bl      common_abort
9128
9129
9130/* ------------------------------ */
9131    .balign 64
9132.L_OP_UNUSED_57FF: /* 0x157 */
9133/* File: armv5te/OP_UNUSED_57FF.S */
9134/* File: armv5te/unused.S */
9135    bl      common_abort
9136
9137
9138/* ------------------------------ */
9139    .balign 64
9140.L_OP_UNUSED_58FF: /* 0x158 */
9141/* File: armv5te/OP_UNUSED_58FF.S */
9142/* File: armv5te/unused.S */
9143    bl      common_abort
9144
9145
9146/* ------------------------------ */
9147    .balign 64
9148.L_OP_UNUSED_59FF: /* 0x159 */
9149/* File: armv5te/OP_UNUSED_59FF.S */
9150/* File: armv5te/unused.S */
9151    bl      common_abort
9152
9153
9154/* ------------------------------ */
9155    .balign 64
9156.L_OP_UNUSED_5AFF: /* 0x15a */
9157/* File: armv5te/OP_UNUSED_5AFF.S */
9158/* File: armv5te/unused.S */
9159    bl      common_abort
9160
9161
9162/* ------------------------------ */
9163    .balign 64
9164.L_OP_UNUSED_5BFF: /* 0x15b */
9165/* File: armv5te/OP_UNUSED_5BFF.S */
9166/* File: armv5te/unused.S */
9167    bl      common_abort
9168
9169
9170/* ------------------------------ */
9171    .balign 64
9172.L_OP_UNUSED_5CFF: /* 0x15c */
9173/* File: armv5te/OP_UNUSED_5CFF.S */
9174/* File: armv5te/unused.S */
9175    bl      common_abort
9176
9177
9178/* ------------------------------ */
9179    .balign 64
9180.L_OP_UNUSED_5DFF: /* 0x15d */
9181/* File: armv5te/OP_UNUSED_5DFF.S */
9182/* File: armv5te/unused.S */
9183    bl      common_abort
9184
9185
9186/* ------------------------------ */
9187    .balign 64
9188.L_OP_UNUSED_5EFF: /* 0x15e */
9189/* File: armv5te/OP_UNUSED_5EFF.S */
9190/* File: armv5te/unused.S */
9191    bl      common_abort
9192
9193
9194/* ------------------------------ */
9195    .balign 64
9196.L_OP_UNUSED_5FFF: /* 0x15f */
9197/* File: armv5te/OP_UNUSED_5FFF.S */
9198/* File: armv5te/unused.S */
9199    bl      common_abort
9200
9201
9202/* ------------------------------ */
9203    .balign 64
9204.L_OP_UNUSED_60FF: /* 0x160 */
9205/* File: armv5te/OP_UNUSED_60FF.S */
9206/* File: armv5te/unused.S */
9207    bl      common_abort
9208
9209
9210/* ------------------------------ */
9211    .balign 64
9212.L_OP_UNUSED_61FF: /* 0x161 */
9213/* File: armv5te/OP_UNUSED_61FF.S */
9214/* File: armv5te/unused.S */
9215    bl      common_abort
9216
9217
9218/* ------------------------------ */
9219    .balign 64
9220.L_OP_UNUSED_62FF: /* 0x162 */
9221/* File: armv5te/OP_UNUSED_62FF.S */
9222/* File: armv5te/unused.S */
9223    bl      common_abort
9224
9225
9226/* ------------------------------ */
9227    .balign 64
9228.L_OP_UNUSED_63FF: /* 0x163 */
9229/* File: armv5te/OP_UNUSED_63FF.S */
9230/* File: armv5te/unused.S */
9231    bl      common_abort
9232
9233
9234/* ------------------------------ */
9235    .balign 64
9236.L_OP_UNUSED_64FF: /* 0x164 */
9237/* File: armv5te/OP_UNUSED_64FF.S */
9238/* File: armv5te/unused.S */
9239    bl      common_abort
9240
9241
9242/* ------------------------------ */
9243    .balign 64
9244.L_OP_UNUSED_65FF: /* 0x165 */
9245/* File: armv5te/OP_UNUSED_65FF.S */
9246/* File: armv5te/unused.S */
9247    bl      common_abort
9248
9249
9250/* ------------------------------ */
9251    .balign 64
9252.L_OP_UNUSED_66FF: /* 0x166 */
9253/* File: armv5te/OP_UNUSED_66FF.S */
9254/* File: armv5te/unused.S */
9255    bl      common_abort
9256
9257
9258/* ------------------------------ */
9259    .balign 64
9260.L_OP_UNUSED_67FF: /* 0x167 */
9261/* File: armv5te/OP_UNUSED_67FF.S */
9262/* File: armv5te/unused.S */
9263    bl      common_abort
9264
9265
9266/* ------------------------------ */
9267    .balign 64
9268.L_OP_UNUSED_68FF: /* 0x168 */
9269/* File: armv5te/OP_UNUSED_68FF.S */
9270/* File: armv5te/unused.S */
9271    bl      common_abort
9272
9273
9274/* ------------------------------ */
9275    .balign 64
9276.L_OP_UNUSED_69FF: /* 0x169 */
9277/* File: armv5te/OP_UNUSED_69FF.S */
9278/* File: armv5te/unused.S */
9279    bl      common_abort
9280
9281
9282/* ------------------------------ */
9283    .balign 64
9284.L_OP_UNUSED_6AFF: /* 0x16a */
9285/* File: armv5te/OP_UNUSED_6AFF.S */
9286/* File: armv5te/unused.S */
9287    bl      common_abort
9288
9289
9290/* ------------------------------ */
9291    .balign 64
9292.L_OP_UNUSED_6BFF: /* 0x16b */
9293/* File: armv5te/OP_UNUSED_6BFF.S */
9294/* File: armv5te/unused.S */
9295    bl      common_abort
9296
9297
9298/* ------------------------------ */
9299    .balign 64
9300.L_OP_UNUSED_6CFF: /* 0x16c */
9301/* File: armv5te/OP_UNUSED_6CFF.S */
9302/* File: armv5te/unused.S */
9303    bl      common_abort
9304
9305
9306/* ------------------------------ */
9307    .balign 64
9308.L_OP_UNUSED_6DFF: /* 0x16d */
9309/* File: armv5te/OP_UNUSED_6DFF.S */
9310/* File: armv5te/unused.S */
9311    bl      common_abort
9312
9313
9314/* ------------------------------ */
9315    .balign 64
9316.L_OP_UNUSED_6EFF: /* 0x16e */
9317/* File: armv5te/OP_UNUSED_6EFF.S */
9318/* File: armv5te/unused.S */
9319    bl      common_abort
9320
9321
9322/* ------------------------------ */
9323    .balign 64
9324.L_OP_UNUSED_6FFF: /* 0x16f */
9325/* File: armv5te/OP_UNUSED_6FFF.S */
9326/* File: armv5te/unused.S */
9327    bl      common_abort
9328
9329
9330/* ------------------------------ */
9331    .balign 64
9332.L_OP_UNUSED_70FF: /* 0x170 */
9333/* File: armv5te/OP_UNUSED_70FF.S */
9334/* File: armv5te/unused.S */
9335    bl      common_abort
9336
9337
9338/* ------------------------------ */
9339    .balign 64
9340.L_OP_UNUSED_71FF: /* 0x171 */
9341/* File: armv5te/OP_UNUSED_71FF.S */
9342/* File: armv5te/unused.S */
9343    bl      common_abort
9344
9345
9346/* ------------------------------ */
9347    .balign 64
9348.L_OP_UNUSED_72FF: /* 0x172 */
9349/* File: armv5te/OP_UNUSED_72FF.S */
9350/* File: armv5te/unused.S */
9351    bl      common_abort
9352
9353
9354/* ------------------------------ */
9355    .balign 64
9356.L_OP_UNUSED_73FF: /* 0x173 */
9357/* File: armv5te/OP_UNUSED_73FF.S */
9358/* File: armv5te/unused.S */
9359    bl      common_abort
9360
9361
9362/* ------------------------------ */
9363    .balign 64
9364.L_OP_UNUSED_74FF: /* 0x174 */
9365/* File: armv5te/OP_UNUSED_74FF.S */
9366/* File: armv5te/unused.S */
9367    bl      common_abort
9368
9369
9370/* ------------------------------ */
9371    .balign 64
9372.L_OP_UNUSED_75FF: /* 0x175 */
9373/* File: armv5te/OP_UNUSED_75FF.S */
9374/* File: armv5te/unused.S */
9375    bl      common_abort
9376
9377
9378/* ------------------------------ */
9379    .balign 64
9380.L_OP_UNUSED_76FF: /* 0x176 */
9381/* File: armv5te/OP_UNUSED_76FF.S */
9382/* File: armv5te/unused.S */
9383    bl      common_abort
9384
9385
9386/* ------------------------------ */
9387    .balign 64
9388.L_OP_UNUSED_77FF: /* 0x177 */
9389/* File: armv5te/OP_UNUSED_77FF.S */
9390/* File: armv5te/unused.S */
9391    bl      common_abort
9392
9393
9394/* ------------------------------ */
9395    .balign 64
9396.L_OP_UNUSED_78FF: /* 0x178 */
9397/* File: armv5te/OP_UNUSED_78FF.S */
9398/* File: armv5te/unused.S */
9399    bl      common_abort
9400
9401
9402/* ------------------------------ */
9403    .balign 64
9404.L_OP_UNUSED_79FF: /* 0x179 */
9405/* File: armv5te/OP_UNUSED_79FF.S */
9406/* File: armv5te/unused.S */
9407    bl      common_abort
9408
9409
9410/* ------------------------------ */
9411    .balign 64
9412.L_OP_UNUSED_7AFF: /* 0x17a */
9413/* File: armv5te/OP_UNUSED_7AFF.S */
9414/* File: armv5te/unused.S */
9415    bl      common_abort
9416
9417
9418/* ------------------------------ */
9419    .balign 64
9420.L_OP_UNUSED_7BFF: /* 0x17b */
9421/* File: armv5te/OP_UNUSED_7BFF.S */
9422/* File: armv5te/unused.S */
9423    bl      common_abort
9424
9425
9426/* ------------------------------ */
9427    .balign 64
9428.L_OP_UNUSED_7CFF: /* 0x17c */
9429/* File: armv5te/OP_UNUSED_7CFF.S */
9430/* File: armv5te/unused.S */
9431    bl      common_abort
9432
9433
9434/* ------------------------------ */
9435    .balign 64
9436.L_OP_UNUSED_7DFF: /* 0x17d */
9437/* File: armv5te/OP_UNUSED_7DFF.S */
9438/* File: armv5te/unused.S */
9439    bl      common_abort
9440
9441
9442/* ------------------------------ */
9443    .balign 64
9444.L_OP_UNUSED_7EFF: /* 0x17e */
9445/* File: armv5te/OP_UNUSED_7EFF.S */
9446/* File: armv5te/unused.S */
9447    bl      common_abort
9448
9449
9450/* ------------------------------ */
9451    .balign 64
9452.L_OP_UNUSED_7FFF: /* 0x17f */
9453/* File: armv5te/OP_UNUSED_7FFF.S */
9454/* File: armv5te/unused.S */
9455    bl      common_abort
9456
9457
9458/* ------------------------------ */
9459    .balign 64
9460.L_OP_UNUSED_80FF: /* 0x180 */
9461/* File: armv5te/OP_UNUSED_80FF.S */
9462/* File: armv5te/unused.S */
9463    bl      common_abort
9464
9465
9466/* ------------------------------ */
9467    .balign 64
9468.L_OP_UNUSED_81FF: /* 0x181 */
9469/* File: armv5te/OP_UNUSED_81FF.S */
9470/* File: armv5te/unused.S */
9471    bl      common_abort
9472
9473
9474/* ------------------------------ */
9475    .balign 64
9476.L_OP_UNUSED_82FF: /* 0x182 */
9477/* File: armv5te/OP_UNUSED_82FF.S */
9478/* File: armv5te/unused.S */
9479    bl      common_abort
9480
9481
9482/* ------------------------------ */
9483    .balign 64
9484.L_OP_UNUSED_83FF: /* 0x183 */
9485/* File: armv5te/OP_UNUSED_83FF.S */
9486/* File: armv5te/unused.S */
9487    bl      common_abort
9488
9489
9490/* ------------------------------ */
9491    .balign 64
9492.L_OP_UNUSED_84FF: /* 0x184 */
9493/* File: armv5te/OP_UNUSED_84FF.S */
9494/* File: armv5te/unused.S */
9495    bl      common_abort
9496
9497
9498/* ------------------------------ */
9499    .balign 64
9500.L_OP_UNUSED_85FF: /* 0x185 */
9501/* File: armv5te/OP_UNUSED_85FF.S */
9502/* File: armv5te/unused.S */
9503    bl      common_abort
9504
9505
9506/* ------------------------------ */
9507    .balign 64
9508.L_OP_UNUSED_86FF: /* 0x186 */
9509/* File: armv5te/OP_UNUSED_86FF.S */
9510/* File: armv5te/unused.S */
9511    bl      common_abort
9512
9513
9514/* ------------------------------ */
9515    .balign 64
9516.L_OP_UNUSED_87FF: /* 0x187 */
9517/* File: armv5te/OP_UNUSED_87FF.S */
9518/* File: armv5te/unused.S */
9519    bl      common_abort
9520
9521
9522/* ------------------------------ */
9523    .balign 64
9524.L_OP_UNUSED_88FF: /* 0x188 */
9525/* File: armv5te/OP_UNUSED_88FF.S */
9526/* File: armv5te/unused.S */
9527    bl      common_abort
9528
9529
9530/* ------------------------------ */
9531    .balign 64
9532.L_OP_UNUSED_89FF: /* 0x189 */
9533/* File: armv5te/OP_UNUSED_89FF.S */
9534/* File: armv5te/unused.S */
9535    bl      common_abort
9536
9537
9538/* ------------------------------ */
9539    .balign 64
9540.L_OP_UNUSED_8AFF: /* 0x18a */
9541/* File: armv5te/OP_UNUSED_8AFF.S */
9542/* File: armv5te/unused.S */
9543    bl      common_abort
9544
9545
9546/* ------------------------------ */
9547    .balign 64
9548.L_OP_UNUSED_8BFF: /* 0x18b */
9549/* File: armv5te/OP_UNUSED_8BFF.S */
9550/* File: armv5te/unused.S */
9551    bl      common_abort
9552
9553
9554/* ------------------------------ */
9555    .balign 64
9556.L_OP_UNUSED_8CFF: /* 0x18c */
9557/* File: armv5te/OP_UNUSED_8CFF.S */
9558/* File: armv5te/unused.S */
9559    bl      common_abort
9560
9561
9562/* ------------------------------ */
9563    .balign 64
9564.L_OP_UNUSED_8DFF: /* 0x18d */
9565/* File: armv5te/OP_UNUSED_8DFF.S */
9566/* File: armv5te/unused.S */
9567    bl      common_abort
9568
9569
9570/* ------------------------------ */
9571    .balign 64
9572.L_OP_UNUSED_8EFF: /* 0x18e */
9573/* File: armv5te/OP_UNUSED_8EFF.S */
9574/* File: armv5te/unused.S */
9575    bl      common_abort
9576
9577
9578/* ------------------------------ */
9579    .balign 64
9580.L_OP_UNUSED_8FFF: /* 0x18f */
9581/* File: armv5te/OP_UNUSED_8FFF.S */
9582/* File: armv5te/unused.S */
9583    bl      common_abort
9584
9585
9586/* ------------------------------ */
9587    .balign 64
9588.L_OP_UNUSED_90FF: /* 0x190 */
9589/* File: armv5te/OP_UNUSED_90FF.S */
9590/* File: armv5te/unused.S */
9591    bl      common_abort
9592
9593
9594/* ------------------------------ */
9595    .balign 64
9596.L_OP_UNUSED_91FF: /* 0x191 */
9597/* File: armv5te/OP_UNUSED_91FF.S */
9598/* File: armv5te/unused.S */
9599    bl      common_abort
9600
9601
9602/* ------------------------------ */
9603    .balign 64
9604.L_OP_UNUSED_92FF: /* 0x192 */
9605/* File: armv5te/OP_UNUSED_92FF.S */
9606/* File: armv5te/unused.S */
9607    bl      common_abort
9608
9609
9610/* ------------------------------ */
9611    .balign 64
9612.L_OP_UNUSED_93FF: /* 0x193 */
9613/* File: armv5te/OP_UNUSED_93FF.S */
9614/* File: armv5te/unused.S */
9615    bl      common_abort
9616
9617
9618/* ------------------------------ */
9619    .balign 64
9620.L_OP_UNUSED_94FF: /* 0x194 */
9621/* File: armv5te/OP_UNUSED_94FF.S */
9622/* File: armv5te/unused.S */
9623    bl      common_abort
9624
9625
9626/* ------------------------------ */
9627    .balign 64
9628.L_OP_UNUSED_95FF: /* 0x195 */
9629/* File: armv5te/OP_UNUSED_95FF.S */
9630/* File: armv5te/unused.S */
9631    bl      common_abort
9632
9633
9634/* ------------------------------ */
9635    .balign 64
9636.L_OP_UNUSED_96FF: /* 0x196 */
9637/* File: armv5te/OP_UNUSED_96FF.S */
9638/* File: armv5te/unused.S */
9639    bl      common_abort
9640
9641
9642/* ------------------------------ */
9643    .balign 64
9644.L_OP_UNUSED_97FF: /* 0x197 */
9645/* File: armv5te/OP_UNUSED_97FF.S */
9646/* File: armv5te/unused.S */
9647    bl      common_abort
9648
9649
9650/* ------------------------------ */
9651    .balign 64
9652.L_OP_UNUSED_98FF: /* 0x198 */
9653/* File: armv5te/OP_UNUSED_98FF.S */
9654/* File: armv5te/unused.S */
9655    bl      common_abort
9656
9657
9658/* ------------------------------ */
9659    .balign 64
9660.L_OP_UNUSED_99FF: /* 0x199 */
9661/* File: armv5te/OP_UNUSED_99FF.S */
9662/* File: armv5te/unused.S */
9663    bl      common_abort
9664
9665
9666/* ------------------------------ */
9667    .balign 64
9668.L_OP_UNUSED_9AFF: /* 0x19a */
9669/* File: armv5te/OP_UNUSED_9AFF.S */
9670/* File: armv5te/unused.S */
9671    bl      common_abort
9672
9673
9674/* ------------------------------ */
9675    .balign 64
9676.L_OP_UNUSED_9BFF: /* 0x19b */
9677/* File: armv5te/OP_UNUSED_9BFF.S */
9678/* File: armv5te/unused.S */
9679    bl      common_abort
9680
9681
9682/* ------------------------------ */
9683    .balign 64
9684.L_OP_UNUSED_9CFF: /* 0x19c */
9685/* File: armv5te/OP_UNUSED_9CFF.S */
9686/* File: armv5te/unused.S */
9687    bl      common_abort
9688
9689
9690/* ------------------------------ */
9691    .balign 64
9692.L_OP_UNUSED_9DFF: /* 0x19d */
9693/* File: armv5te/OP_UNUSED_9DFF.S */
9694/* File: armv5te/unused.S */
9695    bl      common_abort
9696
9697
9698/* ------------------------------ */
9699    .balign 64
9700.L_OP_UNUSED_9EFF: /* 0x19e */
9701/* File: armv5te/OP_UNUSED_9EFF.S */
9702/* File: armv5te/unused.S */
9703    bl      common_abort
9704
9705
9706/* ------------------------------ */
9707    .balign 64
9708.L_OP_UNUSED_9FFF: /* 0x19f */
9709/* File: armv5te/OP_UNUSED_9FFF.S */
9710/* File: armv5te/unused.S */
9711    bl      common_abort
9712
9713
9714/* ------------------------------ */
9715    .balign 64
9716.L_OP_UNUSED_A0FF: /* 0x1a0 */
9717/* File: armv5te/OP_UNUSED_A0FF.S */
9718/* File: armv5te/unused.S */
9719    bl      common_abort
9720
9721
9722/* ------------------------------ */
9723    .balign 64
9724.L_OP_UNUSED_A1FF: /* 0x1a1 */
9725/* File: armv5te/OP_UNUSED_A1FF.S */
9726/* File: armv5te/unused.S */
9727    bl      common_abort
9728
9729
9730/* ------------------------------ */
9731    .balign 64
9732.L_OP_UNUSED_A2FF: /* 0x1a2 */
9733/* File: armv5te/OP_UNUSED_A2FF.S */
9734/* File: armv5te/unused.S */
9735    bl      common_abort
9736
9737
9738/* ------------------------------ */
9739    .balign 64
9740.L_OP_UNUSED_A3FF: /* 0x1a3 */
9741/* File: armv5te/OP_UNUSED_A3FF.S */
9742/* File: armv5te/unused.S */
9743    bl      common_abort
9744
9745
9746/* ------------------------------ */
9747    .balign 64
9748.L_OP_UNUSED_A4FF: /* 0x1a4 */
9749/* File: armv5te/OP_UNUSED_A4FF.S */
9750/* File: armv5te/unused.S */
9751    bl      common_abort
9752
9753
9754/* ------------------------------ */
9755    .balign 64
9756.L_OP_UNUSED_A5FF: /* 0x1a5 */
9757/* File: armv5te/OP_UNUSED_A5FF.S */
9758/* File: armv5te/unused.S */
9759    bl      common_abort
9760
9761
9762/* ------------------------------ */
9763    .balign 64
9764.L_OP_UNUSED_A6FF: /* 0x1a6 */
9765/* File: armv5te/OP_UNUSED_A6FF.S */
9766/* File: armv5te/unused.S */
9767    bl      common_abort
9768
9769
9770/* ------------------------------ */
9771    .balign 64
9772.L_OP_UNUSED_A7FF: /* 0x1a7 */
9773/* File: armv5te/OP_UNUSED_A7FF.S */
9774/* File: armv5te/unused.S */
9775    bl      common_abort
9776
9777
9778/* ------------------------------ */
9779    .balign 64
9780.L_OP_UNUSED_A8FF: /* 0x1a8 */
9781/* File: armv5te/OP_UNUSED_A8FF.S */
9782/* File: armv5te/unused.S */
9783    bl      common_abort
9784
9785
9786/* ------------------------------ */
9787    .balign 64
9788.L_OP_UNUSED_A9FF: /* 0x1a9 */
9789/* File: armv5te/OP_UNUSED_A9FF.S */
9790/* File: armv5te/unused.S */
9791    bl      common_abort
9792
9793
9794/* ------------------------------ */
9795    .balign 64
9796.L_OP_UNUSED_AAFF: /* 0x1aa */
9797/* File: armv5te/OP_UNUSED_AAFF.S */
9798/* File: armv5te/unused.S */
9799    bl      common_abort
9800
9801
9802/* ------------------------------ */
9803    .balign 64
9804.L_OP_UNUSED_ABFF: /* 0x1ab */
9805/* File: armv5te/OP_UNUSED_ABFF.S */
9806/* File: armv5te/unused.S */
9807    bl      common_abort
9808
9809
9810/* ------------------------------ */
9811    .balign 64
9812.L_OP_UNUSED_ACFF: /* 0x1ac */
9813/* File: armv5te/OP_UNUSED_ACFF.S */
9814/* File: armv5te/unused.S */
9815    bl      common_abort
9816
9817
9818/* ------------------------------ */
9819    .balign 64
9820.L_OP_UNUSED_ADFF: /* 0x1ad */
9821/* File: armv5te/OP_UNUSED_ADFF.S */
9822/* File: armv5te/unused.S */
9823    bl      common_abort
9824
9825
9826/* ------------------------------ */
9827    .balign 64
9828.L_OP_UNUSED_AEFF: /* 0x1ae */
9829/* File: armv5te/OP_UNUSED_AEFF.S */
9830/* File: armv5te/unused.S */
9831    bl      common_abort
9832
9833
9834/* ------------------------------ */
9835    .balign 64
9836.L_OP_UNUSED_AFFF: /* 0x1af */
9837/* File: armv5te/OP_UNUSED_AFFF.S */
9838/* File: armv5te/unused.S */
9839    bl      common_abort
9840
9841
9842/* ------------------------------ */
9843    .balign 64
9844.L_OP_UNUSED_B0FF: /* 0x1b0 */
9845/* File: armv5te/OP_UNUSED_B0FF.S */
9846/* File: armv5te/unused.S */
9847    bl      common_abort
9848
9849
9850/* ------------------------------ */
9851    .balign 64
9852.L_OP_UNUSED_B1FF: /* 0x1b1 */
9853/* File: armv5te/OP_UNUSED_B1FF.S */
9854/* File: armv5te/unused.S */
9855    bl      common_abort
9856
9857
9858/* ------------------------------ */
9859    .balign 64
9860.L_OP_UNUSED_B2FF: /* 0x1b2 */
9861/* File: armv5te/OP_UNUSED_B2FF.S */
9862/* File: armv5te/unused.S */
9863    bl      common_abort
9864
9865
9866/* ------------------------------ */
9867    .balign 64
9868.L_OP_UNUSED_B3FF: /* 0x1b3 */
9869/* File: armv5te/OP_UNUSED_B3FF.S */
9870/* File: armv5te/unused.S */
9871    bl      common_abort
9872
9873
9874/* ------------------------------ */
9875    .balign 64
9876.L_OP_UNUSED_B4FF: /* 0x1b4 */
9877/* File: armv5te/OP_UNUSED_B4FF.S */
9878/* File: armv5te/unused.S */
9879    bl      common_abort
9880
9881
9882/* ------------------------------ */
9883    .balign 64
9884.L_OP_UNUSED_B5FF: /* 0x1b5 */
9885/* File: armv5te/OP_UNUSED_B5FF.S */
9886/* File: armv5te/unused.S */
9887    bl      common_abort
9888
9889
9890/* ------------------------------ */
9891    .balign 64
9892.L_OP_UNUSED_B6FF: /* 0x1b6 */
9893/* File: armv5te/OP_UNUSED_B6FF.S */
9894/* File: armv5te/unused.S */
9895    bl      common_abort
9896
9897
9898/* ------------------------------ */
9899    .balign 64
9900.L_OP_UNUSED_B7FF: /* 0x1b7 */
9901/* File: armv5te/OP_UNUSED_B7FF.S */
9902/* File: armv5te/unused.S */
9903    bl      common_abort
9904
9905
9906/* ------------------------------ */
9907    .balign 64
9908.L_OP_UNUSED_B8FF: /* 0x1b8 */
9909/* File: armv5te/OP_UNUSED_B8FF.S */
9910/* File: armv5te/unused.S */
9911    bl      common_abort
9912
9913
9914/* ------------------------------ */
9915    .balign 64
9916.L_OP_UNUSED_B9FF: /* 0x1b9 */
9917/* File: armv5te/OP_UNUSED_B9FF.S */
9918/* File: armv5te/unused.S */
9919    bl      common_abort
9920
9921
9922/* ------------------------------ */
9923    .balign 64
9924.L_OP_UNUSED_BAFF: /* 0x1ba */
9925/* File: armv5te/OP_UNUSED_BAFF.S */
9926/* File: armv5te/unused.S */
9927    bl      common_abort
9928
9929
9930/* ------------------------------ */
9931    .balign 64
9932.L_OP_UNUSED_BBFF: /* 0x1bb */
9933/* File: armv5te/OP_UNUSED_BBFF.S */
9934/* File: armv5te/unused.S */
9935    bl      common_abort
9936
9937
9938/* ------------------------------ */
9939    .balign 64
9940.L_OP_UNUSED_BCFF: /* 0x1bc */
9941/* File: armv5te/OP_UNUSED_BCFF.S */
9942/* File: armv5te/unused.S */
9943    bl      common_abort
9944
9945
9946/* ------------------------------ */
9947    .balign 64
9948.L_OP_UNUSED_BDFF: /* 0x1bd */
9949/* File: armv5te/OP_UNUSED_BDFF.S */
9950/* File: armv5te/unused.S */
9951    bl      common_abort
9952
9953
9954/* ------------------------------ */
9955    .balign 64
9956.L_OP_UNUSED_BEFF: /* 0x1be */
9957/* File: armv5te/OP_UNUSED_BEFF.S */
9958/* File: armv5te/unused.S */
9959    bl      common_abort
9960
9961
9962/* ------------------------------ */
9963    .balign 64
9964.L_OP_UNUSED_BFFF: /* 0x1bf */
9965/* File: armv5te/OP_UNUSED_BFFF.S */
9966/* File: armv5te/unused.S */
9967    bl      common_abort
9968
9969
9970/* ------------------------------ */
9971    .balign 64
9972.L_OP_UNUSED_C0FF: /* 0x1c0 */
9973/* File: armv5te/OP_UNUSED_C0FF.S */
9974/* File: armv5te/unused.S */
9975    bl      common_abort
9976
9977
9978/* ------------------------------ */
9979    .balign 64
9980.L_OP_UNUSED_C1FF: /* 0x1c1 */
9981/* File: armv5te/OP_UNUSED_C1FF.S */
9982/* File: armv5te/unused.S */
9983    bl      common_abort
9984
9985
9986/* ------------------------------ */
9987    .balign 64
9988.L_OP_UNUSED_C2FF: /* 0x1c2 */
9989/* File: armv5te/OP_UNUSED_C2FF.S */
9990/* File: armv5te/unused.S */
9991    bl      common_abort
9992
9993
9994/* ------------------------------ */
9995    .balign 64
9996.L_OP_UNUSED_C3FF: /* 0x1c3 */
9997/* File: armv5te/OP_UNUSED_C3FF.S */
9998/* File: armv5te/unused.S */
9999    bl      common_abort
10000
10001
10002/* ------------------------------ */
10003    .balign 64
10004.L_OP_UNUSED_C4FF: /* 0x1c4 */
10005/* File: armv5te/OP_UNUSED_C4FF.S */
10006/* File: armv5te/unused.S */
10007    bl      common_abort
10008
10009
10010/* ------------------------------ */
10011    .balign 64
10012.L_OP_UNUSED_C5FF: /* 0x1c5 */
10013/* File: armv5te/OP_UNUSED_C5FF.S */
10014/* File: armv5te/unused.S */
10015    bl      common_abort
10016
10017
10018/* ------------------------------ */
10019    .balign 64
10020.L_OP_UNUSED_C6FF: /* 0x1c6 */
10021/* File: armv5te/OP_UNUSED_C6FF.S */
10022/* File: armv5te/unused.S */
10023    bl      common_abort
10024
10025
10026/* ------------------------------ */
10027    .balign 64
10028.L_OP_UNUSED_C7FF: /* 0x1c7 */
10029/* File: armv5te/OP_UNUSED_C7FF.S */
10030/* File: armv5te/unused.S */
10031    bl      common_abort
10032
10033
10034/* ------------------------------ */
10035    .balign 64
10036.L_OP_UNUSED_C8FF: /* 0x1c8 */
10037/* File: armv5te/OP_UNUSED_C8FF.S */
10038/* File: armv5te/unused.S */
10039    bl      common_abort
10040
10041
10042/* ------------------------------ */
10043    .balign 64
10044.L_OP_UNUSED_C9FF: /* 0x1c9 */
10045/* File: armv5te/OP_UNUSED_C9FF.S */
10046/* File: armv5te/unused.S */
10047    bl      common_abort
10048
10049
10050/* ------------------------------ */
10051    .balign 64
10052.L_OP_UNUSED_CAFF: /* 0x1ca */
10053/* File: armv5te/OP_UNUSED_CAFF.S */
10054/* File: armv5te/unused.S */
10055    bl      common_abort
10056
10057
10058/* ------------------------------ */
10059    .balign 64
10060.L_OP_UNUSED_CBFF: /* 0x1cb */
10061/* File: armv5te/OP_UNUSED_CBFF.S */
10062/* File: armv5te/unused.S */
10063    bl      common_abort
10064
10065
10066/* ------------------------------ */
10067    .balign 64
10068.L_OP_UNUSED_CCFF: /* 0x1cc */
10069/* File: armv5te/OP_UNUSED_CCFF.S */
10070/* File: armv5te/unused.S */
10071    bl      common_abort
10072
10073
10074/* ------------------------------ */
10075    .balign 64
10076.L_OP_UNUSED_CDFF: /* 0x1cd */
10077/* File: armv5te/OP_UNUSED_CDFF.S */
10078/* File: armv5te/unused.S */
10079    bl      common_abort
10080
10081
10082/* ------------------------------ */
10083    .balign 64
10084.L_OP_UNUSED_CEFF: /* 0x1ce */
10085/* File: armv5te/OP_UNUSED_CEFF.S */
10086/* File: armv5te/unused.S */
10087    bl      common_abort
10088
10089
10090/* ------------------------------ */
10091    .balign 64
10092.L_OP_UNUSED_CFFF: /* 0x1cf */
10093/* File: armv5te/OP_UNUSED_CFFF.S */
10094/* File: armv5te/unused.S */
10095    bl      common_abort
10096
10097
10098/* ------------------------------ */
10099    .balign 64
10100.L_OP_UNUSED_D0FF: /* 0x1d0 */
10101/* File: armv5te/OP_UNUSED_D0FF.S */
10102/* File: armv5te/unused.S */
10103    bl      common_abort
10104
10105
10106/* ------------------------------ */
10107    .balign 64
10108.L_OP_UNUSED_D1FF: /* 0x1d1 */
10109/* File: armv5te/OP_UNUSED_D1FF.S */
10110/* File: armv5te/unused.S */
10111    bl      common_abort
10112
10113
10114/* ------------------------------ */
10115    .balign 64
10116.L_OP_UNUSED_D2FF: /* 0x1d2 */
10117/* File: armv5te/OP_UNUSED_D2FF.S */
10118/* File: armv5te/unused.S */
10119    bl      common_abort
10120
10121
10122/* ------------------------------ */
10123    .balign 64
10124.L_OP_UNUSED_D3FF: /* 0x1d3 */
10125/* File: armv5te/OP_UNUSED_D3FF.S */
10126/* File: armv5te/unused.S */
10127    bl      common_abort
10128
10129
10130/* ------------------------------ */
10131    .balign 64
10132.L_OP_UNUSED_D4FF: /* 0x1d4 */
10133/* File: armv5te/OP_UNUSED_D4FF.S */
10134/* File: armv5te/unused.S */
10135    bl      common_abort
10136
10137
10138/* ------------------------------ */
10139    .balign 64
10140.L_OP_UNUSED_D5FF: /* 0x1d5 */
10141/* File: armv5te/OP_UNUSED_D5FF.S */
10142/* File: armv5te/unused.S */
10143    bl      common_abort
10144
10145
10146/* ------------------------------ */
10147    .balign 64
10148.L_OP_UNUSED_D6FF: /* 0x1d6 */
10149/* File: armv5te/OP_UNUSED_D6FF.S */
10150/* File: armv5te/unused.S */
10151    bl      common_abort
10152
10153
10154/* ------------------------------ */
10155    .balign 64
10156.L_OP_UNUSED_D7FF: /* 0x1d7 */
10157/* File: armv5te/OP_UNUSED_D7FF.S */
10158/* File: armv5te/unused.S */
10159    bl      common_abort
10160
10161
10162/* ------------------------------ */
10163    .balign 64
10164.L_OP_UNUSED_D8FF: /* 0x1d8 */
10165/* File: armv5te/OP_UNUSED_D8FF.S */
10166/* File: armv5te/unused.S */
10167    bl      common_abort
10168
10169
10170/* ------------------------------ */
10171    .balign 64
10172.L_OP_UNUSED_D9FF: /* 0x1d9 */
10173/* File: armv5te/OP_UNUSED_D9FF.S */
10174/* File: armv5te/unused.S */
10175    bl      common_abort
10176
10177
10178/* ------------------------------ */
10179    .balign 64
10180.L_OP_UNUSED_DAFF: /* 0x1da */
10181/* File: armv5te/OP_UNUSED_DAFF.S */
10182/* File: armv5te/unused.S */
10183    bl      common_abort
10184
10185
10186/* ------------------------------ */
10187    .balign 64
10188.L_OP_UNUSED_DBFF: /* 0x1db */
10189/* File: armv5te/OP_UNUSED_DBFF.S */
10190/* File: armv5te/unused.S */
10191    bl      common_abort
10192
10193
10194/* ------------------------------ */
10195    .balign 64
10196.L_OP_UNUSED_DCFF: /* 0x1dc */
10197/* File: armv5te/OP_UNUSED_DCFF.S */
10198/* File: armv5te/unused.S */
10199    bl      common_abort
10200
10201
10202/* ------------------------------ */
10203    .balign 64
10204.L_OP_UNUSED_DDFF: /* 0x1dd */
10205/* File: armv5te/OP_UNUSED_DDFF.S */
10206/* File: armv5te/unused.S */
10207    bl      common_abort
10208
10209
10210/* ------------------------------ */
10211    .balign 64
10212.L_OP_UNUSED_DEFF: /* 0x1de */
10213/* File: armv5te/OP_UNUSED_DEFF.S */
10214/* File: armv5te/unused.S */
10215    bl      common_abort
10216
10217
10218/* ------------------------------ */
10219    .balign 64
10220.L_OP_UNUSED_DFFF: /* 0x1df */
10221/* File: armv5te/OP_UNUSED_DFFF.S */
10222/* File: armv5te/unused.S */
10223    bl      common_abort
10224
10225
10226/* ------------------------------ */
10227    .balign 64
10228.L_OP_UNUSED_E0FF: /* 0x1e0 */
10229/* File: armv5te/OP_UNUSED_E0FF.S */
10230/* File: armv5te/unused.S */
10231    bl      common_abort
10232
10233
10234/* ------------------------------ */
10235    .balign 64
10236.L_OP_UNUSED_E1FF: /* 0x1e1 */
10237/* File: armv5te/OP_UNUSED_E1FF.S */
10238/* File: armv5te/unused.S */
10239    bl      common_abort
10240
10241
10242/* ------------------------------ */
10243    .balign 64
10244.L_OP_UNUSED_E2FF: /* 0x1e2 */
10245/* File: armv5te/OP_UNUSED_E2FF.S */
10246/* File: armv5te/unused.S */
10247    bl      common_abort
10248
10249
10250/* ------------------------------ */
10251    .balign 64
10252.L_OP_UNUSED_E3FF: /* 0x1e3 */
10253/* File: armv5te/OP_UNUSED_E3FF.S */
10254/* File: armv5te/unused.S */
10255    bl      common_abort
10256
10257
10258/* ------------------------------ */
10259    .balign 64
10260.L_OP_UNUSED_E4FF: /* 0x1e4 */
10261/* File: armv5te/OP_UNUSED_E4FF.S */
10262/* File: armv5te/unused.S */
10263    bl      common_abort
10264
10265
10266/* ------------------------------ */
10267    .balign 64
10268.L_OP_UNUSED_E5FF: /* 0x1e5 */
10269/* File: armv5te/OP_UNUSED_E5FF.S */
10270/* File: armv5te/unused.S */
10271    bl      common_abort
10272
10273
10274/* ------------------------------ */
10275    .balign 64
10276.L_OP_UNUSED_E6FF: /* 0x1e6 */
10277/* File: armv5te/OP_UNUSED_E6FF.S */
10278/* File: armv5te/unused.S */
10279    bl      common_abort
10280
10281
10282/* ------------------------------ */
10283    .balign 64
10284.L_OP_UNUSED_E7FF: /* 0x1e7 */
10285/* File: armv5te/OP_UNUSED_E7FF.S */
10286/* File: armv5te/unused.S */
10287    bl      common_abort
10288
10289
10290/* ------------------------------ */
10291    .balign 64
10292.L_OP_UNUSED_E8FF: /* 0x1e8 */
10293/* File: armv5te/OP_UNUSED_E8FF.S */
10294/* File: armv5te/unused.S */
10295    bl      common_abort
10296
10297
10298/* ------------------------------ */
10299    .balign 64
10300.L_OP_UNUSED_E9FF: /* 0x1e9 */
10301/* File: armv5te/OP_UNUSED_E9FF.S */
10302/* File: armv5te/unused.S */
10303    bl      common_abort
10304
10305
10306/* ------------------------------ */
10307    .balign 64
10308.L_OP_UNUSED_EAFF: /* 0x1ea */
10309/* File: armv5te/OP_UNUSED_EAFF.S */
10310/* File: armv5te/unused.S */
10311    bl      common_abort
10312
10313
10314/* ------------------------------ */
10315    .balign 64
10316.L_OP_UNUSED_EBFF: /* 0x1eb */
10317/* File: armv5te/OP_UNUSED_EBFF.S */
10318/* File: armv5te/unused.S */
10319    bl      common_abort
10320
10321
10322/* ------------------------------ */
10323    .balign 64
10324.L_OP_UNUSED_ECFF: /* 0x1ec */
10325/* File: armv5te/OP_UNUSED_ECFF.S */
10326/* File: armv5te/unused.S */
10327    bl      common_abort
10328
10329
10330/* ------------------------------ */
10331    .balign 64
10332.L_OP_UNUSED_EDFF: /* 0x1ed */
10333/* File: armv5te/OP_UNUSED_EDFF.S */
10334/* File: armv5te/unused.S */
10335    bl      common_abort
10336
10337
10338/* ------------------------------ */
10339    .balign 64
10340.L_OP_UNUSED_EEFF: /* 0x1ee */
10341/* File: armv5te/OP_UNUSED_EEFF.S */
10342/* File: armv5te/unused.S */
10343    bl      common_abort
10344
10345
10346/* ------------------------------ */
10347    .balign 64
10348.L_OP_UNUSED_EFFF: /* 0x1ef */
10349/* File: armv5te/OP_UNUSED_EFFF.S */
10350/* File: armv5te/unused.S */
10351    bl      common_abort
10352
10353
10354/* ------------------------------ */
10355    .balign 64
10356.L_OP_UNUSED_F0FF: /* 0x1f0 */
10357/* File: armv5te/OP_UNUSED_F0FF.S */
10358/* File: armv5te/unused.S */
10359    bl      common_abort
10360
10361
10362/* ------------------------------ */
10363    .balign 64
10364.L_OP_UNUSED_F1FF: /* 0x1f1 */
10365/* File: armv5te/OP_UNUSED_F1FF.S */
10366/* File: armv5te/unused.S */
10367    bl      common_abort
10368
10369
10370/* ------------------------------ */
10371    .balign 64
10372.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
10373/* File: armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S */
10374/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
10375    /*
10376     * Invoke Object.<init> on an object.  In practice we know that
10377     * Object's nullary constructor doesn't do anything, so we just
10378     * skip it unless a debugger is active.
10379     */
10380    FETCH(r1, 4)                  @ r1<- CCCC
10381    GET_VREG(r0, r1)                    @ r0<- "this" ptr
10382    cmp     r0, #0                      @ check for NULL
10383    beq     common_errNullObject        @ export PC and throw NPE
10384    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
10385    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
10386    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
10387    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal        @ yes, go
10388.LOP_INVOKE_OBJECT_INIT_JUMBO_finish:
10389    ldrb    r1, [rSELF, #offThread_subMode]
10390    ands    r1, #kSubModeDebuggerActive @ debugger active?
10391    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_debugger        @ Yes - skip optimization
10392    FETCH_ADVANCE_INST(4+1)       @ advance to next instr, load rINST
10393    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
10394    GOTO_OPCODE(ip)                     @ execute it
10395
10396
10397/* ------------------------------ */
10398    .balign 64
10399.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
10400/* File: armv5te/OP_IGET_VOLATILE_JUMBO.S */
10401/* File: armv5te/OP_IGET_JUMBO.S */
10402    /*
10403     * Jumbo 32-bit instance field get.
10404     *
10405     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10406     *      iget-char/jumbo, iget-short/jumbo
10407     */
10408    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10409    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10410    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10411    FETCH(r0, 4)                        @ r0<- CCCC
10412    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10413    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10414    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10415    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10416    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10417    cmp     r0, #0                      @ is resolved entry null?
10418    bne     .LOP_IGET_VOLATILE_JUMBO_finish          @ no, already resolved
104198:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10420    EXPORT_PC()                         @ resolve() could throw
10421    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10422    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10423    b       .LOP_IGET_VOLATILE_JUMBO_resolved        @ resolved, continue
10424
10425
10426/* ------------------------------ */
10427    .balign 64
10428.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
10429/* File: armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S */
10430/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
10431    /*
10432     * Jumbo 64-bit instance field get.
10433     */
10434    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10435    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10436    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10437    FETCH(r0, 4)                        @ r0<- CCCC
10438    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10439    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10440    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10441    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10442    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10443    cmp     r0, #0                      @ is resolved entry null?
10444    bne     .LOP_IGET_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
10445    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10446    EXPORT_PC()                         @ resolve() could throw
10447    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10448    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10449    b       .LOP_IGET_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10450
10451
10452/* ------------------------------ */
10453    .balign 64
10454.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
10455/* File: armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S */
10456/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
10457/* File: armv5te/OP_IGET_JUMBO.S */
10458    /*
10459     * Jumbo 32-bit instance field get.
10460     *
10461     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10462     *      iget-char/jumbo, iget-short/jumbo
10463     */
10464    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10465    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10466    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10467    FETCH(r0, 4)                        @ r0<- CCCC
10468    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10469    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10470    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10471    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10472    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10473    cmp     r0, #0                      @ is resolved entry null?
10474    bne     .LOP_IGET_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
104758:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10476    EXPORT_PC()                         @ resolve() could throw
10477    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10478    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10479    b       .LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10480
10481
10482
10483/* ------------------------------ */
10484    .balign 64
10485.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
10486/* File: armv5te/OP_IPUT_VOLATILE_JUMBO.S */
10487/* File: armv5te/OP_IPUT_JUMBO.S */
10488    /*
10489     * Jumbo 32-bit instance field put.
10490     *
10491     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
10492     *      iput-short/jumbo
10493     */
10494    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10495    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10496    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10497    FETCH(r0, 4)                        @ r0<- CCCC
10498    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10499    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10500    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10501    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10502    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10503    cmp     r0, #0                      @ is resolved entry null?
10504    bne     .LOP_IPUT_VOLATILE_JUMBO_finish          @ no, already resolved
105058:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10506    EXPORT_PC()                         @ resolve() could throw
10507    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10508    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10509    b       .LOP_IPUT_VOLATILE_JUMBO_resolved        @ resolved, continue
10510
10511
10512/* ------------------------------ */
10513    .balign 64
10514.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
10515/* File: armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S */
10516/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
10517    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10518    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10519    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10520    FETCH(r0, 4)                        @ r0<- CCCC
10521    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10522    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10523    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10524    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
10525    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10526    cmp     r0, #0                      @ is resolved entry null?
10527    bne     .LOP_IPUT_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
105288:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10529    EXPORT_PC()                         @ resolve() could throw
10530    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10531    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10532    b       .LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10533
10534
10535/* ------------------------------ */
10536    .balign 64
10537.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
10538/* File: armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S */
10539/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
10540    /*
10541     * Jumbo 32-bit instance field put.
10542     */
10543    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10544    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10545    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10546    FETCH(r0, 4)                        @ r0<- CCCC
10547    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10548    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10549    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10550    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10551    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10552    cmp     r0, #0                      @ is resolved entry null?
10553    bne     .LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
105548:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10555    EXPORT_PC()                         @ resolve() could throw
10556    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10557    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10558    b       .LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10559
10560
10561/* ------------------------------ */
10562    .balign 64
10563.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
10564/* File: armv5te/OP_SGET_VOLATILE_JUMBO.S */
10565/* File: armv5te/OP_SGET_JUMBO.S */
10566    /*
10567     * Jumbo 32-bit SGET handler.
10568     *
10569     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
10570     *      sget-char/jumbo, sget-short/jumbo
10571     */
10572    /* exop vBBBB, field@AAAAAAAA */
10573    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10574    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10575    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10576    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10577    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10578    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10579    cmp     r0, #0                      @ is resolved entry null?
10580    beq     .LOP_SGET_VOLATILE_JUMBO_resolve         @ yes, do resolve
10581.LOP_SGET_VOLATILE_JUMBO_finish: @ field ptr in r0
10582    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
10583    SMP_DMB                            @ acquiring load
10584    FETCH(r2, 3)                        @ r2<- BBBB
10585    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10586    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
10587    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10588    GOTO_OPCODE(ip)                     @ jump to next instruction
10589
10590
10591/* ------------------------------ */
10592    .balign 64
10593.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
10594/* File: armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S */
10595/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
10596    /*
10597     * Jumbo 64-bit SGET handler.
10598     */
10599    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
10600    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10601    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10602    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10603    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
10604    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10605    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
10606    cmp     r0, #0                      @ is resolved entry null?
10607    beq     .LOP_SGET_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
10608.LOP_SGET_WIDE_VOLATILE_JUMBO_finish:
10609    FETCH(r9, 3)                        @ r9<- BBBB
10610    .if 1
10611    add     r0, r0, #offStaticField_value @ r0<- pointer to data
10612    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
10613    .else
10614    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
10615    .endif
10616    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
10617    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10618    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
10619    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10620    GOTO_OPCODE(ip)                     @ jump to next instruction
10621
10622
10623/* ------------------------------ */
10624    .balign 64
10625.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
10626/* File: armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S */
10627/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
10628/* File: armv5te/OP_SGET_JUMBO.S */
10629    /*
10630     * Jumbo 32-bit SGET handler.
10631     *
10632     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
10633     *      sget-char/jumbo, sget-short/jumbo
10634     */
10635    /* exop vBBBB, field@AAAAAAAA */
10636    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10637    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10638    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10639    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10640    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10641    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10642    cmp     r0, #0                      @ is resolved entry null?
10643    beq     .LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10644.LOP_SGET_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
10645    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
10646    SMP_DMB                            @ acquiring load
10647    FETCH(r2, 3)                        @ r2<- BBBB
10648    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10649    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
10650    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10651    GOTO_OPCODE(ip)                     @ jump to next instruction
10652
10653
10654
10655/* ------------------------------ */
10656    .balign 64
10657.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
10658/* File: armv5te/OP_SPUT_VOLATILE_JUMBO.S */
10659/* File: armv5te/OP_SPUT_JUMBO.S */
10660    /*
10661     * Jumbo 32-bit SPUT handler.
10662     *
10663     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
10664     *      sput-short/jumbo
10665     */
10666    /* exop vBBBB, field@AAAAAAAA */
10667    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10668    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10669    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10670    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10671    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10672    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
10673    cmp     r0, #0                      @ is resolved entry null?
10674    beq     .LOP_SPUT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10675.LOP_SPUT_VOLATILE_JUMBO_finish:   @ field ptr in r0
10676    FETCH(r2, 3)                        @ r2<- BBBB
10677    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10678    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
10679    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10680    SMP_DMB                            @ releasing store
10681    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
10682    GOTO_OPCODE(ip)                     @ jump to next instruction
10683
10684
10685/* ------------------------------ */
10686    .balign 64
10687.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
10688/* File: armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S */
10689/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
10690    /*
10691     * Jumbo 64-bit SPUT handler.
10692     */
10693    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
10694    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
10695    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10696    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10697    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10698    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10699    FETCH(r9, 3)                        @ r9<- BBBB
10700    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
10701    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
10702    cmp     r2, #0                      @ is resolved entry null?
10703    beq     .LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
10704.LOP_SPUT_WIDE_VOLATILE_JUMBO_finish: @ field ptr in r2, BBBB in r9
10705    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10706    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
10707    GET_INST_OPCODE(r10)                @ extract opcode from rINST
10708    .if 1
10709    add     r2, r2, #offStaticField_value @ r2<- pointer to data
10710    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
10711    .else
10712    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
10713    .endif
10714    GOTO_OPCODE(r10)                    @ jump to next instruction
10715
10716
10717/* ------------------------------ */
10718    .balign 64
10719.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
10720/* File: armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S */
10721/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
10722    /*
10723     * Jumbo 32-bit SPUT handler for objects
10724     */
10725    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
10726    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10727    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10728    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10729    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10730    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10731    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10732    cmp     r0, #0                      @ is resolved entry null?
10733    beq     .LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10734.LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish:   @ field ptr in r0
10735    FETCH(r2, 3)                        @ r2<- BBBB
10736    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10737    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
10738    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
10739    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
10740    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10741    SMP_DMB                            @ releasing store
10742    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_end
10743
10744
10745/* ------------------------------ */
10746    .balign 64
10747.L_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
10748/* File: armv5te/OP_THROW_VERIFICATION_ERROR_JUMBO.S */
10749    /*
10750     * Handle a jumbo throw-verification-error instruction.  This throws an
10751     * exception for an error discovered during verification.  The
10752     * exception is indicated by BBBB, with some detail provided by AAAAAAAA.
10753     */
10754    /* exop BBBB, Class@AAAAAAAA */
10755    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10756    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10757    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
10758    orr     r2, r1, r2, lsl #16         @ r2<- AAAAaaaa
10759    EXPORT_PC()                         @ export the PC
10760    FETCH(r1, 3)                        @ r1<- BBBB
10761    bl      dvmThrowVerificationError   @ always throws
10762    b       common_exceptionThrown      @ handle exception
10763
10764    .balign 64
10765    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
10766    .global dvmAsmInstructionEnd
10767dvmAsmInstructionEnd:
10768
10769/*
10770 * ===========================================================================
10771 *  Sister implementations
10772 * ===========================================================================
10773 */
10774    .global dvmAsmSisterStart
10775    .type   dvmAsmSisterStart, %function
10776    .text
10777    .balign 4
10778dvmAsmSisterStart:
10779
10780/* continuation for OP_CONST_STRING */
10781
10782    /*
10783     * Continuation if the String has not yet been resolved.
10784     *  r1: BBBB (String ref)
10785     *  r9: target register
10786     */
10787.LOP_CONST_STRING_resolve:
10788    EXPORT_PC()
10789    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10790    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10791    bl      dvmResolveString            @ r0<- String reference
10792    cmp     r0, #0                      @ failed?
10793    beq     common_exceptionThrown      @ yup, handle the exception
10794    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10795    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10796    SET_VREG(r0, r9)                    @ vAA<- r0
10797    GOTO_OPCODE(ip)                     @ jump to next instruction
10798
10799/* continuation for OP_CONST_STRING_JUMBO */
10800
10801    /*
10802     * Continuation if the String has not yet been resolved.
10803     *  r1: BBBBBBBB (String ref)
10804     *  r9: target register
10805     */
10806.LOP_CONST_STRING_JUMBO_resolve:
10807    EXPORT_PC()
10808    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10809    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10810    bl      dvmResolveString            @ r0<- String reference
10811    cmp     r0, #0                      @ failed?
10812    beq     common_exceptionThrown      @ yup, handle the exception
10813    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
10814    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10815    SET_VREG(r0, r9)                    @ vAA<- r0
10816    GOTO_OPCODE(ip)                     @ jump to next instruction
10817
10818/* continuation for OP_CONST_CLASS */
10819
10820    /*
10821     * Continuation if the Class has not yet been resolved.
10822     *  r1: BBBB (Class ref)
10823     *  r9: target register
10824     */
10825.LOP_CONST_CLASS_resolve:
10826    EXPORT_PC()
10827    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10828    mov     r2, #1                      @ r2<- true
10829    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10830    bl      dvmResolveClass             @ r0<- Class reference
10831    cmp     r0, #0                      @ failed?
10832    beq     common_exceptionThrown      @ yup, handle the exception
10833    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10834    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10835    SET_VREG(r0, r9)                    @ vAA<- r0
10836    GOTO_OPCODE(ip)                     @ jump to next instruction
10837
10838/* continuation for OP_CHECK_CAST */
10839
10840    /*
10841     * Trivial test failed, need to perform full check.  This is common.
10842     *  r0 holds obj->clazz
10843     *  r1 holds desired class resolved from BBBB
10844     *  r9 holds object
10845     */
10846.LOP_CHECK_CAST_fullcheck:
10847    mov     r10, r1                     @ avoid ClassObject getting clobbered
10848    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
10849    cmp     r0, #0                      @ failed?
10850    bne     .LOP_CHECK_CAST_okay            @ no, success
10851
10852    @ A cast has failed.  We need to throw a ClassCastException.
10853    EXPORT_PC()                         @ about to throw
10854    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
10855    mov     r1, r10                     @ r1<- desired class
10856    bl      dvmThrowClassCastException
10857    b       common_exceptionThrown
10858
10859    /*
10860     * Resolution required.  This is the least-likely path.
10861     *
10862     *  r2 holds BBBB
10863     *  r9 holds object
10864     */
10865.LOP_CHECK_CAST_resolve:
10866    EXPORT_PC()                         @ resolve() could throw
10867    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
10868    mov     r1, r2                      @ r1<- BBBB
10869    mov     r2, #0                      @ r2<- false
10870    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
10871    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
10872    cmp     r0, #0                      @ got null?
10873    beq     common_exceptionThrown      @ yes, handle exception
10874    mov     r1, r0                      @ r1<- class resolved from BBB
10875    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
10876    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
10877
10878/* continuation for OP_INSTANCE_OF */
10879
10880    /*
10881     * Trivial test failed, need to perform full check.  This is common.
10882     *  r0 holds obj->clazz
10883     *  r1 holds class resolved from BBBB
10884     *  r9 holds A
10885     */
10886.LOP_INSTANCE_OF_fullcheck:
10887    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
10888    @ fall through to OP_INSTANCE_OF_store
10889
10890    /*
10891     * r0 holds boolean result
10892     * r9 holds A
10893     */
10894.LOP_INSTANCE_OF_store:
10895    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10896    SET_VREG(r0, r9)                    @ vA<- r0
10897    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10898    GOTO_OPCODE(ip)                     @ jump to next instruction
10899
10900    /*
10901     * Trivial test succeeded, save and bail.
10902     *  r9 holds A
10903     */
10904.LOP_INSTANCE_OF_trivial:
10905    mov     r0, #1                      @ indicate success
10906    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
10907    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10908    SET_VREG(r0, r9)                    @ vA<- r0
10909    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10910    GOTO_OPCODE(ip)                     @ jump to next instruction
10911
10912    /*
10913     * Resolution required.  This is the least-likely path.
10914     *
10915     *  r3 holds BBBB
10916     *  r9 holds A
10917     */
10918.LOP_INSTANCE_OF_resolve:
10919    EXPORT_PC()                         @ resolve() could throw
10920    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
10921    mov     r1, r3                      @ r1<- BBBB
10922    mov     r2, #1                      @ r2<- true
10923    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10924    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
10925    cmp     r0, #0                      @ got null?
10926    beq     common_exceptionThrown      @ yes, handle exception
10927    mov     r1, r0                      @ r1<- class resolved from BBB
10928    mov     r3, rINST, lsr #12          @ r3<- B
10929    GET_VREG(r0, r3)                    @ r0<- vB (object)
10930    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
10931    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
10932
10933/* continuation for OP_NEW_INSTANCE */
10934
10935    .balign 32                          @ minimize cache lines
10936.LOP_NEW_INSTANCE_finish: @ r0=new object
10937    mov     r3, rINST, lsr #8           @ r3<- AA
10938    cmp     r0, #0                      @ failed?
10939#if defined(WITH_JIT)
10940    /*
10941     * The JIT needs the class to be fully resolved before it can
10942     * include this instruction in a trace.
10943     */
10944    ldrb    r1, [rSELF, #offThread_subMode]
10945    beq     common_exceptionThrown      @ yes, handle the exception
10946    ands    r1, #kSubModeJitTraceBuild  @ under construction?
10947    bne     .LOP_NEW_INSTANCE_jitCheck
10948#else
10949    beq     common_exceptionThrown      @ yes, handle the exception
10950#endif
10951.LOP_NEW_INSTANCE_end:
10952    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10953    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10954    SET_VREG(r0, r3)                    @ vAA<- r0
10955    GOTO_OPCODE(ip)                     @ jump to next instruction
10956
10957#if defined(WITH_JIT)
10958    /*
10959     * Check to see if we need to stop the trace building early.
10960     * r0: new object
10961     * r3: vAA
10962     */
10963.LOP_NEW_INSTANCE_jitCheck:
10964    ldr     r1, [r10]                   @ reload resolved class
10965    cmp     r1, #0                      @ okay?
10966    bne     .LOP_NEW_INSTANCE_end             @ yes, finish
10967    mov     r9, r0                      @ preserve new object
10968    mov     r10, r3                     @ preserve vAA
10969    mov     r0, rSELF
10970    mov     r1, rPC
10971    bl      dvmJitEndTraceSelect        @ (self, pc)
10972    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10973    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10974    SET_VREG(r9, r10)                   @ vAA<- new object
10975    GOTO_OPCODE(ip)                     @ jump to next instruction
10976#endif
10977
10978    /*
10979     * Class initialization required.
10980     *
10981     *  r0 holds class object
10982     */
10983.LOP_NEW_INSTANCE_needinit:
10984    mov     r9, r0                      @ save r0
10985    bl      dvmInitClass                @ initialize class
10986    cmp     r0, #0                      @ check boolean result
10987    mov     r0, r9                      @ restore r0
10988    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
10989    b       common_exceptionThrown      @ failed, deal with init exception
10990
10991    /*
10992     * Resolution required.  This is the least-likely path.
10993     *
10994     *  r1 holds BBBB
10995     */
10996.LOP_NEW_INSTANCE_resolve:
10997    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
10998    mov     r2, #0                      @ r2<- false
10999    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11000    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
11001    cmp     r0, #0                      @ got null?
11002    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
11003    b       common_exceptionThrown      @ yes, handle exception
11004
11005/* continuation for OP_NEW_ARRAY */
11006
11007
11008    /*
11009     * Resolve class.  (This is an uncommon case.)
11010     *
11011     *  r1 holds array length
11012     *  r2 holds class ref CCCC
11013     */
11014.LOP_NEW_ARRAY_resolve:
11015    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11016    mov     r9, r1                      @ r9<- length (save)
11017    mov     r1, r2                      @ r1<- CCCC
11018    mov     r2, #0                      @ r2<- false
11019    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11020    bl      dvmResolveClass             @ r0<- call(clazz, ref)
11021    cmp     r0, #0                      @ got null?
11022    mov     r1, r9                      @ r1<- length (restore)
11023    beq     common_exceptionThrown      @ yes, handle exception
11024    @ fall through to OP_NEW_ARRAY_finish
11025
11026    /*
11027     * Finish allocation.
11028     *
11029     *  r0 holds class
11030     *  r1 holds array length
11031     */
11032.LOP_NEW_ARRAY_finish:
11033    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
11034    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
11035    cmp     r0, #0                      @ failed?
11036    mov     r2, rINST, lsr #8           @ r2<- A+
11037    beq     common_exceptionThrown      @ yes, handle the exception
11038    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11039    and     r2, r2, #15                 @ r2<- A
11040    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11041    SET_VREG(r0, r2)                    @ vA<- r0
11042    GOTO_OPCODE(ip)                     @ jump to next instruction
11043
11044/* continuation for OP_FILLED_NEW_ARRAY */
11045
11046    /*
11047     * On entry:
11048     *  r0 holds array class
11049     *  r10 holds AA or BA
11050     */
11051.LOP_FILLED_NEW_ARRAY_continue:
11052    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11053    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11054    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11055    .if     0
11056    mov     r1, r10                     @ r1<- AA (length)
11057    .else
11058    mov     r1, r10, lsr #4             @ r1<- B (length)
11059    .endif
11060    cmp     rINST, #'I'                 @ array of ints?
11061    cmpne   rINST, #'L'                 @ array of objects?
11062    cmpne   rINST, #'['                 @ array of arrays?
11063    mov     r9, r1                      @ save length in r9
11064    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
11065    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11066    cmp     r0, #0                      @ null return?
11067    beq     common_exceptionThrown      @ alloc failed, handle exception
11068
11069    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11070    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11071    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11072    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11073    subs    r9, r9, #1                  @ length--, check for neg
11074    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11075    bmi     2f                          @ was zero, bail
11076
11077    @ copy values from registers into the array
11078    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11079    .if     0
11080    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
110811:  ldr     r3, [r2], #4                @ r3<- *r2++
11082    subs    r9, r9, #1                  @ count--
11083    str     r3, [r0], #4                @ *contents++ = vX
11084    bpl     1b
11085    @ continue at 2
11086    .else
11087    cmp     r9, #4                      @ length was initially 5?
11088    and     r2, r10, #15                @ r2<- A
11089    bne     1f                          @ <= 4 args, branch
11090    GET_VREG(r3, r2)                    @ r3<- vA
11091    sub     r9, r9, #1                  @ count--
11092    str     r3, [r0, #16]               @ contents[4] = vA
110931:  and     r2, r1, #15                 @ r2<- F/E/D/C
11094    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11095    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11096    subs    r9, r9, #1                  @ count--
11097    str     r3, [r0], #4                @ *contents++ = vX
11098    bpl     1b
11099    @ continue at 2
11100    .endif
11101
111022:
11103    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11104    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11105    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11106    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11107    cmp     r1, #'I'                         @ Is int array?
11108    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11109    GOTO_OPCODE(ip)                          @ execute it
11110
11111    /*
11112     * Throw an exception indicating that we have not implemented this
11113     * mode of filled-new-array.
11114     */
11115.LOP_FILLED_NEW_ARRAY_notimpl:
11116    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY
11117    bl      dvmThrowInternalError
11118    b       common_exceptionThrown
11119
11120    /*
11121     * Ideally we'd only define this once, but depending on layout we can
11122     * exceed the range of the load above.
11123     */
11124
11125.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY:
11126    .word   .LstrFilledNewArrayNotImpl
11127
11128/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
11129
11130    /*
11131     * On entry:
11132     *  r0 holds array class
11133     *  r10 holds AA or BA
11134     */
11135.LOP_FILLED_NEW_ARRAY_RANGE_continue:
11136    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11137    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11138    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11139    .if     1
11140    mov     r1, r10                     @ r1<- AA (length)
11141    .else
11142    mov     r1, r10, lsr #4             @ r1<- B (length)
11143    .endif
11144    cmp     rINST, #'I'                 @ array of ints?
11145    cmpne   rINST, #'L'                 @ array of objects?
11146    cmpne   rINST, #'['                 @ array of arrays?
11147    mov     r9, r1                      @ save length in r9
11148    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
11149    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11150    cmp     r0, #0                      @ null return?
11151    beq     common_exceptionThrown      @ alloc failed, handle exception
11152
11153    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11154    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11155    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11156    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11157    subs    r9, r9, #1                  @ length--, check for neg
11158    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11159    bmi     2f                          @ was zero, bail
11160
11161    @ copy values from registers into the array
11162    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11163    .if     1
11164    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
111651:  ldr     r3, [r2], #4                @ r3<- *r2++
11166    subs    r9, r9, #1                  @ count--
11167    str     r3, [r0], #4                @ *contents++ = vX
11168    bpl     1b
11169    @ continue at 2
11170    .else
11171    cmp     r9, #4                      @ length was initially 5?
11172    and     r2, r10, #15                @ r2<- A
11173    bne     1f                          @ <= 4 args, branch
11174    GET_VREG(r3, r2)                    @ r3<- vA
11175    sub     r9, r9, #1                  @ count--
11176    str     r3, [r0, #16]               @ contents[4] = vA
111771:  and     r2, r1, #15                 @ r2<- F/E/D/C
11178    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11179    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11180    subs    r9, r9, #1                  @ count--
11181    str     r3, [r0], #4                @ *contents++ = vX
11182    bpl     1b
11183    @ continue at 2
11184    .endif
11185
111862:
11187    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11188    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11189    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11190    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11191    cmp     r1, #'I'                         @ Is int array?
11192    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11193    GOTO_OPCODE(ip)                          @ execute it
11194
11195    /*
11196     * Throw an exception indicating that we have not implemented this
11197     * mode of filled-new-array.
11198     */
11199.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
11200    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE
11201    bl      dvmThrowInternalError
11202    b       common_exceptionThrown
11203
11204    /*
11205     * Ideally we'd only define this once, but depending on layout we can
11206     * exceed the range of the load above.
11207     */
11208
11209.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE:
11210    .word   .LstrFilledNewArrayNotImpl
11211
11212/* continuation for OP_CMPL_FLOAT */
11213.LOP_CMPL_FLOAT_finish:
11214    SET_VREG(r0, r9)                    @ vAA<- r0
11215    GOTO_OPCODE(ip)                     @ jump to next instruction
11216
11217/* continuation for OP_CMPG_FLOAT */
11218.LOP_CMPG_FLOAT_finish:
11219    SET_VREG(r0, r9)                    @ vAA<- r0
11220    GOTO_OPCODE(ip)                     @ jump to next instruction
11221
11222/* continuation for OP_CMPL_DOUBLE */
11223.LOP_CMPL_DOUBLE_finish:
11224    SET_VREG(r0, r9)                    @ vAA<- r0
11225    GOTO_OPCODE(ip)                     @ jump to next instruction
11226
11227/* continuation for OP_CMPG_DOUBLE */
11228.LOP_CMPG_DOUBLE_finish:
11229    SET_VREG(r0, r9)                    @ vAA<- r0
11230    GOTO_OPCODE(ip)                     @ jump to next instruction
11231
11232/* continuation for OP_CMP_LONG */
11233
11234.LOP_CMP_LONG_less:
11235    mvn     r1, #0                      @ r1<- -1
11236    @ Want to cond code the next mov so we can avoid branch, but don't see it;
11237    @ instead, we just replicate the tail end.
11238    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11239    SET_VREG(r1, r9)                    @ vAA<- r1
11240    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11241    GOTO_OPCODE(ip)                     @ jump to next instruction
11242
11243.LOP_CMP_LONG_greater:
11244    mov     r1, #1                      @ r1<- 1
11245    @ fall through to _finish
11246
11247.LOP_CMP_LONG_finish:
11248    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11249    SET_VREG(r1, r9)                    @ vAA<- r1
11250    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11251    GOTO_OPCODE(ip)                     @ jump to next instruction
11252
11253/* continuation for OP_AGET_WIDE */
11254
11255.LOP_AGET_WIDE_finish:
11256    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11257    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11258    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
11259    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11260    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
11261    GOTO_OPCODE(ip)                     @ jump to next instruction
11262
11263/* continuation for OP_APUT_WIDE */
11264
11265.LOP_APUT_WIDE_finish:
11266    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11267    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
11268    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11269    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11270    GOTO_OPCODE(ip)                     @ jump to next instruction
11271
11272/* continuation for OP_APUT_OBJECT */
11273    /*
11274     * On entry:
11275     *  rINST = vBB (arrayObj)
11276     *  r9 = vAA (obj)
11277     *  r10 = offset into array (vBB + vCC * width)
11278     */
11279.LOP_APUT_OBJECT_finish:
11280    cmp     r9, #0                      @ storing null reference?
11281    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
11282    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
11283    ldr     r1, [rINST, #offObject_clazz]  @ r1<- arrayObj->clazz
11284    bl      dvmCanPutArrayElement       @ test object type vs. array type
11285    cmp     r0, #0                      @ okay?
11286    beq     .LOP_APUT_OBJECT_throw           @ no
11287    mov     r1, rINST                   @ r1<- arrayObj
11288    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11289    ldr     r2, [rSELF, #offThread_cardTable]     @ get biased CT base
11290    add     r10, #offArrayObject_contents   @ r0<- pointer to slot
11291    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11292    str     r9, [r10]                   @ vBB[vCC]<- vAA
11293    strb    r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
11294    GOTO_OPCODE(ip)                     @ jump to next instruction
11295.LOP_APUT_OBJECT_skip_check:
11296    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11297    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11298    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
11299    GOTO_OPCODE(ip)                     @ jump to next instruction
11300.LOP_APUT_OBJECT_throw:
11301    @ The types don't match.  We need to throw an ArrayStoreException.
11302    ldr     r0, [r9, #offObject_clazz]
11303    ldr     r1, [rINST, #offObject_clazz]
11304    EXPORT_PC()
11305    bl      dvmThrowArrayStoreExceptionIncompatibleElement
11306    b       common_exceptionThrown
11307
11308/* continuation for OP_IGET */
11309
11310    /*
11311     * Currently:
11312     *  r0 holds resolved field
11313     *  r9 holds object
11314     */
11315.LOP_IGET_finish:
11316    @bl      common_squeak0
11317    cmp     r9, #0                      @ check object for null
11318    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11319    beq     common_errNullObject        @ object was null
11320    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11321    ubfx    r2, rINST, #8, #4           @ r2<- A
11322    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11323    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11324    SET_VREG(r0, r2)                    @ fp[A]<- r0
11325    GOTO_OPCODE(ip)                     @ jump to next instruction
11326
11327/* continuation for OP_IGET_WIDE */
11328
11329    /*
11330     * Currently:
11331     *  r0 holds resolved field
11332     *  r9 holds object
11333     */
11334.LOP_IGET_WIDE_finish:
11335    cmp     r9, #0                      @ check object for null
11336    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11337    beq     common_errNullObject        @ object was null
11338    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
11339    ubfx    r2, rINST, #8, #4           @ r2<- A
11340    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11341    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
11342    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11343    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
11344    GOTO_OPCODE(ip)                     @ jump to next instruction
11345
11346/* continuation for OP_IGET_OBJECT */
11347
11348    /*
11349     * Currently:
11350     *  r0 holds resolved field
11351     *  r9 holds object
11352     */
11353.LOP_IGET_OBJECT_finish:
11354    @bl      common_squeak0
11355    cmp     r9, #0                      @ check object for null
11356    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11357    beq     common_errNullObject        @ object was null
11358    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11359    @ no-op                             @ acquiring load
11360    mov     r2, rINST, lsr #8           @ r2<- A+
11361    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11362    and     r2, r2, #15                 @ r2<- A
11363    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11364    SET_VREG(r0, r2)                    @ fp[A]<- r0
11365    GOTO_OPCODE(ip)                     @ jump to next instruction
11366
11367/* continuation for OP_IGET_BOOLEAN */
11368
11369    /*
11370     * Currently:
11371     *  r0 holds resolved field
11372     *  r9 holds object
11373     */
11374.LOP_IGET_BOOLEAN_finish:
11375    @bl      common_squeak1
11376    cmp     r9, #0                      @ check object for null
11377    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11378    beq     common_errNullObject        @ object was null
11379    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11380    @ no-op                             @ acquiring load
11381    mov     r2, rINST, lsr #8           @ r2<- A+
11382    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11383    and     r2, r2, #15                 @ r2<- A
11384    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11385    SET_VREG(r0, r2)                    @ fp[A]<- r0
11386    GOTO_OPCODE(ip)                     @ jump to next instruction
11387
11388/* continuation for OP_IGET_BYTE */
11389
11390    /*
11391     * Currently:
11392     *  r0 holds resolved field
11393     *  r9 holds object
11394     */
11395.LOP_IGET_BYTE_finish:
11396    @bl      common_squeak2
11397    cmp     r9, #0                      @ check object for null
11398    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11399    beq     common_errNullObject        @ object was null
11400    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11401    @ no-op                             @ acquiring load
11402    mov     r2, rINST, lsr #8           @ r2<- A+
11403    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11404    and     r2, r2, #15                 @ r2<- A
11405    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11406    SET_VREG(r0, r2)                    @ fp[A]<- r0
11407    GOTO_OPCODE(ip)                     @ jump to next instruction
11408
11409/* continuation for OP_IGET_CHAR */
11410
11411    /*
11412     * Currently:
11413     *  r0 holds resolved field
11414     *  r9 holds object
11415     */
11416.LOP_IGET_CHAR_finish:
11417    @bl      common_squeak3
11418    cmp     r9, #0                      @ check object for null
11419    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11420    beq     common_errNullObject        @ object was null
11421    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11422    @ no-op                             @ acquiring load
11423    mov     r2, rINST, lsr #8           @ r2<- A+
11424    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11425    and     r2, r2, #15                 @ r2<- A
11426    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11427    SET_VREG(r0, r2)                    @ fp[A]<- r0
11428    GOTO_OPCODE(ip)                     @ jump to next instruction
11429
11430/* continuation for OP_IGET_SHORT */
11431
11432    /*
11433     * Currently:
11434     *  r0 holds resolved field
11435     *  r9 holds object
11436     */
11437.LOP_IGET_SHORT_finish:
11438    @bl      common_squeak4
11439    cmp     r9, #0                      @ check object for null
11440    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11441    beq     common_errNullObject        @ object was null
11442    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11443    @ no-op                             @ acquiring load
11444    mov     r2, rINST, lsr #8           @ r2<- A+
11445    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11446    and     r2, r2, #15                 @ r2<- A
11447    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11448    SET_VREG(r0, r2)                    @ fp[A]<- r0
11449    GOTO_OPCODE(ip)                     @ jump to next instruction
11450
11451/* continuation for OP_IPUT */
11452
11453    /*
11454     * Currently:
11455     *  r0 holds resolved field
11456     *  r9 holds object
11457     */
11458.LOP_IPUT_finish:
11459    @bl      common_squeak0
11460    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11461    ubfx    r1, rINST, #8, #4           @ r1<- A
11462    cmp     r9, #0                      @ check object for null
11463    GET_VREG(r0, r1)                    @ r0<- fp[A]
11464    beq     common_errNullObject        @ object was null
11465    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11466    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11467    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11468    GOTO_OPCODE(ip)                     @ jump to next instruction
11469
11470/* continuation for OP_IPUT_WIDE */
11471
11472    /*
11473     * Currently:
11474     *  r0 holds resolved field
11475     *  r9 holds object
11476     */
11477.LOP_IPUT_WIDE_finish:
11478    ubfx    r2, rINST, #8, #4           @ r2<- A
11479    cmp     r9, #0                      @ check object for null
11480    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11481    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
11482    beq     common_errNullObject        @ object was null
11483    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11484    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
11485    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11486    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0
11487    GOTO_OPCODE(ip)                     @ jump to next instruction
11488
11489/* continuation for OP_IPUT_OBJECT */
11490
11491    /*
11492     * Currently:
11493     *  r0 holds resolved field
11494     *  r9 holds object
11495     */
11496.LOP_IPUT_OBJECT_finish:
11497    @bl      common_squeak0
11498    mov     r1, rINST, lsr #8           @ r1<- A+
11499    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11500    and     r1, r1, #15                 @ r1<- A
11501    cmp     r9, #0                      @ check object for null
11502    GET_VREG(r0, r1)                    @ r0<- fp[A]
11503    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11504    beq     common_errNullObject        @ object was null
11505    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11506    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11507    @ no-op                             @ releasing store
11508    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
11509    cmp     r0, #0                      @ stored a null reference?
11510    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
11511    GOTO_OPCODE(ip)                     @ jump to next instruction
11512
11513/* continuation for OP_IPUT_BOOLEAN */
11514
11515    /*
11516     * Currently:
11517     *  r0 holds resolved field
11518     *  r9 holds object
11519     */
11520.LOP_IPUT_BOOLEAN_finish:
11521    @bl      common_squeak1
11522    mov     r1, rINST, lsr #8           @ r1<- A+
11523    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11524    and     r1, r1, #15                 @ r1<- A
11525    cmp     r9, #0                      @ check object for null
11526    GET_VREG(r0, r1)                    @ r0<- fp[A]
11527    beq     common_errNullObject        @ object was null
11528    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11529    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11530    @ no-op                             @ releasing store
11531    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11532    GOTO_OPCODE(ip)                     @ jump to next instruction
11533
11534/* continuation for OP_IPUT_BYTE */
11535
11536    /*
11537     * Currently:
11538     *  r0 holds resolved field
11539     *  r9 holds object
11540     */
11541.LOP_IPUT_BYTE_finish:
11542    @bl      common_squeak2
11543    mov     r1, rINST, lsr #8           @ r1<- A+
11544    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11545    and     r1, r1, #15                 @ r1<- A
11546    cmp     r9, #0                      @ check object for null
11547    GET_VREG(r0, r1)                    @ r0<- fp[A]
11548    beq     common_errNullObject        @ object was null
11549    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11550    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11551    @ no-op                             @ releasing store
11552    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11553    GOTO_OPCODE(ip)                     @ jump to next instruction
11554
11555/* continuation for OP_IPUT_CHAR */
11556
11557    /*
11558     * Currently:
11559     *  r0 holds resolved field
11560     *  r9 holds object
11561     */
11562.LOP_IPUT_CHAR_finish:
11563    @bl      common_squeak3
11564    mov     r1, rINST, lsr #8           @ r1<- A+
11565    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11566    and     r1, r1, #15                 @ r1<- A
11567    cmp     r9, #0                      @ check object for null
11568    GET_VREG(r0, r1)                    @ r0<- fp[A]
11569    beq     common_errNullObject        @ object was null
11570    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11571    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11572    @ no-op                             @ releasing store
11573    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11574    GOTO_OPCODE(ip)                     @ jump to next instruction
11575
11576/* continuation for OP_IPUT_SHORT */
11577
11578    /*
11579     * Currently:
11580     *  r0 holds resolved field
11581     *  r9 holds object
11582     */
11583.LOP_IPUT_SHORT_finish:
11584    @bl      common_squeak4
11585    mov     r1, rINST, lsr #8           @ r1<- A+
11586    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11587    and     r1, r1, #15                 @ r1<- A
11588    cmp     r9, #0                      @ check object for null
11589    GET_VREG(r0, r1)                    @ r0<- fp[A]
11590    beq     common_errNullObject        @ object was null
11591    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11592    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11593    @ no-op                             @ releasing store
11594    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11595    GOTO_OPCODE(ip)                     @ jump to next instruction
11596
11597/* continuation for OP_SGET */
11598
11599    /*
11600     * Continuation if the field has not yet been resolved.
11601     *  r1:  BBBB field ref
11602     *  r10: dvmDex->pResFields
11603     */
11604.LOP_SGET_resolve:
11605    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11606#if defined(WITH_JIT)
11607    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11608#endif
11609    EXPORT_PC()                         @ resolve() could throw, so export now
11610    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11611    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11612    cmp     r0, #0                      @ success?
11613    beq     common_exceptionThrown      @ no, handle exception
11614#if defined(WITH_JIT)
11615    /*
11616     * If the JIT is actively building a trace we need to make sure
11617     * that the field is fully resolved before including this instruction.
11618     */
11619    bl      common_verifyField
11620#endif
11621    b       .LOP_SGET_finish
11622
11623/* continuation for OP_SGET_WIDE */
11624
11625    /*
11626     * Continuation if the field has not yet been resolved.
11627     *  r1:  BBBB field ref
11628     *  r10: dvmDex->pResFields
11629     *
11630     * Returns StaticField pointer in r0.
11631     */
11632.LOP_SGET_WIDE_resolve:
11633    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11634#if defined(WITH_JIT)
11635    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
11636#endif
11637    EXPORT_PC()                         @ resolve() could throw, so export now
11638    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11639    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11640    cmp     r0, #0                      @ success?
11641    beq     common_exceptionThrown      @ no, handle exception
11642#if defined(WITH_JIT)
11643    /*
11644     * If the JIT is actively building a trace we need to make sure
11645     * that the field is fully resolved before including this instruction.
11646     */
11647    bl      common_verifyField
11648#endif
11649    b       .LOP_SGET_WIDE_finish          @ resume
11650
11651/* continuation for OP_SGET_OBJECT */
11652
11653    /*
11654     * Continuation if the field has not yet been resolved.
11655     *  r1:  BBBB field ref
11656     *  r10: dvmDex->pResFields
11657     */
11658.LOP_SGET_OBJECT_resolve:
11659    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11660#if defined(WITH_JIT)
11661    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11662#endif
11663    EXPORT_PC()                         @ resolve() could throw, so export now
11664    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11665    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11666    cmp     r0, #0                      @ success?
11667    beq     common_exceptionThrown      @ no, handle exception
11668#if defined(WITH_JIT)
11669    /*
11670     * If the JIT is actively building a trace we need to make sure
11671     * that the field is fully resolved before including this instruction.
11672     */
11673    bl      common_verifyField
11674#endif
11675    b       .LOP_SGET_OBJECT_finish
11676
11677/* continuation for OP_SGET_BOOLEAN */
11678
11679    /*
11680     * Continuation if the field has not yet been resolved.
11681     *  r1:  BBBB field ref
11682     *  r10: dvmDex->pResFields
11683     */
11684.LOP_SGET_BOOLEAN_resolve:
11685    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11686#if defined(WITH_JIT)
11687    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11688#endif
11689    EXPORT_PC()                         @ resolve() could throw, so export now
11690    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11691    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11692    cmp     r0, #0                      @ success?
11693    beq     common_exceptionThrown      @ no, handle exception
11694#if defined(WITH_JIT)
11695    /*
11696     * If the JIT is actively building a trace we need to make sure
11697     * that the field is fully resolved before including this instruction.
11698     */
11699    bl      common_verifyField
11700#endif
11701    b       .LOP_SGET_BOOLEAN_finish
11702
11703/* continuation for OP_SGET_BYTE */
11704
11705    /*
11706     * Continuation if the field has not yet been resolved.
11707     *  r1:  BBBB field ref
11708     *  r10: dvmDex->pResFields
11709     */
11710.LOP_SGET_BYTE_resolve:
11711    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11712#if defined(WITH_JIT)
11713    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11714#endif
11715    EXPORT_PC()                         @ resolve() could throw, so export now
11716    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11717    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11718    cmp     r0, #0                      @ success?
11719    beq     common_exceptionThrown      @ no, handle exception
11720#if defined(WITH_JIT)
11721    /*
11722     * If the JIT is actively building a trace we need to make sure
11723     * that the field is fully resolved before including this instruction.
11724     */
11725    bl      common_verifyField
11726#endif
11727    b       .LOP_SGET_BYTE_finish
11728
11729/* continuation for OP_SGET_CHAR */
11730
11731    /*
11732     * Continuation if the field has not yet been resolved.
11733     *  r1:  BBBB field ref
11734     *  r10: dvmDex->pResFields
11735     */
11736.LOP_SGET_CHAR_resolve:
11737    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11738#if defined(WITH_JIT)
11739    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11740#endif
11741    EXPORT_PC()                         @ resolve() could throw, so export now
11742    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11743    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11744    cmp     r0, #0                      @ success?
11745    beq     common_exceptionThrown      @ no, handle exception
11746#if defined(WITH_JIT)
11747    /*
11748     * If the JIT is actively building a trace we need to make sure
11749     * that the field is fully resolved before including this instruction.
11750     */
11751    bl      common_verifyField
11752#endif
11753    b       .LOP_SGET_CHAR_finish
11754
11755/* continuation for OP_SGET_SHORT */
11756
11757    /*
11758     * Continuation if the field has not yet been resolved.
11759     *  r1:  BBBB field ref
11760     *  r10: dvmDex->pResFields
11761     */
11762.LOP_SGET_SHORT_resolve:
11763    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11764#if defined(WITH_JIT)
11765    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11766#endif
11767    EXPORT_PC()                         @ resolve() could throw, so export now
11768    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11769    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11770    cmp     r0, #0                      @ success?
11771    beq     common_exceptionThrown      @ no, handle exception
11772#if defined(WITH_JIT)
11773    /*
11774     * If the JIT is actively building a trace we need to make sure
11775     * that the field is fully resolved before including this instruction.
11776     */
11777    bl      common_verifyField
11778#endif
11779    b       .LOP_SGET_SHORT_finish
11780
11781/* continuation for OP_SPUT */
11782
11783    /*
11784     * Continuation if the field has not yet been resolved.
11785     *  r1:  BBBB field ref
11786     *  r10: dvmDex->pResFields
11787     */
11788.LOP_SPUT_resolve:
11789    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11790#if defined(WITH_JIT)
11791    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11792#endif
11793    EXPORT_PC()                         @ resolve() could throw, so export now
11794    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11795    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11796    cmp     r0, #0                      @ success?
11797    beq     common_exceptionThrown      @ no, handle exception
11798#if defined(WITH_JIT)
11799    /*
11800     * If the JIT is actively building a trace we need to make sure
11801     * that the field is fully resolved before including this instruction.
11802     */
11803    bl      common_verifyField
11804#endif
11805    b       .LOP_SPUT_finish          @ resume
11806
11807/* continuation for OP_SPUT_WIDE */
11808
11809    /*
11810     * Continuation if the field has not yet been resolved.
11811     *  r1:  BBBB field ref
11812     *  r9:  &fp[AA]
11813     *  r10: dvmDex->pResFields
11814     *
11815     * Returns StaticField pointer in r2.
11816     */
11817.LOP_SPUT_WIDE_resolve:
11818    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11819#if defined(WITH_JIT)
11820    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11821#endif
11822    EXPORT_PC()                         @ resolve() could throw, so export now
11823    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11824    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11825    cmp     r0, #0                      @ success?
11826    mov     r2, r0                      @ copy to r2
11827    beq     common_exceptionThrown      @ no, handle exception
11828#if defined(WITH_JIT)
11829    /*
11830     * If the JIT is actively building a trace we need to make sure
11831     * that the field is fully resolved before including this instruction.
11832     */
11833    bl      common_verifyField
11834#endif
11835    b       .LOP_SPUT_WIDE_finish          @ resume
11836
11837/* continuation for OP_SPUT_OBJECT */
11838
11839
11840.LOP_SPUT_OBJECT_end:
11841    str     r1, [r0, #offStaticField_value]  @ field<- vAA
11842    cmp     r1, #0                      @ stored a null object?
11843    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
11844    GOTO_OPCODE(ip)                     @ jump to next instruction
11845
11846    /* Continuation if the field has not yet been resolved.
11847     * r1:  BBBB field ref
11848     * r10: dvmDex->pResFields
11849     */
11850.LOP_SPUT_OBJECT_resolve:
11851    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11852#if defined(WITH_JIT)
11853    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11854#endif
11855    EXPORT_PC()                         @ resolve() could throw, so export now
11856    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11857    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11858    cmp     r0, #0                      @ success?
11859    beq     common_exceptionThrown      @ no, handle exception
11860#if defined(WITH_JIT)
11861    /*
11862     * If the JIT is actively building a trace we need to make sure
11863     * that the field is fully resolved before including this instruction.
11864     */
11865    bl      common_verifyField
11866#endif
11867    b       .LOP_SPUT_OBJECT_finish          @ resume
11868
11869
11870/* continuation for OP_SPUT_BOOLEAN */
11871
11872    /*
11873     * Continuation if the field has not yet been resolved.
11874     *  r1:  BBBB field ref
11875     *  r10: dvmDex->pResFields
11876     */
11877.LOP_SPUT_BOOLEAN_resolve:
11878    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11879#if defined(WITH_JIT)
11880    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11881#endif
11882    EXPORT_PC()                         @ resolve() could throw, so export now
11883    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11884    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11885    cmp     r0, #0                      @ success?
11886    beq     common_exceptionThrown      @ no, handle exception
11887#if defined(WITH_JIT)
11888    /*
11889     * If the JIT is actively building a trace we need to make sure
11890     * that the field is fully resolved before including this instruction.
11891     */
11892    bl      common_verifyField
11893#endif
11894    b       .LOP_SPUT_BOOLEAN_finish          @ resume
11895
11896/* continuation for OP_SPUT_BYTE */
11897
11898    /*
11899     * Continuation if the field has not yet been resolved.
11900     *  r1:  BBBB field ref
11901     *  r10: dvmDex->pResFields
11902     */
11903.LOP_SPUT_BYTE_resolve:
11904    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11905#if defined(WITH_JIT)
11906    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11907#endif
11908    EXPORT_PC()                         @ resolve() could throw, so export now
11909    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11910    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11911    cmp     r0, #0                      @ success?
11912    beq     common_exceptionThrown      @ no, handle exception
11913#if defined(WITH_JIT)
11914    /*
11915     * If the JIT is actively building a trace we need to make sure
11916     * that the field is fully resolved before including this instruction.
11917     */
11918    bl      common_verifyField
11919#endif
11920    b       .LOP_SPUT_BYTE_finish          @ resume
11921
11922/* continuation for OP_SPUT_CHAR */
11923
11924    /*
11925     * Continuation if the field has not yet been resolved.
11926     *  r1:  BBBB field ref
11927     *  r10: dvmDex->pResFields
11928     */
11929.LOP_SPUT_CHAR_resolve:
11930    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11931#if defined(WITH_JIT)
11932    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11933#endif
11934    EXPORT_PC()                         @ resolve() could throw, so export now
11935    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11936    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11937    cmp     r0, #0                      @ success?
11938    beq     common_exceptionThrown      @ no, handle exception
11939#if defined(WITH_JIT)
11940    /*
11941     * If the JIT is actively building a trace we need to make sure
11942     * that the field is fully resolved before including this instruction.
11943     */
11944    bl      common_verifyField
11945#endif
11946    b       .LOP_SPUT_CHAR_finish          @ resume
11947
11948/* continuation for OP_SPUT_SHORT */
11949
11950    /*
11951     * Continuation if the field has not yet been resolved.
11952     *  r1:  BBBB field ref
11953     *  r10: dvmDex->pResFields
11954     */
11955.LOP_SPUT_SHORT_resolve:
11956    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11957#if defined(WITH_JIT)
11958    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11959#endif
11960    EXPORT_PC()                         @ resolve() could throw, so export now
11961    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11962    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11963    cmp     r0, #0                      @ success?
11964    beq     common_exceptionThrown      @ no, handle exception
11965#if defined(WITH_JIT)
11966    /*
11967     * If the JIT is actively building a trace we need to make sure
11968     * that the field is fully resolved before including this instruction.
11969     */
11970    bl      common_verifyField
11971#endif
11972    b       .LOP_SPUT_SHORT_finish          @ resume
11973
11974/* continuation for OP_INVOKE_VIRTUAL */
11975
11976    /*
11977     * At this point:
11978     *  r0 = resolved base method
11979     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
11980     */
11981.LOP_INVOKE_VIRTUAL_continue:
11982    GET_VREG(r9, r10)                   @ r9<- "this" ptr
11983    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
11984    cmp     r9, #0                      @ is "this" null?
11985    beq     common_errNullObject        @ null "this", throw exception
11986    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
11987    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
11988    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
11989    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
11990
11991/* continuation for OP_INVOKE_SUPER */
11992
11993    /*
11994     * At this point:
11995     *  r0 = resolved base method
11996     *  r10 = method->clazz
11997     */
11998.LOP_INVOKE_SUPER_continue:
11999    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12000    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12001    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12002    EXPORT_PC()                         @ must export for invoke
12003    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12004    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
12005    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12006    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12007    bl      common_invokeMethodNoRange @ continue on
12008
12009.LOP_INVOKE_SUPER_resolve:
12010    mov     r0, r10                     @ r0<- method->clazz
12011    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12012    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12013    cmp     r0, #0                      @ got null?
12014    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
12015    b       common_exceptionThrown      @ yes, handle exception
12016
12017    /*
12018     * Throw a NoSuchMethodError with the method name as the message.
12019     *  r0 = resolved base method
12020     */
12021.LOP_INVOKE_SUPER_nsm:
12022    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12023    b       common_errNoSuchMethod
12024
12025/* continuation for OP_INVOKE_DIRECT */
12026
12027    /*
12028     * On entry:
12029     *  r1 = reference (BBBB or CCCC)
12030     *  r10 = "this" register
12031     */
12032.LOP_INVOKE_DIRECT_resolve:
12033    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12034    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12035    mov     r2, #METHOD_DIRECT          @ resolver method type
12036    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12037    cmp     r0, #0                      @ got null?
12038    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
12039    b       common_exceptionThrown      @ yes, handle exception
12040
12041/* continuation for OP_INVOKE_STATIC */
12042
12043
12044.LOP_INVOKE_STATIC_resolve:
12045    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12046    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12047    mov     r2, #METHOD_STATIC          @ resolver method type
12048    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12049    cmp     r0, #0                      @ got null?
12050#if defined(WITH_JIT)
12051    /*
12052     * Check to see if we're actively building a trace.  If so,
12053     * we need to keep this instruction out of it.
12054     * r10: &resolved_methodToCall
12055     */
12056    ldrb    r2, [rSELF, #offThread_subMode]
12057    beq     common_exceptionThrown            @ null, handle exception
12058    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12059    beq     common_invokeMethodNoRange     @ no (r0=method, r9="this")
12060    ldr     r1, [r10]                         @ reload resolved method
12061    cmp     r1, #0                            @ finished resolving?
12062    bne     common_invokeMethodNoRange     @ yes (r0=method, r9="this")
12063    mov     r10, r0                           @ preserve method
12064    mov     r0, rSELF
12065    mov     r1, rPC
12066    bl      dvmJitEndTraceSelect              @ (self, pc)
12067    mov     r0, r10
12068    b       common_invokeMethodNoRange     @ whew, finally!
12069#else
12070    bne     common_invokeMethodNoRange     @ (r0=method, r9="this")
12071    b       common_exceptionThrown            @ yes, handle exception
12072#endif
12073
12074/* continuation for OP_INVOKE_VIRTUAL_RANGE */
12075
12076    /*
12077     * At this point:
12078     *  r0 = resolved base method
12079     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
12080     */
12081.LOP_INVOKE_VIRTUAL_RANGE_continue:
12082    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12083    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12084    cmp     r9, #0                      @ is "this" null?
12085    beq     common_errNullObject        @ null "this", throw exception
12086    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12087    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12088    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12089    bl      common_invokeMethodRange @ (r0=method, r9="this")
12090
12091/* continuation for OP_INVOKE_SUPER_RANGE */
12092
12093    /*
12094     * At this point:
12095     *  r0 = resolved base method
12096     *  r10 = method->clazz
12097     */
12098.LOP_INVOKE_SUPER_RANGE_continue:
12099    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12100    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12101    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12102    EXPORT_PC()                         @ must export for invoke
12103    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12104    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
12105    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12106    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12107    bl      common_invokeMethodRange @ continue on
12108
12109.LOP_INVOKE_SUPER_RANGE_resolve:
12110    mov     r0, r10                     @ r0<- method->clazz
12111    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12112    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12113    cmp     r0, #0                      @ got null?
12114    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
12115    b       common_exceptionThrown      @ yes, handle exception
12116
12117    /*
12118     * Throw a NoSuchMethodError with the method name as the message.
12119     *  r0 = resolved base method
12120     */
12121.LOP_INVOKE_SUPER_RANGE_nsm:
12122    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12123    b       common_errNoSuchMethod
12124
12125/* continuation for OP_INVOKE_DIRECT_RANGE */
12126
12127    /*
12128     * On entry:
12129     *  r1 = reference (BBBB or CCCC)
12130     *  r10 = "this" register
12131     */
12132.LOP_INVOKE_DIRECT_RANGE_resolve:
12133    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12134    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12135    mov     r2, #METHOD_DIRECT          @ resolver method type
12136    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12137    cmp     r0, #0                      @ got null?
12138    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
12139    b       common_exceptionThrown      @ yes, handle exception
12140
12141/* continuation for OP_INVOKE_STATIC_RANGE */
12142
12143
12144.LOP_INVOKE_STATIC_RANGE_resolve:
12145    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12146    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12147    mov     r2, #METHOD_STATIC          @ resolver method type
12148    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12149    cmp     r0, #0                      @ got null?
12150#if defined(WITH_JIT)
12151    /*
12152     * Check to see if we're actively building a trace.  If so,
12153     * we need to keep this instruction out of it.
12154     * r10: &resolved_methodToCall
12155     */
12156    ldrb    r2, [rSELF, #offThread_subMode]
12157    beq     common_exceptionThrown            @ null, handle exception
12158    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12159    beq     common_invokeMethodRange     @ no (r0=method, r9="this")
12160    ldr     r1, [r10]                         @ reload resolved method
12161    cmp     r1, #0                            @ finished resolving?
12162    bne     common_invokeMethodRange     @ yes (r0=method, r9="this")
12163    mov     r10, r0                           @ preserve method
12164    mov     r0, rSELF
12165    mov     r1, rPC
12166    bl      dvmJitEndTraceSelect              @ (self, pc)
12167    mov     r0, r10
12168    b       common_invokeMethodRange     @ whew, finally!
12169#else
12170    bne     common_invokeMethodRange     @ (r0=method, r9="this")
12171    b       common_exceptionThrown            @ yes, handle exception
12172#endif
12173
12174/* continuation for OP_FLOAT_TO_LONG */
12175/*
12176 * Convert the float in r0 to a long in r0/r1.
12177 *
12178 * We have to clip values to long min/max per the specification.  The
12179 * expected common case is a "reasonable" value that converts directly
12180 * to modest integer.  The EABI convert function isn't doing this for us.
12181 */
12182f2l_doconv:
12183    stmfd   sp!, {r4, lr}
12184    mov     r1, #0x5f000000             @ (float)maxlong
12185    mov     r4, r0
12186    bl      __aeabi_fcmpge              @ is arg >= maxlong?
12187    cmp     r0, #0                      @ nonzero == yes
12188    mvnne   r0, #0                      @ return maxlong (7fffffff)
12189    mvnne   r1, #0x80000000
12190    ldmnefd sp!, {r4, pc}
12191
12192    mov     r0, r4                      @ recover arg
12193    mov     r1, #0xdf000000             @ (float)minlong
12194    bl      __aeabi_fcmple              @ is arg <= minlong?
12195    cmp     r0, #0                      @ nonzero == yes
12196    movne   r0, #0                      @ return minlong (80000000)
12197    movne   r1, #0x80000000
12198    ldmnefd sp!, {r4, pc}
12199
12200    mov     r0, r4                      @ recover arg
12201    mov     r1, r4
12202    bl      __aeabi_fcmpeq              @ is arg == self?
12203    cmp     r0, #0                      @ zero == no
12204    moveq   r1, #0                      @ return zero for NaN
12205    ldmeqfd sp!, {r4, pc}
12206
12207    mov     r0, r4                      @ recover arg
12208    bl      __aeabi_f2lz                @ convert float to long
12209    ldmfd   sp!, {r4, pc}
12210
12211/* continuation for OP_DOUBLE_TO_LONG */
12212/*
12213 * Convert the double in r0/r1 to a long in r0/r1.
12214 *
12215 * We have to clip values to long min/max per the specification.  The
12216 * expected common case is a "reasonable" value that converts directly
12217 * to modest integer.  The EABI convert function isn't doing this for us.
12218 */
12219d2l_doconv:
12220    stmfd   sp!, {r4, r5, lr}           @ save regs
12221    mov     r3, #0x43000000             @ maxlong, as a double (high word)
12222    add     r3, #0x00e00000             @  0x43e00000
12223    mov     r2, #0                      @ maxlong, as a double (low word)
12224    sub     sp, sp, #4                  @ align for EABI
12225    mov     r4, r0                      @ save a copy of r0
12226    mov     r5, r1                      @  and r1
12227    bl      __aeabi_dcmpge              @ is arg >= maxlong?
12228    cmp     r0, #0                      @ nonzero == yes
12229    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
12230    mvnne   r1, #0x80000000
12231    bne     1f
12232
12233    mov     r0, r4                      @ recover arg
12234    mov     r1, r5
12235    mov     r3, #0xc3000000             @ minlong, as a double (high word)
12236    add     r3, #0x00e00000             @  0xc3e00000
12237    mov     r2, #0                      @ minlong, as a double (low word)
12238    bl      __aeabi_dcmple              @ is arg <= minlong?
12239    cmp     r0, #0                      @ nonzero == yes
12240    movne   r0, #0                      @ return minlong (8000000000000000)
12241    movne   r1, #0x80000000
12242    bne     1f
12243
12244    mov     r0, r4                      @ recover arg
12245    mov     r1, r5
12246    mov     r2, r4                      @ compare against self
12247    mov     r3, r5
12248    bl      __aeabi_dcmpeq              @ is arg == self?
12249    cmp     r0, #0                      @ zero == no
12250    moveq   r1, #0                      @ return zero for NaN
12251    beq     1f
12252
12253    mov     r0, r4                      @ recover arg
12254    mov     r1, r5
12255    bl      __aeabi_d2lz                @ convert double to long
12256
122571:
12258    add     sp, sp, #4
12259    ldmfd   sp!, {r4, r5, pc}
12260
12261/* continuation for OP_MUL_LONG */
12262
12263.LOP_MUL_LONG_finish:
12264    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12265    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
12266    GOTO_OPCODE(ip)                     @ jump to next instruction
12267
12268/* continuation for OP_SHL_LONG */
12269
12270.LOP_SHL_LONG_finish:
12271    mov     r0, r0, asl r2              @  r0<- r0 << r2
12272    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12273    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12274    GOTO_OPCODE(ip)                     @ jump to next instruction
12275
12276/* continuation for OP_SHR_LONG */
12277
12278.LOP_SHR_LONG_finish:
12279    mov     r1, r1, asr r2              @  r1<- r1 >> r2
12280    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12281    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12282    GOTO_OPCODE(ip)                     @ jump to next instruction
12283
12284/* continuation for OP_USHR_LONG */
12285
12286.LOP_USHR_LONG_finish:
12287    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
12288    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12289    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12290    GOTO_OPCODE(ip)                     @ jump to next instruction
12291
12292/* continuation for OP_SHL_LONG_2ADDR */
12293
12294.LOP_SHL_LONG_2ADDR_finish:
12295    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12296    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12297    GOTO_OPCODE(ip)                     @ jump to next instruction
12298
12299/* continuation for OP_SHR_LONG_2ADDR */
12300
12301.LOP_SHR_LONG_2ADDR_finish:
12302    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12303    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12304    GOTO_OPCODE(ip)                     @ jump to next instruction
12305
12306/* continuation for OP_USHR_LONG_2ADDR */
12307
12308.LOP_USHR_LONG_2ADDR_finish:
12309    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12310    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12311    GOTO_OPCODE(ip)                     @ jump to next instruction
12312
12313/* continuation for OP_IGET_VOLATILE */
12314
12315    /*
12316     * Currently:
12317     *  r0 holds resolved field
12318     *  r9 holds object
12319     */
12320.LOP_IGET_VOLATILE_finish:
12321    @bl      common_squeak0
12322    cmp     r9, #0                      @ check object for null
12323    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12324    beq     common_errNullObject        @ object was null
12325    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12326    SMP_DMB                            @ acquiring load
12327    mov     r2, rINST, lsr #8           @ r2<- A+
12328    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12329    and     r2, r2, #15                 @ r2<- A
12330    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12331    SET_VREG(r0, r2)                    @ fp[A]<- r0
12332    GOTO_OPCODE(ip)                     @ jump to next instruction
12333
12334/* continuation for OP_IPUT_VOLATILE */
12335
12336    /*
12337     * Currently:
12338     *  r0 holds resolved field
12339     *  r9 holds object
12340     */
12341.LOP_IPUT_VOLATILE_finish:
12342    @bl      common_squeak0
12343    mov     r1, rINST, lsr #8           @ r1<- A+
12344    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12345    and     r1, r1, #15                 @ r1<- A
12346    cmp     r9, #0                      @ check object for null
12347    GET_VREG(r0, r1)                    @ r0<- fp[A]
12348    beq     common_errNullObject        @ object was null
12349    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12350    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12351    SMP_DMB                            @ releasing store
12352    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12353    GOTO_OPCODE(ip)                     @ jump to next instruction
12354
12355/* continuation for OP_SGET_VOLATILE */
12356
12357    /*
12358     * Continuation if the field has not yet been resolved.
12359     *  r1:  BBBB field ref
12360     *  r10: dvmDex->pResFields
12361     */
12362.LOP_SGET_VOLATILE_resolve:
12363    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12364#if defined(WITH_JIT)
12365    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12366#endif
12367    EXPORT_PC()                         @ resolve() could throw, so export now
12368    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12369    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12370    cmp     r0, #0                      @ success?
12371    beq     common_exceptionThrown      @ no, handle exception
12372#if defined(WITH_JIT)
12373    /*
12374     * If the JIT is actively building a trace we need to make sure
12375     * that the field is fully resolved before including this instruction.
12376     */
12377    bl      common_verifyField
12378#endif
12379    b       .LOP_SGET_VOLATILE_finish
12380
12381/* continuation for OP_SPUT_VOLATILE */
12382
12383    /*
12384     * Continuation if the field has not yet been resolved.
12385     *  r1:  BBBB field ref
12386     *  r10: dvmDex->pResFields
12387     */
12388.LOP_SPUT_VOLATILE_resolve:
12389    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12390#if defined(WITH_JIT)
12391    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12392#endif
12393    EXPORT_PC()                         @ resolve() could throw, so export now
12394    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12395    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12396    cmp     r0, #0                      @ success?
12397    beq     common_exceptionThrown      @ no, handle exception
12398#if defined(WITH_JIT)
12399    /*
12400     * If the JIT is actively building a trace we need to make sure
12401     * that the field is fully resolved before including this instruction.
12402     */
12403    bl      common_verifyField
12404#endif
12405    b       .LOP_SPUT_VOLATILE_finish          @ resume
12406
12407/* continuation for OP_IGET_OBJECT_VOLATILE */
12408
12409    /*
12410     * Currently:
12411     *  r0 holds resolved field
12412     *  r9 holds object
12413     */
12414.LOP_IGET_OBJECT_VOLATILE_finish:
12415    @bl      common_squeak0
12416    cmp     r9, #0                      @ check object for null
12417    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12418    beq     common_errNullObject        @ object was null
12419    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12420    SMP_DMB                            @ acquiring load
12421    mov     r2, rINST, lsr #8           @ r2<- A+
12422    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12423    and     r2, r2, #15                 @ r2<- A
12424    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12425    SET_VREG(r0, r2)                    @ fp[A]<- r0
12426    GOTO_OPCODE(ip)                     @ jump to next instruction
12427
12428/* continuation for OP_IGET_WIDE_VOLATILE */
12429
12430    /*
12431     * Currently:
12432     *  r0 holds resolved field
12433     *  r9 holds object
12434     */
12435.LOP_IGET_WIDE_VOLATILE_finish:
12436    cmp     r9, #0                      @ check object for null
12437    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12438    beq     common_errNullObject        @ object was null
12439    .if     1
12440    add     r0, r9, r3                  @ r0<- address of field
12441    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
12442    .else
12443    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
12444    .endif
12445    mov     r2, rINST, lsr #8           @ r2<- A+
12446    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12447    and     r2, r2, #15                 @ r2<- A
12448    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
12449    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12450    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
12451    GOTO_OPCODE(ip)                     @ jump to next instruction
12452
12453/* continuation for OP_IPUT_WIDE_VOLATILE */
12454
12455    /*
12456     * Currently:
12457     *  r0 holds resolved field
12458     *  r9 holds object
12459     */
12460.LOP_IPUT_WIDE_VOLATILE_finish:
12461    mov     r2, rINST, lsr #8           @ r2<- A+
12462    cmp     r9, #0                      @ check object for null
12463    and     r2, r2, #15                 @ r2<- A
12464    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12465    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
12466    beq     common_errNullObject        @ object was null
12467    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12468    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
12469    GET_INST_OPCODE(r10)                @ extract opcode from rINST
12470    .if     1
12471    add     r2, r9, r3                  @ r2<- target address
12472    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
12473    .else
12474    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
12475    .endif
12476    GOTO_OPCODE(r10)                    @ jump to next instruction
12477
12478/* continuation for OP_SGET_WIDE_VOLATILE */
12479
12480    /*
12481     * Continuation if the field has not yet been resolved.
12482     *  r1:  BBBB field ref
12483     *  r10: dvmDex->pResFields
12484     *
12485     * Returns StaticField pointer in r0.
12486     */
12487.LOP_SGET_WIDE_VOLATILE_resolve:
12488    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12489#if defined(WITH_JIT)
12490    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
12491#endif
12492    EXPORT_PC()                         @ resolve() could throw, so export now
12493    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12494    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12495    cmp     r0, #0                      @ success?
12496    beq     common_exceptionThrown      @ no, handle exception
12497#if defined(WITH_JIT)
12498    /*
12499     * If the JIT is actively building a trace we need to make sure
12500     * that the field is fully resolved before including this instruction.
12501     */
12502    bl      common_verifyField
12503#endif
12504    b       .LOP_SGET_WIDE_VOLATILE_finish          @ resume
12505
12506/* continuation for OP_SPUT_WIDE_VOLATILE */
12507
12508    /*
12509     * Continuation if the field has not yet been resolved.
12510     *  r1:  BBBB field ref
12511     *  r9:  &fp[AA]
12512     *  r10: dvmDex->pResFields
12513     *
12514     * Returns StaticField pointer in r2.
12515     */
12516.LOP_SPUT_WIDE_VOLATILE_resolve:
12517    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12518#if defined(WITH_JIT)
12519    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12520#endif
12521    EXPORT_PC()                         @ resolve() could throw, so export now
12522    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12523    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12524    cmp     r0, #0                      @ success?
12525    mov     r2, r0                      @ copy to r2
12526    beq     common_exceptionThrown      @ no, handle exception
12527#if defined(WITH_JIT)
12528    /*
12529     * If the JIT is actively building a trace we need to make sure
12530     * that the field is fully resolved before including this instruction.
12531     */
12532    bl      common_verifyField
12533#endif
12534    b       .LOP_SPUT_WIDE_VOLATILE_finish          @ resume
12535
12536/* continuation for OP_EXECUTE_INLINE */
12537
12538    /*
12539     * Extract args, call function.
12540     *  r0 = #of args (0-4)
12541     *  r10 = call index
12542     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
12543     *
12544     * Other ideas:
12545     * - Use a jump table from the main piece to jump directly into the
12546     *   AND/LDR pairs.  Costs a data load, saves a branch.
12547     * - Have five separate pieces that do the loading, so we can work the
12548     *   interleave a little better.  Increases code size.
12549     */
12550.LOP_EXECUTE_INLINE_continue:
12551    rsb     r0, r0, #4                  @ r0<- 4-r0
12552    FETCH(r9, 2)                        @ r9<- FEDC
12553    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
12554    bl      common_abort                @ (skipped due to ARM prefetch)
125554:  and     ip, r9, #0xf000             @ isolate F
12556    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
125573:  and     ip, r9, #0x0f00             @ isolate E
12558    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
125592:  and     ip, r9, #0x00f0             @ isolate D
12560    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
125611:  and     ip, r9, #0x000f             @ isolate C
12562    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
125630:
12564    ldr     r9, .LOP_EXECUTE_INLINE_table       @ table of InlineOperation
12565    ldr     pc, [r9, r10, lsl #4]       @ sizeof=16, "func" is first entry
12566    @ (not reached)
12567
12568    /*
12569     * We're debugging or profiling.
12570     * r10: opIndex
12571     */
12572.LOP_EXECUTE_INLINE_debugmode:
12573    mov     r0, r10
12574    bl      dvmResolveInlineNative
12575    cmp     r0, #0                      @ did it resolve?
12576    beq     .LOP_EXECUTE_INLINE_resume          @ no, just move on
12577    mov     r1, rSELF
12578    bl      dvmFastMethodTraceEnter     @ (method, self)
12579    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
12580    sub     sp, sp, #8                  @ make room for arg, +64 bit align
12581    mov     r0, rINST, lsr #12          @ r0<- B
12582    str     r1, [sp]                    @ push &self->retval
12583    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
12584    add     sp, sp, #8                  @ pop stack
12585    cmp     r0, #0                      @ test boolean result of inline
12586    beq     common_exceptionThrown      @ returned false, handle exception
12587    mov     r0, r10
12588    bl      dvmResolveInlineNative      @ reload method
12589    mov     r1, rSELF
12590    bl      dvmFastMethodTraceExit      @ (method, self)
12591    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
12592    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12593    GOTO_OPCODE(ip)                     @ jump to next instruction
12594
12595
12596
12597
12598.LOP_EXECUTE_INLINE_table:
12599    .word   gDvmInlineOpsTable
12600
12601/* continuation for OP_EXECUTE_INLINE_RANGE */
12602
12603    /*
12604     * Extract args, call function.
12605     *  r0 = #of args (0-4)
12606     *  r10 = call index
12607     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
12608     */
12609.LOP_EXECUTE_INLINE_RANGE_continue:
12610    rsb     r0, r0, #4                  @ r0<- 4-r0
12611    FETCH(r9, 2)                        @ r9<- CCCC
12612    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
12613    bl      common_abort                @ (skipped due to ARM prefetch)
126144:  add     ip, r9, #3                  @ base+3
12615    GET_VREG(r3, ip)                    @ r3<- vBase[3]
126163:  add     ip, r9, #2                  @ base+2
12617    GET_VREG(r2, ip)                    @ r2<- vBase[2]
126182:  add     ip, r9, #1                  @ base+1
12619    GET_VREG(r1, ip)                    @ r1<- vBase[1]
126201:  add     ip, r9, #0                  @ (nop)
12621    GET_VREG(r0, ip)                    @ r0<- vBase[0]
126220:
12623    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
12624    ldr     pc, [r9, r10, lsl #4]       @ sizeof=16, "func" is first entry
12625    @ (not reached)
12626
12627
12628    /*
12629     * We're debugging or profiling.
12630     * r10: opIndex
12631     */
12632.LOP_EXECUTE_INLINE_RANGE_debugmode:
12633    mov     r0, r10
12634    bl      dvmResolveInlineNative
12635    cmp     r0, #0                      @ did it resolve?
12636    beq     .LOP_EXECUTE_INLINE_RANGE_resume          @ no, just move on
12637    mov     r1, rSELF
12638    bl      dvmFastMethodTraceEnter     @ (method, self)
12639    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
12640    sub     sp, sp, #8                  @ make room for arg, +64 bit align
12641    mov     r0, rINST, lsr #12          @ r0<- B
12642    str     r1, [sp]                    @ push &self->retval
12643    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
12644    add     sp, sp, #8                  @ pop stack
12645    cmp     r0, #0                      @ test boolean result of inline
12646    beq     common_exceptionThrown      @ returned false, handle exception
12647    mov     r0, r10
12648    bl      dvmResolveInlineNative      @ reload method
12649    mov     r1, rSELF
12650    bl      dvmFastMethodTraceExit      @ (method, self)
12651    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
12652    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12653    GOTO_OPCODE(ip)                     @ jump to next instruction
12654
12655
12656
12657
12658.LOP_EXECUTE_INLINE_RANGE_table:
12659    .word   gDvmInlineOpsTable
12660
12661
12662/* continuation for OP_INVOKE_OBJECT_INIT_RANGE */
12663
12664.LOP_INVOKE_OBJECT_INIT_RANGE_setFinal:
12665    EXPORT_PC()                         @ can throw
12666    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
12667    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
12668    cmp     r0, #0                      @ exception pending?
12669    bne     common_exceptionThrown      @ yes, handle it
12670    b       .LOP_INVOKE_OBJECT_INIT_RANGE_finish
12671
12672    /*
12673     * A debugger is attached, so we need to go ahead and do
12674     * this.  For simplicity, we'll just jump directly to the
12675     * corresponding handler.  Note that we can't use
12676     * rIBASE here because it may be in single-step mode.
12677     * Load the primary table base directly.
12678     */
12679.LOP_INVOKE_OBJECT_INIT_RANGE_debugger:
12680    ldr     r1, [rSELF, #offThread_mainHandlerTable]
12681    .if 0
12682    mov     ip, #OP_INVOKE_DIRECT_JUMBO
12683    .else
12684    mov     ip, #OP_INVOKE_DIRECT_RANGE
12685    .endif
12686    GOTO_OPCODE_BASE(r1,ip)             @ execute it
12687
12688/* continuation for OP_IPUT_OBJECT_VOLATILE */
12689
12690    /*
12691     * Currently:
12692     *  r0 holds resolved field
12693     *  r9 holds object
12694     */
12695.LOP_IPUT_OBJECT_VOLATILE_finish:
12696    @bl      common_squeak0
12697    mov     r1, rINST, lsr #8           @ r1<- A+
12698    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12699    and     r1, r1, #15                 @ r1<- A
12700    cmp     r9, #0                      @ check object for null
12701    GET_VREG(r0, r1)                    @ r0<- fp[A]
12702    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
12703    beq     common_errNullObject        @ object was null
12704    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12705    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12706    SMP_DMB                            @ releasing store
12707    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
12708    cmp     r0, #0                      @ stored a null reference?
12709    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
12710    GOTO_OPCODE(ip)                     @ jump to next instruction
12711
12712/* continuation for OP_SGET_OBJECT_VOLATILE */
12713
12714    /*
12715     * Continuation if the field has not yet been resolved.
12716     *  r1:  BBBB field ref
12717     *  r10: dvmDex->pResFields
12718     */
12719.LOP_SGET_OBJECT_VOLATILE_resolve:
12720    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12721#if defined(WITH_JIT)
12722    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12723#endif
12724    EXPORT_PC()                         @ resolve() could throw, so export now
12725    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12726    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12727    cmp     r0, #0                      @ success?
12728    beq     common_exceptionThrown      @ no, handle exception
12729#if defined(WITH_JIT)
12730    /*
12731     * If the JIT is actively building a trace we need to make sure
12732     * that the field is fully resolved before including this instruction.
12733     */
12734    bl      common_verifyField
12735#endif
12736    b       .LOP_SGET_OBJECT_VOLATILE_finish
12737
12738/* continuation for OP_SPUT_OBJECT_VOLATILE */
12739
12740
12741.LOP_SPUT_OBJECT_VOLATILE_end:
12742    str     r1, [r0, #offStaticField_value]  @ field<- vAA
12743    cmp     r1, #0                      @ stored a null object?
12744    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
12745    GOTO_OPCODE(ip)                     @ jump to next instruction
12746
12747    /* Continuation if the field has not yet been resolved.
12748     * r1:  BBBB field ref
12749     * r10: dvmDex->pResFields
12750     */
12751.LOP_SPUT_OBJECT_VOLATILE_resolve:
12752    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12753#if defined(WITH_JIT)
12754    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12755#endif
12756    EXPORT_PC()                         @ resolve() could throw, so export now
12757    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12758    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12759    cmp     r0, #0                      @ success?
12760    beq     common_exceptionThrown      @ no, handle exception
12761#if defined(WITH_JIT)
12762    /*
12763     * If the JIT is actively building a trace we need to make sure
12764     * that the field is fully resolved before including this instruction.
12765     */
12766    bl      common_verifyField
12767#endif
12768    b       .LOP_SPUT_OBJECT_VOLATILE_finish          @ resume
12769
12770
12771/* continuation for OP_CONST_CLASS_JUMBO */
12772
12773    /*
12774     * Continuation if the Class has not yet been resolved.
12775     *  r1: AAAAAAAA (Class ref)
12776     *  r9: target register
12777     */
12778.LOP_CONST_CLASS_JUMBO_resolve:
12779    EXPORT_PC()
12780    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
12781    mov     r2, #1                      @ r2<- true
12782    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
12783    bl      dvmResolveClass             @ r0<- Class reference
12784    cmp     r0, #0                      @ failed?
12785    beq     common_exceptionThrown      @ yup, handle the exception
12786    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12787    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12788    SET_VREG(r0, r9)                    @ vBBBB<- r0
12789    GOTO_OPCODE(ip)                     @ jump to next instruction
12790
12791/* continuation for OP_CHECK_CAST_JUMBO */
12792
12793    /*
12794     * Trivial test failed, need to perform full check.  This is common.
12795     *  r0 holds obj->clazz
12796     *  r1 holds desired class resolved from AAAAAAAA
12797     *  r9 holds object
12798     */
12799.LOP_CHECK_CAST_JUMBO_fullcheck:
12800    mov     r10, r1                     @ avoid ClassObject getting clobbered
12801    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
12802    cmp     r0, #0                      @ failed?
12803    bne     .LOP_CHECK_CAST_JUMBO_okay            @ no, success
12804
12805    @ A cast has failed.  We need to throw a ClassCastException.
12806    EXPORT_PC()                         @ about to throw
12807    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
12808    mov     r1, r10                     @ r1<- desired class
12809    bl      dvmThrowClassCastException
12810    b       common_exceptionThrown
12811
12812    /*
12813     * Advance PC and get the next opcode.
12814     */
12815.LOP_CHECK_CAST_JUMBO_okay:
12816    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12817    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12818    GOTO_OPCODE(ip)                     @ jump to next instruction
12819
12820    /*
12821     * Resolution required.  This is the least-likely path.
12822     *
12823     *  r2 holds AAAAAAAA
12824     *  r9 holds object
12825     */
12826.LOP_CHECK_CAST_JUMBO_resolve:
12827    EXPORT_PC()                         @ resolve() could throw
12828    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12829    mov     r1, r2                      @ r1<- AAAAAAAA
12830    mov     r2, #0                      @ r2<- false
12831    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12832    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12833    cmp     r0, #0                      @ got null?
12834    beq     common_exceptionThrown      @ yes, handle exception
12835    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
12836    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
12837    b       .LOP_CHECK_CAST_JUMBO_resolved        @ pick up where we left off
12838
12839/* continuation for OP_INSTANCE_OF_JUMBO */
12840
12841    /*
12842     * Class resolved, determine type of check necessary.  This is common.
12843     *  r0 holds obj->clazz
12844     *  r1 holds class resolved from AAAAAAAA
12845     *  r9 holds BBBB
12846     */
12847.LOP_INSTANCE_OF_JUMBO_resolved:
12848    cmp     r0, r1                      @ same class (trivial success)?
12849    beq     .LOP_INSTANCE_OF_JUMBO_trivial         @ yes, trivial finish
12850    @ fall through to OP_INSTANCE_OF_JUMBO_fullcheck
12851
12852    /*
12853     * Trivial test failed, need to perform full check.  This is common.
12854     *  r0 holds obj->clazz
12855     *  r1 holds class resolved from AAAAAAAA
12856     *  r9 holds BBBB
12857     */
12858.LOP_INSTANCE_OF_JUMBO_fullcheck:
12859    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
12860    @ fall through to OP_INSTANCE_OF_JUMBO_store
12861
12862    /*
12863     * r0 holds boolean result
12864     * r9 holds BBBB
12865     */
12866.LOP_INSTANCE_OF_JUMBO_store:
12867    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
12868    SET_VREG(r0, r9)                    @ vBBBB<- r0
12869    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12870    GOTO_OPCODE(ip)                     @ jump to next instruction
12871
12872    /*
12873     * Trivial test succeeded, save and bail.
12874     *  r9 holds BBBB
12875     */
12876.LOP_INSTANCE_OF_JUMBO_trivial:
12877    mov     r0, #1                      @ indicate success
12878    @ could b OP_INSTANCE_OF_JUMBO_store, but copying is faster and cheaper
12879    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
12880    SET_VREG(r0, r9)                    @ vBBBB<- r0
12881    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12882    GOTO_OPCODE(ip)                     @ jump to next instruction
12883
12884    /*
12885     * Resolution required.  This is the least-likely path.
12886     *
12887     *  r3 holds AAAAAAAA
12888     *  r9 holds BBBB
12889     */
12890
12891.LOP_INSTANCE_OF_JUMBO_resolve:
12892    EXPORT_PC()                         @ resolve() could throw
12893    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
12894    mov     r1, r3                      @ r1<- AAAAAAAA
12895    mov     r2, #1                      @ r2<- true
12896    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
12897    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12898    cmp     r0, #0                      @ got null?
12899    beq     common_exceptionThrown      @ yes, handle exception
12900    FETCH(r3, 4)                        @ r3<- vCCCC
12901    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
12902    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
12903    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
12904    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ pick up where we left off
12905
12906/* continuation for OP_NEW_INSTANCE_JUMBO */
12907
12908    .balign 32                          @ minimize cache lines
12909.LOP_NEW_INSTANCE_JUMBO_finish: @ r0=new object
12910    FETCH(r3, 3)                        @ r3<- BBBB
12911    cmp     r0, #0                      @ failed?
12912#if defined(WITH_JIT)
12913    /*
12914     * The JIT needs the class to be fully resolved before it can
12915     * include this instruction in a trace.
12916     */
12917    ldrb    r1, [rSELF, #offThread_subMode]
12918    beq     common_exceptionThrown      @ yes, handle the exception
12919    ands    r1, #kSubModeJitTraceBuild  @ under construction?
12920    bne     .LOP_NEW_INSTANCE_JUMBO_jitCheck
12921#else
12922    beq     common_exceptionThrown      @ yes, handle the exception
12923#endif
12924.LOP_NEW_INSTANCE_JUMBO_end:
12925    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12926    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12927    SET_VREG(r0, r3)                    @ vBBBB<- r0
12928    GOTO_OPCODE(ip)                     @ jump to next instruction
12929
12930#if defined(WITH_JIT)
12931    /*
12932     * Check to see if we need to stop the trace building early.
12933     * r0: new object
12934     * r3: vAA
12935     */
12936.LOP_NEW_INSTANCE_JUMBO_jitCheck:
12937    ldr     r1, [r10]                   @ reload resolved class
12938    cmp     r1, #0                      @ okay?
12939    bne     .LOP_NEW_INSTANCE_JUMBO_end             @ yes, finish
12940    mov     r9, r0                      @ preserve new object
12941    mov     r10, r3                     @ preserve vAA
12942    mov     r0, rSELF
12943    mov     r1, rPC
12944    bl      dvmJitEndTraceSelect        @ (self, pc)
12945    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12946    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12947    SET_VREG(r9, r10)                   @ vAA<- new object
12948    GOTO_OPCODE(ip)                     @ jump to next instruction
12949#endif
12950
12951    /*
12952     * Class initialization required.
12953     *
12954     *  r0 holds class object
12955     */
12956.LOP_NEW_INSTANCE_JUMBO_needinit:
12957    mov     r9, r0                      @ save r0
12958    bl      dvmInitClass                @ initialize class
12959    cmp     r0, #0                      @ check boolean result
12960    mov     r0, r9                      @ restore r0
12961    bne     .LOP_NEW_INSTANCE_JUMBO_initialized     @ success, continue
12962    b       common_exceptionThrown      @ failed, deal with init exception
12963
12964    /*
12965     * Resolution required.  This is the least-likely path.
12966     *
12967     *  r1 holds AAAAAAAA
12968     */
12969.LOP_NEW_INSTANCE_JUMBO_resolve:
12970    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12971    mov     r2, #0                      @ r2<- false
12972    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12973    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12974    cmp     r0, #0                      @ got null?
12975    bne     .LOP_NEW_INSTANCE_JUMBO_resolved        @ no, continue
12976    b       common_exceptionThrown      @ yes, handle exception
12977
12978/* continuation for OP_NEW_ARRAY_JUMBO */
12979
12980
12981    /*
12982     * Resolve class.  (This is an uncommon case.)
12983     *
12984     *  r1 holds array length
12985     *  r2 holds class ref AAAAAAAA
12986     */
12987.LOP_NEW_ARRAY_JUMBO_resolve:
12988    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12989    mov     r9, r1                      @ r9<- length (save)
12990    mov     r1, r2                      @ r1<- AAAAAAAA
12991    mov     r2, #0                      @ r2<- false
12992    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12993    bl      dvmResolveClass             @ r0<- call(clazz, ref)
12994    cmp     r0, #0                      @ got null?
12995    mov     r1, r9                      @ r1<- length (restore)
12996    beq     common_exceptionThrown      @ yes, handle exception
12997    @ fall through to OP_NEW_ARRAY_JUMBO_finish
12998
12999    /*
13000     * Finish allocation.
13001     *
13002     *  r0 holds class
13003     *  r1 holds array length
13004     */
13005.LOP_NEW_ARRAY_JUMBO_finish:
13006    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
13007    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
13008    cmp     r0, #0                      @ failed?
13009    FETCH(r2, 3)                        @ r2<- vBBBB
13010    beq     common_exceptionThrown      @ yes, handle the exception
13011    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13012    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13013    SET_VREG(r0, r2)                    @ vBBBB<- r0
13014    GOTO_OPCODE(ip)                     @ jump to next instruction
13015
13016/* continuation for OP_FILLED_NEW_ARRAY_JUMBO */
13017
13018    /*
13019     * On entry:
13020     *  r0 holds array class
13021     */
13022.LOP_FILLED_NEW_ARRAY_JUMBO_continue:
13023    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
13024    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
13025    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
13026    FETCH(r1, 3)                        @ r1<- BBBB (length)
13027    cmp     rINST, #'I'                 @ array of ints?
13028    cmpne   rINST, #'L'                 @ array of objects?
13029    cmpne   rINST, #'['                 @ array of arrays?
13030    mov     r9, r1                      @ save length in r9
13031    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_notimpl         @ no, not handled yet
13032    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
13033    cmp     r0, #0                      @ null return?
13034    beq     common_exceptionThrown      @ alloc failed, handle exception
13035
13036    FETCH(r1, 4)                        @ r1<- CCCC
13037    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
13038    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
13039    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
13040    subs    r9, r9, #1                  @ length--, check for neg
13041    FETCH_ADVANCE_INST(5)               @ advance to next instr, load rINST
13042    bmi     2f                          @ was zero, bail
13043
13044    @ copy values from registers into the array
13045    @ r0=array, r1=CCCC, r9=BBBB (length)
13046    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
130471:  ldr     r3, [r2], #4                @ r3<- *r2++
13048    subs    r9, r9, #1                  @ count--
13049    str     r3, [r0], #4                @ *contents++ = vX
13050    bpl     1b
13051
130522:  ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
13053    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
13054    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13055    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
13056    cmp     r1, #'I'                         @ Is int array?
13057    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
13058    GOTO_OPCODE(ip)                          @ execute it
13059
13060    /*
13061     * Throw an exception indicating that we have not implemented this
13062     * mode of filled-new-array.
13063     */
13064.LOP_FILLED_NEW_ARRAY_JUMBO_notimpl:
13065    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO
13066    bl      dvmThrowInternalError
13067    b       common_exceptionThrown
13068
13069    /*
13070     * Ideally we'd only define this once, but depending on layout we can
13071     * exceed the range of the load above.
13072     */
13073
13074.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO:
13075    .word   .LstrFilledNewArrayNotImpl
13076
13077/* continuation for OP_IGET_JUMBO */
13078
13079    /*
13080     * Currently:
13081     *  r0 holds resolved field
13082     *  r9 holds object
13083     */
13084.LOP_IGET_JUMBO_resolved:
13085    cmp     r0, #0                      @ resolution unsuccessful?
13086    beq     common_exceptionThrown      @ yes, throw exception
13087    @ fall through to OP_IGET_JUMBO_finish
13088
13089    /*
13090     * Currently:
13091     *  r0 holds resolved field
13092     *  r9 holds object
13093     */
13094.LOP_IGET_JUMBO_finish:
13095    @bl      common_squeak0
13096    cmp     r9, #0                      @ check object for null
13097    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13098    beq     common_errNullObject        @ object was null
13099    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13100    @ no-op                             @ acquiring load
13101    FETCH(r2, 3)                        @ r2<- BBBB
13102    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13103    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13104    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13105    GOTO_OPCODE(ip)                     @ jump to next instruction
13106
13107/* continuation for OP_IGET_WIDE_JUMBO */
13108
13109    /*
13110     * Currently:
13111     *  r0 holds resolved field
13112     *  r9 holds object
13113     */
13114.LOP_IGET_WIDE_JUMBO_resolved:
13115    cmp     r0, #0                      @ resolution unsuccessful?
13116    beq     common_exceptionThrown      @ yes, throw exception
13117    @ fall through to OP_IGET_WIDE_JUMBO_finish
13118
13119    /*
13120     * Currently:
13121     *  r0 holds resolved field
13122     *  r9 holds object
13123     */
13124.LOP_IGET_WIDE_JUMBO_finish:
13125    cmp     r9, #0                      @ check object for null
13126    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13127    beq     common_errNullObject        @ object was null
13128    .if     0
13129    add     r0, r9, r3                  @ r0<- address of field
13130    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
13131    .else
13132    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
13133    .endif
13134    FETCH(r2, 3)                        @ r2<- BBBB
13135    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13136    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13137    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13138    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
13139    GOTO_OPCODE(ip)                     @ jump to next instruction
13140
13141/* continuation for OP_IGET_OBJECT_JUMBO */
13142
13143    /*
13144     * Currently:
13145     *  r0 holds resolved field
13146     *  r9 holds object
13147     */
13148.LOP_IGET_OBJECT_JUMBO_resolved:
13149    cmp     r0, #0                      @ resolution unsuccessful?
13150    beq     common_exceptionThrown      @ yes, throw exception
13151    @ fall through to OP_IGET_OBJECT_JUMBO_finish
13152
13153    /*
13154     * Currently:
13155     *  r0 holds resolved field
13156     *  r9 holds object
13157     */
13158.LOP_IGET_OBJECT_JUMBO_finish:
13159    @bl      common_squeak0
13160    cmp     r9, #0                      @ check object for null
13161    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13162    beq     common_errNullObject        @ object was null
13163    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13164    @ no-op                             @ acquiring load
13165    FETCH(r2, 3)                        @ r2<- BBBB
13166    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13167    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13168    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13169    GOTO_OPCODE(ip)                     @ jump to next instruction
13170
13171/* continuation for OP_IGET_BOOLEAN_JUMBO */
13172
13173    /*
13174     * Currently:
13175     *  r0 holds resolved field
13176     *  r9 holds object
13177     */
13178.LOP_IGET_BOOLEAN_JUMBO_resolved:
13179    cmp     r0, #0                      @ resolution unsuccessful?
13180    beq     common_exceptionThrown      @ yes, throw exception
13181    @ fall through to OP_IGET_BOOLEAN_JUMBO_finish
13182
13183    /*
13184     * Currently:
13185     *  r0 holds resolved field
13186     *  r9 holds object
13187     */
13188.LOP_IGET_BOOLEAN_JUMBO_finish:
13189    @bl      common_squeak1
13190    cmp     r9, #0                      @ check object for null
13191    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13192    beq     common_errNullObject        @ object was null
13193    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13194    @ no-op                             @ acquiring load
13195    FETCH(r2, 3)                        @ r2<- BBBB
13196    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13197    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13198    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13199    GOTO_OPCODE(ip)                     @ jump to next instruction
13200
13201/* continuation for OP_IGET_BYTE_JUMBO */
13202
13203    /*
13204     * Currently:
13205     *  r0 holds resolved field
13206     *  r9 holds object
13207     */
13208.LOP_IGET_BYTE_JUMBO_resolved:
13209    cmp     r0, #0                      @ resolution unsuccessful?
13210    beq     common_exceptionThrown      @ yes, throw exception
13211    @ fall through to OP_IGET_BYTE_JUMBO_finish
13212
13213    /*
13214     * Currently:
13215     *  r0 holds resolved field
13216     *  r9 holds object
13217     */
13218.LOP_IGET_BYTE_JUMBO_finish:
13219    @bl      common_squeak2
13220    cmp     r9, #0                      @ check object for null
13221    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13222    beq     common_errNullObject        @ object was null
13223    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13224    @ no-op                             @ acquiring load
13225    FETCH(r2, 3)                        @ r2<- BBBB
13226    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13227    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13228    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13229    GOTO_OPCODE(ip)                     @ jump to next instruction
13230
13231/* continuation for OP_IGET_CHAR_JUMBO */
13232
13233    /*
13234     * Currently:
13235     *  r0 holds resolved field
13236     *  r9 holds object
13237     */
13238.LOP_IGET_CHAR_JUMBO_resolved:
13239    cmp     r0, #0                      @ resolution unsuccessful?
13240    beq     common_exceptionThrown      @ yes, throw exception
13241    @ fall through to OP_IGET_CHAR_JUMBO_finish
13242
13243    /*
13244     * Currently:
13245     *  r0 holds resolved field
13246     *  r9 holds object
13247     */
13248.LOP_IGET_CHAR_JUMBO_finish:
13249    @bl      common_squeak3
13250    cmp     r9, #0                      @ check object for null
13251    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13252    beq     common_errNullObject        @ object was null
13253    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13254    @ no-op                             @ acquiring load
13255    FETCH(r2, 3)                        @ r2<- BBBB
13256    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13257    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13258    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13259    GOTO_OPCODE(ip)                     @ jump to next instruction
13260
13261/* continuation for OP_IGET_SHORT_JUMBO */
13262
13263    /*
13264     * Currently:
13265     *  r0 holds resolved field
13266     *  r9 holds object
13267     */
13268.LOP_IGET_SHORT_JUMBO_resolved:
13269    cmp     r0, #0                      @ resolution unsuccessful?
13270    beq     common_exceptionThrown      @ yes, throw exception
13271    @ fall through to OP_IGET_SHORT_JUMBO_finish
13272
13273    /*
13274     * Currently:
13275     *  r0 holds resolved field
13276     *  r9 holds object
13277     */
13278.LOP_IGET_SHORT_JUMBO_finish:
13279    @bl      common_squeak4
13280    cmp     r9, #0                      @ check object for null
13281    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13282    beq     common_errNullObject        @ object was null
13283    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13284    @ no-op                             @ acquiring load
13285    FETCH(r2, 3)                        @ r2<- BBBB
13286    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13287    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13288    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13289    GOTO_OPCODE(ip)                     @ jump to next instruction
13290
13291/* continuation for OP_IPUT_JUMBO */
13292
13293    /*
13294     * Currently:
13295     *  r0 holds resolved field
13296     *  r9 holds object
13297     */
13298.LOP_IPUT_JUMBO_resolved:
13299     cmp     r0, #0                     @ resolution unsuccessful?
13300     beq     common_exceptionThrown     @ yes, throw exception
13301     @ fall through to OP_IPUT_JUMBO_finish
13302
13303    /*
13304     * Currently:
13305     *  r0 holds resolved field
13306     *  r9 holds object
13307     */
13308.LOP_IPUT_JUMBO_finish:
13309    @bl      common_squeak0
13310    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13311    FETCH(r1, 3)                        @ r1<- BBBB
13312    cmp     r9, #0                      @ check object for null
13313    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13314    beq     common_errNullObject        @ object was null
13315    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13316    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13317    @ no-op                             @ releasing store
13318    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13319    GOTO_OPCODE(ip)                     @ jump to next instruction
13320
13321/* continuation for OP_IPUT_WIDE_JUMBO */
13322
13323    /*
13324     * Currently:
13325     *  r0 holds resolved field
13326     *  r9 holds object
13327     */
13328.LOP_IPUT_WIDE_JUMBO_resolved:
13329     cmp     r0, #0                     @ resolution unsuccessful?
13330     beq     common_exceptionThrown     @ yes, throw exception
13331     @ fall through to OP_IPUT_WIDE_JUMBO_finish
13332
13333    /*
13334     * Currently:
13335     *  r0 holds resolved field
13336     *  r9 holds object
13337     */
13338.LOP_IPUT_WIDE_JUMBO_finish:
13339    cmp     r9, #0                      @ check object for null
13340    FETCH(r2, 3)                        @ r1<- BBBB
13341    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13342    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13343    beq     common_errNullObject        @ object was null
13344    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13345    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
13346    GET_INST_OPCODE(r10)                @ extract opcode from rINST
13347    .if     0
13348    add     r2, r9, r3                  @ r2<- target address
13349    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
13350    .else
13351    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
13352    .endif
13353    GOTO_OPCODE(r10)                    @ jump to next instruction
13354
13355/* continuation for OP_IPUT_OBJECT_JUMBO */
13356
13357    /*
13358     * Currently:
13359     *  r0 holds resolved field
13360     *  r9 holds object
13361     */
13362.LOP_IPUT_OBJECT_JUMBO_resolved:
13363     cmp     r0, #0                     @ resolution unsuccessful?
13364     beq     common_exceptionThrown     @ yes, throw exception
13365     @ fall through to OP_IPUT_OBJECT_JUMBO_finish
13366
13367    /*
13368     * Currently:
13369     *  r0 holds resolved field
13370     *  r9 holds object
13371     */
13372.LOP_IPUT_OBJECT_JUMBO_finish:
13373    @bl      common_squeak0
13374    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13375    FETCH(r1, 3)                        @ r1<- BBBB
13376    cmp     r9, #0                      @ check object for null
13377    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13378    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13379    beq     common_errNullObject        @ object was null
13380    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13381    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13382    @ no-op                             @ releasing store
13383    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
13384    cmp     r0, #0                      @ stored a null reference?
13385    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
13386    GOTO_OPCODE(ip)                     @ jump to next instruction
13387
13388/* continuation for OP_IPUT_BOOLEAN_JUMBO */
13389
13390    /*
13391     * Currently:
13392     *  r0 holds resolved field
13393     *  r9 holds object
13394     */
13395.LOP_IPUT_BOOLEAN_JUMBO_resolved:
13396     cmp     r0, #0                     @ resolution unsuccessful?
13397     beq     common_exceptionThrown     @ yes, throw exception
13398     @ fall through to OP_IPUT_BOOLEAN_JUMBO_finish
13399
13400    /*
13401     * Currently:
13402     *  r0 holds resolved field
13403     *  r9 holds object
13404     */
13405.LOP_IPUT_BOOLEAN_JUMBO_finish:
13406    @bl      common_squeak1
13407    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13408    FETCH(r1, 3)                        @ r1<- BBBB
13409    cmp     r9, #0                      @ check object for null
13410    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13411    beq     common_errNullObject        @ object was null
13412    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13413    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13414    @ no-op                             @ releasing store
13415    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13416    GOTO_OPCODE(ip)                     @ jump to next instruction
13417
13418/* continuation for OP_IPUT_BYTE_JUMBO */
13419
13420    /*
13421     * Currently:
13422     *  r0 holds resolved field
13423     *  r9 holds object
13424     */
13425.LOP_IPUT_BYTE_JUMBO_resolved:
13426     cmp     r0, #0                     @ resolution unsuccessful?
13427     beq     common_exceptionThrown     @ yes, throw exception
13428     @ fall through to OP_IPUT_BYTE_JUMBO_finish
13429
13430    /*
13431     * Currently:
13432     *  r0 holds resolved field
13433     *  r9 holds object
13434     */
13435.LOP_IPUT_BYTE_JUMBO_finish:
13436    @bl      common_squeak2
13437    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13438    FETCH(r1, 3)                        @ r1<- BBBB
13439    cmp     r9, #0                      @ check object for null
13440    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13441    beq     common_errNullObject        @ object was null
13442    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13443    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13444    @ no-op                             @ releasing store
13445    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13446    GOTO_OPCODE(ip)                     @ jump to next instruction
13447
13448/* continuation for OP_IPUT_CHAR_JUMBO */
13449
13450    /*
13451     * Currently:
13452     *  r0 holds resolved field
13453     *  r9 holds object
13454     */
13455.LOP_IPUT_CHAR_JUMBO_resolved:
13456     cmp     r0, #0                     @ resolution unsuccessful?
13457     beq     common_exceptionThrown     @ yes, throw exception
13458     @ fall through to OP_IPUT_CHAR_JUMBO_finish
13459
13460    /*
13461     * Currently:
13462     *  r0 holds resolved field
13463     *  r9 holds object
13464     */
13465.LOP_IPUT_CHAR_JUMBO_finish:
13466    @bl      common_squeak3
13467    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13468    FETCH(r1, 3)                        @ r1<- BBBB
13469    cmp     r9, #0                      @ check object for null
13470    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13471    beq     common_errNullObject        @ object was null
13472    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13473    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13474    @ no-op                             @ releasing store
13475    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13476    GOTO_OPCODE(ip)                     @ jump to next instruction
13477
13478/* continuation for OP_IPUT_SHORT_JUMBO */
13479
13480    /*
13481     * Currently:
13482     *  r0 holds resolved field
13483     *  r9 holds object
13484     */
13485.LOP_IPUT_SHORT_JUMBO_resolved:
13486     cmp     r0, #0                     @ resolution unsuccessful?
13487     beq     common_exceptionThrown     @ yes, throw exception
13488     @ fall through to OP_IPUT_SHORT_JUMBO_finish
13489
13490    /*
13491     * Currently:
13492     *  r0 holds resolved field
13493     *  r9 holds object
13494     */
13495.LOP_IPUT_SHORT_JUMBO_finish:
13496    @bl      common_squeak4
13497    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13498    FETCH(r1, 3)                        @ r1<- BBBB
13499    cmp     r9, #0                      @ check object for null
13500    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13501    beq     common_errNullObject        @ object was null
13502    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13503    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13504    @ no-op                             @ releasing store
13505    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13506    GOTO_OPCODE(ip)                     @ jump to next instruction
13507
13508/* continuation for OP_SGET_JUMBO */
13509
13510    /*
13511     * Continuation if the field has not yet been resolved.
13512     *  r1:  AAAAAAAA field ref
13513     *  r10: dvmDex->pResFields
13514     */
13515.LOP_SGET_JUMBO_resolve:
13516    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13517#if defined(WITH_JIT)
13518    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13519#endif
13520    EXPORT_PC()                         @ resolve() could throw, so export now
13521    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13522    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13523    cmp     r0, #0                      @ success?
13524    beq     common_exceptionThrown      @ no, handle exception
13525#if defined(WITH_JIT)
13526    /*
13527     * If the JIT is actively building a trace we need to make sure
13528     * that the field is fully resolved before including this instruction.
13529     */
13530    bl      common_verifyField
13531#endif
13532    b       .LOP_SGET_JUMBO_finish          @ resume
13533
13534/* continuation for OP_SGET_WIDE_JUMBO */
13535
13536    /*
13537     * Continuation if the field has not yet been resolved.
13538     *  r1: AAAAAAAA field ref
13539     *
13540     * Returns StaticField pointer in r0.
13541     */
13542.LOP_SGET_WIDE_JUMBO_resolve:
13543    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13544    EXPORT_PC()                         @ resolve() could throw, so export now
13545    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13546    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13547    cmp     r0, #0                      @ success?
13548    bne     .LOP_SGET_WIDE_JUMBO_finish          @ yes, finish
13549    b       common_exceptionThrown      @ no, handle exception
13550
13551/* continuation for OP_SGET_OBJECT_JUMBO */
13552
13553    /*
13554     * Continuation if the field has not yet been resolved.
13555     *  r1:  AAAAAAAA field ref
13556     *  r10: dvmDex->pResFields
13557     */
13558.LOP_SGET_OBJECT_JUMBO_resolve:
13559    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13560#if defined(WITH_JIT)
13561    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13562#endif
13563    EXPORT_PC()                         @ resolve() could throw, so export now
13564    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13565    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13566    cmp     r0, #0                      @ success?
13567    beq     common_exceptionThrown      @ no, handle exception
13568#if defined(WITH_JIT)
13569    /*
13570     * If the JIT is actively building a trace we need to make sure
13571     * that the field is fully resolved before including this instruction.
13572     */
13573    bl      common_verifyField
13574#endif
13575    b       .LOP_SGET_OBJECT_JUMBO_finish          @ resume
13576
13577/* continuation for OP_SGET_BOOLEAN_JUMBO */
13578
13579    /*
13580     * Continuation if the field has not yet been resolved.
13581     *  r1:  AAAAAAAA field ref
13582     *  r10: dvmDex->pResFields
13583     */
13584.LOP_SGET_BOOLEAN_JUMBO_resolve:
13585    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13586#if defined(WITH_JIT)
13587    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13588#endif
13589    EXPORT_PC()                         @ resolve() could throw, so export now
13590    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13591    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13592    cmp     r0, #0                      @ success?
13593    beq     common_exceptionThrown      @ no, handle exception
13594#if defined(WITH_JIT)
13595    /*
13596     * If the JIT is actively building a trace we need to make sure
13597     * that the field is fully resolved before including this instruction.
13598     */
13599    bl      common_verifyField
13600#endif
13601    b       .LOP_SGET_BOOLEAN_JUMBO_finish          @ resume
13602
13603/* continuation for OP_SGET_BYTE_JUMBO */
13604
13605    /*
13606     * Continuation if the field has not yet been resolved.
13607     *  r1:  AAAAAAAA field ref
13608     *  r10: dvmDex->pResFields
13609     */
13610.LOP_SGET_BYTE_JUMBO_resolve:
13611    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13612#if defined(WITH_JIT)
13613    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13614#endif
13615    EXPORT_PC()                         @ resolve() could throw, so export now
13616    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13617    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13618    cmp     r0, #0                      @ success?
13619    beq     common_exceptionThrown      @ no, handle exception
13620#if defined(WITH_JIT)
13621    /*
13622     * If the JIT is actively building a trace we need to make sure
13623     * that the field is fully resolved before including this instruction.
13624     */
13625    bl      common_verifyField
13626#endif
13627    b       .LOP_SGET_BYTE_JUMBO_finish          @ resume
13628
13629/* continuation for OP_SGET_CHAR_JUMBO */
13630
13631    /*
13632     * Continuation if the field has not yet been resolved.
13633     *  r1:  AAAAAAAA field ref
13634     *  r10: dvmDex->pResFields
13635     */
13636.LOP_SGET_CHAR_JUMBO_resolve:
13637    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13638#if defined(WITH_JIT)
13639    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13640#endif
13641    EXPORT_PC()                         @ resolve() could throw, so export now
13642    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13643    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13644    cmp     r0, #0                      @ success?
13645    beq     common_exceptionThrown      @ no, handle exception
13646#if defined(WITH_JIT)
13647    /*
13648     * If the JIT is actively building a trace we need to make sure
13649     * that the field is fully resolved before including this instruction.
13650     */
13651    bl      common_verifyField
13652#endif
13653    b       .LOP_SGET_CHAR_JUMBO_finish          @ resume
13654
13655/* continuation for OP_SGET_SHORT_JUMBO */
13656
13657    /*
13658     * Continuation if the field has not yet been resolved.
13659     *  r1:  AAAAAAAA field ref
13660     *  r10: dvmDex->pResFields
13661     */
13662.LOP_SGET_SHORT_JUMBO_resolve:
13663    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13664#if defined(WITH_JIT)
13665    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13666#endif
13667    EXPORT_PC()                         @ resolve() could throw, so export now
13668    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13669    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13670    cmp     r0, #0                      @ success?
13671    beq     common_exceptionThrown      @ no, handle exception
13672#if defined(WITH_JIT)
13673    /*
13674     * If the JIT is actively building a trace we need to make sure
13675     * that the field is fully resolved before including this instruction.
13676     */
13677    bl      common_verifyField
13678#endif
13679    b       .LOP_SGET_SHORT_JUMBO_finish          @ resume
13680
13681/* continuation for OP_SPUT_JUMBO */
13682
13683    /*
13684     * Continuation if the field has not yet been resolved.
13685     *  r1:  AAAAAAAA field ref
13686     *  r10: dvmDex->pResFields
13687     */
13688.LOP_SPUT_JUMBO_resolve:
13689    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13690#if defined(WITH_JIT)
13691    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13692#endif
13693    EXPORT_PC()                         @ resolve() could throw, so export now
13694    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13695    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13696    cmp     r0, #0                      @ success?
13697    beq     common_exceptionThrown      @ no, handle exception
13698#if defined(WITH_JIT)
13699    /*
13700     * If the JIT is actively building a trace we need to make sure
13701     * that the field is fully resolved before including this instruction.
13702     */
13703    bl      common_verifyField
13704#endif
13705    b       .LOP_SPUT_JUMBO_finish          @ resume
13706
13707/* continuation for OP_SPUT_WIDE_JUMBO */
13708
13709    /*
13710     * Continuation if the field has not yet been resolved.
13711     *  r1:  AAAAAAAA field ref
13712     *  r9:  &fp[BBBB]
13713     *  r10: dvmDex->pResFields
13714     *
13715     * Returns StaticField pointer in r2.
13716     */
13717.LOP_SPUT_WIDE_JUMBO_resolve:
13718    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13719#if defined(WITH_JIT)
13720    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13721#endif
13722    EXPORT_PC()                         @ resolve() could throw, so export now
13723    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13724    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13725    cmp     r0, #0                      @ success?
13726    mov     r2, r0                      @ copy to r2
13727    beq     common_exceptionThrown      @ no, handle exception
13728#if defined(WITH_JIT)
13729    /*
13730     * If the JIT is actively building a trace we need to make sure
13731     * that the field is fully resolved before including this instruction.
13732     */
13733    bl      common_verifyField
13734#endif
13735    b       .LOP_SPUT_WIDE_JUMBO_finish          @ resume
13736
13737/* continuation for OP_SPUT_OBJECT_JUMBO */
13738
13739
13740.LOP_SPUT_OBJECT_JUMBO_end:
13741    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
13742    cmp     r1, #0                      @ stored a null object?
13743    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
13744    GOTO_OPCODE(ip)                     @ jump to next instruction
13745
13746    /* Continuation if the field has not yet been resolved.
13747     * r1:  AAAAaaaa field ref
13748     * r10: dvmDex->pResFields
13749     */
13750.LOP_SPUT_OBJECT_JUMBO_resolve:
13751    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
13752#if defined(WITH_JIT)
13753    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13754#endif
13755    EXPORT_PC()                         @ resolve() could throw, so export now
13756    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13757    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13758    cmp     r0, #0                      @ success?
13759    beq     common_exceptionThrown      @ no, handle exception
13760#if defined(WITH_JIT)
13761    /*
13762     * If the JIT is actively building a trace we need to make sure
13763     * that the field is fully resolved before including this instruction.
13764     */
13765    bl      common_verifyField
13766#endif
13767    b       .LOP_SPUT_OBJECT_JUMBO_finish          @ resume
13768
13769
13770/* continuation for OP_SPUT_BOOLEAN_JUMBO */
13771
13772    /*
13773     * Continuation if the field has not yet been resolved.
13774     *  r1:  AAAAAAAA field ref
13775     *  r10: dvmDex->pResFields
13776     */
13777.LOP_SPUT_BOOLEAN_JUMBO_resolve:
13778    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13779#if defined(WITH_JIT)
13780    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13781#endif
13782    EXPORT_PC()                         @ resolve() could throw, so export now
13783    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13784    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13785    cmp     r0, #0                      @ success?
13786    beq     common_exceptionThrown      @ no, handle exception
13787#if defined(WITH_JIT)
13788    /*
13789     * If the JIT is actively building a trace we need to make sure
13790     * that the field is fully resolved before including this instruction.
13791     */
13792    bl      common_verifyField
13793#endif
13794    b       .LOP_SPUT_BOOLEAN_JUMBO_finish          @ resume
13795
13796/* continuation for OP_SPUT_BYTE_JUMBO */
13797
13798    /*
13799     * Continuation if the field has not yet been resolved.
13800     *  r1:  AAAAAAAA field ref
13801     *  r10: dvmDex->pResFields
13802     */
13803.LOP_SPUT_BYTE_JUMBO_resolve:
13804    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13805#if defined(WITH_JIT)
13806    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13807#endif
13808    EXPORT_PC()                         @ resolve() could throw, so export now
13809    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13810    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13811    cmp     r0, #0                      @ success?
13812    beq     common_exceptionThrown      @ no, handle exception
13813#if defined(WITH_JIT)
13814    /*
13815     * If the JIT is actively building a trace we need to make sure
13816     * that the field is fully resolved before including this instruction.
13817     */
13818    bl      common_verifyField
13819#endif
13820    b       .LOP_SPUT_BYTE_JUMBO_finish          @ resume
13821
13822/* continuation for OP_SPUT_CHAR_JUMBO */
13823
13824    /*
13825     * Continuation if the field has not yet been resolved.
13826     *  r1:  AAAAAAAA field ref
13827     *  r10: dvmDex->pResFields
13828     */
13829.LOP_SPUT_CHAR_JUMBO_resolve:
13830    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13831#if defined(WITH_JIT)
13832    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13833#endif
13834    EXPORT_PC()                         @ resolve() could throw, so export now
13835    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13836    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13837    cmp     r0, #0                      @ success?
13838    beq     common_exceptionThrown      @ no, handle exception
13839#if defined(WITH_JIT)
13840    /*
13841     * If the JIT is actively building a trace we need to make sure
13842     * that the field is fully resolved before including this instruction.
13843     */
13844    bl      common_verifyField
13845#endif
13846    b       .LOP_SPUT_CHAR_JUMBO_finish          @ resume
13847
13848/* continuation for OP_SPUT_SHORT_JUMBO */
13849
13850    /*
13851     * Continuation if the field has not yet been resolved.
13852     *  r1:  AAAAAAAA field ref
13853     *  r10: dvmDex->pResFields
13854     */
13855.LOP_SPUT_SHORT_JUMBO_resolve:
13856    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13857#if defined(WITH_JIT)
13858    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13859#endif
13860    EXPORT_PC()                         @ resolve() could throw, so export now
13861    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13862    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13863    cmp     r0, #0                      @ success?
13864    beq     common_exceptionThrown      @ no, handle exception
13865#if defined(WITH_JIT)
13866    /*
13867     * If the JIT is actively building a trace we need to make sure
13868     * that the field is fully resolved before including this instruction.
13869     */
13870    bl      common_verifyField
13871#endif
13872    b       .LOP_SPUT_SHORT_JUMBO_finish          @ resume
13873
13874/* continuation for OP_INVOKE_VIRTUAL_JUMBO */
13875
13876    /*
13877     * At this point:
13878     *  r0 = resolved base method
13879     */
13880.LOP_INVOKE_VIRTUAL_JUMBO_continue:
13881    FETCH(r10, 4)                       @ r10<- CCCC
13882    GET_VREG(r9, r10)                   @ r9<- "this" ptr
13883    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
13884    cmp     r9, #0                      @ is "this" null?
13885    beq     common_errNullObject        @ null "this", throw exception
13886    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
13887    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
13888    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
13889    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
13890
13891/* continuation for OP_INVOKE_SUPER_JUMBO */
13892
13893    /*
13894     * At this point:
13895     *  r0 = resolved base method
13896     *  r10 = method->clazz
13897     */
13898.LOP_INVOKE_SUPER_JUMBO_continue:
13899    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
13900    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
13901    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
13902    EXPORT_PC()                         @ must export for invoke
13903    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
13904    bcs     .LOP_INVOKE_SUPER_JUMBO_nsm             @ method not present in superclass
13905    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
13906    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
13907    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
13908
13909.LOP_INVOKE_SUPER_JUMBO_resolve:
13910    mov     r0, r10                     @ r0<- method->clazz
13911    mov     r2, #METHOD_VIRTUAL         @ resolver method type
13912    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
13913    cmp     r0, #0                      @ got null?
13914    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ no, continue
13915    b       common_exceptionThrown      @ yes, handle exception
13916
13917    /*
13918     * Throw a NoSuchMethodError with the method name as the message.
13919     *  r0 = resolved base method
13920     */
13921.LOP_INVOKE_SUPER_JUMBO_nsm:
13922    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
13923    b       common_errNoSuchMethod
13924
13925/* continuation for OP_INVOKE_DIRECT_JUMBO */
13926
13927    /*
13928     * On entry:
13929     *  r1 = reference (CCCC)
13930     *  r10 = "this" register
13931     */
13932.LOP_INVOKE_DIRECT_JUMBO_resolve:
13933    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13934    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13935    mov     r2, #METHOD_DIRECT          @ resolver method type
13936    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
13937    cmp     r0, #0                      @ got null?
13938    bne     .LOP_INVOKE_DIRECT_JUMBO_finish          @ no, continue
13939    b       common_exceptionThrown      @ yes, handle exception
13940
13941/* continuation for OP_INVOKE_STATIC_JUMBO */
13942
13943
13944.LOP_INVOKE_STATIC_JUMBO_resolve:
13945    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13946    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13947    mov     r2, #METHOD_STATIC          @ resolver method type
13948    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
13949    cmp     r0, #0                      @ got null?
13950#if defined(WITH_JIT)
13951    /*
13952     * Check to see if we're actively building a trace.  If so,
13953     * we need to keep this instruction out of it.
13954     * r10: &resolved_methodToCall
13955     */
13956    ldrb    r2, [rSELF, #offThread_subMode]
13957    beq     common_exceptionThrown            @ null, handle exception
13958    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
13959    beq     common_invokeMethodJumboNoThis    @ no (r0=method, r9="this")
13960    ldr     r1, [r10]                         @ reload resolved method
13961    cmp     r1, #0                            @ finished resolving?
13962    bne     common_invokeMethodJumboNoThis    @ yes (r0=method, r9="this")
13963    mov     r10, r0                           @ preserve method
13964    mov     r0, rSELF
13965    mov     r1, rPC
13966    bl      dvmJitEndTraceSelect              @ (self, pc)
13967    mov     r0, r10
13968    b       common_invokeMethodJumboNoThis    @ whew, finally!
13969#else
13970    bne     common_invokeMethodJumboNoThis    @ (r0=method, r9="this")
13971    b       common_exceptionThrown            @ yes, handle exception
13972#endif
13973
13974/* continuation for OP_INVOKE_OBJECT_INIT_JUMBO */
13975
13976.LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal:
13977    EXPORT_PC()                         @ can throw
13978    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
13979    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
13980    cmp     r0, #0                      @ exception pending?
13981    bne     common_exceptionThrown      @ yes, handle it
13982    b       .LOP_INVOKE_OBJECT_INIT_JUMBO_finish
13983
13984    /*
13985     * A debugger is attached, so we need to go ahead and do
13986     * this.  For simplicity, we'll just jump directly to the
13987     * corresponding handler.  Note that we can't use
13988     * rIBASE here because it may be in single-step mode.
13989     * Load the primary table base directly.
13990     */
13991.LOP_INVOKE_OBJECT_INIT_JUMBO_debugger:
13992    ldr     r1, [rSELF, #offThread_mainHandlerTable]
13993    .if 1
13994    mov     ip, #OP_INVOKE_DIRECT_JUMBO
13995    .else
13996    mov     ip, #OP_INVOKE_DIRECT_RANGE
13997    .endif
13998    GOTO_OPCODE_BASE(r1,ip)             @ execute it
13999
14000/* continuation for OP_IGET_VOLATILE_JUMBO */
14001
14002    /*
14003     * Currently:
14004     *  r0 holds resolved field
14005     *  r9 holds object
14006     */
14007.LOP_IGET_VOLATILE_JUMBO_resolved:
14008    cmp     r0, #0                      @ resolution unsuccessful?
14009    beq     common_exceptionThrown      @ yes, throw exception
14010    @ fall through to OP_IGET_VOLATILE_JUMBO_finish
14011
14012    /*
14013     * Currently:
14014     *  r0 holds resolved field
14015     *  r9 holds object
14016     */
14017.LOP_IGET_VOLATILE_JUMBO_finish:
14018    @bl      common_squeak0
14019    cmp     r9, #0                      @ check object for null
14020    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14021    beq     common_errNullObject        @ object was null
14022    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14023    SMP_DMB                            @ acquiring load
14024    FETCH(r2, 3)                        @ r2<- BBBB
14025    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14026    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14027    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14028    GOTO_OPCODE(ip)                     @ jump to next instruction
14029
14030/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
14031
14032    /*
14033     * Currently:
14034     *  r0 holds resolved field
14035     *  r9 holds object
14036     */
14037.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
14038    cmp     r0, #0                      @ resolution unsuccessful?
14039    beq     common_exceptionThrown      @ yes, throw exception
14040    @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
14041
14042    /*
14043     * Currently:
14044     *  r0 holds resolved field
14045     *  r9 holds object
14046     */
14047.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
14048    cmp     r9, #0                      @ check object for null
14049    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14050    beq     common_errNullObject        @ object was null
14051    .if     1
14052    add     r0, r9, r3                  @ r0<- address of field
14053    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
14054    .else
14055    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
14056    .endif
14057    FETCH(r2, 3)                        @ r2<- BBBB
14058    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14059    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14060    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14061    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
14062    GOTO_OPCODE(ip)                     @ jump to next instruction
14063
14064/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
14065
14066    /*
14067     * Currently:
14068     *  r0 holds resolved field
14069     *  r9 holds object
14070     */
14071.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
14072    cmp     r0, #0                      @ resolution unsuccessful?
14073    beq     common_exceptionThrown      @ yes, throw exception
14074    @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
14075
14076    /*
14077     * Currently:
14078     *  r0 holds resolved field
14079     *  r9 holds object
14080     */
14081.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
14082    @bl      common_squeak0
14083    cmp     r9, #0                      @ check object for null
14084    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14085    beq     common_errNullObject        @ object was null
14086    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14087    SMP_DMB                            @ acquiring load
14088    FETCH(r2, 3)                        @ r2<- BBBB
14089    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14090    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14091    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14092    GOTO_OPCODE(ip)                     @ jump to next instruction
14093
14094/* continuation for OP_IPUT_VOLATILE_JUMBO */
14095
14096    /*
14097     * Currently:
14098     *  r0 holds resolved field
14099     *  r9 holds object
14100     */
14101.LOP_IPUT_VOLATILE_JUMBO_resolved:
14102     cmp     r0, #0                     @ resolution unsuccessful?
14103     beq     common_exceptionThrown     @ yes, throw exception
14104     @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
14105
14106    /*
14107     * Currently:
14108     *  r0 holds resolved field
14109     *  r9 holds object
14110     */
14111.LOP_IPUT_VOLATILE_JUMBO_finish:
14112    @bl      common_squeak0
14113    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14114    FETCH(r1, 3)                        @ r1<- BBBB
14115    cmp     r9, #0                      @ check object for null
14116    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14117    beq     common_errNullObject        @ object was null
14118    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14119    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14120    SMP_DMB                            @ releasing store
14121    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14122    GOTO_OPCODE(ip)                     @ jump to next instruction
14123
14124/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
14125
14126    /*
14127     * Currently:
14128     *  r0 holds resolved field
14129     *  r9 holds object
14130     */
14131.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
14132     cmp     r0, #0                     @ resolution unsuccessful?
14133     beq     common_exceptionThrown     @ yes, throw exception
14134     @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
14135
14136    /*
14137     * Currently:
14138     *  r0 holds resolved field
14139     *  r9 holds object
14140     */
14141.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
14142    cmp     r9, #0                      @ check object for null
14143    FETCH(r2, 3)                        @ r1<- BBBB
14144    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14145    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14146    beq     common_errNullObject        @ object was null
14147    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14148    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
14149    GET_INST_OPCODE(r10)                @ extract opcode from rINST
14150    .if     1
14151    add     r2, r9, r3                  @ r2<- target address
14152    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
14153    .else
14154    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
14155    .endif
14156    GOTO_OPCODE(r10)                    @ jump to next instruction
14157
14158/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
14159
14160    /*
14161     * Currently:
14162     *  r0 holds resolved field
14163     *  r9 holds object
14164     */
14165.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
14166     cmp     r0, #0                     @ resolution unsuccessful?
14167     beq     common_exceptionThrown     @ yes, throw exception
14168     @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
14169
14170    /*
14171     * Currently:
14172     *  r0 holds resolved field
14173     *  r9 holds object
14174     */
14175.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
14176    @bl      common_squeak0
14177    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14178    FETCH(r1, 3)                        @ r1<- BBBB
14179    cmp     r9, #0                      @ check object for null
14180    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14181    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
14182    beq     common_errNullObject        @ object was null
14183    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14184    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14185    SMP_DMB                            @ releasing store
14186    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
14187    cmp     r0, #0                      @ stored a null reference?
14188    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
14189    GOTO_OPCODE(ip)                     @ jump to next instruction
14190
14191/* continuation for OP_SGET_VOLATILE_JUMBO */
14192
14193    /*
14194     * Continuation if the field has not yet been resolved.
14195     *  r1:  AAAAAAAA field ref
14196     *  r10: dvmDex->pResFields
14197     */
14198.LOP_SGET_VOLATILE_JUMBO_resolve:
14199    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14200#if defined(WITH_JIT)
14201    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14202#endif
14203    EXPORT_PC()                         @ resolve() could throw, so export now
14204    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14205    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14206    cmp     r0, #0                      @ success?
14207    beq     common_exceptionThrown      @ no, handle exception
14208#if defined(WITH_JIT)
14209    /*
14210     * If the JIT is actively building a trace we need to make sure
14211     * that the field is fully resolved before including this instruction.
14212     */
14213    bl      common_verifyField
14214#endif
14215    b       .LOP_SGET_VOLATILE_JUMBO_finish          @ resume
14216
14217/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
14218
14219    /*
14220     * Continuation if the field has not yet been resolved.
14221     *  r1: AAAAAAAA field ref
14222     *
14223     * Returns StaticField pointer in r0.
14224     */
14225.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
14226    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14227    EXPORT_PC()                         @ resolve() could throw, so export now
14228    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14229    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14230    cmp     r0, #0                      @ success?
14231    bne     .LOP_SGET_WIDE_VOLATILE_JUMBO_finish          @ yes, finish
14232    b       common_exceptionThrown      @ no, handle exception
14233
14234/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
14235
14236    /*
14237     * Continuation if the field has not yet been resolved.
14238     *  r1:  AAAAAAAA field ref
14239     *  r10: dvmDex->pResFields
14240     */
14241.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
14242    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14243#if defined(WITH_JIT)
14244    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14245#endif
14246    EXPORT_PC()                         @ resolve() could throw, so export now
14247    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14248    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14249    cmp     r0, #0                      @ success?
14250    beq     common_exceptionThrown      @ no, handle exception
14251#if defined(WITH_JIT)
14252    /*
14253     * If the JIT is actively building a trace we need to make sure
14254     * that the field is fully resolved before including this instruction.
14255     */
14256    bl      common_verifyField
14257#endif
14258    b       .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish          @ resume
14259
14260/* continuation for OP_SPUT_VOLATILE_JUMBO */
14261
14262    /*
14263     * Continuation if the field has not yet been resolved.
14264     *  r1:  AAAAAAAA field ref
14265     *  r10: dvmDex->pResFields
14266     */
14267.LOP_SPUT_VOLATILE_JUMBO_resolve:
14268    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14269#if defined(WITH_JIT)
14270    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14271#endif
14272    EXPORT_PC()                         @ resolve() could throw, so export now
14273    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14274    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14275    cmp     r0, #0                      @ success?
14276    beq     common_exceptionThrown      @ no, handle exception
14277#if defined(WITH_JIT)
14278    /*
14279     * If the JIT is actively building a trace we need to make sure
14280     * that the field is fully resolved before including this instruction.
14281     */
14282    bl      common_verifyField
14283#endif
14284    b       .LOP_SPUT_VOLATILE_JUMBO_finish          @ resume
14285
14286/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
14287
14288    /*
14289     * Continuation if the field has not yet been resolved.
14290     *  r1:  AAAAAAAA field ref
14291     *  r9:  &fp[BBBB]
14292     *  r10: dvmDex->pResFields
14293     *
14294     * Returns StaticField pointer in r2.
14295     */
14296.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
14297    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14298#if defined(WITH_JIT)
14299    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14300#endif
14301    EXPORT_PC()                         @ resolve() could throw, so export now
14302    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14303    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14304    cmp     r0, #0                      @ success?
14305    mov     r2, r0                      @ copy to r2
14306    beq     common_exceptionThrown      @ no, handle exception
14307#if defined(WITH_JIT)
14308    /*
14309     * If the JIT is actively building a trace we need to make sure
14310     * that the field is fully resolved before including this instruction.
14311     */
14312    bl      common_verifyField
14313#endif
14314    b       .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish          @ resume
14315
14316/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
14317
14318
14319.LOP_SPUT_OBJECT_VOLATILE_JUMBO_end:
14320    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
14321    cmp     r1, #0                      @ stored a null object?
14322    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
14323    GOTO_OPCODE(ip)                     @ jump to next instruction
14324
14325    /* Continuation if the field has not yet been resolved.
14326     * r1:  AAAAaaaa field ref
14327     * r10: dvmDex->pResFields
14328     */
14329.LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve:
14330    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
14331#if defined(WITH_JIT)
14332    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14333#endif
14334    EXPORT_PC()                         @ resolve() could throw, so export now
14335    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14336    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14337    cmp     r0, #0                      @ success?
14338    beq     common_exceptionThrown      @ no, handle exception
14339#if defined(WITH_JIT)
14340    /*
14341     * If the JIT is actively building a trace we need to make sure
14342     * that the field is fully resolved before including this instruction.
14343     */
14344    bl      common_verifyField
14345#endif
14346    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish          @ resume
14347
14348
14349    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
14350    .global dvmAsmSisterEnd
14351dvmAsmSisterEnd:
14352
14353
14354    .global dvmAsmAltInstructionStart
14355    .type   dvmAsmAltInstructionStart, %function
14356    .text
14357
14358dvmAsmAltInstructionStart = .L_ALT_OP_NOP
14359/* ------------------------------ */
14360    .balign 64
14361.L_ALT_OP_NOP: /* 0x00 */
14362/* File: armv5te/alt_stub.S */
14363/*
14364 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14365 * any interesting requests and then jump to the real instruction
14366 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14367 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14368 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14369 * bail to the real handler if breakFlags==0.
14370 */
14371    ldrb   r3, [rSELF, #offThread_breakFlags]
14372    adrl   lr, dvmAsmInstructionStart + (0 * 64)
14373    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14374    cmp    r3, #0
14375    bxeq   lr                   @ nothing to do - jump to real handler
14376    EXPORT_PC()
14377    mov    r0, rPC              @ arg0
14378    mov    r1, rFP              @ arg1
14379    mov    r2, rSELF            @ arg2
14380    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14381
14382/* ------------------------------ */
14383    .balign 64
14384.L_ALT_OP_MOVE: /* 0x01 */
14385/* File: armv5te/alt_stub.S */
14386/*
14387 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14388 * any interesting requests and then jump to the real instruction
14389 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14390 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14391 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14392 * bail to the real handler if breakFlags==0.
14393 */
14394    ldrb   r3, [rSELF, #offThread_breakFlags]
14395    adrl   lr, dvmAsmInstructionStart + (1 * 64)
14396    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14397    cmp    r3, #0
14398    bxeq   lr                   @ nothing to do - jump to real handler
14399    EXPORT_PC()
14400    mov    r0, rPC              @ arg0
14401    mov    r1, rFP              @ arg1
14402    mov    r2, rSELF            @ arg2
14403    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14404
14405/* ------------------------------ */
14406    .balign 64
14407.L_ALT_OP_MOVE_FROM16: /* 0x02 */
14408/* File: armv5te/alt_stub.S */
14409/*
14410 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14411 * any interesting requests and then jump to the real instruction
14412 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14413 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14414 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14415 * bail to the real handler if breakFlags==0.
14416 */
14417    ldrb   r3, [rSELF, #offThread_breakFlags]
14418    adrl   lr, dvmAsmInstructionStart + (2 * 64)
14419    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14420    cmp    r3, #0
14421    bxeq   lr                   @ nothing to do - jump to real handler
14422    EXPORT_PC()
14423    mov    r0, rPC              @ arg0
14424    mov    r1, rFP              @ arg1
14425    mov    r2, rSELF            @ arg2
14426    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14427
14428/* ------------------------------ */
14429    .balign 64
14430.L_ALT_OP_MOVE_16: /* 0x03 */
14431/* File: armv5te/alt_stub.S */
14432/*
14433 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14434 * any interesting requests and then jump to the real instruction
14435 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14436 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14437 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14438 * bail to the real handler if breakFlags==0.
14439 */
14440    ldrb   r3, [rSELF, #offThread_breakFlags]
14441    adrl   lr, dvmAsmInstructionStart + (3 * 64)
14442    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14443    cmp    r3, #0
14444    bxeq   lr                   @ nothing to do - jump to real handler
14445    EXPORT_PC()
14446    mov    r0, rPC              @ arg0
14447    mov    r1, rFP              @ arg1
14448    mov    r2, rSELF            @ arg2
14449    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14450
14451/* ------------------------------ */
14452    .balign 64
14453.L_ALT_OP_MOVE_WIDE: /* 0x04 */
14454/* File: armv5te/alt_stub.S */
14455/*
14456 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14457 * any interesting requests and then jump to the real instruction
14458 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14459 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14460 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14461 * bail to the real handler if breakFlags==0.
14462 */
14463    ldrb   r3, [rSELF, #offThread_breakFlags]
14464    adrl   lr, dvmAsmInstructionStart + (4 * 64)
14465    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14466    cmp    r3, #0
14467    bxeq   lr                   @ nothing to do - jump to real handler
14468    EXPORT_PC()
14469    mov    r0, rPC              @ arg0
14470    mov    r1, rFP              @ arg1
14471    mov    r2, rSELF            @ arg2
14472    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14473
14474/* ------------------------------ */
14475    .balign 64
14476.L_ALT_OP_MOVE_WIDE_FROM16: /* 0x05 */
14477/* File: armv5te/alt_stub.S */
14478/*
14479 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14480 * any interesting requests and then jump to the real instruction
14481 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14482 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14483 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14484 * bail to the real handler if breakFlags==0.
14485 */
14486    ldrb   r3, [rSELF, #offThread_breakFlags]
14487    adrl   lr, dvmAsmInstructionStart + (5 * 64)
14488    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14489    cmp    r3, #0
14490    bxeq   lr                   @ nothing to do - jump to real handler
14491    EXPORT_PC()
14492    mov    r0, rPC              @ arg0
14493    mov    r1, rFP              @ arg1
14494    mov    r2, rSELF            @ arg2
14495    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14496
14497/* ------------------------------ */
14498    .balign 64
14499.L_ALT_OP_MOVE_WIDE_16: /* 0x06 */
14500/* File: armv5te/alt_stub.S */
14501/*
14502 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14503 * any interesting requests and then jump to the real instruction
14504 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14505 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14506 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14507 * bail to the real handler if breakFlags==0.
14508 */
14509    ldrb   r3, [rSELF, #offThread_breakFlags]
14510    adrl   lr, dvmAsmInstructionStart + (6 * 64)
14511    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14512    cmp    r3, #0
14513    bxeq   lr                   @ nothing to do - jump to real handler
14514    EXPORT_PC()
14515    mov    r0, rPC              @ arg0
14516    mov    r1, rFP              @ arg1
14517    mov    r2, rSELF            @ arg2
14518    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14519
14520/* ------------------------------ */
14521    .balign 64
14522.L_ALT_OP_MOVE_OBJECT: /* 0x07 */
14523/* File: armv5te/alt_stub.S */
14524/*
14525 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14526 * any interesting requests and then jump to the real instruction
14527 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14528 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14529 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14530 * bail to the real handler if breakFlags==0.
14531 */
14532    ldrb   r3, [rSELF, #offThread_breakFlags]
14533    adrl   lr, dvmAsmInstructionStart + (7 * 64)
14534    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14535    cmp    r3, #0
14536    bxeq   lr                   @ nothing to do - jump to real handler
14537    EXPORT_PC()
14538    mov    r0, rPC              @ arg0
14539    mov    r1, rFP              @ arg1
14540    mov    r2, rSELF            @ arg2
14541    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14542
14543/* ------------------------------ */
14544    .balign 64
14545.L_ALT_OP_MOVE_OBJECT_FROM16: /* 0x08 */
14546/* File: armv5te/alt_stub.S */
14547/*
14548 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14549 * any interesting requests and then jump to the real instruction
14550 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14551 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14552 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14553 * bail to the real handler if breakFlags==0.
14554 */
14555    ldrb   r3, [rSELF, #offThread_breakFlags]
14556    adrl   lr, dvmAsmInstructionStart + (8 * 64)
14557    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14558    cmp    r3, #0
14559    bxeq   lr                   @ nothing to do - jump to real handler
14560    EXPORT_PC()
14561    mov    r0, rPC              @ arg0
14562    mov    r1, rFP              @ arg1
14563    mov    r2, rSELF            @ arg2
14564    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14565
14566/* ------------------------------ */
14567    .balign 64
14568.L_ALT_OP_MOVE_OBJECT_16: /* 0x09 */
14569/* File: armv5te/alt_stub.S */
14570/*
14571 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14572 * any interesting requests and then jump to the real instruction
14573 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14574 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14575 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14576 * bail to the real handler if breakFlags==0.
14577 */
14578    ldrb   r3, [rSELF, #offThread_breakFlags]
14579    adrl   lr, dvmAsmInstructionStart + (9 * 64)
14580    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14581    cmp    r3, #0
14582    bxeq   lr                   @ nothing to do - jump to real handler
14583    EXPORT_PC()
14584    mov    r0, rPC              @ arg0
14585    mov    r1, rFP              @ arg1
14586    mov    r2, rSELF            @ arg2
14587    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14588
14589/* ------------------------------ */
14590    .balign 64
14591.L_ALT_OP_MOVE_RESULT: /* 0x0a */
14592/* File: armv5te/alt_stub.S */
14593/*
14594 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14595 * any interesting requests and then jump to the real instruction
14596 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14597 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14598 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14599 * bail to the real handler if breakFlags==0.
14600 */
14601    ldrb   r3, [rSELF, #offThread_breakFlags]
14602    adrl   lr, dvmAsmInstructionStart + (10 * 64)
14603    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14604    cmp    r3, #0
14605    bxeq   lr                   @ nothing to do - jump to real handler
14606    EXPORT_PC()
14607    mov    r0, rPC              @ arg0
14608    mov    r1, rFP              @ arg1
14609    mov    r2, rSELF            @ arg2
14610    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14611
14612/* ------------------------------ */
14613    .balign 64
14614.L_ALT_OP_MOVE_RESULT_WIDE: /* 0x0b */
14615/* File: armv5te/alt_stub.S */
14616/*
14617 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14618 * any interesting requests and then jump to the real instruction
14619 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14620 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14621 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14622 * bail to the real handler if breakFlags==0.
14623 */
14624    ldrb   r3, [rSELF, #offThread_breakFlags]
14625    adrl   lr, dvmAsmInstructionStart + (11 * 64)
14626    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14627    cmp    r3, #0
14628    bxeq   lr                   @ nothing to do - jump to real handler
14629    EXPORT_PC()
14630    mov    r0, rPC              @ arg0
14631    mov    r1, rFP              @ arg1
14632    mov    r2, rSELF            @ arg2
14633    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14634
14635/* ------------------------------ */
14636    .balign 64
14637.L_ALT_OP_MOVE_RESULT_OBJECT: /* 0x0c */
14638/* File: armv5te/alt_stub.S */
14639/*
14640 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14641 * any interesting requests and then jump to the real instruction
14642 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14643 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14644 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14645 * bail to the real handler if breakFlags==0.
14646 */
14647    ldrb   r3, [rSELF, #offThread_breakFlags]
14648    adrl   lr, dvmAsmInstructionStart + (12 * 64)
14649    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14650    cmp    r3, #0
14651    bxeq   lr                   @ nothing to do - jump to real handler
14652    EXPORT_PC()
14653    mov    r0, rPC              @ arg0
14654    mov    r1, rFP              @ arg1
14655    mov    r2, rSELF            @ arg2
14656    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14657
14658/* ------------------------------ */
14659    .balign 64
14660.L_ALT_OP_MOVE_EXCEPTION: /* 0x0d */
14661/* File: armv5te/alt_stub.S */
14662/*
14663 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14664 * any interesting requests and then jump to the real instruction
14665 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14666 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14667 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14668 * bail to the real handler if breakFlags==0.
14669 */
14670    ldrb   r3, [rSELF, #offThread_breakFlags]
14671    adrl   lr, dvmAsmInstructionStart + (13 * 64)
14672    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14673    cmp    r3, #0
14674    bxeq   lr                   @ nothing to do - jump to real handler
14675    EXPORT_PC()
14676    mov    r0, rPC              @ arg0
14677    mov    r1, rFP              @ arg1
14678    mov    r2, rSELF            @ arg2
14679    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14680
14681/* ------------------------------ */
14682    .balign 64
14683.L_ALT_OP_RETURN_VOID: /* 0x0e */
14684/* File: armv5te/alt_stub.S */
14685/*
14686 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14687 * any interesting requests and then jump to the real instruction
14688 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14689 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14690 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14691 * bail to the real handler if breakFlags==0.
14692 */
14693    ldrb   r3, [rSELF, #offThread_breakFlags]
14694    adrl   lr, dvmAsmInstructionStart + (14 * 64)
14695    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14696    cmp    r3, #0
14697    bxeq   lr                   @ nothing to do - jump to real handler
14698    EXPORT_PC()
14699    mov    r0, rPC              @ arg0
14700    mov    r1, rFP              @ arg1
14701    mov    r2, rSELF            @ arg2
14702    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14703
14704/* ------------------------------ */
14705    .balign 64
14706.L_ALT_OP_RETURN: /* 0x0f */
14707/* File: armv5te/alt_stub.S */
14708/*
14709 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14710 * any interesting requests and then jump to the real instruction
14711 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14712 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14713 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14714 * bail to the real handler if breakFlags==0.
14715 */
14716    ldrb   r3, [rSELF, #offThread_breakFlags]
14717    adrl   lr, dvmAsmInstructionStart + (15 * 64)
14718    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14719    cmp    r3, #0
14720    bxeq   lr                   @ nothing to do - jump to real handler
14721    EXPORT_PC()
14722    mov    r0, rPC              @ arg0
14723    mov    r1, rFP              @ arg1
14724    mov    r2, rSELF            @ arg2
14725    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14726
14727/* ------------------------------ */
14728    .balign 64
14729.L_ALT_OP_RETURN_WIDE: /* 0x10 */
14730/* File: armv5te/alt_stub.S */
14731/*
14732 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14733 * any interesting requests and then jump to the real instruction
14734 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14735 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14736 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14737 * bail to the real handler if breakFlags==0.
14738 */
14739    ldrb   r3, [rSELF, #offThread_breakFlags]
14740    adrl   lr, dvmAsmInstructionStart + (16 * 64)
14741    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14742    cmp    r3, #0
14743    bxeq   lr                   @ nothing to do - jump to real handler
14744    EXPORT_PC()
14745    mov    r0, rPC              @ arg0
14746    mov    r1, rFP              @ arg1
14747    mov    r2, rSELF            @ arg2
14748    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14749
14750/* ------------------------------ */
14751    .balign 64
14752.L_ALT_OP_RETURN_OBJECT: /* 0x11 */
14753/* File: armv5te/alt_stub.S */
14754/*
14755 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14756 * any interesting requests and then jump to the real instruction
14757 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14758 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14759 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14760 * bail to the real handler if breakFlags==0.
14761 */
14762    ldrb   r3, [rSELF, #offThread_breakFlags]
14763    adrl   lr, dvmAsmInstructionStart + (17 * 64)
14764    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14765    cmp    r3, #0
14766    bxeq   lr                   @ nothing to do - jump to real handler
14767    EXPORT_PC()
14768    mov    r0, rPC              @ arg0
14769    mov    r1, rFP              @ arg1
14770    mov    r2, rSELF            @ arg2
14771    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14772
14773/* ------------------------------ */
14774    .balign 64
14775.L_ALT_OP_CONST_4: /* 0x12 */
14776/* File: armv5te/alt_stub.S */
14777/*
14778 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14779 * any interesting requests and then jump to the real instruction
14780 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14781 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14782 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14783 * bail to the real handler if breakFlags==0.
14784 */
14785    ldrb   r3, [rSELF, #offThread_breakFlags]
14786    adrl   lr, dvmAsmInstructionStart + (18 * 64)
14787    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14788    cmp    r3, #0
14789    bxeq   lr                   @ nothing to do - jump to real handler
14790    EXPORT_PC()
14791    mov    r0, rPC              @ arg0
14792    mov    r1, rFP              @ arg1
14793    mov    r2, rSELF            @ arg2
14794    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14795
14796/* ------------------------------ */
14797    .balign 64
14798.L_ALT_OP_CONST_16: /* 0x13 */
14799/* File: armv5te/alt_stub.S */
14800/*
14801 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14802 * any interesting requests and then jump to the real instruction
14803 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14804 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14805 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14806 * bail to the real handler if breakFlags==0.
14807 */
14808    ldrb   r3, [rSELF, #offThread_breakFlags]
14809    adrl   lr, dvmAsmInstructionStart + (19 * 64)
14810    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14811    cmp    r3, #0
14812    bxeq   lr                   @ nothing to do - jump to real handler
14813    EXPORT_PC()
14814    mov    r0, rPC              @ arg0
14815    mov    r1, rFP              @ arg1
14816    mov    r2, rSELF            @ arg2
14817    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14818
14819/* ------------------------------ */
14820    .balign 64
14821.L_ALT_OP_CONST: /* 0x14 */
14822/* File: armv5te/alt_stub.S */
14823/*
14824 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14825 * any interesting requests and then jump to the real instruction
14826 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14827 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14828 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14829 * bail to the real handler if breakFlags==0.
14830 */
14831    ldrb   r3, [rSELF, #offThread_breakFlags]
14832    adrl   lr, dvmAsmInstructionStart + (20 * 64)
14833    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14834    cmp    r3, #0
14835    bxeq   lr                   @ nothing to do - jump to real handler
14836    EXPORT_PC()
14837    mov    r0, rPC              @ arg0
14838    mov    r1, rFP              @ arg1
14839    mov    r2, rSELF            @ arg2
14840    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14841
14842/* ------------------------------ */
14843    .balign 64
14844.L_ALT_OP_CONST_HIGH16: /* 0x15 */
14845/* File: armv5te/alt_stub.S */
14846/*
14847 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14848 * any interesting requests and then jump to the real instruction
14849 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14850 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14851 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14852 * bail to the real handler if breakFlags==0.
14853 */
14854    ldrb   r3, [rSELF, #offThread_breakFlags]
14855    adrl   lr, dvmAsmInstructionStart + (21 * 64)
14856    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14857    cmp    r3, #0
14858    bxeq   lr                   @ nothing to do - jump to real handler
14859    EXPORT_PC()
14860    mov    r0, rPC              @ arg0
14861    mov    r1, rFP              @ arg1
14862    mov    r2, rSELF            @ arg2
14863    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14864
14865/* ------------------------------ */
14866    .balign 64
14867.L_ALT_OP_CONST_WIDE_16: /* 0x16 */
14868/* File: armv5te/alt_stub.S */
14869/*
14870 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14871 * any interesting requests and then jump to the real instruction
14872 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14873 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14874 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14875 * bail to the real handler if breakFlags==0.
14876 */
14877    ldrb   r3, [rSELF, #offThread_breakFlags]
14878    adrl   lr, dvmAsmInstructionStart + (22 * 64)
14879    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14880    cmp    r3, #0
14881    bxeq   lr                   @ nothing to do - jump to real handler
14882    EXPORT_PC()
14883    mov    r0, rPC              @ arg0
14884    mov    r1, rFP              @ arg1
14885    mov    r2, rSELF            @ arg2
14886    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14887
14888/* ------------------------------ */
14889    .balign 64
14890.L_ALT_OP_CONST_WIDE_32: /* 0x17 */
14891/* File: armv5te/alt_stub.S */
14892/*
14893 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14894 * any interesting requests and then jump to the real instruction
14895 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14896 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14897 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14898 * bail to the real handler if breakFlags==0.
14899 */
14900    ldrb   r3, [rSELF, #offThread_breakFlags]
14901    adrl   lr, dvmAsmInstructionStart + (23 * 64)
14902    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14903    cmp    r3, #0
14904    bxeq   lr                   @ nothing to do - jump to real handler
14905    EXPORT_PC()
14906    mov    r0, rPC              @ arg0
14907    mov    r1, rFP              @ arg1
14908    mov    r2, rSELF            @ arg2
14909    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14910
14911/* ------------------------------ */
14912    .balign 64
14913.L_ALT_OP_CONST_WIDE: /* 0x18 */
14914/* File: armv5te/alt_stub.S */
14915/*
14916 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14917 * any interesting requests and then jump to the real instruction
14918 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14919 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14920 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14921 * bail to the real handler if breakFlags==0.
14922 */
14923    ldrb   r3, [rSELF, #offThread_breakFlags]
14924    adrl   lr, dvmAsmInstructionStart + (24 * 64)
14925    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14926    cmp    r3, #0
14927    bxeq   lr                   @ nothing to do - jump to real handler
14928    EXPORT_PC()
14929    mov    r0, rPC              @ arg0
14930    mov    r1, rFP              @ arg1
14931    mov    r2, rSELF            @ arg2
14932    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14933
14934/* ------------------------------ */
14935    .balign 64
14936.L_ALT_OP_CONST_WIDE_HIGH16: /* 0x19 */
14937/* File: armv5te/alt_stub.S */
14938/*
14939 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14940 * any interesting requests and then jump to the real instruction
14941 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14942 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14943 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14944 * bail to the real handler if breakFlags==0.
14945 */
14946    ldrb   r3, [rSELF, #offThread_breakFlags]
14947    adrl   lr, dvmAsmInstructionStart + (25 * 64)
14948    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14949    cmp    r3, #0
14950    bxeq   lr                   @ nothing to do - jump to real handler
14951    EXPORT_PC()
14952    mov    r0, rPC              @ arg0
14953    mov    r1, rFP              @ arg1
14954    mov    r2, rSELF            @ arg2
14955    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14956
14957/* ------------------------------ */
14958    .balign 64
14959.L_ALT_OP_CONST_STRING: /* 0x1a */
14960/* File: armv5te/alt_stub.S */
14961/*
14962 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14963 * any interesting requests and then jump to the real instruction
14964 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14965 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14966 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14967 * bail to the real handler if breakFlags==0.
14968 */
14969    ldrb   r3, [rSELF, #offThread_breakFlags]
14970    adrl   lr, dvmAsmInstructionStart + (26 * 64)
14971    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14972    cmp    r3, #0
14973    bxeq   lr                   @ nothing to do - jump to real handler
14974    EXPORT_PC()
14975    mov    r0, rPC              @ arg0
14976    mov    r1, rFP              @ arg1
14977    mov    r2, rSELF            @ arg2
14978    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14979
14980/* ------------------------------ */
14981    .balign 64
14982.L_ALT_OP_CONST_STRING_JUMBO: /* 0x1b */
14983/* File: armv5te/alt_stub.S */
14984/*
14985 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14986 * any interesting requests and then jump to the real instruction
14987 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14988 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14989 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14990 * bail to the real handler if breakFlags==0.
14991 */
14992    ldrb   r3, [rSELF, #offThread_breakFlags]
14993    adrl   lr, dvmAsmInstructionStart + (27 * 64)
14994    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14995    cmp    r3, #0
14996    bxeq   lr                   @ nothing to do - jump to real handler
14997    EXPORT_PC()
14998    mov    r0, rPC              @ arg0
14999    mov    r1, rFP              @ arg1
15000    mov    r2, rSELF            @ arg2
15001    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15002
15003/* ------------------------------ */
15004    .balign 64
15005.L_ALT_OP_CONST_CLASS: /* 0x1c */
15006/* File: armv5te/alt_stub.S */
15007/*
15008 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15009 * any interesting requests and then jump to the real instruction
15010 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15011 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15012 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15013 * bail to the real handler if breakFlags==0.
15014 */
15015    ldrb   r3, [rSELF, #offThread_breakFlags]
15016    adrl   lr, dvmAsmInstructionStart + (28 * 64)
15017    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15018    cmp    r3, #0
15019    bxeq   lr                   @ nothing to do - jump to real handler
15020    EXPORT_PC()
15021    mov    r0, rPC              @ arg0
15022    mov    r1, rFP              @ arg1
15023    mov    r2, rSELF            @ arg2
15024    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15025
15026/* ------------------------------ */
15027    .balign 64
15028.L_ALT_OP_MONITOR_ENTER: /* 0x1d */
15029/* File: armv5te/alt_stub.S */
15030/*
15031 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15032 * any interesting requests and then jump to the real instruction
15033 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15034 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15035 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15036 * bail to the real handler if breakFlags==0.
15037 */
15038    ldrb   r3, [rSELF, #offThread_breakFlags]
15039    adrl   lr, dvmAsmInstructionStart + (29 * 64)
15040    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15041    cmp    r3, #0
15042    bxeq   lr                   @ nothing to do - jump to real handler
15043    EXPORT_PC()
15044    mov    r0, rPC              @ arg0
15045    mov    r1, rFP              @ arg1
15046    mov    r2, rSELF            @ arg2
15047    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15048
15049/* ------------------------------ */
15050    .balign 64
15051.L_ALT_OP_MONITOR_EXIT: /* 0x1e */
15052/* File: armv5te/alt_stub.S */
15053/*
15054 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15055 * any interesting requests and then jump to the real instruction
15056 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15057 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15058 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15059 * bail to the real handler if breakFlags==0.
15060 */
15061    ldrb   r3, [rSELF, #offThread_breakFlags]
15062    adrl   lr, dvmAsmInstructionStart + (30 * 64)
15063    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15064    cmp    r3, #0
15065    bxeq   lr                   @ nothing to do - jump to real handler
15066    EXPORT_PC()
15067    mov    r0, rPC              @ arg0
15068    mov    r1, rFP              @ arg1
15069    mov    r2, rSELF            @ arg2
15070    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15071
15072/* ------------------------------ */
15073    .balign 64
15074.L_ALT_OP_CHECK_CAST: /* 0x1f */
15075/* File: armv5te/alt_stub.S */
15076/*
15077 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15078 * any interesting requests and then jump to the real instruction
15079 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15080 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15081 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15082 * bail to the real handler if breakFlags==0.
15083 */
15084    ldrb   r3, [rSELF, #offThread_breakFlags]
15085    adrl   lr, dvmAsmInstructionStart + (31 * 64)
15086    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15087    cmp    r3, #0
15088    bxeq   lr                   @ nothing to do - jump to real handler
15089    EXPORT_PC()
15090    mov    r0, rPC              @ arg0
15091    mov    r1, rFP              @ arg1
15092    mov    r2, rSELF            @ arg2
15093    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15094
15095/* ------------------------------ */
15096    .balign 64
15097.L_ALT_OP_INSTANCE_OF: /* 0x20 */
15098/* File: armv5te/alt_stub.S */
15099/*
15100 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15101 * any interesting requests and then jump to the real instruction
15102 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15103 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15104 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15105 * bail to the real handler if breakFlags==0.
15106 */
15107    ldrb   r3, [rSELF, #offThread_breakFlags]
15108    adrl   lr, dvmAsmInstructionStart + (32 * 64)
15109    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15110    cmp    r3, #0
15111    bxeq   lr                   @ nothing to do - jump to real handler
15112    EXPORT_PC()
15113    mov    r0, rPC              @ arg0
15114    mov    r1, rFP              @ arg1
15115    mov    r2, rSELF            @ arg2
15116    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15117
15118/* ------------------------------ */
15119    .balign 64
15120.L_ALT_OP_ARRAY_LENGTH: /* 0x21 */
15121/* File: armv5te/alt_stub.S */
15122/*
15123 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15124 * any interesting requests and then jump to the real instruction
15125 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15126 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15127 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15128 * bail to the real handler if breakFlags==0.
15129 */
15130    ldrb   r3, [rSELF, #offThread_breakFlags]
15131    adrl   lr, dvmAsmInstructionStart + (33 * 64)
15132    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15133    cmp    r3, #0
15134    bxeq   lr                   @ nothing to do - jump to real handler
15135    EXPORT_PC()
15136    mov    r0, rPC              @ arg0
15137    mov    r1, rFP              @ arg1
15138    mov    r2, rSELF            @ arg2
15139    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15140
15141/* ------------------------------ */
15142    .balign 64
15143.L_ALT_OP_NEW_INSTANCE: /* 0x22 */
15144/* File: armv5te/alt_stub.S */
15145/*
15146 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15147 * any interesting requests and then jump to the real instruction
15148 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15149 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15150 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15151 * bail to the real handler if breakFlags==0.
15152 */
15153    ldrb   r3, [rSELF, #offThread_breakFlags]
15154    adrl   lr, dvmAsmInstructionStart + (34 * 64)
15155    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15156    cmp    r3, #0
15157    bxeq   lr                   @ nothing to do - jump to real handler
15158    EXPORT_PC()
15159    mov    r0, rPC              @ arg0
15160    mov    r1, rFP              @ arg1
15161    mov    r2, rSELF            @ arg2
15162    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15163
15164/* ------------------------------ */
15165    .balign 64
15166.L_ALT_OP_NEW_ARRAY: /* 0x23 */
15167/* File: armv5te/alt_stub.S */
15168/*
15169 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15170 * any interesting requests and then jump to the real instruction
15171 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15172 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15173 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15174 * bail to the real handler if breakFlags==0.
15175 */
15176    ldrb   r3, [rSELF, #offThread_breakFlags]
15177    adrl   lr, dvmAsmInstructionStart + (35 * 64)
15178    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15179    cmp    r3, #0
15180    bxeq   lr                   @ nothing to do - jump to real handler
15181    EXPORT_PC()
15182    mov    r0, rPC              @ arg0
15183    mov    r1, rFP              @ arg1
15184    mov    r2, rSELF            @ arg2
15185    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15186
15187/* ------------------------------ */
15188    .balign 64
15189.L_ALT_OP_FILLED_NEW_ARRAY: /* 0x24 */
15190/* File: armv5te/alt_stub.S */
15191/*
15192 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15193 * any interesting requests and then jump to the real instruction
15194 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15195 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15196 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15197 * bail to the real handler if breakFlags==0.
15198 */
15199    ldrb   r3, [rSELF, #offThread_breakFlags]
15200    adrl   lr, dvmAsmInstructionStart + (36 * 64)
15201    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15202    cmp    r3, #0
15203    bxeq   lr                   @ nothing to do - jump to real handler
15204    EXPORT_PC()
15205    mov    r0, rPC              @ arg0
15206    mov    r1, rFP              @ arg1
15207    mov    r2, rSELF            @ arg2
15208    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15209
15210/* ------------------------------ */
15211    .balign 64
15212.L_ALT_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
15213/* File: armv5te/alt_stub.S */
15214/*
15215 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15216 * any interesting requests and then jump to the real instruction
15217 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15218 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15219 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15220 * bail to the real handler if breakFlags==0.
15221 */
15222    ldrb   r3, [rSELF, #offThread_breakFlags]
15223    adrl   lr, dvmAsmInstructionStart + (37 * 64)
15224    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15225    cmp    r3, #0
15226    bxeq   lr                   @ nothing to do - jump to real handler
15227    EXPORT_PC()
15228    mov    r0, rPC              @ arg0
15229    mov    r1, rFP              @ arg1
15230    mov    r2, rSELF            @ arg2
15231    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15232
15233/* ------------------------------ */
15234    .balign 64
15235.L_ALT_OP_FILL_ARRAY_DATA: /* 0x26 */
15236/* File: armv5te/alt_stub.S */
15237/*
15238 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15239 * any interesting requests and then jump to the real instruction
15240 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15241 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15242 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15243 * bail to the real handler if breakFlags==0.
15244 */
15245    ldrb   r3, [rSELF, #offThread_breakFlags]
15246    adrl   lr, dvmAsmInstructionStart + (38 * 64)
15247    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15248    cmp    r3, #0
15249    bxeq   lr                   @ nothing to do - jump to real handler
15250    EXPORT_PC()
15251    mov    r0, rPC              @ arg0
15252    mov    r1, rFP              @ arg1
15253    mov    r2, rSELF            @ arg2
15254    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15255
15256/* ------------------------------ */
15257    .balign 64
15258.L_ALT_OP_THROW: /* 0x27 */
15259/* File: armv5te/alt_stub.S */
15260/*
15261 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15262 * any interesting requests and then jump to the real instruction
15263 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15264 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15265 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15266 * bail to the real handler if breakFlags==0.
15267 */
15268    ldrb   r3, [rSELF, #offThread_breakFlags]
15269    adrl   lr, dvmAsmInstructionStart + (39 * 64)
15270    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15271    cmp    r3, #0
15272    bxeq   lr                   @ nothing to do - jump to real handler
15273    EXPORT_PC()
15274    mov    r0, rPC              @ arg0
15275    mov    r1, rFP              @ arg1
15276    mov    r2, rSELF            @ arg2
15277    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15278
15279/* ------------------------------ */
15280    .balign 64
15281.L_ALT_OP_GOTO: /* 0x28 */
15282/* File: armv5te/alt_stub.S */
15283/*
15284 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15285 * any interesting requests and then jump to the real instruction
15286 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15287 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15288 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15289 * bail to the real handler if breakFlags==0.
15290 */
15291    ldrb   r3, [rSELF, #offThread_breakFlags]
15292    adrl   lr, dvmAsmInstructionStart + (40 * 64)
15293    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15294    cmp    r3, #0
15295    bxeq   lr                   @ nothing to do - jump to real handler
15296    EXPORT_PC()
15297    mov    r0, rPC              @ arg0
15298    mov    r1, rFP              @ arg1
15299    mov    r2, rSELF            @ arg2
15300    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15301
15302/* ------------------------------ */
15303    .balign 64
15304.L_ALT_OP_GOTO_16: /* 0x29 */
15305/* File: armv5te/alt_stub.S */
15306/*
15307 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15308 * any interesting requests and then jump to the real instruction
15309 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15310 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15311 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15312 * bail to the real handler if breakFlags==0.
15313 */
15314    ldrb   r3, [rSELF, #offThread_breakFlags]
15315    adrl   lr, dvmAsmInstructionStart + (41 * 64)
15316    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15317    cmp    r3, #0
15318    bxeq   lr                   @ nothing to do - jump to real handler
15319    EXPORT_PC()
15320    mov    r0, rPC              @ arg0
15321    mov    r1, rFP              @ arg1
15322    mov    r2, rSELF            @ arg2
15323    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15324
15325/* ------------------------------ */
15326    .balign 64
15327.L_ALT_OP_GOTO_32: /* 0x2a */
15328/* File: armv5te/alt_stub.S */
15329/*
15330 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15331 * any interesting requests and then jump to the real instruction
15332 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15333 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15334 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15335 * bail to the real handler if breakFlags==0.
15336 */
15337    ldrb   r3, [rSELF, #offThread_breakFlags]
15338    adrl   lr, dvmAsmInstructionStart + (42 * 64)
15339    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15340    cmp    r3, #0
15341    bxeq   lr                   @ nothing to do - jump to real handler
15342    EXPORT_PC()
15343    mov    r0, rPC              @ arg0
15344    mov    r1, rFP              @ arg1
15345    mov    r2, rSELF            @ arg2
15346    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15347
15348/* ------------------------------ */
15349    .balign 64
15350.L_ALT_OP_PACKED_SWITCH: /* 0x2b */
15351/* File: armv5te/alt_stub.S */
15352/*
15353 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15354 * any interesting requests and then jump to the real instruction
15355 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15356 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15357 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15358 * bail to the real handler if breakFlags==0.
15359 */
15360    ldrb   r3, [rSELF, #offThread_breakFlags]
15361    adrl   lr, dvmAsmInstructionStart + (43 * 64)
15362    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15363    cmp    r3, #0
15364    bxeq   lr                   @ nothing to do - jump to real handler
15365    EXPORT_PC()
15366    mov    r0, rPC              @ arg0
15367    mov    r1, rFP              @ arg1
15368    mov    r2, rSELF            @ arg2
15369    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15370
15371/* ------------------------------ */
15372    .balign 64
15373.L_ALT_OP_SPARSE_SWITCH: /* 0x2c */
15374/* File: armv5te/alt_stub.S */
15375/*
15376 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15377 * any interesting requests and then jump to the real instruction
15378 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15379 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15380 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15381 * bail to the real handler if breakFlags==0.
15382 */
15383    ldrb   r3, [rSELF, #offThread_breakFlags]
15384    adrl   lr, dvmAsmInstructionStart + (44 * 64)
15385    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15386    cmp    r3, #0
15387    bxeq   lr                   @ nothing to do - jump to real handler
15388    EXPORT_PC()
15389    mov    r0, rPC              @ arg0
15390    mov    r1, rFP              @ arg1
15391    mov    r2, rSELF            @ arg2
15392    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15393
15394/* ------------------------------ */
15395    .balign 64
15396.L_ALT_OP_CMPL_FLOAT: /* 0x2d */
15397/* File: armv5te/alt_stub.S */
15398/*
15399 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15400 * any interesting requests and then jump to the real instruction
15401 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15402 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15403 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15404 * bail to the real handler if breakFlags==0.
15405 */
15406    ldrb   r3, [rSELF, #offThread_breakFlags]
15407    adrl   lr, dvmAsmInstructionStart + (45 * 64)
15408    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15409    cmp    r3, #0
15410    bxeq   lr                   @ nothing to do - jump to real handler
15411    EXPORT_PC()
15412    mov    r0, rPC              @ arg0
15413    mov    r1, rFP              @ arg1
15414    mov    r2, rSELF            @ arg2
15415    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15416
15417/* ------------------------------ */
15418    .balign 64
15419.L_ALT_OP_CMPG_FLOAT: /* 0x2e */
15420/* File: armv5te/alt_stub.S */
15421/*
15422 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15423 * any interesting requests and then jump to the real instruction
15424 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15425 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15426 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15427 * bail to the real handler if breakFlags==0.
15428 */
15429    ldrb   r3, [rSELF, #offThread_breakFlags]
15430    adrl   lr, dvmAsmInstructionStart + (46 * 64)
15431    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15432    cmp    r3, #0
15433    bxeq   lr                   @ nothing to do - jump to real handler
15434    EXPORT_PC()
15435    mov    r0, rPC              @ arg0
15436    mov    r1, rFP              @ arg1
15437    mov    r2, rSELF            @ arg2
15438    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15439
15440/* ------------------------------ */
15441    .balign 64
15442.L_ALT_OP_CMPL_DOUBLE: /* 0x2f */
15443/* File: armv5te/alt_stub.S */
15444/*
15445 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15446 * any interesting requests and then jump to the real instruction
15447 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15448 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15449 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15450 * bail to the real handler if breakFlags==0.
15451 */
15452    ldrb   r3, [rSELF, #offThread_breakFlags]
15453    adrl   lr, dvmAsmInstructionStart + (47 * 64)
15454    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15455    cmp    r3, #0
15456    bxeq   lr                   @ nothing to do - jump to real handler
15457    EXPORT_PC()
15458    mov    r0, rPC              @ arg0
15459    mov    r1, rFP              @ arg1
15460    mov    r2, rSELF            @ arg2
15461    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15462
15463/* ------------------------------ */
15464    .balign 64
15465.L_ALT_OP_CMPG_DOUBLE: /* 0x30 */
15466/* File: armv5te/alt_stub.S */
15467/*
15468 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15469 * any interesting requests and then jump to the real instruction
15470 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15471 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15472 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15473 * bail to the real handler if breakFlags==0.
15474 */
15475    ldrb   r3, [rSELF, #offThread_breakFlags]
15476    adrl   lr, dvmAsmInstructionStart + (48 * 64)
15477    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15478    cmp    r3, #0
15479    bxeq   lr                   @ nothing to do - jump to real handler
15480    EXPORT_PC()
15481    mov    r0, rPC              @ arg0
15482    mov    r1, rFP              @ arg1
15483    mov    r2, rSELF            @ arg2
15484    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15485
15486/* ------------------------------ */
15487    .balign 64
15488.L_ALT_OP_CMP_LONG: /* 0x31 */
15489/* File: armv5te/alt_stub.S */
15490/*
15491 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15492 * any interesting requests and then jump to the real instruction
15493 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15494 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15495 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15496 * bail to the real handler if breakFlags==0.
15497 */
15498    ldrb   r3, [rSELF, #offThread_breakFlags]
15499    adrl   lr, dvmAsmInstructionStart + (49 * 64)
15500    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15501    cmp    r3, #0
15502    bxeq   lr                   @ nothing to do - jump to real handler
15503    EXPORT_PC()
15504    mov    r0, rPC              @ arg0
15505    mov    r1, rFP              @ arg1
15506    mov    r2, rSELF            @ arg2
15507    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15508
15509/* ------------------------------ */
15510    .balign 64
15511.L_ALT_OP_IF_EQ: /* 0x32 */
15512/* File: armv5te/alt_stub.S */
15513/*
15514 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15515 * any interesting requests and then jump to the real instruction
15516 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15517 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15518 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15519 * bail to the real handler if breakFlags==0.
15520 */
15521    ldrb   r3, [rSELF, #offThread_breakFlags]
15522    adrl   lr, dvmAsmInstructionStart + (50 * 64)
15523    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15524    cmp    r3, #0
15525    bxeq   lr                   @ nothing to do - jump to real handler
15526    EXPORT_PC()
15527    mov    r0, rPC              @ arg0
15528    mov    r1, rFP              @ arg1
15529    mov    r2, rSELF            @ arg2
15530    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15531
15532/* ------------------------------ */
15533    .balign 64
15534.L_ALT_OP_IF_NE: /* 0x33 */
15535/* File: armv5te/alt_stub.S */
15536/*
15537 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15538 * any interesting requests and then jump to the real instruction
15539 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15540 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15541 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15542 * bail to the real handler if breakFlags==0.
15543 */
15544    ldrb   r3, [rSELF, #offThread_breakFlags]
15545    adrl   lr, dvmAsmInstructionStart + (51 * 64)
15546    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15547    cmp    r3, #0
15548    bxeq   lr                   @ nothing to do - jump to real handler
15549    EXPORT_PC()
15550    mov    r0, rPC              @ arg0
15551    mov    r1, rFP              @ arg1
15552    mov    r2, rSELF            @ arg2
15553    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15554
15555/* ------------------------------ */
15556    .balign 64
15557.L_ALT_OP_IF_LT: /* 0x34 */
15558/* File: armv5te/alt_stub.S */
15559/*
15560 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15561 * any interesting requests and then jump to the real instruction
15562 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15563 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15564 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15565 * bail to the real handler if breakFlags==0.
15566 */
15567    ldrb   r3, [rSELF, #offThread_breakFlags]
15568    adrl   lr, dvmAsmInstructionStart + (52 * 64)
15569    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15570    cmp    r3, #0
15571    bxeq   lr                   @ nothing to do - jump to real handler
15572    EXPORT_PC()
15573    mov    r0, rPC              @ arg0
15574    mov    r1, rFP              @ arg1
15575    mov    r2, rSELF            @ arg2
15576    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15577
15578/* ------------------------------ */
15579    .balign 64
15580.L_ALT_OP_IF_GE: /* 0x35 */
15581/* File: armv5te/alt_stub.S */
15582/*
15583 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15584 * any interesting requests and then jump to the real instruction
15585 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15586 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15587 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15588 * bail to the real handler if breakFlags==0.
15589 */
15590    ldrb   r3, [rSELF, #offThread_breakFlags]
15591    adrl   lr, dvmAsmInstructionStart + (53 * 64)
15592    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15593    cmp    r3, #0
15594    bxeq   lr                   @ nothing to do - jump to real handler
15595    EXPORT_PC()
15596    mov    r0, rPC              @ arg0
15597    mov    r1, rFP              @ arg1
15598    mov    r2, rSELF            @ arg2
15599    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15600
15601/* ------------------------------ */
15602    .balign 64
15603.L_ALT_OP_IF_GT: /* 0x36 */
15604/* File: armv5te/alt_stub.S */
15605/*
15606 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15607 * any interesting requests and then jump to the real instruction
15608 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15609 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15610 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15611 * bail to the real handler if breakFlags==0.
15612 */
15613    ldrb   r3, [rSELF, #offThread_breakFlags]
15614    adrl   lr, dvmAsmInstructionStart + (54 * 64)
15615    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15616    cmp    r3, #0
15617    bxeq   lr                   @ nothing to do - jump to real handler
15618    EXPORT_PC()
15619    mov    r0, rPC              @ arg0
15620    mov    r1, rFP              @ arg1
15621    mov    r2, rSELF            @ arg2
15622    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15623
15624/* ------------------------------ */
15625    .balign 64
15626.L_ALT_OP_IF_LE: /* 0x37 */
15627/* File: armv5te/alt_stub.S */
15628/*
15629 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15630 * any interesting requests and then jump to the real instruction
15631 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15632 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15633 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15634 * bail to the real handler if breakFlags==0.
15635 */
15636    ldrb   r3, [rSELF, #offThread_breakFlags]
15637    adrl   lr, dvmAsmInstructionStart + (55 * 64)
15638    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15639    cmp    r3, #0
15640    bxeq   lr                   @ nothing to do - jump to real handler
15641    EXPORT_PC()
15642    mov    r0, rPC              @ arg0
15643    mov    r1, rFP              @ arg1
15644    mov    r2, rSELF            @ arg2
15645    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15646
15647/* ------------------------------ */
15648    .balign 64
15649.L_ALT_OP_IF_EQZ: /* 0x38 */
15650/* File: armv5te/alt_stub.S */
15651/*
15652 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15653 * any interesting requests and then jump to the real instruction
15654 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15655 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15656 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15657 * bail to the real handler if breakFlags==0.
15658 */
15659    ldrb   r3, [rSELF, #offThread_breakFlags]
15660    adrl   lr, dvmAsmInstructionStart + (56 * 64)
15661    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15662    cmp    r3, #0
15663    bxeq   lr                   @ nothing to do - jump to real handler
15664    EXPORT_PC()
15665    mov    r0, rPC              @ arg0
15666    mov    r1, rFP              @ arg1
15667    mov    r2, rSELF            @ arg2
15668    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15669
15670/* ------------------------------ */
15671    .balign 64
15672.L_ALT_OP_IF_NEZ: /* 0x39 */
15673/* File: armv5te/alt_stub.S */
15674/*
15675 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15676 * any interesting requests and then jump to the real instruction
15677 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15678 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15679 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15680 * bail to the real handler if breakFlags==0.
15681 */
15682    ldrb   r3, [rSELF, #offThread_breakFlags]
15683    adrl   lr, dvmAsmInstructionStart + (57 * 64)
15684    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15685    cmp    r3, #0
15686    bxeq   lr                   @ nothing to do - jump to real handler
15687    EXPORT_PC()
15688    mov    r0, rPC              @ arg0
15689    mov    r1, rFP              @ arg1
15690    mov    r2, rSELF            @ arg2
15691    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15692
15693/* ------------------------------ */
15694    .balign 64
15695.L_ALT_OP_IF_LTZ: /* 0x3a */
15696/* File: armv5te/alt_stub.S */
15697/*
15698 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15699 * any interesting requests and then jump to the real instruction
15700 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15701 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15702 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15703 * bail to the real handler if breakFlags==0.
15704 */
15705    ldrb   r3, [rSELF, #offThread_breakFlags]
15706    adrl   lr, dvmAsmInstructionStart + (58 * 64)
15707    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15708    cmp    r3, #0
15709    bxeq   lr                   @ nothing to do - jump to real handler
15710    EXPORT_PC()
15711    mov    r0, rPC              @ arg0
15712    mov    r1, rFP              @ arg1
15713    mov    r2, rSELF            @ arg2
15714    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15715
15716/* ------------------------------ */
15717    .balign 64
15718.L_ALT_OP_IF_GEZ: /* 0x3b */
15719/* File: armv5te/alt_stub.S */
15720/*
15721 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15722 * any interesting requests and then jump to the real instruction
15723 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15724 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15725 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15726 * bail to the real handler if breakFlags==0.
15727 */
15728    ldrb   r3, [rSELF, #offThread_breakFlags]
15729    adrl   lr, dvmAsmInstructionStart + (59 * 64)
15730    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15731    cmp    r3, #0
15732    bxeq   lr                   @ nothing to do - jump to real handler
15733    EXPORT_PC()
15734    mov    r0, rPC              @ arg0
15735    mov    r1, rFP              @ arg1
15736    mov    r2, rSELF            @ arg2
15737    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15738
15739/* ------------------------------ */
15740    .balign 64
15741.L_ALT_OP_IF_GTZ: /* 0x3c */
15742/* File: armv5te/alt_stub.S */
15743/*
15744 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15745 * any interesting requests and then jump to the real instruction
15746 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15747 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15748 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15749 * bail to the real handler if breakFlags==0.
15750 */
15751    ldrb   r3, [rSELF, #offThread_breakFlags]
15752    adrl   lr, dvmAsmInstructionStart + (60 * 64)
15753    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15754    cmp    r3, #0
15755    bxeq   lr                   @ nothing to do - jump to real handler
15756    EXPORT_PC()
15757    mov    r0, rPC              @ arg0
15758    mov    r1, rFP              @ arg1
15759    mov    r2, rSELF            @ arg2
15760    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15761
15762/* ------------------------------ */
15763    .balign 64
15764.L_ALT_OP_IF_LEZ: /* 0x3d */
15765/* File: armv5te/alt_stub.S */
15766/*
15767 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15768 * any interesting requests and then jump to the real instruction
15769 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15770 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15771 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15772 * bail to the real handler if breakFlags==0.
15773 */
15774    ldrb   r3, [rSELF, #offThread_breakFlags]
15775    adrl   lr, dvmAsmInstructionStart + (61 * 64)
15776    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15777    cmp    r3, #0
15778    bxeq   lr                   @ nothing to do - jump to real handler
15779    EXPORT_PC()
15780    mov    r0, rPC              @ arg0
15781    mov    r1, rFP              @ arg1
15782    mov    r2, rSELF            @ arg2
15783    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15784
15785/* ------------------------------ */
15786    .balign 64
15787.L_ALT_OP_UNUSED_3E: /* 0x3e */
15788/* File: armv5te/alt_stub.S */
15789/*
15790 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15791 * any interesting requests and then jump to the real instruction
15792 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15793 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15794 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15795 * bail to the real handler if breakFlags==0.
15796 */
15797    ldrb   r3, [rSELF, #offThread_breakFlags]
15798    adrl   lr, dvmAsmInstructionStart + (62 * 64)
15799    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15800    cmp    r3, #0
15801    bxeq   lr                   @ nothing to do - jump to real handler
15802    EXPORT_PC()
15803    mov    r0, rPC              @ arg0
15804    mov    r1, rFP              @ arg1
15805    mov    r2, rSELF            @ arg2
15806    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15807
15808/* ------------------------------ */
15809    .balign 64
15810.L_ALT_OP_UNUSED_3F: /* 0x3f */
15811/* File: armv5te/alt_stub.S */
15812/*
15813 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15814 * any interesting requests and then jump to the real instruction
15815 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15816 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15817 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15818 * bail to the real handler if breakFlags==0.
15819 */
15820    ldrb   r3, [rSELF, #offThread_breakFlags]
15821    adrl   lr, dvmAsmInstructionStart + (63 * 64)
15822    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15823    cmp    r3, #0
15824    bxeq   lr                   @ nothing to do - jump to real handler
15825    EXPORT_PC()
15826    mov    r0, rPC              @ arg0
15827    mov    r1, rFP              @ arg1
15828    mov    r2, rSELF            @ arg2
15829    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15830
15831/* ------------------------------ */
15832    .balign 64
15833.L_ALT_OP_UNUSED_40: /* 0x40 */
15834/* File: armv5te/alt_stub.S */
15835/*
15836 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15837 * any interesting requests and then jump to the real instruction
15838 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15839 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15840 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15841 * bail to the real handler if breakFlags==0.
15842 */
15843    ldrb   r3, [rSELF, #offThread_breakFlags]
15844    adrl   lr, dvmAsmInstructionStart + (64 * 64)
15845    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15846    cmp    r3, #0
15847    bxeq   lr                   @ nothing to do - jump to real handler
15848    EXPORT_PC()
15849    mov    r0, rPC              @ arg0
15850    mov    r1, rFP              @ arg1
15851    mov    r2, rSELF            @ arg2
15852    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15853
15854/* ------------------------------ */
15855    .balign 64
15856.L_ALT_OP_UNUSED_41: /* 0x41 */
15857/* File: armv5te/alt_stub.S */
15858/*
15859 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15860 * any interesting requests and then jump to the real instruction
15861 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15862 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15863 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15864 * bail to the real handler if breakFlags==0.
15865 */
15866    ldrb   r3, [rSELF, #offThread_breakFlags]
15867    adrl   lr, dvmAsmInstructionStart + (65 * 64)
15868    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15869    cmp    r3, #0
15870    bxeq   lr                   @ nothing to do - jump to real handler
15871    EXPORT_PC()
15872    mov    r0, rPC              @ arg0
15873    mov    r1, rFP              @ arg1
15874    mov    r2, rSELF            @ arg2
15875    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15876
15877/* ------------------------------ */
15878    .balign 64
15879.L_ALT_OP_UNUSED_42: /* 0x42 */
15880/* File: armv5te/alt_stub.S */
15881/*
15882 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15883 * any interesting requests and then jump to the real instruction
15884 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15885 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15886 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15887 * bail to the real handler if breakFlags==0.
15888 */
15889    ldrb   r3, [rSELF, #offThread_breakFlags]
15890    adrl   lr, dvmAsmInstructionStart + (66 * 64)
15891    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15892    cmp    r3, #0
15893    bxeq   lr                   @ nothing to do - jump to real handler
15894    EXPORT_PC()
15895    mov    r0, rPC              @ arg0
15896    mov    r1, rFP              @ arg1
15897    mov    r2, rSELF            @ arg2
15898    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15899
15900/* ------------------------------ */
15901    .balign 64
15902.L_ALT_OP_UNUSED_43: /* 0x43 */
15903/* File: armv5te/alt_stub.S */
15904/*
15905 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15906 * any interesting requests and then jump to the real instruction
15907 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15908 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15909 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15910 * bail to the real handler if breakFlags==0.
15911 */
15912    ldrb   r3, [rSELF, #offThread_breakFlags]
15913    adrl   lr, dvmAsmInstructionStart + (67 * 64)
15914    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15915    cmp    r3, #0
15916    bxeq   lr                   @ nothing to do - jump to real handler
15917    EXPORT_PC()
15918    mov    r0, rPC              @ arg0
15919    mov    r1, rFP              @ arg1
15920    mov    r2, rSELF            @ arg2
15921    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15922
15923/* ------------------------------ */
15924    .balign 64
15925.L_ALT_OP_AGET: /* 0x44 */
15926/* File: armv5te/alt_stub.S */
15927/*
15928 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15929 * any interesting requests and then jump to the real instruction
15930 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15931 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15932 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15933 * bail to the real handler if breakFlags==0.
15934 */
15935    ldrb   r3, [rSELF, #offThread_breakFlags]
15936    adrl   lr, dvmAsmInstructionStart + (68 * 64)
15937    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15938    cmp    r3, #0
15939    bxeq   lr                   @ nothing to do - jump to real handler
15940    EXPORT_PC()
15941    mov    r0, rPC              @ arg0
15942    mov    r1, rFP              @ arg1
15943    mov    r2, rSELF            @ arg2
15944    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15945
15946/* ------------------------------ */
15947    .balign 64
15948.L_ALT_OP_AGET_WIDE: /* 0x45 */
15949/* File: armv5te/alt_stub.S */
15950/*
15951 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15952 * any interesting requests and then jump to the real instruction
15953 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15954 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15955 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15956 * bail to the real handler if breakFlags==0.
15957 */
15958    ldrb   r3, [rSELF, #offThread_breakFlags]
15959    adrl   lr, dvmAsmInstructionStart + (69 * 64)
15960    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15961    cmp    r3, #0
15962    bxeq   lr                   @ nothing to do - jump to real handler
15963    EXPORT_PC()
15964    mov    r0, rPC              @ arg0
15965    mov    r1, rFP              @ arg1
15966    mov    r2, rSELF            @ arg2
15967    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15968
15969/* ------------------------------ */
15970    .balign 64
15971.L_ALT_OP_AGET_OBJECT: /* 0x46 */
15972/* File: armv5te/alt_stub.S */
15973/*
15974 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15975 * any interesting requests and then jump to the real instruction
15976 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15977 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15978 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15979 * bail to the real handler if breakFlags==0.
15980 */
15981    ldrb   r3, [rSELF, #offThread_breakFlags]
15982    adrl   lr, dvmAsmInstructionStart + (70 * 64)
15983    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15984    cmp    r3, #0
15985    bxeq   lr                   @ nothing to do - jump to real handler
15986    EXPORT_PC()
15987    mov    r0, rPC              @ arg0
15988    mov    r1, rFP              @ arg1
15989    mov    r2, rSELF            @ arg2
15990    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15991
15992/* ------------------------------ */
15993    .balign 64
15994.L_ALT_OP_AGET_BOOLEAN: /* 0x47 */
15995/* File: armv5te/alt_stub.S */
15996/*
15997 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15998 * any interesting requests and then jump to the real instruction
15999 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16000 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16001 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16002 * bail to the real handler if breakFlags==0.
16003 */
16004    ldrb   r3, [rSELF, #offThread_breakFlags]
16005    adrl   lr, dvmAsmInstructionStart + (71 * 64)
16006    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16007    cmp    r3, #0
16008    bxeq   lr                   @ nothing to do - jump to real handler
16009    EXPORT_PC()
16010    mov    r0, rPC              @ arg0
16011    mov    r1, rFP              @ arg1
16012    mov    r2, rSELF            @ arg2
16013    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16014
16015/* ------------------------------ */
16016    .balign 64
16017.L_ALT_OP_AGET_BYTE: /* 0x48 */
16018/* File: armv5te/alt_stub.S */
16019/*
16020 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16021 * any interesting requests and then jump to the real instruction
16022 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16023 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16024 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16025 * bail to the real handler if breakFlags==0.
16026 */
16027    ldrb   r3, [rSELF, #offThread_breakFlags]
16028    adrl   lr, dvmAsmInstructionStart + (72 * 64)
16029    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16030    cmp    r3, #0
16031    bxeq   lr                   @ nothing to do - jump to real handler
16032    EXPORT_PC()
16033    mov    r0, rPC              @ arg0
16034    mov    r1, rFP              @ arg1
16035    mov    r2, rSELF            @ arg2
16036    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16037
16038/* ------------------------------ */
16039    .balign 64
16040.L_ALT_OP_AGET_CHAR: /* 0x49 */
16041/* File: armv5te/alt_stub.S */
16042/*
16043 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16044 * any interesting requests and then jump to the real instruction
16045 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16046 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16047 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16048 * bail to the real handler if breakFlags==0.
16049 */
16050    ldrb   r3, [rSELF, #offThread_breakFlags]
16051    adrl   lr, dvmAsmInstructionStart + (73 * 64)
16052    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16053    cmp    r3, #0
16054    bxeq   lr                   @ nothing to do - jump to real handler
16055    EXPORT_PC()
16056    mov    r0, rPC              @ arg0
16057    mov    r1, rFP              @ arg1
16058    mov    r2, rSELF            @ arg2
16059    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16060
16061/* ------------------------------ */
16062    .balign 64
16063.L_ALT_OP_AGET_SHORT: /* 0x4a */
16064/* File: armv5te/alt_stub.S */
16065/*
16066 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16067 * any interesting requests and then jump to the real instruction
16068 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16069 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16070 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16071 * bail to the real handler if breakFlags==0.
16072 */
16073    ldrb   r3, [rSELF, #offThread_breakFlags]
16074    adrl   lr, dvmAsmInstructionStart + (74 * 64)
16075    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16076    cmp    r3, #0
16077    bxeq   lr                   @ nothing to do - jump to real handler
16078    EXPORT_PC()
16079    mov    r0, rPC              @ arg0
16080    mov    r1, rFP              @ arg1
16081    mov    r2, rSELF            @ arg2
16082    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16083
16084/* ------------------------------ */
16085    .balign 64
16086.L_ALT_OP_APUT: /* 0x4b */
16087/* File: armv5te/alt_stub.S */
16088/*
16089 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16090 * any interesting requests and then jump to the real instruction
16091 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16092 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16093 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16094 * bail to the real handler if breakFlags==0.
16095 */
16096    ldrb   r3, [rSELF, #offThread_breakFlags]
16097    adrl   lr, dvmAsmInstructionStart + (75 * 64)
16098    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16099    cmp    r3, #0
16100    bxeq   lr                   @ nothing to do - jump to real handler
16101    EXPORT_PC()
16102    mov    r0, rPC              @ arg0
16103    mov    r1, rFP              @ arg1
16104    mov    r2, rSELF            @ arg2
16105    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16106
16107/* ------------------------------ */
16108    .balign 64
16109.L_ALT_OP_APUT_WIDE: /* 0x4c */
16110/* File: armv5te/alt_stub.S */
16111/*
16112 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16113 * any interesting requests and then jump to the real instruction
16114 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16115 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16116 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16117 * bail to the real handler if breakFlags==0.
16118 */
16119    ldrb   r3, [rSELF, #offThread_breakFlags]
16120    adrl   lr, dvmAsmInstructionStart + (76 * 64)
16121    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16122    cmp    r3, #0
16123    bxeq   lr                   @ nothing to do - jump to real handler
16124    EXPORT_PC()
16125    mov    r0, rPC              @ arg0
16126    mov    r1, rFP              @ arg1
16127    mov    r2, rSELF            @ arg2
16128    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16129
16130/* ------------------------------ */
16131    .balign 64
16132.L_ALT_OP_APUT_OBJECT: /* 0x4d */
16133/* File: armv5te/alt_stub.S */
16134/*
16135 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16136 * any interesting requests and then jump to the real instruction
16137 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16138 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16139 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16140 * bail to the real handler if breakFlags==0.
16141 */
16142    ldrb   r3, [rSELF, #offThread_breakFlags]
16143    adrl   lr, dvmAsmInstructionStart + (77 * 64)
16144    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16145    cmp    r3, #0
16146    bxeq   lr                   @ nothing to do - jump to real handler
16147    EXPORT_PC()
16148    mov    r0, rPC              @ arg0
16149    mov    r1, rFP              @ arg1
16150    mov    r2, rSELF            @ arg2
16151    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16152
16153/* ------------------------------ */
16154    .balign 64
16155.L_ALT_OP_APUT_BOOLEAN: /* 0x4e */
16156/* File: armv5te/alt_stub.S */
16157/*
16158 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16159 * any interesting requests and then jump to the real instruction
16160 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16161 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16162 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16163 * bail to the real handler if breakFlags==0.
16164 */
16165    ldrb   r3, [rSELF, #offThread_breakFlags]
16166    adrl   lr, dvmAsmInstructionStart + (78 * 64)
16167    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16168    cmp    r3, #0
16169    bxeq   lr                   @ nothing to do - jump to real handler
16170    EXPORT_PC()
16171    mov    r0, rPC              @ arg0
16172    mov    r1, rFP              @ arg1
16173    mov    r2, rSELF            @ arg2
16174    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16175
16176/* ------------------------------ */
16177    .balign 64
16178.L_ALT_OP_APUT_BYTE: /* 0x4f */
16179/* File: armv5te/alt_stub.S */
16180/*
16181 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16182 * any interesting requests and then jump to the real instruction
16183 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16184 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16185 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16186 * bail to the real handler if breakFlags==0.
16187 */
16188    ldrb   r3, [rSELF, #offThread_breakFlags]
16189    adrl   lr, dvmAsmInstructionStart + (79 * 64)
16190    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16191    cmp    r3, #0
16192    bxeq   lr                   @ nothing to do - jump to real handler
16193    EXPORT_PC()
16194    mov    r0, rPC              @ arg0
16195    mov    r1, rFP              @ arg1
16196    mov    r2, rSELF            @ arg2
16197    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16198
16199/* ------------------------------ */
16200    .balign 64
16201.L_ALT_OP_APUT_CHAR: /* 0x50 */
16202/* File: armv5te/alt_stub.S */
16203/*
16204 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16205 * any interesting requests and then jump to the real instruction
16206 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16207 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16208 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16209 * bail to the real handler if breakFlags==0.
16210 */
16211    ldrb   r3, [rSELF, #offThread_breakFlags]
16212    adrl   lr, dvmAsmInstructionStart + (80 * 64)
16213    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16214    cmp    r3, #0
16215    bxeq   lr                   @ nothing to do - jump to real handler
16216    EXPORT_PC()
16217    mov    r0, rPC              @ arg0
16218    mov    r1, rFP              @ arg1
16219    mov    r2, rSELF            @ arg2
16220    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16221
16222/* ------------------------------ */
16223    .balign 64
16224.L_ALT_OP_APUT_SHORT: /* 0x51 */
16225/* File: armv5te/alt_stub.S */
16226/*
16227 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16228 * any interesting requests and then jump to the real instruction
16229 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16230 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16231 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16232 * bail to the real handler if breakFlags==0.
16233 */
16234    ldrb   r3, [rSELF, #offThread_breakFlags]
16235    adrl   lr, dvmAsmInstructionStart + (81 * 64)
16236    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16237    cmp    r3, #0
16238    bxeq   lr                   @ nothing to do - jump to real handler
16239    EXPORT_PC()
16240    mov    r0, rPC              @ arg0
16241    mov    r1, rFP              @ arg1
16242    mov    r2, rSELF            @ arg2
16243    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16244
16245/* ------------------------------ */
16246    .balign 64
16247.L_ALT_OP_IGET: /* 0x52 */
16248/* File: armv5te/alt_stub.S */
16249/*
16250 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16251 * any interesting requests and then jump to the real instruction
16252 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16253 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16254 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16255 * bail to the real handler if breakFlags==0.
16256 */
16257    ldrb   r3, [rSELF, #offThread_breakFlags]
16258    adrl   lr, dvmAsmInstructionStart + (82 * 64)
16259    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16260    cmp    r3, #0
16261    bxeq   lr                   @ nothing to do - jump to real handler
16262    EXPORT_PC()
16263    mov    r0, rPC              @ arg0
16264    mov    r1, rFP              @ arg1
16265    mov    r2, rSELF            @ arg2
16266    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16267
16268/* ------------------------------ */
16269    .balign 64
16270.L_ALT_OP_IGET_WIDE: /* 0x53 */
16271/* File: armv5te/alt_stub.S */
16272/*
16273 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16274 * any interesting requests and then jump to the real instruction
16275 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16276 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16277 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16278 * bail to the real handler if breakFlags==0.
16279 */
16280    ldrb   r3, [rSELF, #offThread_breakFlags]
16281    adrl   lr, dvmAsmInstructionStart + (83 * 64)
16282    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16283    cmp    r3, #0
16284    bxeq   lr                   @ nothing to do - jump to real handler
16285    EXPORT_PC()
16286    mov    r0, rPC              @ arg0
16287    mov    r1, rFP              @ arg1
16288    mov    r2, rSELF            @ arg2
16289    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16290
16291/* ------------------------------ */
16292    .balign 64
16293.L_ALT_OP_IGET_OBJECT: /* 0x54 */
16294/* File: armv5te/alt_stub.S */
16295/*
16296 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16297 * any interesting requests and then jump to the real instruction
16298 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16299 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16300 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16301 * bail to the real handler if breakFlags==0.
16302 */
16303    ldrb   r3, [rSELF, #offThread_breakFlags]
16304    adrl   lr, dvmAsmInstructionStart + (84 * 64)
16305    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16306    cmp    r3, #0
16307    bxeq   lr                   @ nothing to do - jump to real handler
16308    EXPORT_PC()
16309    mov    r0, rPC              @ arg0
16310    mov    r1, rFP              @ arg1
16311    mov    r2, rSELF            @ arg2
16312    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16313
16314/* ------------------------------ */
16315    .balign 64
16316.L_ALT_OP_IGET_BOOLEAN: /* 0x55 */
16317/* File: armv5te/alt_stub.S */
16318/*
16319 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16320 * any interesting requests and then jump to the real instruction
16321 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16322 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16323 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16324 * bail to the real handler if breakFlags==0.
16325 */
16326    ldrb   r3, [rSELF, #offThread_breakFlags]
16327    adrl   lr, dvmAsmInstructionStart + (85 * 64)
16328    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16329    cmp    r3, #0
16330    bxeq   lr                   @ nothing to do - jump to real handler
16331    EXPORT_PC()
16332    mov    r0, rPC              @ arg0
16333    mov    r1, rFP              @ arg1
16334    mov    r2, rSELF            @ arg2
16335    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16336
16337/* ------------------------------ */
16338    .balign 64
16339.L_ALT_OP_IGET_BYTE: /* 0x56 */
16340/* File: armv5te/alt_stub.S */
16341/*
16342 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16343 * any interesting requests and then jump to the real instruction
16344 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16345 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16346 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16347 * bail to the real handler if breakFlags==0.
16348 */
16349    ldrb   r3, [rSELF, #offThread_breakFlags]
16350    adrl   lr, dvmAsmInstructionStart + (86 * 64)
16351    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16352    cmp    r3, #0
16353    bxeq   lr                   @ nothing to do - jump to real handler
16354    EXPORT_PC()
16355    mov    r0, rPC              @ arg0
16356    mov    r1, rFP              @ arg1
16357    mov    r2, rSELF            @ arg2
16358    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16359
16360/* ------------------------------ */
16361    .balign 64
16362.L_ALT_OP_IGET_CHAR: /* 0x57 */
16363/* File: armv5te/alt_stub.S */
16364/*
16365 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16366 * any interesting requests and then jump to the real instruction
16367 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16368 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16369 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16370 * bail to the real handler if breakFlags==0.
16371 */
16372    ldrb   r3, [rSELF, #offThread_breakFlags]
16373    adrl   lr, dvmAsmInstructionStart + (87 * 64)
16374    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16375    cmp    r3, #0
16376    bxeq   lr                   @ nothing to do - jump to real handler
16377    EXPORT_PC()
16378    mov    r0, rPC              @ arg0
16379    mov    r1, rFP              @ arg1
16380    mov    r2, rSELF            @ arg2
16381    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16382
16383/* ------------------------------ */
16384    .balign 64
16385.L_ALT_OP_IGET_SHORT: /* 0x58 */
16386/* File: armv5te/alt_stub.S */
16387/*
16388 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16389 * any interesting requests and then jump to the real instruction
16390 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16391 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16392 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16393 * bail to the real handler if breakFlags==0.
16394 */
16395    ldrb   r3, [rSELF, #offThread_breakFlags]
16396    adrl   lr, dvmAsmInstructionStart + (88 * 64)
16397    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16398    cmp    r3, #0
16399    bxeq   lr                   @ nothing to do - jump to real handler
16400    EXPORT_PC()
16401    mov    r0, rPC              @ arg0
16402    mov    r1, rFP              @ arg1
16403    mov    r2, rSELF            @ arg2
16404    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16405
16406/* ------------------------------ */
16407    .balign 64
16408.L_ALT_OP_IPUT: /* 0x59 */
16409/* File: armv5te/alt_stub.S */
16410/*
16411 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16412 * any interesting requests and then jump to the real instruction
16413 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16414 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16415 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16416 * bail to the real handler if breakFlags==0.
16417 */
16418    ldrb   r3, [rSELF, #offThread_breakFlags]
16419    adrl   lr, dvmAsmInstructionStart + (89 * 64)
16420    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16421    cmp    r3, #0
16422    bxeq   lr                   @ nothing to do - jump to real handler
16423    EXPORT_PC()
16424    mov    r0, rPC              @ arg0
16425    mov    r1, rFP              @ arg1
16426    mov    r2, rSELF            @ arg2
16427    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16428
16429/* ------------------------------ */
16430    .balign 64
16431.L_ALT_OP_IPUT_WIDE: /* 0x5a */
16432/* File: armv5te/alt_stub.S */
16433/*
16434 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16435 * any interesting requests and then jump to the real instruction
16436 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16437 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16438 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16439 * bail to the real handler if breakFlags==0.
16440 */
16441    ldrb   r3, [rSELF, #offThread_breakFlags]
16442    adrl   lr, dvmAsmInstructionStart + (90 * 64)
16443    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16444    cmp    r3, #0
16445    bxeq   lr                   @ nothing to do - jump to real handler
16446    EXPORT_PC()
16447    mov    r0, rPC              @ arg0
16448    mov    r1, rFP              @ arg1
16449    mov    r2, rSELF            @ arg2
16450    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16451
16452/* ------------------------------ */
16453    .balign 64
16454.L_ALT_OP_IPUT_OBJECT: /* 0x5b */
16455/* File: armv5te/alt_stub.S */
16456/*
16457 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16458 * any interesting requests and then jump to the real instruction
16459 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16460 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16461 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16462 * bail to the real handler if breakFlags==0.
16463 */
16464    ldrb   r3, [rSELF, #offThread_breakFlags]
16465    adrl   lr, dvmAsmInstructionStart + (91 * 64)
16466    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16467    cmp    r3, #0
16468    bxeq   lr                   @ nothing to do - jump to real handler
16469    EXPORT_PC()
16470    mov    r0, rPC              @ arg0
16471    mov    r1, rFP              @ arg1
16472    mov    r2, rSELF            @ arg2
16473    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16474
16475/* ------------------------------ */
16476    .balign 64
16477.L_ALT_OP_IPUT_BOOLEAN: /* 0x5c */
16478/* File: armv5te/alt_stub.S */
16479/*
16480 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16481 * any interesting requests and then jump to the real instruction
16482 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16483 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16484 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16485 * bail to the real handler if breakFlags==0.
16486 */
16487    ldrb   r3, [rSELF, #offThread_breakFlags]
16488    adrl   lr, dvmAsmInstructionStart + (92 * 64)
16489    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16490    cmp    r3, #0
16491    bxeq   lr                   @ nothing to do - jump to real handler
16492    EXPORT_PC()
16493    mov    r0, rPC              @ arg0
16494    mov    r1, rFP              @ arg1
16495    mov    r2, rSELF            @ arg2
16496    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16497
16498/* ------------------------------ */
16499    .balign 64
16500.L_ALT_OP_IPUT_BYTE: /* 0x5d */
16501/* File: armv5te/alt_stub.S */
16502/*
16503 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16504 * any interesting requests and then jump to the real instruction
16505 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16506 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16507 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16508 * bail to the real handler if breakFlags==0.
16509 */
16510    ldrb   r3, [rSELF, #offThread_breakFlags]
16511    adrl   lr, dvmAsmInstructionStart + (93 * 64)
16512    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16513    cmp    r3, #0
16514    bxeq   lr                   @ nothing to do - jump to real handler
16515    EXPORT_PC()
16516    mov    r0, rPC              @ arg0
16517    mov    r1, rFP              @ arg1
16518    mov    r2, rSELF            @ arg2
16519    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16520
16521/* ------------------------------ */
16522    .balign 64
16523.L_ALT_OP_IPUT_CHAR: /* 0x5e */
16524/* File: armv5te/alt_stub.S */
16525/*
16526 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16527 * any interesting requests and then jump to the real instruction
16528 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16529 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16530 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16531 * bail to the real handler if breakFlags==0.
16532 */
16533    ldrb   r3, [rSELF, #offThread_breakFlags]
16534    adrl   lr, dvmAsmInstructionStart + (94 * 64)
16535    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16536    cmp    r3, #0
16537    bxeq   lr                   @ nothing to do - jump to real handler
16538    EXPORT_PC()
16539    mov    r0, rPC              @ arg0
16540    mov    r1, rFP              @ arg1
16541    mov    r2, rSELF            @ arg2
16542    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16543
16544/* ------------------------------ */
16545    .balign 64
16546.L_ALT_OP_IPUT_SHORT: /* 0x5f */
16547/* File: armv5te/alt_stub.S */
16548/*
16549 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16550 * any interesting requests and then jump to the real instruction
16551 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16552 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16553 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16554 * bail to the real handler if breakFlags==0.
16555 */
16556    ldrb   r3, [rSELF, #offThread_breakFlags]
16557    adrl   lr, dvmAsmInstructionStart + (95 * 64)
16558    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16559    cmp    r3, #0
16560    bxeq   lr                   @ nothing to do - jump to real handler
16561    EXPORT_PC()
16562    mov    r0, rPC              @ arg0
16563    mov    r1, rFP              @ arg1
16564    mov    r2, rSELF            @ arg2
16565    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16566
16567/* ------------------------------ */
16568    .balign 64
16569.L_ALT_OP_SGET: /* 0x60 */
16570/* File: armv5te/alt_stub.S */
16571/*
16572 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16573 * any interesting requests and then jump to the real instruction
16574 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16575 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16576 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16577 * bail to the real handler if breakFlags==0.
16578 */
16579    ldrb   r3, [rSELF, #offThread_breakFlags]
16580    adrl   lr, dvmAsmInstructionStart + (96 * 64)
16581    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16582    cmp    r3, #0
16583    bxeq   lr                   @ nothing to do - jump to real handler
16584    EXPORT_PC()
16585    mov    r0, rPC              @ arg0
16586    mov    r1, rFP              @ arg1
16587    mov    r2, rSELF            @ arg2
16588    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16589
16590/* ------------------------------ */
16591    .balign 64
16592.L_ALT_OP_SGET_WIDE: /* 0x61 */
16593/* File: armv5te/alt_stub.S */
16594/*
16595 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16596 * any interesting requests and then jump to the real instruction
16597 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16598 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16599 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16600 * bail to the real handler if breakFlags==0.
16601 */
16602    ldrb   r3, [rSELF, #offThread_breakFlags]
16603    adrl   lr, dvmAsmInstructionStart + (97 * 64)
16604    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16605    cmp    r3, #0
16606    bxeq   lr                   @ nothing to do - jump to real handler
16607    EXPORT_PC()
16608    mov    r0, rPC              @ arg0
16609    mov    r1, rFP              @ arg1
16610    mov    r2, rSELF            @ arg2
16611    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16612
16613/* ------------------------------ */
16614    .balign 64
16615.L_ALT_OP_SGET_OBJECT: /* 0x62 */
16616/* File: armv5te/alt_stub.S */
16617/*
16618 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16619 * any interesting requests and then jump to the real instruction
16620 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16621 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16622 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16623 * bail to the real handler if breakFlags==0.
16624 */
16625    ldrb   r3, [rSELF, #offThread_breakFlags]
16626    adrl   lr, dvmAsmInstructionStart + (98 * 64)
16627    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16628    cmp    r3, #0
16629    bxeq   lr                   @ nothing to do - jump to real handler
16630    EXPORT_PC()
16631    mov    r0, rPC              @ arg0
16632    mov    r1, rFP              @ arg1
16633    mov    r2, rSELF            @ arg2
16634    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16635
16636/* ------------------------------ */
16637    .balign 64
16638.L_ALT_OP_SGET_BOOLEAN: /* 0x63 */
16639/* File: armv5te/alt_stub.S */
16640/*
16641 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16642 * any interesting requests and then jump to the real instruction
16643 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16644 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16645 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16646 * bail to the real handler if breakFlags==0.
16647 */
16648    ldrb   r3, [rSELF, #offThread_breakFlags]
16649    adrl   lr, dvmAsmInstructionStart + (99 * 64)
16650    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16651    cmp    r3, #0
16652    bxeq   lr                   @ nothing to do - jump to real handler
16653    EXPORT_PC()
16654    mov    r0, rPC              @ arg0
16655    mov    r1, rFP              @ arg1
16656    mov    r2, rSELF            @ arg2
16657    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16658
16659/* ------------------------------ */
16660    .balign 64
16661.L_ALT_OP_SGET_BYTE: /* 0x64 */
16662/* File: armv5te/alt_stub.S */
16663/*
16664 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16665 * any interesting requests and then jump to the real instruction
16666 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16667 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16668 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16669 * bail to the real handler if breakFlags==0.
16670 */
16671    ldrb   r3, [rSELF, #offThread_breakFlags]
16672    adrl   lr, dvmAsmInstructionStart + (100 * 64)
16673    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16674    cmp    r3, #0
16675    bxeq   lr                   @ nothing to do - jump to real handler
16676    EXPORT_PC()
16677    mov    r0, rPC              @ arg0
16678    mov    r1, rFP              @ arg1
16679    mov    r2, rSELF            @ arg2
16680    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16681
16682/* ------------------------------ */
16683    .balign 64
16684.L_ALT_OP_SGET_CHAR: /* 0x65 */
16685/* File: armv5te/alt_stub.S */
16686/*
16687 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16688 * any interesting requests and then jump to the real instruction
16689 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16690 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16691 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16692 * bail to the real handler if breakFlags==0.
16693 */
16694    ldrb   r3, [rSELF, #offThread_breakFlags]
16695    adrl   lr, dvmAsmInstructionStart + (101 * 64)
16696    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16697    cmp    r3, #0
16698    bxeq   lr                   @ nothing to do - jump to real handler
16699    EXPORT_PC()
16700    mov    r0, rPC              @ arg0
16701    mov    r1, rFP              @ arg1
16702    mov    r2, rSELF            @ arg2
16703    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16704
16705/* ------------------------------ */
16706    .balign 64
16707.L_ALT_OP_SGET_SHORT: /* 0x66 */
16708/* File: armv5te/alt_stub.S */
16709/*
16710 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16711 * any interesting requests and then jump to the real instruction
16712 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16713 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16714 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16715 * bail to the real handler if breakFlags==0.
16716 */
16717    ldrb   r3, [rSELF, #offThread_breakFlags]
16718    adrl   lr, dvmAsmInstructionStart + (102 * 64)
16719    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16720    cmp    r3, #0
16721    bxeq   lr                   @ nothing to do - jump to real handler
16722    EXPORT_PC()
16723    mov    r0, rPC              @ arg0
16724    mov    r1, rFP              @ arg1
16725    mov    r2, rSELF            @ arg2
16726    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16727
16728/* ------------------------------ */
16729    .balign 64
16730.L_ALT_OP_SPUT: /* 0x67 */
16731/* File: armv5te/alt_stub.S */
16732/*
16733 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16734 * any interesting requests and then jump to the real instruction
16735 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16736 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16737 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16738 * bail to the real handler if breakFlags==0.
16739 */
16740    ldrb   r3, [rSELF, #offThread_breakFlags]
16741    adrl   lr, dvmAsmInstructionStart + (103 * 64)
16742    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16743    cmp    r3, #0
16744    bxeq   lr                   @ nothing to do - jump to real handler
16745    EXPORT_PC()
16746    mov    r0, rPC              @ arg0
16747    mov    r1, rFP              @ arg1
16748    mov    r2, rSELF            @ arg2
16749    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16750
16751/* ------------------------------ */
16752    .balign 64
16753.L_ALT_OP_SPUT_WIDE: /* 0x68 */
16754/* File: armv5te/alt_stub.S */
16755/*
16756 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16757 * any interesting requests and then jump to the real instruction
16758 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16759 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16760 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16761 * bail to the real handler if breakFlags==0.
16762 */
16763    ldrb   r3, [rSELF, #offThread_breakFlags]
16764    adrl   lr, dvmAsmInstructionStart + (104 * 64)
16765    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16766    cmp    r3, #0
16767    bxeq   lr                   @ nothing to do - jump to real handler
16768    EXPORT_PC()
16769    mov    r0, rPC              @ arg0
16770    mov    r1, rFP              @ arg1
16771    mov    r2, rSELF            @ arg2
16772    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16773
16774/* ------------------------------ */
16775    .balign 64
16776.L_ALT_OP_SPUT_OBJECT: /* 0x69 */
16777/* File: armv5te/alt_stub.S */
16778/*
16779 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16780 * any interesting requests and then jump to the real instruction
16781 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16782 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16783 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16784 * bail to the real handler if breakFlags==0.
16785 */
16786    ldrb   r3, [rSELF, #offThread_breakFlags]
16787    adrl   lr, dvmAsmInstructionStart + (105 * 64)
16788    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16789    cmp    r3, #0
16790    bxeq   lr                   @ nothing to do - jump to real handler
16791    EXPORT_PC()
16792    mov    r0, rPC              @ arg0
16793    mov    r1, rFP              @ arg1
16794    mov    r2, rSELF            @ arg2
16795    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16796
16797/* ------------------------------ */
16798    .balign 64
16799.L_ALT_OP_SPUT_BOOLEAN: /* 0x6a */
16800/* File: armv5te/alt_stub.S */
16801/*
16802 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16803 * any interesting requests and then jump to the real instruction
16804 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16805 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16806 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16807 * bail to the real handler if breakFlags==0.
16808 */
16809    ldrb   r3, [rSELF, #offThread_breakFlags]
16810    adrl   lr, dvmAsmInstructionStart + (106 * 64)
16811    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16812    cmp    r3, #0
16813    bxeq   lr                   @ nothing to do - jump to real handler
16814    EXPORT_PC()
16815    mov    r0, rPC              @ arg0
16816    mov    r1, rFP              @ arg1
16817    mov    r2, rSELF            @ arg2
16818    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16819
16820/* ------------------------------ */
16821    .balign 64
16822.L_ALT_OP_SPUT_BYTE: /* 0x6b */
16823/* File: armv5te/alt_stub.S */
16824/*
16825 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16826 * any interesting requests and then jump to the real instruction
16827 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16828 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16829 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16830 * bail to the real handler if breakFlags==0.
16831 */
16832    ldrb   r3, [rSELF, #offThread_breakFlags]
16833    adrl   lr, dvmAsmInstructionStart + (107 * 64)
16834    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16835    cmp    r3, #0
16836    bxeq   lr                   @ nothing to do - jump to real handler
16837    EXPORT_PC()
16838    mov    r0, rPC              @ arg0
16839    mov    r1, rFP              @ arg1
16840    mov    r2, rSELF            @ arg2
16841    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16842
16843/* ------------------------------ */
16844    .balign 64
16845.L_ALT_OP_SPUT_CHAR: /* 0x6c */
16846/* File: armv5te/alt_stub.S */
16847/*
16848 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16849 * any interesting requests and then jump to the real instruction
16850 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16851 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16852 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16853 * bail to the real handler if breakFlags==0.
16854 */
16855    ldrb   r3, [rSELF, #offThread_breakFlags]
16856    adrl   lr, dvmAsmInstructionStart + (108 * 64)
16857    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16858    cmp    r3, #0
16859    bxeq   lr                   @ nothing to do - jump to real handler
16860    EXPORT_PC()
16861    mov    r0, rPC              @ arg0
16862    mov    r1, rFP              @ arg1
16863    mov    r2, rSELF            @ arg2
16864    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16865
16866/* ------------------------------ */
16867    .balign 64
16868.L_ALT_OP_SPUT_SHORT: /* 0x6d */
16869/* File: armv5te/alt_stub.S */
16870/*
16871 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16872 * any interesting requests and then jump to the real instruction
16873 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16874 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16875 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16876 * bail to the real handler if breakFlags==0.
16877 */
16878    ldrb   r3, [rSELF, #offThread_breakFlags]
16879    adrl   lr, dvmAsmInstructionStart + (109 * 64)
16880    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16881    cmp    r3, #0
16882    bxeq   lr                   @ nothing to do - jump to real handler
16883    EXPORT_PC()
16884    mov    r0, rPC              @ arg0
16885    mov    r1, rFP              @ arg1
16886    mov    r2, rSELF            @ arg2
16887    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16888
16889/* ------------------------------ */
16890    .balign 64
16891.L_ALT_OP_INVOKE_VIRTUAL: /* 0x6e */
16892/* File: armv5te/alt_stub.S */
16893/*
16894 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16895 * any interesting requests and then jump to the real instruction
16896 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16897 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16898 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16899 * bail to the real handler if breakFlags==0.
16900 */
16901    ldrb   r3, [rSELF, #offThread_breakFlags]
16902    adrl   lr, dvmAsmInstructionStart + (110 * 64)
16903    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16904    cmp    r3, #0
16905    bxeq   lr                   @ nothing to do - jump to real handler
16906    EXPORT_PC()
16907    mov    r0, rPC              @ arg0
16908    mov    r1, rFP              @ arg1
16909    mov    r2, rSELF            @ arg2
16910    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16911
16912/* ------------------------------ */
16913    .balign 64
16914.L_ALT_OP_INVOKE_SUPER: /* 0x6f */
16915/* File: armv5te/alt_stub.S */
16916/*
16917 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16918 * any interesting requests and then jump to the real instruction
16919 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16920 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16921 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16922 * bail to the real handler if breakFlags==0.
16923 */
16924    ldrb   r3, [rSELF, #offThread_breakFlags]
16925    adrl   lr, dvmAsmInstructionStart + (111 * 64)
16926    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16927    cmp    r3, #0
16928    bxeq   lr                   @ nothing to do - jump to real handler
16929    EXPORT_PC()
16930    mov    r0, rPC              @ arg0
16931    mov    r1, rFP              @ arg1
16932    mov    r2, rSELF            @ arg2
16933    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16934
16935/* ------------------------------ */
16936    .balign 64
16937.L_ALT_OP_INVOKE_DIRECT: /* 0x70 */
16938/* File: armv5te/alt_stub.S */
16939/*
16940 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16941 * any interesting requests and then jump to the real instruction
16942 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16943 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16944 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16945 * bail to the real handler if breakFlags==0.
16946 */
16947    ldrb   r3, [rSELF, #offThread_breakFlags]
16948    adrl   lr, dvmAsmInstructionStart + (112 * 64)
16949    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16950    cmp    r3, #0
16951    bxeq   lr                   @ nothing to do - jump to real handler
16952    EXPORT_PC()
16953    mov    r0, rPC              @ arg0
16954    mov    r1, rFP              @ arg1
16955    mov    r2, rSELF            @ arg2
16956    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16957
16958/* ------------------------------ */
16959    .balign 64
16960.L_ALT_OP_INVOKE_STATIC: /* 0x71 */
16961/* File: armv5te/alt_stub.S */
16962/*
16963 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16964 * any interesting requests and then jump to the real instruction
16965 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16966 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16967 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16968 * bail to the real handler if breakFlags==0.
16969 */
16970    ldrb   r3, [rSELF, #offThread_breakFlags]
16971    adrl   lr, dvmAsmInstructionStart + (113 * 64)
16972    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16973    cmp    r3, #0
16974    bxeq   lr                   @ nothing to do - jump to real handler
16975    EXPORT_PC()
16976    mov    r0, rPC              @ arg0
16977    mov    r1, rFP              @ arg1
16978    mov    r2, rSELF            @ arg2
16979    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16980
16981/* ------------------------------ */
16982    .balign 64
16983.L_ALT_OP_INVOKE_INTERFACE: /* 0x72 */
16984/* File: armv5te/alt_stub.S */
16985/*
16986 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16987 * any interesting requests and then jump to the real instruction
16988 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16989 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16990 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16991 * bail to the real handler if breakFlags==0.
16992 */
16993    ldrb   r3, [rSELF, #offThread_breakFlags]
16994    adrl   lr, dvmAsmInstructionStart + (114 * 64)
16995    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16996    cmp    r3, #0
16997    bxeq   lr                   @ nothing to do - jump to real handler
16998    EXPORT_PC()
16999    mov    r0, rPC              @ arg0
17000    mov    r1, rFP              @ arg1
17001    mov    r2, rSELF            @ arg2
17002    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17003
17004/* ------------------------------ */
17005    .balign 64
17006.L_ALT_OP_UNUSED_73: /* 0x73 */
17007/* File: armv5te/alt_stub.S */
17008/*
17009 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17010 * any interesting requests and then jump to the real instruction
17011 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17012 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17013 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17014 * bail to the real handler if breakFlags==0.
17015 */
17016    ldrb   r3, [rSELF, #offThread_breakFlags]
17017    adrl   lr, dvmAsmInstructionStart + (115 * 64)
17018    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17019    cmp    r3, #0
17020    bxeq   lr                   @ nothing to do - jump to real handler
17021    EXPORT_PC()
17022    mov    r0, rPC              @ arg0
17023    mov    r1, rFP              @ arg1
17024    mov    r2, rSELF            @ arg2
17025    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17026
17027/* ------------------------------ */
17028    .balign 64
17029.L_ALT_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
17030/* File: armv5te/alt_stub.S */
17031/*
17032 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17033 * any interesting requests and then jump to the real instruction
17034 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17035 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17036 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17037 * bail to the real handler if breakFlags==0.
17038 */
17039    ldrb   r3, [rSELF, #offThread_breakFlags]
17040    adrl   lr, dvmAsmInstructionStart + (116 * 64)
17041    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17042    cmp    r3, #0
17043    bxeq   lr                   @ nothing to do - jump to real handler
17044    EXPORT_PC()
17045    mov    r0, rPC              @ arg0
17046    mov    r1, rFP              @ arg1
17047    mov    r2, rSELF            @ arg2
17048    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17049
17050/* ------------------------------ */
17051    .balign 64
17052.L_ALT_OP_INVOKE_SUPER_RANGE: /* 0x75 */
17053/* File: armv5te/alt_stub.S */
17054/*
17055 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17056 * any interesting requests and then jump to the real instruction
17057 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17058 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17059 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17060 * bail to the real handler if breakFlags==0.
17061 */
17062    ldrb   r3, [rSELF, #offThread_breakFlags]
17063    adrl   lr, dvmAsmInstructionStart + (117 * 64)
17064    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17065    cmp    r3, #0
17066    bxeq   lr                   @ nothing to do - jump to real handler
17067    EXPORT_PC()
17068    mov    r0, rPC              @ arg0
17069    mov    r1, rFP              @ arg1
17070    mov    r2, rSELF            @ arg2
17071    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17072
17073/* ------------------------------ */
17074    .balign 64
17075.L_ALT_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
17076/* File: armv5te/alt_stub.S */
17077/*
17078 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17079 * any interesting requests and then jump to the real instruction
17080 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17081 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17082 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17083 * bail to the real handler if breakFlags==0.
17084 */
17085    ldrb   r3, [rSELF, #offThread_breakFlags]
17086    adrl   lr, dvmAsmInstructionStart + (118 * 64)
17087    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17088    cmp    r3, #0
17089    bxeq   lr                   @ nothing to do - jump to real handler
17090    EXPORT_PC()
17091    mov    r0, rPC              @ arg0
17092    mov    r1, rFP              @ arg1
17093    mov    r2, rSELF            @ arg2
17094    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17095
17096/* ------------------------------ */
17097    .balign 64
17098.L_ALT_OP_INVOKE_STATIC_RANGE: /* 0x77 */
17099/* File: armv5te/alt_stub.S */
17100/*
17101 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17102 * any interesting requests and then jump to the real instruction
17103 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17104 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17105 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17106 * bail to the real handler if breakFlags==0.
17107 */
17108    ldrb   r3, [rSELF, #offThread_breakFlags]
17109    adrl   lr, dvmAsmInstructionStart + (119 * 64)
17110    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17111    cmp    r3, #0
17112    bxeq   lr                   @ nothing to do - jump to real handler
17113    EXPORT_PC()
17114    mov    r0, rPC              @ arg0
17115    mov    r1, rFP              @ arg1
17116    mov    r2, rSELF            @ arg2
17117    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17118
17119/* ------------------------------ */
17120    .balign 64
17121.L_ALT_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
17122/* File: armv5te/alt_stub.S */
17123/*
17124 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17125 * any interesting requests and then jump to the real instruction
17126 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17127 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17128 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17129 * bail to the real handler if breakFlags==0.
17130 */
17131    ldrb   r3, [rSELF, #offThread_breakFlags]
17132    adrl   lr, dvmAsmInstructionStart + (120 * 64)
17133    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17134    cmp    r3, #0
17135    bxeq   lr                   @ nothing to do - jump to real handler
17136    EXPORT_PC()
17137    mov    r0, rPC              @ arg0
17138    mov    r1, rFP              @ arg1
17139    mov    r2, rSELF            @ arg2
17140    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17141
17142/* ------------------------------ */
17143    .balign 64
17144.L_ALT_OP_UNUSED_79: /* 0x79 */
17145/* File: armv5te/alt_stub.S */
17146/*
17147 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17148 * any interesting requests and then jump to the real instruction
17149 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17150 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17151 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17152 * bail to the real handler if breakFlags==0.
17153 */
17154    ldrb   r3, [rSELF, #offThread_breakFlags]
17155    adrl   lr, dvmAsmInstructionStart + (121 * 64)
17156    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17157    cmp    r3, #0
17158    bxeq   lr                   @ nothing to do - jump to real handler
17159    EXPORT_PC()
17160    mov    r0, rPC              @ arg0
17161    mov    r1, rFP              @ arg1
17162    mov    r2, rSELF            @ arg2
17163    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17164
17165/* ------------------------------ */
17166    .balign 64
17167.L_ALT_OP_UNUSED_7A: /* 0x7a */
17168/* File: armv5te/alt_stub.S */
17169/*
17170 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17171 * any interesting requests and then jump to the real instruction
17172 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17173 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17174 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17175 * bail to the real handler if breakFlags==0.
17176 */
17177    ldrb   r3, [rSELF, #offThread_breakFlags]
17178    adrl   lr, dvmAsmInstructionStart + (122 * 64)
17179    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17180    cmp    r3, #0
17181    bxeq   lr                   @ nothing to do - jump to real handler
17182    EXPORT_PC()
17183    mov    r0, rPC              @ arg0
17184    mov    r1, rFP              @ arg1
17185    mov    r2, rSELF            @ arg2
17186    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17187
17188/* ------------------------------ */
17189    .balign 64
17190.L_ALT_OP_NEG_INT: /* 0x7b */
17191/* File: armv5te/alt_stub.S */
17192/*
17193 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17194 * any interesting requests and then jump to the real instruction
17195 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17196 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17197 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17198 * bail to the real handler if breakFlags==0.
17199 */
17200    ldrb   r3, [rSELF, #offThread_breakFlags]
17201    adrl   lr, dvmAsmInstructionStart + (123 * 64)
17202    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17203    cmp    r3, #0
17204    bxeq   lr                   @ nothing to do - jump to real handler
17205    EXPORT_PC()
17206    mov    r0, rPC              @ arg0
17207    mov    r1, rFP              @ arg1
17208    mov    r2, rSELF            @ arg2
17209    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17210
17211/* ------------------------------ */
17212    .balign 64
17213.L_ALT_OP_NOT_INT: /* 0x7c */
17214/* File: armv5te/alt_stub.S */
17215/*
17216 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17217 * any interesting requests and then jump to the real instruction
17218 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17219 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17220 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17221 * bail to the real handler if breakFlags==0.
17222 */
17223    ldrb   r3, [rSELF, #offThread_breakFlags]
17224    adrl   lr, dvmAsmInstructionStart + (124 * 64)
17225    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17226    cmp    r3, #0
17227    bxeq   lr                   @ nothing to do - jump to real handler
17228    EXPORT_PC()
17229    mov    r0, rPC              @ arg0
17230    mov    r1, rFP              @ arg1
17231    mov    r2, rSELF            @ arg2
17232    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17233
17234/* ------------------------------ */
17235    .balign 64
17236.L_ALT_OP_NEG_LONG: /* 0x7d */
17237/* File: armv5te/alt_stub.S */
17238/*
17239 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17240 * any interesting requests and then jump to the real instruction
17241 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17242 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17243 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17244 * bail to the real handler if breakFlags==0.
17245 */
17246    ldrb   r3, [rSELF, #offThread_breakFlags]
17247    adrl   lr, dvmAsmInstructionStart + (125 * 64)
17248    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17249    cmp    r3, #0
17250    bxeq   lr                   @ nothing to do - jump to real handler
17251    EXPORT_PC()
17252    mov    r0, rPC              @ arg0
17253    mov    r1, rFP              @ arg1
17254    mov    r2, rSELF            @ arg2
17255    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17256
17257/* ------------------------------ */
17258    .balign 64
17259.L_ALT_OP_NOT_LONG: /* 0x7e */
17260/* File: armv5te/alt_stub.S */
17261/*
17262 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17263 * any interesting requests and then jump to the real instruction
17264 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17265 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17266 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17267 * bail to the real handler if breakFlags==0.
17268 */
17269    ldrb   r3, [rSELF, #offThread_breakFlags]
17270    adrl   lr, dvmAsmInstructionStart + (126 * 64)
17271    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17272    cmp    r3, #0
17273    bxeq   lr                   @ nothing to do - jump to real handler
17274    EXPORT_PC()
17275    mov    r0, rPC              @ arg0
17276    mov    r1, rFP              @ arg1
17277    mov    r2, rSELF            @ arg2
17278    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17279
17280/* ------------------------------ */
17281    .balign 64
17282.L_ALT_OP_NEG_FLOAT: /* 0x7f */
17283/* File: armv5te/alt_stub.S */
17284/*
17285 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17286 * any interesting requests and then jump to the real instruction
17287 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17288 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17289 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17290 * bail to the real handler if breakFlags==0.
17291 */
17292    ldrb   r3, [rSELF, #offThread_breakFlags]
17293    adrl   lr, dvmAsmInstructionStart + (127 * 64)
17294    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17295    cmp    r3, #0
17296    bxeq   lr                   @ nothing to do - jump to real handler
17297    EXPORT_PC()
17298    mov    r0, rPC              @ arg0
17299    mov    r1, rFP              @ arg1
17300    mov    r2, rSELF            @ arg2
17301    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17302
17303/* ------------------------------ */
17304    .balign 64
17305.L_ALT_OP_NEG_DOUBLE: /* 0x80 */
17306/* File: armv5te/alt_stub.S */
17307/*
17308 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17309 * any interesting requests and then jump to the real instruction
17310 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17311 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17312 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17313 * bail to the real handler if breakFlags==0.
17314 */
17315    ldrb   r3, [rSELF, #offThread_breakFlags]
17316    adrl   lr, dvmAsmInstructionStart + (128 * 64)
17317    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17318    cmp    r3, #0
17319    bxeq   lr                   @ nothing to do - jump to real handler
17320    EXPORT_PC()
17321    mov    r0, rPC              @ arg0
17322    mov    r1, rFP              @ arg1
17323    mov    r2, rSELF            @ arg2
17324    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17325
17326/* ------------------------------ */
17327    .balign 64
17328.L_ALT_OP_INT_TO_LONG: /* 0x81 */
17329/* File: armv5te/alt_stub.S */
17330/*
17331 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17332 * any interesting requests and then jump to the real instruction
17333 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17334 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17335 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17336 * bail to the real handler if breakFlags==0.
17337 */
17338    ldrb   r3, [rSELF, #offThread_breakFlags]
17339    adrl   lr, dvmAsmInstructionStart + (129 * 64)
17340    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17341    cmp    r3, #0
17342    bxeq   lr                   @ nothing to do - jump to real handler
17343    EXPORT_PC()
17344    mov    r0, rPC              @ arg0
17345    mov    r1, rFP              @ arg1
17346    mov    r2, rSELF            @ arg2
17347    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17348
17349/* ------------------------------ */
17350    .balign 64
17351.L_ALT_OP_INT_TO_FLOAT: /* 0x82 */
17352/* File: armv5te/alt_stub.S */
17353/*
17354 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17355 * any interesting requests and then jump to the real instruction
17356 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17357 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17358 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17359 * bail to the real handler if breakFlags==0.
17360 */
17361    ldrb   r3, [rSELF, #offThread_breakFlags]
17362    adrl   lr, dvmAsmInstructionStart + (130 * 64)
17363    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17364    cmp    r3, #0
17365    bxeq   lr                   @ nothing to do - jump to real handler
17366    EXPORT_PC()
17367    mov    r0, rPC              @ arg0
17368    mov    r1, rFP              @ arg1
17369    mov    r2, rSELF            @ arg2
17370    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17371
17372/* ------------------------------ */
17373    .balign 64
17374.L_ALT_OP_INT_TO_DOUBLE: /* 0x83 */
17375/* File: armv5te/alt_stub.S */
17376/*
17377 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17378 * any interesting requests and then jump to the real instruction
17379 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17380 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17381 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17382 * bail to the real handler if breakFlags==0.
17383 */
17384    ldrb   r3, [rSELF, #offThread_breakFlags]
17385    adrl   lr, dvmAsmInstructionStart + (131 * 64)
17386    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17387    cmp    r3, #0
17388    bxeq   lr                   @ nothing to do - jump to real handler
17389    EXPORT_PC()
17390    mov    r0, rPC              @ arg0
17391    mov    r1, rFP              @ arg1
17392    mov    r2, rSELF            @ arg2
17393    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17394
17395/* ------------------------------ */
17396    .balign 64
17397.L_ALT_OP_LONG_TO_INT: /* 0x84 */
17398/* File: armv5te/alt_stub.S */
17399/*
17400 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17401 * any interesting requests and then jump to the real instruction
17402 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17403 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17404 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17405 * bail to the real handler if breakFlags==0.
17406 */
17407    ldrb   r3, [rSELF, #offThread_breakFlags]
17408    adrl   lr, dvmAsmInstructionStart + (132 * 64)
17409    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17410    cmp    r3, #0
17411    bxeq   lr                   @ nothing to do - jump to real handler
17412    EXPORT_PC()
17413    mov    r0, rPC              @ arg0
17414    mov    r1, rFP              @ arg1
17415    mov    r2, rSELF            @ arg2
17416    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17417
17418/* ------------------------------ */
17419    .balign 64
17420.L_ALT_OP_LONG_TO_FLOAT: /* 0x85 */
17421/* File: armv5te/alt_stub.S */
17422/*
17423 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17424 * any interesting requests and then jump to the real instruction
17425 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17426 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17427 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17428 * bail to the real handler if breakFlags==0.
17429 */
17430    ldrb   r3, [rSELF, #offThread_breakFlags]
17431    adrl   lr, dvmAsmInstructionStart + (133 * 64)
17432    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17433    cmp    r3, #0
17434    bxeq   lr                   @ nothing to do - jump to real handler
17435    EXPORT_PC()
17436    mov    r0, rPC              @ arg0
17437    mov    r1, rFP              @ arg1
17438    mov    r2, rSELF            @ arg2
17439    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17440
17441/* ------------------------------ */
17442    .balign 64
17443.L_ALT_OP_LONG_TO_DOUBLE: /* 0x86 */
17444/* File: armv5te/alt_stub.S */
17445/*
17446 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17447 * any interesting requests and then jump to the real instruction
17448 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17449 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17450 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17451 * bail to the real handler if breakFlags==0.
17452 */
17453    ldrb   r3, [rSELF, #offThread_breakFlags]
17454    adrl   lr, dvmAsmInstructionStart + (134 * 64)
17455    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17456    cmp    r3, #0
17457    bxeq   lr                   @ nothing to do - jump to real handler
17458    EXPORT_PC()
17459    mov    r0, rPC              @ arg0
17460    mov    r1, rFP              @ arg1
17461    mov    r2, rSELF            @ arg2
17462    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17463
17464/* ------------------------------ */
17465    .balign 64
17466.L_ALT_OP_FLOAT_TO_INT: /* 0x87 */
17467/* File: armv5te/alt_stub.S */
17468/*
17469 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17470 * any interesting requests and then jump to the real instruction
17471 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17472 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17473 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17474 * bail to the real handler if breakFlags==0.
17475 */
17476    ldrb   r3, [rSELF, #offThread_breakFlags]
17477    adrl   lr, dvmAsmInstructionStart + (135 * 64)
17478    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17479    cmp    r3, #0
17480    bxeq   lr                   @ nothing to do - jump to real handler
17481    EXPORT_PC()
17482    mov    r0, rPC              @ arg0
17483    mov    r1, rFP              @ arg1
17484    mov    r2, rSELF            @ arg2
17485    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17486
17487/* ------------------------------ */
17488    .balign 64
17489.L_ALT_OP_FLOAT_TO_LONG: /* 0x88 */
17490/* File: armv5te/alt_stub.S */
17491/*
17492 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17493 * any interesting requests and then jump to the real instruction
17494 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17495 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17496 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17497 * bail to the real handler if breakFlags==0.
17498 */
17499    ldrb   r3, [rSELF, #offThread_breakFlags]
17500    adrl   lr, dvmAsmInstructionStart + (136 * 64)
17501    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17502    cmp    r3, #0
17503    bxeq   lr                   @ nothing to do - jump to real handler
17504    EXPORT_PC()
17505    mov    r0, rPC              @ arg0
17506    mov    r1, rFP              @ arg1
17507    mov    r2, rSELF            @ arg2
17508    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17509
17510/* ------------------------------ */
17511    .balign 64
17512.L_ALT_OP_FLOAT_TO_DOUBLE: /* 0x89 */
17513/* File: armv5te/alt_stub.S */
17514/*
17515 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17516 * any interesting requests and then jump to the real instruction
17517 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17518 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17519 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17520 * bail to the real handler if breakFlags==0.
17521 */
17522    ldrb   r3, [rSELF, #offThread_breakFlags]
17523    adrl   lr, dvmAsmInstructionStart + (137 * 64)
17524    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17525    cmp    r3, #0
17526    bxeq   lr                   @ nothing to do - jump to real handler
17527    EXPORT_PC()
17528    mov    r0, rPC              @ arg0
17529    mov    r1, rFP              @ arg1
17530    mov    r2, rSELF            @ arg2
17531    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17532
17533/* ------------------------------ */
17534    .balign 64
17535.L_ALT_OP_DOUBLE_TO_INT: /* 0x8a */
17536/* File: armv5te/alt_stub.S */
17537/*
17538 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17539 * any interesting requests and then jump to the real instruction
17540 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17541 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17542 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17543 * bail to the real handler if breakFlags==0.
17544 */
17545    ldrb   r3, [rSELF, #offThread_breakFlags]
17546    adrl   lr, dvmAsmInstructionStart + (138 * 64)
17547    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17548    cmp    r3, #0
17549    bxeq   lr                   @ nothing to do - jump to real handler
17550    EXPORT_PC()
17551    mov    r0, rPC              @ arg0
17552    mov    r1, rFP              @ arg1
17553    mov    r2, rSELF            @ arg2
17554    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17555
17556/* ------------------------------ */
17557    .balign 64
17558.L_ALT_OP_DOUBLE_TO_LONG: /* 0x8b */
17559/* File: armv5te/alt_stub.S */
17560/*
17561 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17562 * any interesting requests and then jump to the real instruction
17563 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17564 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17565 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17566 * bail to the real handler if breakFlags==0.
17567 */
17568    ldrb   r3, [rSELF, #offThread_breakFlags]
17569    adrl   lr, dvmAsmInstructionStart + (139 * 64)
17570    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17571    cmp    r3, #0
17572    bxeq   lr                   @ nothing to do - jump to real handler
17573    EXPORT_PC()
17574    mov    r0, rPC              @ arg0
17575    mov    r1, rFP              @ arg1
17576    mov    r2, rSELF            @ arg2
17577    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17578
17579/* ------------------------------ */
17580    .balign 64
17581.L_ALT_OP_DOUBLE_TO_FLOAT: /* 0x8c */
17582/* File: armv5te/alt_stub.S */
17583/*
17584 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17585 * any interesting requests and then jump to the real instruction
17586 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17587 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17588 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17589 * bail to the real handler if breakFlags==0.
17590 */
17591    ldrb   r3, [rSELF, #offThread_breakFlags]
17592    adrl   lr, dvmAsmInstructionStart + (140 * 64)
17593    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17594    cmp    r3, #0
17595    bxeq   lr                   @ nothing to do - jump to real handler
17596    EXPORT_PC()
17597    mov    r0, rPC              @ arg0
17598    mov    r1, rFP              @ arg1
17599    mov    r2, rSELF            @ arg2
17600    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17601
17602/* ------------------------------ */
17603    .balign 64
17604.L_ALT_OP_INT_TO_BYTE: /* 0x8d */
17605/* File: armv5te/alt_stub.S */
17606/*
17607 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17608 * any interesting requests and then jump to the real instruction
17609 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17610 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17611 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17612 * bail to the real handler if breakFlags==0.
17613 */
17614    ldrb   r3, [rSELF, #offThread_breakFlags]
17615    adrl   lr, dvmAsmInstructionStart + (141 * 64)
17616    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17617    cmp    r3, #0
17618    bxeq   lr                   @ nothing to do - jump to real handler
17619    EXPORT_PC()
17620    mov    r0, rPC              @ arg0
17621    mov    r1, rFP              @ arg1
17622    mov    r2, rSELF            @ arg2
17623    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17624
17625/* ------------------------------ */
17626    .balign 64
17627.L_ALT_OP_INT_TO_CHAR: /* 0x8e */
17628/* File: armv5te/alt_stub.S */
17629/*
17630 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17631 * any interesting requests and then jump to the real instruction
17632 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17633 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17634 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17635 * bail to the real handler if breakFlags==0.
17636 */
17637    ldrb   r3, [rSELF, #offThread_breakFlags]
17638    adrl   lr, dvmAsmInstructionStart + (142 * 64)
17639    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17640    cmp    r3, #0
17641    bxeq   lr                   @ nothing to do - jump to real handler
17642    EXPORT_PC()
17643    mov    r0, rPC              @ arg0
17644    mov    r1, rFP              @ arg1
17645    mov    r2, rSELF            @ arg2
17646    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17647
17648/* ------------------------------ */
17649    .balign 64
17650.L_ALT_OP_INT_TO_SHORT: /* 0x8f */
17651/* File: armv5te/alt_stub.S */
17652/*
17653 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17654 * any interesting requests and then jump to the real instruction
17655 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17656 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17657 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17658 * bail to the real handler if breakFlags==0.
17659 */
17660    ldrb   r3, [rSELF, #offThread_breakFlags]
17661    adrl   lr, dvmAsmInstructionStart + (143 * 64)
17662    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17663    cmp    r3, #0
17664    bxeq   lr                   @ nothing to do - jump to real handler
17665    EXPORT_PC()
17666    mov    r0, rPC              @ arg0
17667    mov    r1, rFP              @ arg1
17668    mov    r2, rSELF            @ arg2
17669    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17670
17671/* ------------------------------ */
17672    .balign 64
17673.L_ALT_OP_ADD_INT: /* 0x90 */
17674/* File: armv5te/alt_stub.S */
17675/*
17676 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17677 * any interesting requests and then jump to the real instruction
17678 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17679 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17680 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17681 * bail to the real handler if breakFlags==0.
17682 */
17683    ldrb   r3, [rSELF, #offThread_breakFlags]
17684    adrl   lr, dvmAsmInstructionStart + (144 * 64)
17685    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17686    cmp    r3, #0
17687    bxeq   lr                   @ nothing to do - jump to real handler
17688    EXPORT_PC()
17689    mov    r0, rPC              @ arg0
17690    mov    r1, rFP              @ arg1
17691    mov    r2, rSELF            @ arg2
17692    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17693
17694/* ------------------------------ */
17695    .balign 64
17696.L_ALT_OP_SUB_INT: /* 0x91 */
17697/* File: armv5te/alt_stub.S */
17698/*
17699 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17700 * any interesting requests and then jump to the real instruction
17701 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17702 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17703 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17704 * bail to the real handler if breakFlags==0.
17705 */
17706    ldrb   r3, [rSELF, #offThread_breakFlags]
17707    adrl   lr, dvmAsmInstructionStart + (145 * 64)
17708    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17709    cmp    r3, #0
17710    bxeq   lr                   @ nothing to do - jump to real handler
17711    EXPORT_PC()
17712    mov    r0, rPC              @ arg0
17713    mov    r1, rFP              @ arg1
17714    mov    r2, rSELF            @ arg2
17715    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17716
17717/* ------------------------------ */
17718    .balign 64
17719.L_ALT_OP_MUL_INT: /* 0x92 */
17720/* File: armv5te/alt_stub.S */
17721/*
17722 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17723 * any interesting requests and then jump to the real instruction
17724 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17725 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17726 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17727 * bail to the real handler if breakFlags==0.
17728 */
17729    ldrb   r3, [rSELF, #offThread_breakFlags]
17730    adrl   lr, dvmAsmInstructionStart + (146 * 64)
17731    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17732    cmp    r3, #0
17733    bxeq   lr                   @ nothing to do - jump to real handler
17734    EXPORT_PC()
17735    mov    r0, rPC              @ arg0
17736    mov    r1, rFP              @ arg1
17737    mov    r2, rSELF            @ arg2
17738    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17739
17740/* ------------------------------ */
17741    .balign 64
17742.L_ALT_OP_DIV_INT: /* 0x93 */
17743/* File: armv5te/alt_stub.S */
17744/*
17745 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17746 * any interesting requests and then jump to the real instruction
17747 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17748 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17749 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17750 * bail to the real handler if breakFlags==0.
17751 */
17752    ldrb   r3, [rSELF, #offThread_breakFlags]
17753    adrl   lr, dvmAsmInstructionStart + (147 * 64)
17754    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17755    cmp    r3, #0
17756    bxeq   lr                   @ nothing to do - jump to real handler
17757    EXPORT_PC()
17758    mov    r0, rPC              @ arg0
17759    mov    r1, rFP              @ arg1
17760    mov    r2, rSELF            @ arg2
17761    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17762
17763/* ------------------------------ */
17764    .balign 64
17765.L_ALT_OP_REM_INT: /* 0x94 */
17766/* File: armv5te/alt_stub.S */
17767/*
17768 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17769 * any interesting requests and then jump to the real instruction
17770 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17771 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17772 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17773 * bail to the real handler if breakFlags==0.
17774 */
17775    ldrb   r3, [rSELF, #offThread_breakFlags]
17776    adrl   lr, dvmAsmInstructionStart + (148 * 64)
17777    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17778    cmp    r3, #0
17779    bxeq   lr                   @ nothing to do - jump to real handler
17780    EXPORT_PC()
17781    mov    r0, rPC              @ arg0
17782    mov    r1, rFP              @ arg1
17783    mov    r2, rSELF            @ arg2
17784    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17785
17786/* ------------------------------ */
17787    .balign 64
17788.L_ALT_OP_AND_INT: /* 0x95 */
17789/* File: armv5te/alt_stub.S */
17790/*
17791 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17792 * any interesting requests and then jump to the real instruction
17793 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17794 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17795 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17796 * bail to the real handler if breakFlags==0.
17797 */
17798    ldrb   r3, [rSELF, #offThread_breakFlags]
17799    adrl   lr, dvmAsmInstructionStart + (149 * 64)
17800    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17801    cmp    r3, #0
17802    bxeq   lr                   @ nothing to do - jump to real handler
17803    EXPORT_PC()
17804    mov    r0, rPC              @ arg0
17805    mov    r1, rFP              @ arg1
17806    mov    r2, rSELF            @ arg2
17807    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17808
17809/* ------------------------------ */
17810    .balign 64
17811.L_ALT_OP_OR_INT: /* 0x96 */
17812/* File: armv5te/alt_stub.S */
17813/*
17814 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17815 * any interesting requests and then jump to the real instruction
17816 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17817 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17818 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17819 * bail to the real handler if breakFlags==0.
17820 */
17821    ldrb   r3, [rSELF, #offThread_breakFlags]
17822    adrl   lr, dvmAsmInstructionStart + (150 * 64)
17823    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17824    cmp    r3, #0
17825    bxeq   lr                   @ nothing to do - jump to real handler
17826    EXPORT_PC()
17827    mov    r0, rPC              @ arg0
17828    mov    r1, rFP              @ arg1
17829    mov    r2, rSELF            @ arg2
17830    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17831
17832/* ------------------------------ */
17833    .balign 64
17834.L_ALT_OP_XOR_INT: /* 0x97 */
17835/* File: armv5te/alt_stub.S */
17836/*
17837 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17838 * any interesting requests and then jump to the real instruction
17839 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17840 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17841 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17842 * bail to the real handler if breakFlags==0.
17843 */
17844    ldrb   r3, [rSELF, #offThread_breakFlags]
17845    adrl   lr, dvmAsmInstructionStart + (151 * 64)
17846    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17847    cmp    r3, #0
17848    bxeq   lr                   @ nothing to do - jump to real handler
17849    EXPORT_PC()
17850    mov    r0, rPC              @ arg0
17851    mov    r1, rFP              @ arg1
17852    mov    r2, rSELF            @ arg2
17853    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17854
17855/* ------------------------------ */
17856    .balign 64
17857.L_ALT_OP_SHL_INT: /* 0x98 */
17858/* File: armv5te/alt_stub.S */
17859/*
17860 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17861 * any interesting requests and then jump to the real instruction
17862 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17863 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17864 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17865 * bail to the real handler if breakFlags==0.
17866 */
17867    ldrb   r3, [rSELF, #offThread_breakFlags]
17868    adrl   lr, dvmAsmInstructionStart + (152 * 64)
17869    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17870    cmp    r3, #0
17871    bxeq   lr                   @ nothing to do - jump to real handler
17872    EXPORT_PC()
17873    mov    r0, rPC              @ arg0
17874    mov    r1, rFP              @ arg1
17875    mov    r2, rSELF            @ arg2
17876    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17877
17878/* ------------------------------ */
17879    .balign 64
17880.L_ALT_OP_SHR_INT: /* 0x99 */
17881/* File: armv5te/alt_stub.S */
17882/*
17883 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17884 * any interesting requests and then jump to the real instruction
17885 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17886 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17887 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17888 * bail to the real handler if breakFlags==0.
17889 */
17890    ldrb   r3, [rSELF, #offThread_breakFlags]
17891    adrl   lr, dvmAsmInstructionStart + (153 * 64)
17892    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17893    cmp    r3, #0
17894    bxeq   lr                   @ nothing to do - jump to real handler
17895    EXPORT_PC()
17896    mov    r0, rPC              @ arg0
17897    mov    r1, rFP              @ arg1
17898    mov    r2, rSELF            @ arg2
17899    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17900
17901/* ------------------------------ */
17902    .balign 64
17903.L_ALT_OP_USHR_INT: /* 0x9a */
17904/* File: armv5te/alt_stub.S */
17905/*
17906 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17907 * any interesting requests and then jump to the real instruction
17908 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17909 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17910 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17911 * bail to the real handler if breakFlags==0.
17912 */
17913    ldrb   r3, [rSELF, #offThread_breakFlags]
17914    adrl   lr, dvmAsmInstructionStart + (154 * 64)
17915    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17916    cmp    r3, #0
17917    bxeq   lr                   @ nothing to do - jump to real handler
17918    EXPORT_PC()
17919    mov    r0, rPC              @ arg0
17920    mov    r1, rFP              @ arg1
17921    mov    r2, rSELF            @ arg2
17922    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17923
17924/* ------------------------------ */
17925    .balign 64
17926.L_ALT_OP_ADD_LONG: /* 0x9b */
17927/* File: armv5te/alt_stub.S */
17928/*
17929 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17930 * any interesting requests and then jump to the real instruction
17931 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17932 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17933 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17934 * bail to the real handler if breakFlags==0.
17935 */
17936    ldrb   r3, [rSELF, #offThread_breakFlags]
17937    adrl   lr, dvmAsmInstructionStart + (155 * 64)
17938    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17939    cmp    r3, #0
17940    bxeq   lr                   @ nothing to do - jump to real handler
17941    EXPORT_PC()
17942    mov    r0, rPC              @ arg0
17943    mov    r1, rFP              @ arg1
17944    mov    r2, rSELF            @ arg2
17945    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17946
17947/* ------------------------------ */
17948    .balign 64
17949.L_ALT_OP_SUB_LONG: /* 0x9c */
17950/* File: armv5te/alt_stub.S */
17951/*
17952 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17953 * any interesting requests and then jump to the real instruction
17954 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17955 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17956 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17957 * bail to the real handler if breakFlags==0.
17958 */
17959    ldrb   r3, [rSELF, #offThread_breakFlags]
17960    adrl   lr, dvmAsmInstructionStart + (156 * 64)
17961    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17962    cmp    r3, #0
17963    bxeq   lr                   @ nothing to do - jump to real handler
17964    EXPORT_PC()
17965    mov    r0, rPC              @ arg0
17966    mov    r1, rFP              @ arg1
17967    mov    r2, rSELF            @ arg2
17968    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17969
17970/* ------------------------------ */
17971    .balign 64
17972.L_ALT_OP_MUL_LONG: /* 0x9d */
17973/* File: armv5te/alt_stub.S */
17974/*
17975 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17976 * any interesting requests and then jump to the real instruction
17977 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17978 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17979 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17980 * bail to the real handler if breakFlags==0.
17981 */
17982    ldrb   r3, [rSELF, #offThread_breakFlags]
17983    adrl   lr, dvmAsmInstructionStart + (157 * 64)
17984    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17985    cmp    r3, #0
17986    bxeq   lr                   @ nothing to do - jump to real handler
17987    EXPORT_PC()
17988    mov    r0, rPC              @ arg0
17989    mov    r1, rFP              @ arg1
17990    mov    r2, rSELF            @ arg2
17991    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17992
17993/* ------------------------------ */
17994    .balign 64
17995.L_ALT_OP_DIV_LONG: /* 0x9e */
17996/* File: armv5te/alt_stub.S */
17997/*
17998 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17999 * any interesting requests and then jump to the real instruction
18000 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18001 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18002 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18003 * bail to the real handler if breakFlags==0.
18004 */
18005    ldrb   r3, [rSELF, #offThread_breakFlags]
18006    adrl   lr, dvmAsmInstructionStart + (158 * 64)
18007    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18008    cmp    r3, #0
18009    bxeq   lr                   @ nothing to do - jump to real handler
18010    EXPORT_PC()
18011    mov    r0, rPC              @ arg0
18012    mov    r1, rFP              @ arg1
18013    mov    r2, rSELF            @ arg2
18014    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18015
18016/* ------------------------------ */
18017    .balign 64
18018.L_ALT_OP_REM_LONG: /* 0x9f */
18019/* File: armv5te/alt_stub.S */
18020/*
18021 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18022 * any interesting requests and then jump to the real instruction
18023 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18024 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18025 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18026 * bail to the real handler if breakFlags==0.
18027 */
18028    ldrb   r3, [rSELF, #offThread_breakFlags]
18029    adrl   lr, dvmAsmInstructionStart + (159 * 64)
18030    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18031    cmp    r3, #0
18032    bxeq   lr                   @ nothing to do - jump to real handler
18033    EXPORT_PC()
18034    mov    r0, rPC              @ arg0
18035    mov    r1, rFP              @ arg1
18036    mov    r2, rSELF            @ arg2
18037    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18038
18039/* ------------------------------ */
18040    .balign 64
18041.L_ALT_OP_AND_LONG: /* 0xa0 */
18042/* File: armv5te/alt_stub.S */
18043/*
18044 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18045 * any interesting requests and then jump to the real instruction
18046 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18047 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18048 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18049 * bail to the real handler if breakFlags==0.
18050 */
18051    ldrb   r3, [rSELF, #offThread_breakFlags]
18052    adrl   lr, dvmAsmInstructionStart + (160 * 64)
18053    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18054    cmp    r3, #0
18055    bxeq   lr                   @ nothing to do - jump to real handler
18056    EXPORT_PC()
18057    mov    r0, rPC              @ arg0
18058    mov    r1, rFP              @ arg1
18059    mov    r2, rSELF            @ arg2
18060    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18061
18062/* ------------------------------ */
18063    .balign 64
18064.L_ALT_OP_OR_LONG: /* 0xa1 */
18065/* File: armv5te/alt_stub.S */
18066/*
18067 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18068 * any interesting requests and then jump to the real instruction
18069 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18070 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18071 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18072 * bail to the real handler if breakFlags==0.
18073 */
18074    ldrb   r3, [rSELF, #offThread_breakFlags]
18075    adrl   lr, dvmAsmInstructionStart + (161 * 64)
18076    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18077    cmp    r3, #0
18078    bxeq   lr                   @ nothing to do - jump to real handler
18079    EXPORT_PC()
18080    mov    r0, rPC              @ arg0
18081    mov    r1, rFP              @ arg1
18082    mov    r2, rSELF            @ arg2
18083    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18084
18085/* ------------------------------ */
18086    .balign 64
18087.L_ALT_OP_XOR_LONG: /* 0xa2 */
18088/* File: armv5te/alt_stub.S */
18089/*
18090 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18091 * any interesting requests and then jump to the real instruction
18092 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18093 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18094 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18095 * bail to the real handler if breakFlags==0.
18096 */
18097    ldrb   r3, [rSELF, #offThread_breakFlags]
18098    adrl   lr, dvmAsmInstructionStart + (162 * 64)
18099    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18100    cmp    r3, #0
18101    bxeq   lr                   @ nothing to do - jump to real handler
18102    EXPORT_PC()
18103    mov    r0, rPC              @ arg0
18104    mov    r1, rFP              @ arg1
18105    mov    r2, rSELF            @ arg2
18106    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18107
18108/* ------------------------------ */
18109    .balign 64
18110.L_ALT_OP_SHL_LONG: /* 0xa3 */
18111/* File: armv5te/alt_stub.S */
18112/*
18113 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18114 * any interesting requests and then jump to the real instruction
18115 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18116 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18117 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18118 * bail to the real handler if breakFlags==0.
18119 */
18120    ldrb   r3, [rSELF, #offThread_breakFlags]
18121    adrl   lr, dvmAsmInstructionStart + (163 * 64)
18122    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18123    cmp    r3, #0
18124    bxeq   lr                   @ nothing to do - jump to real handler
18125    EXPORT_PC()
18126    mov    r0, rPC              @ arg0
18127    mov    r1, rFP              @ arg1
18128    mov    r2, rSELF            @ arg2
18129    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18130
18131/* ------------------------------ */
18132    .balign 64
18133.L_ALT_OP_SHR_LONG: /* 0xa4 */
18134/* File: armv5te/alt_stub.S */
18135/*
18136 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18137 * any interesting requests and then jump to the real instruction
18138 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18139 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18140 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18141 * bail to the real handler if breakFlags==0.
18142 */
18143    ldrb   r3, [rSELF, #offThread_breakFlags]
18144    adrl   lr, dvmAsmInstructionStart + (164 * 64)
18145    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18146    cmp    r3, #0
18147    bxeq   lr                   @ nothing to do - jump to real handler
18148    EXPORT_PC()
18149    mov    r0, rPC              @ arg0
18150    mov    r1, rFP              @ arg1
18151    mov    r2, rSELF            @ arg2
18152    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18153
18154/* ------------------------------ */
18155    .balign 64
18156.L_ALT_OP_USHR_LONG: /* 0xa5 */
18157/* File: armv5te/alt_stub.S */
18158/*
18159 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18160 * any interesting requests and then jump to the real instruction
18161 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18162 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18163 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18164 * bail to the real handler if breakFlags==0.
18165 */
18166    ldrb   r3, [rSELF, #offThread_breakFlags]
18167    adrl   lr, dvmAsmInstructionStart + (165 * 64)
18168    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18169    cmp    r3, #0
18170    bxeq   lr                   @ nothing to do - jump to real handler
18171    EXPORT_PC()
18172    mov    r0, rPC              @ arg0
18173    mov    r1, rFP              @ arg1
18174    mov    r2, rSELF            @ arg2
18175    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18176
18177/* ------------------------------ */
18178    .balign 64
18179.L_ALT_OP_ADD_FLOAT: /* 0xa6 */
18180/* File: armv5te/alt_stub.S */
18181/*
18182 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18183 * any interesting requests and then jump to the real instruction
18184 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18185 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18186 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18187 * bail to the real handler if breakFlags==0.
18188 */
18189    ldrb   r3, [rSELF, #offThread_breakFlags]
18190    adrl   lr, dvmAsmInstructionStart + (166 * 64)
18191    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18192    cmp    r3, #0
18193    bxeq   lr                   @ nothing to do - jump to real handler
18194    EXPORT_PC()
18195    mov    r0, rPC              @ arg0
18196    mov    r1, rFP              @ arg1
18197    mov    r2, rSELF            @ arg2
18198    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18199
18200/* ------------------------------ */
18201    .balign 64
18202.L_ALT_OP_SUB_FLOAT: /* 0xa7 */
18203/* File: armv5te/alt_stub.S */
18204/*
18205 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18206 * any interesting requests and then jump to the real instruction
18207 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18208 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18209 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18210 * bail to the real handler if breakFlags==0.
18211 */
18212    ldrb   r3, [rSELF, #offThread_breakFlags]
18213    adrl   lr, dvmAsmInstructionStart + (167 * 64)
18214    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18215    cmp    r3, #0
18216    bxeq   lr                   @ nothing to do - jump to real handler
18217    EXPORT_PC()
18218    mov    r0, rPC              @ arg0
18219    mov    r1, rFP              @ arg1
18220    mov    r2, rSELF            @ arg2
18221    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18222
18223/* ------------------------------ */
18224    .balign 64
18225.L_ALT_OP_MUL_FLOAT: /* 0xa8 */
18226/* File: armv5te/alt_stub.S */
18227/*
18228 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18229 * any interesting requests and then jump to the real instruction
18230 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18231 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18232 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18233 * bail to the real handler if breakFlags==0.
18234 */
18235    ldrb   r3, [rSELF, #offThread_breakFlags]
18236    adrl   lr, dvmAsmInstructionStart + (168 * 64)
18237    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18238    cmp    r3, #0
18239    bxeq   lr                   @ nothing to do - jump to real handler
18240    EXPORT_PC()
18241    mov    r0, rPC              @ arg0
18242    mov    r1, rFP              @ arg1
18243    mov    r2, rSELF            @ arg2
18244    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18245
18246/* ------------------------------ */
18247    .balign 64
18248.L_ALT_OP_DIV_FLOAT: /* 0xa9 */
18249/* File: armv5te/alt_stub.S */
18250/*
18251 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18252 * any interesting requests and then jump to the real instruction
18253 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18254 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18255 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18256 * bail to the real handler if breakFlags==0.
18257 */
18258    ldrb   r3, [rSELF, #offThread_breakFlags]
18259    adrl   lr, dvmAsmInstructionStart + (169 * 64)
18260    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18261    cmp    r3, #0
18262    bxeq   lr                   @ nothing to do - jump to real handler
18263    EXPORT_PC()
18264    mov    r0, rPC              @ arg0
18265    mov    r1, rFP              @ arg1
18266    mov    r2, rSELF            @ arg2
18267    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18268
18269/* ------------------------------ */
18270    .balign 64
18271.L_ALT_OP_REM_FLOAT: /* 0xaa */
18272/* File: armv5te/alt_stub.S */
18273/*
18274 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18275 * any interesting requests and then jump to the real instruction
18276 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18277 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18278 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18279 * bail to the real handler if breakFlags==0.
18280 */
18281    ldrb   r3, [rSELF, #offThread_breakFlags]
18282    adrl   lr, dvmAsmInstructionStart + (170 * 64)
18283    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18284    cmp    r3, #0
18285    bxeq   lr                   @ nothing to do - jump to real handler
18286    EXPORT_PC()
18287    mov    r0, rPC              @ arg0
18288    mov    r1, rFP              @ arg1
18289    mov    r2, rSELF            @ arg2
18290    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18291
18292/* ------------------------------ */
18293    .balign 64
18294.L_ALT_OP_ADD_DOUBLE: /* 0xab */
18295/* File: armv5te/alt_stub.S */
18296/*
18297 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18298 * any interesting requests and then jump to the real instruction
18299 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18300 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18301 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18302 * bail to the real handler if breakFlags==0.
18303 */
18304    ldrb   r3, [rSELF, #offThread_breakFlags]
18305    adrl   lr, dvmAsmInstructionStart + (171 * 64)
18306    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18307    cmp    r3, #0
18308    bxeq   lr                   @ nothing to do - jump to real handler
18309    EXPORT_PC()
18310    mov    r0, rPC              @ arg0
18311    mov    r1, rFP              @ arg1
18312    mov    r2, rSELF            @ arg2
18313    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18314
18315/* ------------------------------ */
18316    .balign 64
18317.L_ALT_OP_SUB_DOUBLE: /* 0xac */
18318/* File: armv5te/alt_stub.S */
18319/*
18320 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18321 * any interesting requests and then jump to the real instruction
18322 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18323 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18324 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18325 * bail to the real handler if breakFlags==0.
18326 */
18327    ldrb   r3, [rSELF, #offThread_breakFlags]
18328    adrl   lr, dvmAsmInstructionStart + (172 * 64)
18329    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18330    cmp    r3, #0
18331    bxeq   lr                   @ nothing to do - jump to real handler
18332    EXPORT_PC()
18333    mov    r0, rPC              @ arg0
18334    mov    r1, rFP              @ arg1
18335    mov    r2, rSELF            @ arg2
18336    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18337
18338/* ------------------------------ */
18339    .balign 64
18340.L_ALT_OP_MUL_DOUBLE: /* 0xad */
18341/* File: armv5te/alt_stub.S */
18342/*
18343 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18344 * any interesting requests and then jump to the real instruction
18345 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18346 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18347 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18348 * bail to the real handler if breakFlags==0.
18349 */
18350    ldrb   r3, [rSELF, #offThread_breakFlags]
18351    adrl   lr, dvmAsmInstructionStart + (173 * 64)
18352    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18353    cmp    r3, #0
18354    bxeq   lr                   @ nothing to do - jump to real handler
18355    EXPORT_PC()
18356    mov    r0, rPC              @ arg0
18357    mov    r1, rFP              @ arg1
18358    mov    r2, rSELF            @ arg2
18359    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18360
18361/* ------------------------------ */
18362    .balign 64
18363.L_ALT_OP_DIV_DOUBLE: /* 0xae */
18364/* File: armv5te/alt_stub.S */
18365/*
18366 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18367 * any interesting requests and then jump to the real instruction
18368 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18369 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18370 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18371 * bail to the real handler if breakFlags==0.
18372 */
18373    ldrb   r3, [rSELF, #offThread_breakFlags]
18374    adrl   lr, dvmAsmInstructionStart + (174 * 64)
18375    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18376    cmp    r3, #0
18377    bxeq   lr                   @ nothing to do - jump to real handler
18378    EXPORT_PC()
18379    mov    r0, rPC              @ arg0
18380    mov    r1, rFP              @ arg1
18381    mov    r2, rSELF            @ arg2
18382    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18383
18384/* ------------------------------ */
18385    .balign 64
18386.L_ALT_OP_REM_DOUBLE: /* 0xaf */
18387/* File: armv5te/alt_stub.S */
18388/*
18389 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18390 * any interesting requests and then jump to the real instruction
18391 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18392 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18393 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18394 * bail to the real handler if breakFlags==0.
18395 */
18396    ldrb   r3, [rSELF, #offThread_breakFlags]
18397    adrl   lr, dvmAsmInstructionStart + (175 * 64)
18398    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18399    cmp    r3, #0
18400    bxeq   lr                   @ nothing to do - jump to real handler
18401    EXPORT_PC()
18402    mov    r0, rPC              @ arg0
18403    mov    r1, rFP              @ arg1
18404    mov    r2, rSELF            @ arg2
18405    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18406
18407/* ------------------------------ */
18408    .balign 64
18409.L_ALT_OP_ADD_INT_2ADDR: /* 0xb0 */
18410/* File: armv5te/alt_stub.S */
18411/*
18412 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18413 * any interesting requests and then jump to the real instruction
18414 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18415 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18416 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18417 * bail to the real handler if breakFlags==0.
18418 */
18419    ldrb   r3, [rSELF, #offThread_breakFlags]
18420    adrl   lr, dvmAsmInstructionStart + (176 * 64)
18421    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18422    cmp    r3, #0
18423    bxeq   lr                   @ nothing to do - jump to real handler
18424    EXPORT_PC()
18425    mov    r0, rPC              @ arg0
18426    mov    r1, rFP              @ arg1
18427    mov    r2, rSELF            @ arg2
18428    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18429
18430/* ------------------------------ */
18431    .balign 64
18432.L_ALT_OP_SUB_INT_2ADDR: /* 0xb1 */
18433/* File: armv5te/alt_stub.S */
18434/*
18435 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18436 * any interesting requests and then jump to the real instruction
18437 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18438 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18439 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18440 * bail to the real handler if breakFlags==0.
18441 */
18442    ldrb   r3, [rSELF, #offThread_breakFlags]
18443    adrl   lr, dvmAsmInstructionStart + (177 * 64)
18444    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18445    cmp    r3, #0
18446    bxeq   lr                   @ nothing to do - jump to real handler
18447    EXPORT_PC()
18448    mov    r0, rPC              @ arg0
18449    mov    r1, rFP              @ arg1
18450    mov    r2, rSELF            @ arg2
18451    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18452
18453/* ------------------------------ */
18454    .balign 64
18455.L_ALT_OP_MUL_INT_2ADDR: /* 0xb2 */
18456/* File: armv5te/alt_stub.S */
18457/*
18458 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18459 * any interesting requests and then jump to the real instruction
18460 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18461 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18462 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18463 * bail to the real handler if breakFlags==0.
18464 */
18465    ldrb   r3, [rSELF, #offThread_breakFlags]
18466    adrl   lr, dvmAsmInstructionStart + (178 * 64)
18467    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18468    cmp    r3, #0
18469    bxeq   lr                   @ nothing to do - jump to real handler
18470    EXPORT_PC()
18471    mov    r0, rPC              @ arg0
18472    mov    r1, rFP              @ arg1
18473    mov    r2, rSELF            @ arg2
18474    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18475
18476/* ------------------------------ */
18477    .balign 64
18478.L_ALT_OP_DIV_INT_2ADDR: /* 0xb3 */
18479/* File: armv5te/alt_stub.S */
18480/*
18481 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18482 * any interesting requests and then jump to the real instruction
18483 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18484 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18485 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18486 * bail to the real handler if breakFlags==0.
18487 */
18488    ldrb   r3, [rSELF, #offThread_breakFlags]
18489    adrl   lr, dvmAsmInstructionStart + (179 * 64)
18490    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18491    cmp    r3, #0
18492    bxeq   lr                   @ nothing to do - jump to real handler
18493    EXPORT_PC()
18494    mov    r0, rPC              @ arg0
18495    mov    r1, rFP              @ arg1
18496    mov    r2, rSELF            @ arg2
18497    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18498
18499/* ------------------------------ */
18500    .balign 64
18501.L_ALT_OP_REM_INT_2ADDR: /* 0xb4 */
18502/* File: armv5te/alt_stub.S */
18503/*
18504 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18505 * any interesting requests and then jump to the real instruction
18506 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18507 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18508 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18509 * bail to the real handler if breakFlags==0.
18510 */
18511    ldrb   r3, [rSELF, #offThread_breakFlags]
18512    adrl   lr, dvmAsmInstructionStart + (180 * 64)
18513    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18514    cmp    r3, #0
18515    bxeq   lr                   @ nothing to do - jump to real handler
18516    EXPORT_PC()
18517    mov    r0, rPC              @ arg0
18518    mov    r1, rFP              @ arg1
18519    mov    r2, rSELF            @ arg2
18520    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18521
18522/* ------------------------------ */
18523    .balign 64
18524.L_ALT_OP_AND_INT_2ADDR: /* 0xb5 */
18525/* File: armv5te/alt_stub.S */
18526/*
18527 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18528 * any interesting requests and then jump to the real instruction
18529 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18530 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18531 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18532 * bail to the real handler if breakFlags==0.
18533 */
18534    ldrb   r3, [rSELF, #offThread_breakFlags]
18535    adrl   lr, dvmAsmInstructionStart + (181 * 64)
18536    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18537    cmp    r3, #0
18538    bxeq   lr                   @ nothing to do - jump to real handler
18539    EXPORT_PC()
18540    mov    r0, rPC              @ arg0
18541    mov    r1, rFP              @ arg1
18542    mov    r2, rSELF            @ arg2
18543    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18544
18545/* ------------------------------ */
18546    .balign 64
18547.L_ALT_OP_OR_INT_2ADDR: /* 0xb6 */
18548/* File: armv5te/alt_stub.S */
18549/*
18550 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18551 * any interesting requests and then jump to the real instruction
18552 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18553 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18554 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18555 * bail to the real handler if breakFlags==0.
18556 */
18557    ldrb   r3, [rSELF, #offThread_breakFlags]
18558    adrl   lr, dvmAsmInstructionStart + (182 * 64)
18559    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18560    cmp    r3, #0
18561    bxeq   lr                   @ nothing to do - jump to real handler
18562    EXPORT_PC()
18563    mov    r0, rPC              @ arg0
18564    mov    r1, rFP              @ arg1
18565    mov    r2, rSELF            @ arg2
18566    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18567
18568/* ------------------------------ */
18569    .balign 64
18570.L_ALT_OP_XOR_INT_2ADDR: /* 0xb7 */
18571/* File: armv5te/alt_stub.S */
18572/*
18573 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18574 * any interesting requests and then jump to the real instruction
18575 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18576 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18577 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18578 * bail to the real handler if breakFlags==0.
18579 */
18580    ldrb   r3, [rSELF, #offThread_breakFlags]
18581    adrl   lr, dvmAsmInstructionStart + (183 * 64)
18582    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18583    cmp    r3, #0
18584    bxeq   lr                   @ nothing to do - jump to real handler
18585    EXPORT_PC()
18586    mov    r0, rPC              @ arg0
18587    mov    r1, rFP              @ arg1
18588    mov    r2, rSELF            @ arg2
18589    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18590
18591/* ------------------------------ */
18592    .balign 64
18593.L_ALT_OP_SHL_INT_2ADDR: /* 0xb8 */
18594/* File: armv5te/alt_stub.S */
18595/*
18596 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18597 * any interesting requests and then jump to the real instruction
18598 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18599 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18600 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18601 * bail to the real handler if breakFlags==0.
18602 */
18603    ldrb   r3, [rSELF, #offThread_breakFlags]
18604    adrl   lr, dvmAsmInstructionStart + (184 * 64)
18605    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18606    cmp    r3, #0
18607    bxeq   lr                   @ nothing to do - jump to real handler
18608    EXPORT_PC()
18609    mov    r0, rPC              @ arg0
18610    mov    r1, rFP              @ arg1
18611    mov    r2, rSELF            @ arg2
18612    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18613
18614/* ------------------------------ */
18615    .balign 64
18616.L_ALT_OP_SHR_INT_2ADDR: /* 0xb9 */
18617/* File: armv5te/alt_stub.S */
18618/*
18619 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18620 * any interesting requests and then jump to the real instruction
18621 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18622 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18623 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18624 * bail to the real handler if breakFlags==0.
18625 */
18626    ldrb   r3, [rSELF, #offThread_breakFlags]
18627    adrl   lr, dvmAsmInstructionStart + (185 * 64)
18628    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18629    cmp    r3, #0
18630    bxeq   lr                   @ nothing to do - jump to real handler
18631    EXPORT_PC()
18632    mov    r0, rPC              @ arg0
18633    mov    r1, rFP              @ arg1
18634    mov    r2, rSELF            @ arg2
18635    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18636
18637/* ------------------------------ */
18638    .balign 64
18639.L_ALT_OP_USHR_INT_2ADDR: /* 0xba */
18640/* File: armv5te/alt_stub.S */
18641/*
18642 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18643 * any interesting requests and then jump to the real instruction
18644 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18645 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18646 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18647 * bail to the real handler if breakFlags==0.
18648 */
18649    ldrb   r3, [rSELF, #offThread_breakFlags]
18650    adrl   lr, dvmAsmInstructionStart + (186 * 64)
18651    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18652    cmp    r3, #0
18653    bxeq   lr                   @ nothing to do - jump to real handler
18654    EXPORT_PC()
18655    mov    r0, rPC              @ arg0
18656    mov    r1, rFP              @ arg1
18657    mov    r2, rSELF            @ arg2
18658    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18659
18660/* ------------------------------ */
18661    .balign 64
18662.L_ALT_OP_ADD_LONG_2ADDR: /* 0xbb */
18663/* File: armv5te/alt_stub.S */
18664/*
18665 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18666 * any interesting requests and then jump to the real instruction
18667 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18668 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18669 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18670 * bail to the real handler if breakFlags==0.
18671 */
18672    ldrb   r3, [rSELF, #offThread_breakFlags]
18673    adrl   lr, dvmAsmInstructionStart + (187 * 64)
18674    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18675    cmp    r3, #0
18676    bxeq   lr                   @ nothing to do - jump to real handler
18677    EXPORT_PC()
18678    mov    r0, rPC              @ arg0
18679    mov    r1, rFP              @ arg1
18680    mov    r2, rSELF            @ arg2
18681    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18682
18683/* ------------------------------ */
18684    .balign 64
18685.L_ALT_OP_SUB_LONG_2ADDR: /* 0xbc */
18686/* File: armv5te/alt_stub.S */
18687/*
18688 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18689 * any interesting requests and then jump to the real instruction
18690 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18691 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18692 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18693 * bail to the real handler if breakFlags==0.
18694 */
18695    ldrb   r3, [rSELF, #offThread_breakFlags]
18696    adrl   lr, dvmAsmInstructionStart + (188 * 64)
18697    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18698    cmp    r3, #0
18699    bxeq   lr                   @ nothing to do - jump to real handler
18700    EXPORT_PC()
18701    mov    r0, rPC              @ arg0
18702    mov    r1, rFP              @ arg1
18703    mov    r2, rSELF            @ arg2
18704    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18705
18706/* ------------------------------ */
18707    .balign 64
18708.L_ALT_OP_MUL_LONG_2ADDR: /* 0xbd */
18709/* File: armv5te/alt_stub.S */
18710/*
18711 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18712 * any interesting requests and then jump to the real instruction
18713 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18714 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18715 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18716 * bail to the real handler if breakFlags==0.
18717 */
18718    ldrb   r3, [rSELF, #offThread_breakFlags]
18719    adrl   lr, dvmAsmInstructionStart + (189 * 64)
18720    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18721    cmp    r3, #0
18722    bxeq   lr                   @ nothing to do - jump to real handler
18723    EXPORT_PC()
18724    mov    r0, rPC              @ arg0
18725    mov    r1, rFP              @ arg1
18726    mov    r2, rSELF            @ arg2
18727    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18728
18729/* ------------------------------ */
18730    .balign 64
18731.L_ALT_OP_DIV_LONG_2ADDR: /* 0xbe */
18732/* File: armv5te/alt_stub.S */
18733/*
18734 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18735 * any interesting requests and then jump to the real instruction
18736 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18737 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18738 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18739 * bail to the real handler if breakFlags==0.
18740 */
18741    ldrb   r3, [rSELF, #offThread_breakFlags]
18742    adrl   lr, dvmAsmInstructionStart + (190 * 64)
18743    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18744    cmp    r3, #0
18745    bxeq   lr                   @ nothing to do - jump to real handler
18746    EXPORT_PC()
18747    mov    r0, rPC              @ arg0
18748    mov    r1, rFP              @ arg1
18749    mov    r2, rSELF            @ arg2
18750    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18751
18752/* ------------------------------ */
18753    .balign 64
18754.L_ALT_OP_REM_LONG_2ADDR: /* 0xbf */
18755/* File: armv5te/alt_stub.S */
18756/*
18757 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18758 * any interesting requests and then jump to the real instruction
18759 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18760 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18761 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18762 * bail to the real handler if breakFlags==0.
18763 */
18764    ldrb   r3, [rSELF, #offThread_breakFlags]
18765    adrl   lr, dvmAsmInstructionStart + (191 * 64)
18766    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18767    cmp    r3, #0
18768    bxeq   lr                   @ nothing to do - jump to real handler
18769    EXPORT_PC()
18770    mov    r0, rPC              @ arg0
18771    mov    r1, rFP              @ arg1
18772    mov    r2, rSELF            @ arg2
18773    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18774
18775/* ------------------------------ */
18776    .balign 64
18777.L_ALT_OP_AND_LONG_2ADDR: /* 0xc0 */
18778/* File: armv5te/alt_stub.S */
18779/*
18780 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18781 * any interesting requests and then jump to the real instruction
18782 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18783 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18784 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18785 * bail to the real handler if breakFlags==0.
18786 */
18787    ldrb   r3, [rSELF, #offThread_breakFlags]
18788    adrl   lr, dvmAsmInstructionStart + (192 * 64)
18789    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18790    cmp    r3, #0
18791    bxeq   lr                   @ nothing to do - jump to real handler
18792    EXPORT_PC()
18793    mov    r0, rPC              @ arg0
18794    mov    r1, rFP              @ arg1
18795    mov    r2, rSELF            @ arg2
18796    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18797
18798/* ------------------------------ */
18799    .balign 64
18800.L_ALT_OP_OR_LONG_2ADDR: /* 0xc1 */
18801/* File: armv5te/alt_stub.S */
18802/*
18803 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18804 * any interesting requests and then jump to the real instruction
18805 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18806 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18807 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18808 * bail to the real handler if breakFlags==0.
18809 */
18810    ldrb   r3, [rSELF, #offThread_breakFlags]
18811    adrl   lr, dvmAsmInstructionStart + (193 * 64)
18812    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18813    cmp    r3, #0
18814    bxeq   lr                   @ nothing to do - jump to real handler
18815    EXPORT_PC()
18816    mov    r0, rPC              @ arg0
18817    mov    r1, rFP              @ arg1
18818    mov    r2, rSELF            @ arg2
18819    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18820
18821/* ------------------------------ */
18822    .balign 64
18823.L_ALT_OP_XOR_LONG_2ADDR: /* 0xc2 */
18824/* File: armv5te/alt_stub.S */
18825/*
18826 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18827 * any interesting requests and then jump to the real instruction
18828 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18829 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18830 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18831 * bail to the real handler if breakFlags==0.
18832 */
18833    ldrb   r3, [rSELF, #offThread_breakFlags]
18834    adrl   lr, dvmAsmInstructionStart + (194 * 64)
18835    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18836    cmp    r3, #0
18837    bxeq   lr                   @ nothing to do - jump to real handler
18838    EXPORT_PC()
18839    mov    r0, rPC              @ arg0
18840    mov    r1, rFP              @ arg1
18841    mov    r2, rSELF            @ arg2
18842    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18843
18844/* ------------------------------ */
18845    .balign 64
18846.L_ALT_OP_SHL_LONG_2ADDR: /* 0xc3 */
18847/* File: armv5te/alt_stub.S */
18848/*
18849 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18850 * any interesting requests and then jump to the real instruction
18851 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18852 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18853 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18854 * bail to the real handler if breakFlags==0.
18855 */
18856    ldrb   r3, [rSELF, #offThread_breakFlags]
18857    adrl   lr, dvmAsmInstructionStart + (195 * 64)
18858    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18859    cmp    r3, #0
18860    bxeq   lr                   @ nothing to do - jump to real handler
18861    EXPORT_PC()
18862    mov    r0, rPC              @ arg0
18863    mov    r1, rFP              @ arg1
18864    mov    r2, rSELF            @ arg2
18865    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18866
18867/* ------------------------------ */
18868    .balign 64
18869.L_ALT_OP_SHR_LONG_2ADDR: /* 0xc4 */
18870/* File: armv5te/alt_stub.S */
18871/*
18872 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18873 * any interesting requests and then jump to the real instruction
18874 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18875 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18876 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18877 * bail to the real handler if breakFlags==0.
18878 */
18879    ldrb   r3, [rSELF, #offThread_breakFlags]
18880    adrl   lr, dvmAsmInstructionStart + (196 * 64)
18881    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18882    cmp    r3, #0
18883    bxeq   lr                   @ nothing to do - jump to real handler
18884    EXPORT_PC()
18885    mov    r0, rPC              @ arg0
18886    mov    r1, rFP              @ arg1
18887    mov    r2, rSELF            @ arg2
18888    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18889
18890/* ------------------------------ */
18891    .balign 64
18892.L_ALT_OP_USHR_LONG_2ADDR: /* 0xc5 */
18893/* File: armv5te/alt_stub.S */
18894/*
18895 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18896 * any interesting requests and then jump to the real instruction
18897 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18898 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18899 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18900 * bail to the real handler if breakFlags==0.
18901 */
18902    ldrb   r3, [rSELF, #offThread_breakFlags]
18903    adrl   lr, dvmAsmInstructionStart + (197 * 64)
18904    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18905    cmp    r3, #0
18906    bxeq   lr                   @ nothing to do - jump to real handler
18907    EXPORT_PC()
18908    mov    r0, rPC              @ arg0
18909    mov    r1, rFP              @ arg1
18910    mov    r2, rSELF            @ arg2
18911    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18912
18913/* ------------------------------ */
18914    .balign 64
18915.L_ALT_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
18916/* File: armv5te/alt_stub.S */
18917/*
18918 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18919 * any interesting requests and then jump to the real instruction
18920 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18921 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18922 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18923 * bail to the real handler if breakFlags==0.
18924 */
18925    ldrb   r3, [rSELF, #offThread_breakFlags]
18926    adrl   lr, dvmAsmInstructionStart + (198 * 64)
18927    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18928    cmp    r3, #0
18929    bxeq   lr                   @ nothing to do - jump to real handler
18930    EXPORT_PC()
18931    mov    r0, rPC              @ arg0
18932    mov    r1, rFP              @ arg1
18933    mov    r2, rSELF            @ arg2
18934    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18935
18936/* ------------------------------ */
18937    .balign 64
18938.L_ALT_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
18939/* File: armv5te/alt_stub.S */
18940/*
18941 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18942 * any interesting requests and then jump to the real instruction
18943 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18944 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18945 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18946 * bail to the real handler if breakFlags==0.
18947 */
18948    ldrb   r3, [rSELF, #offThread_breakFlags]
18949    adrl   lr, dvmAsmInstructionStart + (199 * 64)
18950    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18951    cmp    r3, #0
18952    bxeq   lr                   @ nothing to do - jump to real handler
18953    EXPORT_PC()
18954    mov    r0, rPC              @ arg0
18955    mov    r1, rFP              @ arg1
18956    mov    r2, rSELF            @ arg2
18957    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18958
18959/* ------------------------------ */
18960    .balign 64
18961.L_ALT_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
18962/* File: armv5te/alt_stub.S */
18963/*
18964 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18965 * any interesting requests and then jump to the real instruction
18966 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18967 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18968 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18969 * bail to the real handler if breakFlags==0.
18970 */
18971    ldrb   r3, [rSELF, #offThread_breakFlags]
18972    adrl   lr, dvmAsmInstructionStart + (200 * 64)
18973    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18974    cmp    r3, #0
18975    bxeq   lr                   @ nothing to do - jump to real handler
18976    EXPORT_PC()
18977    mov    r0, rPC              @ arg0
18978    mov    r1, rFP              @ arg1
18979    mov    r2, rSELF            @ arg2
18980    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18981
18982/* ------------------------------ */
18983    .balign 64
18984.L_ALT_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
18985/* File: armv5te/alt_stub.S */
18986/*
18987 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18988 * any interesting requests and then jump to the real instruction
18989 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18990 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18991 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18992 * bail to the real handler if breakFlags==0.
18993 */
18994    ldrb   r3, [rSELF, #offThread_breakFlags]
18995    adrl   lr, dvmAsmInstructionStart + (201 * 64)
18996    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18997    cmp    r3, #0
18998    bxeq   lr                   @ nothing to do - jump to real handler
18999    EXPORT_PC()
19000    mov    r0, rPC              @ arg0
19001    mov    r1, rFP              @ arg1
19002    mov    r2, rSELF            @ arg2
19003    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19004
19005/* ------------------------------ */
19006    .balign 64
19007.L_ALT_OP_REM_FLOAT_2ADDR: /* 0xca */
19008/* File: armv5te/alt_stub.S */
19009/*
19010 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19011 * any interesting requests and then jump to the real instruction
19012 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19013 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19014 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19015 * bail to the real handler if breakFlags==0.
19016 */
19017    ldrb   r3, [rSELF, #offThread_breakFlags]
19018    adrl   lr, dvmAsmInstructionStart + (202 * 64)
19019    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19020    cmp    r3, #0
19021    bxeq   lr                   @ nothing to do - jump to real handler
19022    EXPORT_PC()
19023    mov    r0, rPC              @ arg0
19024    mov    r1, rFP              @ arg1
19025    mov    r2, rSELF            @ arg2
19026    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19027
19028/* ------------------------------ */
19029    .balign 64
19030.L_ALT_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
19031/* File: armv5te/alt_stub.S */
19032/*
19033 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19034 * any interesting requests and then jump to the real instruction
19035 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19036 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19037 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19038 * bail to the real handler if breakFlags==0.
19039 */
19040    ldrb   r3, [rSELF, #offThread_breakFlags]
19041    adrl   lr, dvmAsmInstructionStart + (203 * 64)
19042    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19043    cmp    r3, #0
19044    bxeq   lr                   @ nothing to do - jump to real handler
19045    EXPORT_PC()
19046    mov    r0, rPC              @ arg0
19047    mov    r1, rFP              @ arg1
19048    mov    r2, rSELF            @ arg2
19049    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19050
19051/* ------------------------------ */
19052    .balign 64
19053.L_ALT_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
19054/* File: armv5te/alt_stub.S */
19055/*
19056 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19057 * any interesting requests and then jump to the real instruction
19058 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19059 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19060 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19061 * bail to the real handler if breakFlags==0.
19062 */
19063    ldrb   r3, [rSELF, #offThread_breakFlags]
19064    adrl   lr, dvmAsmInstructionStart + (204 * 64)
19065    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19066    cmp    r3, #0
19067    bxeq   lr                   @ nothing to do - jump to real handler
19068    EXPORT_PC()
19069    mov    r0, rPC              @ arg0
19070    mov    r1, rFP              @ arg1
19071    mov    r2, rSELF            @ arg2
19072    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19073
19074/* ------------------------------ */
19075    .balign 64
19076.L_ALT_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
19077/* File: armv5te/alt_stub.S */
19078/*
19079 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19080 * any interesting requests and then jump to the real instruction
19081 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19082 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19083 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19084 * bail to the real handler if breakFlags==0.
19085 */
19086    ldrb   r3, [rSELF, #offThread_breakFlags]
19087    adrl   lr, dvmAsmInstructionStart + (205 * 64)
19088    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19089    cmp    r3, #0
19090    bxeq   lr                   @ nothing to do - jump to real handler
19091    EXPORT_PC()
19092    mov    r0, rPC              @ arg0
19093    mov    r1, rFP              @ arg1
19094    mov    r2, rSELF            @ arg2
19095    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19096
19097/* ------------------------------ */
19098    .balign 64
19099.L_ALT_OP_DIV_DOUBLE_2ADDR: /* 0xce */
19100/* File: armv5te/alt_stub.S */
19101/*
19102 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19103 * any interesting requests and then jump to the real instruction
19104 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19105 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19106 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19107 * bail to the real handler if breakFlags==0.
19108 */
19109    ldrb   r3, [rSELF, #offThread_breakFlags]
19110    adrl   lr, dvmAsmInstructionStart + (206 * 64)
19111    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19112    cmp    r3, #0
19113    bxeq   lr                   @ nothing to do - jump to real handler
19114    EXPORT_PC()
19115    mov    r0, rPC              @ arg0
19116    mov    r1, rFP              @ arg1
19117    mov    r2, rSELF            @ arg2
19118    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19119
19120/* ------------------------------ */
19121    .balign 64
19122.L_ALT_OP_REM_DOUBLE_2ADDR: /* 0xcf */
19123/* File: armv5te/alt_stub.S */
19124/*
19125 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19126 * any interesting requests and then jump to the real instruction
19127 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19128 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19129 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19130 * bail to the real handler if breakFlags==0.
19131 */
19132    ldrb   r3, [rSELF, #offThread_breakFlags]
19133    adrl   lr, dvmAsmInstructionStart + (207 * 64)
19134    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19135    cmp    r3, #0
19136    bxeq   lr                   @ nothing to do - jump to real handler
19137    EXPORT_PC()
19138    mov    r0, rPC              @ arg0
19139    mov    r1, rFP              @ arg1
19140    mov    r2, rSELF            @ arg2
19141    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19142
19143/* ------------------------------ */
19144    .balign 64
19145.L_ALT_OP_ADD_INT_LIT16: /* 0xd0 */
19146/* File: armv5te/alt_stub.S */
19147/*
19148 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19149 * any interesting requests and then jump to the real instruction
19150 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19151 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19152 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19153 * bail to the real handler if breakFlags==0.
19154 */
19155    ldrb   r3, [rSELF, #offThread_breakFlags]
19156    adrl   lr, dvmAsmInstructionStart + (208 * 64)
19157    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19158    cmp    r3, #0
19159    bxeq   lr                   @ nothing to do - jump to real handler
19160    EXPORT_PC()
19161    mov    r0, rPC              @ arg0
19162    mov    r1, rFP              @ arg1
19163    mov    r2, rSELF            @ arg2
19164    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19165
19166/* ------------------------------ */
19167    .balign 64
19168.L_ALT_OP_RSUB_INT: /* 0xd1 */
19169/* File: armv5te/alt_stub.S */
19170/*
19171 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19172 * any interesting requests and then jump to the real instruction
19173 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19174 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19175 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19176 * bail to the real handler if breakFlags==0.
19177 */
19178    ldrb   r3, [rSELF, #offThread_breakFlags]
19179    adrl   lr, dvmAsmInstructionStart + (209 * 64)
19180    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19181    cmp    r3, #0
19182    bxeq   lr                   @ nothing to do - jump to real handler
19183    EXPORT_PC()
19184    mov    r0, rPC              @ arg0
19185    mov    r1, rFP              @ arg1
19186    mov    r2, rSELF            @ arg2
19187    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19188
19189/* ------------------------------ */
19190    .balign 64
19191.L_ALT_OP_MUL_INT_LIT16: /* 0xd2 */
19192/* File: armv5te/alt_stub.S */
19193/*
19194 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19195 * any interesting requests and then jump to the real instruction
19196 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19197 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19198 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19199 * bail to the real handler if breakFlags==0.
19200 */
19201    ldrb   r3, [rSELF, #offThread_breakFlags]
19202    adrl   lr, dvmAsmInstructionStart + (210 * 64)
19203    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19204    cmp    r3, #0
19205    bxeq   lr                   @ nothing to do - jump to real handler
19206    EXPORT_PC()
19207    mov    r0, rPC              @ arg0
19208    mov    r1, rFP              @ arg1
19209    mov    r2, rSELF            @ arg2
19210    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19211
19212/* ------------------------------ */
19213    .balign 64
19214.L_ALT_OP_DIV_INT_LIT16: /* 0xd3 */
19215/* File: armv5te/alt_stub.S */
19216/*
19217 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19218 * any interesting requests and then jump to the real instruction
19219 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19220 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19221 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19222 * bail to the real handler if breakFlags==0.
19223 */
19224    ldrb   r3, [rSELF, #offThread_breakFlags]
19225    adrl   lr, dvmAsmInstructionStart + (211 * 64)
19226    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19227    cmp    r3, #0
19228    bxeq   lr                   @ nothing to do - jump to real handler
19229    EXPORT_PC()
19230    mov    r0, rPC              @ arg0
19231    mov    r1, rFP              @ arg1
19232    mov    r2, rSELF            @ arg2
19233    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19234
19235/* ------------------------------ */
19236    .balign 64
19237.L_ALT_OP_REM_INT_LIT16: /* 0xd4 */
19238/* File: armv5te/alt_stub.S */
19239/*
19240 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19241 * any interesting requests and then jump to the real instruction
19242 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19243 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19244 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19245 * bail to the real handler if breakFlags==0.
19246 */
19247    ldrb   r3, [rSELF, #offThread_breakFlags]
19248    adrl   lr, dvmAsmInstructionStart + (212 * 64)
19249    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19250    cmp    r3, #0
19251    bxeq   lr                   @ nothing to do - jump to real handler
19252    EXPORT_PC()
19253    mov    r0, rPC              @ arg0
19254    mov    r1, rFP              @ arg1
19255    mov    r2, rSELF            @ arg2
19256    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19257
19258/* ------------------------------ */
19259    .balign 64
19260.L_ALT_OP_AND_INT_LIT16: /* 0xd5 */
19261/* File: armv5te/alt_stub.S */
19262/*
19263 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19264 * any interesting requests and then jump to the real instruction
19265 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19266 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19267 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19268 * bail to the real handler if breakFlags==0.
19269 */
19270    ldrb   r3, [rSELF, #offThread_breakFlags]
19271    adrl   lr, dvmAsmInstructionStart + (213 * 64)
19272    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19273    cmp    r3, #0
19274    bxeq   lr                   @ nothing to do - jump to real handler
19275    EXPORT_PC()
19276    mov    r0, rPC              @ arg0
19277    mov    r1, rFP              @ arg1
19278    mov    r2, rSELF            @ arg2
19279    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19280
19281/* ------------------------------ */
19282    .balign 64
19283.L_ALT_OP_OR_INT_LIT16: /* 0xd6 */
19284/* File: armv5te/alt_stub.S */
19285/*
19286 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19287 * any interesting requests and then jump to the real instruction
19288 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19289 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19290 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19291 * bail to the real handler if breakFlags==0.
19292 */
19293    ldrb   r3, [rSELF, #offThread_breakFlags]
19294    adrl   lr, dvmAsmInstructionStart + (214 * 64)
19295    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19296    cmp    r3, #0
19297    bxeq   lr                   @ nothing to do - jump to real handler
19298    EXPORT_PC()
19299    mov    r0, rPC              @ arg0
19300    mov    r1, rFP              @ arg1
19301    mov    r2, rSELF            @ arg2
19302    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19303
19304/* ------------------------------ */
19305    .balign 64
19306.L_ALT_OP_XOR_INT_LIT16: /* 0xd7 */
19307/* File: armv5te/alt_stub.S */
19308/*
19309 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19310 * any interesting requests and then jump to the real instruction
19311 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19312 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19313 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19314 * bail to the real handler if breakFlags==0.
19315 */
19316    ldrb   r3, [rSELF, #offThread_breakFlags]
19317    adrl   lr, dvmAsmInstructionStart + (215 * 64)
19318    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19319    cmp    r3, #0
19320    bxeq   lr                   @ nothing to do - jump to real handler
19321    EXPORT_PC()
19322    mov    r0, rPC              @ arg0
19323    mov    r1, rFP              @ arg1
19324    mov    r2, rSELF            @ arg2
19325    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19326
19327/* ------------------------------ */
19328    .balign 64
19329.L_ALT_OP_ADD_INT_LIT8: /* 0xd8 */
19330/* File: armv5te/alt_stub.S */
19331/*
19332 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19333 * any interesting requests and then jump to the real instruction
19334 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19335 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19336 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19337 * bail to the real handler if breakFlags==0.
19338 */
19339    ldrb   r3, [rSELF, #offThread_breakFlags]
19340    adrl   lr, dvmAsmInstructionStart + (216 * 64)
19341    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19342    cmp    r3, #0
19343    bxeq   lr                   @ nothing to do - jump to real handler
19344    EXPORT_PC()
19345    mov    r0, rPC              @ arg0
19346    mov    r1, rFP              @ arg1
19347    mov    r2, rSELF            @ arg2
19348    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19349
19350/* ------------------------------ */
19351    .balign 64
19352.L_ALT_OP_RSUB_INT_LIT8: /* 0xd9 */
19353/* File: armv5te/alt_stub.S */
19354/*
19355 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19356 * any interesting requests and then jump to the real instruction
19357 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19358 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19359 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19360 * bail to the real handler if breakFlags==0.
19361 */
19362    ldrb   r3, [rSELF, #offThread_breakFlags]
19363    adrl   lr, dvmAsmInstructionStart + (217 * 64)
19364    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19365    cmp    r3, #0
19366    bxeq   lr                   @ nothing to do - jump to real handler
19367    EXPORT_PC()
19368    mov    r0, rPC              @ arg0
19369    mov    r1, rFP              @ arg1
19370    mov    r2, rSELF            @ arg2
19371    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19372
19373/* ------------------------------ */
19374    .balign 64
19375.L_ALT_OP_MUL_INT_LIT8: /* 0xda */
19376/* File: armv5te/alt_stub.S */
19377/*
19378 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19379 * any interesting requests and then jump to the real instruction
19380 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19381 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19382 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19383 * bail to the real handler if breakFlags==0.
19384 */
19385    ldrb   r3, [rSELF, #offThread_breakFlags]
19386    adrl   lr, dvmAsmInstructionStart + (218 * 64)
19387    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19388    cmp    r3, #0
19389    bxeq   lr                   @ nothing to do - jump to real handler
19390    EXPORT_PC()
19391    mov    r0, rPC              @ arg0
19392    mov    r1, rFP              @ arg1
19393    mov    r2, rSELF            @ arg2
19394    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19395
19396/* ------------------------------ */
19397    .balign 64
19398.L_ALT_OP_DIV_INT_LIT8: /* 0xdb */
19399/* File: armv5te/alt_stub.S */
19400/*
19401 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19402 * any interesting requests and then jump to the real instruction
19403 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19404 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19405 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19406 * bail to the real handler if breakFlags==0.
19407 */
19408    ldrb   r3, [rSELF, #offThread_breakFlags]
19409    adrl   lr, dvmAsmInstructionStart + (219 * 64)
19410    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19411    cmp    r3, #0
19412    bxeq   lr                   @ nothing to do - jump to real handler
19413    EXPORT_PC()
19414    mov    r0, rPC              @ arg0
19415    mov    r1, rFP              @ arg1
19416    mov    r2, rSELF            @ arg2
19417    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19418
19419/* ------------------------------ */
19420    .balign 64
19421.L_ALT_OP_REM_INT_LIT8: /* 0xdc */
19422/* File: armv5te/alt_stub.S */
19423/*
19424 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19425 * any interesting requests and then jump to the real instruction
19426 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19427 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19428 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19429 * bail to the real handler if breakFlags==0.
19430 */
19431    ldrb   r3, [rSELF, #offThread_breakFlags]
19432    adrl   lr, dvmAsmInstructionStart + (220 * 64)
19433    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19434    cmp    r3, #0
19435    bxeq   lr                   @ nothing to do - jump to real handler
19436    EXPORT_PC()
19437    mov    r0, rPC              @ arg0
19438    mov    r1, rFP              @ arg1
19439    mov    r2, rSELF            @ arg2
19440    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19441
19442/* ------------------------------ */
19443    .balign 64
19444.L_ALT_OP_AND_INT_LIT8: /* 0xdd */
19445/* File: armv5te/alt_stub.S */
19446/*
19447 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19448 * any interesting requests and then jump to the real instruction
19449 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19450 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19451 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19452 * bail to the real handler if breakFlags==0.
19453 */
19454    ldrb   r3, [rSELF, #offThread_breakFlags]
19455    adrl   lr, dvmAsmInstructionStart + (221 * 64)
19456    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19457    cmp    r3, #0
19458    bxeq   lr                   @ nothing to do - jump to real handler
19459    EXPORT_PC()
19460    mov    r0, rPC              @ arg0
19461    mov    r1, rFP              @ arg1
19462    mov    r2, rSELF            @ arg2
19463    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19464
19465/* ------------------------------ */
19466    .balign 64
19467.L_ALT_OP_OR_INT_LIT8: /* 0xde */
19468/* File: armv5te/alt_stub.S */
19469/*
19470 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19471 * any interesting requests and then jump to the real instruction
19472 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19473 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19474 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19475 * bail to the real handler if breakFlags==0.
19476 */
19477    ldrb   r3, [rSELF, #offThread_breakFlags]
19478    adrl   lr, dvmAsmInstructionStart + (222 * 64)
19479    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19480    cmp    r3, #0
19481    bxeq   lr                   @ nothing to do - jump to real handler
19482    EXPORT_PC()
19483    mov    r0, rPC              @ arg0
19484    mov    r1, rFP              @ arg1
19485    mov    r2, rSELF            @ arg2
19486    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19487
19488/* ------------------------------ */
19489    .balign 64
19490.L_ALT_OP_XOR_INT_LIT8: /* 0xdf */
19491/* File: armv5te/alt_stub.S */
19492/*
19493 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19494 * any interesting requests and then jump to the real instruction
19495 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19496 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19497 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19498 * bail to the real handler if breakFlags==0.
19499 */
19500    ldrb   r3, [rSELF, #offThread_breakFlags]
19501    adrl   lr, dvmAsmInstructionStart + (223 * 64)
19502    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19503    cmp    r3, #0
19504    bxeq   lr                   @ nothing to do - jump to real handler
19505    EXPORT_PC()
19506    mov    r0, rPC              @ arg0
19507    mov    r1, rFP              @ arg1
19508    mov    r2, rSELF            @ arg2
19509    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19510
19511/* ------------------------------ */
19512    .balign 64
19513.L_ALT_OP_SHL_INT_LIT8: /* 0xe0 */
19514/* File: armv5te/alt_stub.S */
19515/*
19516 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19517 * any interesting requests and then jump to the real instruction
19518 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19519 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19520 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19521 * bail to the real handler if breakFlags==0.
19522 */
19523    ldrb   r3, [rSELF, #offThread_breakFlags]
19524    adrl   lr, dvmAsmInstructionStart + (224 * 64)
19525    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19526    cmp    r3, #0
19527    bxeq   lr                   @ nothing to do - jump to real handler
19528    EXPORT_PC()
19529    mov    r0, rPC              @ arg0
19530    mov    r1, rFP              @ arg1
19531    mov    r2, rSELF            @ arg2
19532    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19533
19534/* ------------------------------ */
19535    .balign 64
19536.L_ALT_OP_SHR_INT_LIT8: /* 0xe1 */
19537/* File: armv5te/alt_stub.S */
19538/*
19539 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19540 * any interesting requests and then jump to the real instruction
19541 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19542 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19543 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19544 * bail to the real handler if breakFlags==0.
19545 */
19546    ldrb   r3, [rSELF, #offThread_breakFlags]
19547    adrl   lr, dvmAsmInstructionStart + (225 * 64)
19548    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19549    cmp    r3, #0
19550    bxeq   lr                   @ nothing to do - jump to real handler
19551    EXPORT_PC()
19552    mov    r0, rPC              @ arg0
19553    mov    r1, rFP              @ arg1
19554    mov    r2, rSELF            @ arg2
19555    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19556
19557/* ------------------------------ */
19558    .balign 64
19559.L_ALT_OP_USHR_INT_LIT8: /* 0xe2 */
19560/* File: armv5te/alt_stub.S */
19561/*
19562 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19563 * any interesting requests and then jump to the real instruction
19564 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19565 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19566 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19567 * bail to the real handler if breakFlags==0.
19568 */
19569    ldrb   r3, [rSELF, #offThread_breakFlags]
19570    adrl   lr, dvmAsmInstructionStart + (226 * 64)
19571    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19572    cmp    r3, #0
19573    bxeq   lr                   @ nothing to do - jump to real handler
19574    EXPORT_PC()
19575    mov    r0, rPC              @ arg0
19576    mov    r1, rFP              @ arg1
19577    mov    r2, rSELF            @ arg2
19578    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19579
19580/* ------------------------------ */
19581    .balign 64
19582.L_ALT_OP_IGET_VOLATILE: /* 0xe3 */
19583/* File: armv5te/alt_stub.S */
19584/*
19585 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19586 * any interesting requests and then jump to the real instruction
19587 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19588 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19589 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19590 * bail to the real handler if breakFlags==0.
19591 */
19592    ldrb   r3, [rSELF, #offThread_breakFlags]
19593    adrl   lr, dvmAsmInstructionStart + (227 * 64)
19594    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19595    cmp    r3, #0
19596    bxeq   lr                   @ nothing to do - jump to real handler
19597    EXPORT_PC()
19598    mov    r0, rPC              @ arg0
19599    mov    r1, rFP              @ arg1
19600    mov    r2, rSELF            @ arg2
19601    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19602
19603/* ------------------------------ */
19604    .balign 64
19605.L_ALT_OP_IPUT_VOLATILE: /* 0xe4 */
19606/* File: armv5te/alt_stub.S */
19607/*
19608 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19609 * any interesting requests and then jump to the real instruction
19610 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19611 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19612 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19613 * bail to the real handler if breakFlags==0.
19614 */
19615    ldrb   r3, [rSELF, #offThread_breakFlags]
19616    adrl   lr, dvmAsmInstructionStart + (228 * 64)
19617    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19618    cmp    r3, #0
19619    bxeq   lr                   @ nothing to do - jump to real handler
19620    EXPORT_PC()
19621    mov    r0, rPC              @ arg0
19622    mov    r1, rFP              @ arg1
19623    mov    r2, rSELF            @ arg2
19624    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19625
19626/* ------------------------------ */
19627    .balign 64
19628.L_ALT_OP_SGET_VOLATILE: /* 0xe5 */
19629/* File: armv5te/alt_stub.S */
19630/*
19631 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19632 * any interesting requests and then jump to the real instruction
19633 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19634 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19635 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19636 * bail to the real handler if breakFlags==0.
19637 */
19638    ldrb   r3, [rSELF, #offThread_breakFlags]
19639    adrl   lr, dvmAsmInstructionStart + (229 * 64)
19640    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19641    cmp    r3, #0
19642    bxeq   lr                   @ nothing to do - jump to real handler
19643    EXPORT_PC()
19644    mov    r0, rPC              @ arg0
19645    mov    r1, rFP              @ arg1
19646    mov    r2, rSELF            @ arg2
19647    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19648
19649/* ------------------------------ */
19650    .balign 64
19651.L_ALT_OP_SPUT_VOLATILE: /* 0xe6 */
19652/* File: armv5te/alt_stub.S */
19653/*
19654 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19655 * any interesting requests and then jump to the real instruction
19656 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19657 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19658 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19659 * bail to the real handler if breakFlags==0.
19660 */
19661    ldrb   r3, [rSELF, #offThread_breakFlags]
19662    adrl   lr, dvmAsmInstructionStart + (230 * 64)
19663    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19664    cmp    r3, #0
19665    bxeq   lr                   @ nothing to do - jump to real handler
19666    EXPORT_PC()
19667    mov    r0, rPC              @ arg0
19668    mov    r1, rFP              @ arg1
19669    mov    r2, rSELF            @ arg2
19670    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19671
19672/* ------------------------------ */
19673    .balign 64
19674.L_ALT_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
19675/* File: armv5te/alt_stub.S */
19676/*
19677 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19678 * any interesting requests and then jump to the real instruction
19679 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19680 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19681 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19682 * bail to the real handler if breakFlags==0.
19683 */
19684    ldrb   r3, [rSELF, #offThread_breakFlags]
19685    adrl   lr, dvmAsmInstructionStart + (231 * 64)
19686    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19687    cmp    r3, #0
19688    bxeq   lr                   @ nothing to do - jump to real handler
19689    EXPORT_PC()
19690    mov    r0, rPC              @ arg0
19691    mov    r1, rFP              @ arg1
19692    mov    r2, rSELF            @ arg2
19693    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19694
19695/* ------------------------------ */
19696    .balign 64
19697.L_ALT_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
19698/* File: armv5te/alt_stub.S */
19699/*
19700 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19701 * any interesting requests and then jump to the real instruction
19702 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19703 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19704 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19705 * bail to the real handler if breakFlags==0.
19706 */
19707    ldrb   r3, [rSELF, #offThread_breakFlags]
19708    adrl   lr, dvmAsmInstructionStart + (232 * 64)
19709    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19710    cmp    r3, #0
19711    bxeq   lr                   @ nothing to do - jump to real handler
19712    EXPORT_PC()
19713    mov    r0, rPC              @ arg0
19714    mov    r1, rFP              @ arg1
19715    mov    r2, rSELF            @ arg2
19716    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19717
19718/* ------------------------------ */
19719    .balign 64
19720.L_ALT_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
19721/* File: armv5te/alt_stub.S */
19722/*
19723 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19724 * any interesting requests and then jump to the real instruction
19725 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19726 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19727 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19728 * bail to the real handler if breakFlags==0.
19729 */
19730    ldrb   r3, [rSELF, #offThread_breakFlags]
19731    adrl   lr, dvmAsmInstructionStart + (233 * 64)
19732    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19733    cmp    r3, #0
19734    bxeq   lr                   @ nothing to do - jump to real handler
19735    EXPORT_PC()
19736    mov    r0, rPC              @ arg0
19737    mov    r1, rFP              @ arg1
19738    mov    r2, rSELF            @ arg2
19739    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19740
19741/* ------------------------------ */
19742    .balign 64
19743.L_ALT_OP_SGET_WIDE_VOLATILE: /* 0xea */
19744/* File: armv5te/alt_stub.S */
19745/*
19746 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19747 * any interesting requests and then jump to the real instruction
19748 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19749 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19750 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19751 * bail to the real handler if breakFlags==0.
19752 */
19753    ldrb   r3, [rSELF, #offThread_breakFlags]
19754    adrl   lr, dvmAsmInstructionStart + (234 * 64)
19755    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19756    cmp    r3, #0
19757    bxeq   lr                   @ nothing to do - jump to real handler
19758    EXPORT_PC()
19759    mov    r0, rPC              @ arg0
19760    mov    r1, rFP              @ arg1
19761    mov    r2, rSELF            @ arg2
19762    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19763
19764/* ------------------------------ */
19765    .balign 64
19766.L_ALT_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
19767/* File: armv5te/alt_stub.S */
19768/*
19769 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19770 * any interesting requests and then jump to the real instruction
19771 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19772 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19773 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19774 * bail to the real handler if breakFlags==0.
19775 */
19776    ldrb   r3, [rSELF, #offThread_breakFlags]
19777    adrl   lr, dvmAsmInstructionStart + (235 * 64)
19778    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19779    cmp    r3, #0
19780    bxeq   lr                   @ nothing to do - jump to real handler
19781    EXPORT_PC()
19782    mov    r0, rPC              @ arg0
19783    mov    r1, rFP              @ arg1
19784    mov    r2, rSELF            @ arg2
19785    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19786
19787/* ------------------------------ */
19788    .balign 64
19789.L_ALT_OP_BREAKPOINT: /* 0xec */
19790/* File: armv5te/alt_stub.S */
19791/*
19792 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19793 * any interesting requests and then jump to the real instruction
19794 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19795 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19796 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19797 * bail to the real handler if breakFlags==0.
19798 */
19799    ldrb   r3, [rSELF, #offThread_breakFlags]
19800    adrl   lr, dvmAsmInstructionStart + (236 * 64)
19801    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19802    cmp    r3, #0
19803    bxeq   lr                   @ nothing to do - jump to real handler
19804    EXPORT_PC()
19805    mov    r0, rPC              @ arg0
19806    mov    r1, rFP              @ arg1
19807    mov    r2, rSELF            @ arg2
19808    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19809
19810/* ------------------------------ */
19811    .balign 64
19812.L_ALT_OP_THROW_VERIFICATION_ERROR: /* 0xed */
19813/* File: armv5te/alt_stub.S */
19814/*
19815 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19816 * any interesting requests and then jump to the real instruction
19817 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19818 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19819 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19820 * bail to the real handler if breakFlags==0.
19821 */
19822    ldrb   r3, [rSELF, #offThread_breakFlags]
19823    adrl   lr, dvmAsmInstructionStart + (237 * 64)
19824    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19825    cmp    r3, #0
19826    bxeq   lr                   @ nothing to do - jump to real handler
19827    EXPORT_PC()
19828    mov    r0, rPC              @ arg0
19829    mov    r1, rFP              @ arg1
19830    mov    r2, rSELF            @ arg2
19831    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19832
19833/* ------------------------------ */
19834    .balign 64
19835.L_ALT_OP_EXECUTE_INLINE: /* 0xee */
19836/* File: armv5te/alt_stub.S */
19837/*
19838 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19839 * any interesting requests and then jump to the real instruction
19840 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19841 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19842 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19843 * bail to the real handler if breakFlags==0.
19844 */
19845    ldrb   r3, [rSELF, #offThread_breakFlags]
19846    adrl   lr, dvmAsmInstructionStart + (238 * 64)
19847    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19848    cmp    r3, #0
19849    bxeq   lr                   @ nothing to do - jump to real handler
19850    EXPORT_PC()
19851    mov    r0, rPC              @ arg0
19852    mov    r1, rFP              @ arg1
19853    mov    r2, rSELF            @ arg2
19854    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19855
19856/* ------------------------------ */
19857    .balign 64
19858.L_ALT_OP_EXECUTE_INLINE_RANGE: /* 0xef */
19859/* File: armv5te/alt_stub.S */
19860/*
19861 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19862 * any interesting requests and then jump to the real instruction
19863 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19864 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19865 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19866 * bail to the real handler if breakFlags==0.
19867 */
19868    ldrb   r3, [rSELF, #offThread_breakFlags]
19869    adrl   lr, dvmAsmInstructionStart + (239 * 64)
19870    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19871    cmp    r3, #0
19872    bxeq   lr                   @ nothing to do - jump to real handler
19873    EXPORT_PC()
19874    mov    r0, rPC              @ arg0
19875    mov    r1, rFP              @ arg1
19876    mov    r2, rSELF            @ arg2
19877    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19878
19879/* ------------------------------ */
19880    .balign 64
19881.L_ALT_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
19882/* File: armv5te/alt_stub.S */
19883/*
19884 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19885 * any interesting requests and then jump to the real instruction
19886 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19887 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19888 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19889 * bail to the real handler if breakFlags==0.
19890 */
19891    ldrb   r3, [rSELF, #offThread_breakFlags]
19892    adrl   lr, dvmAsmInstructionStart + (240 * 64)
19893    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19894    cmp    r3, #0
19895    bxeq   lr                   @ nothing to do - jump to real handler
19896    EXPORT_PC()
19897    mov    r0, rPC              @ arg0
19898    mov    r1, rFP              @ arg1
19899    mov    r2, rSELF            @ arg2
19900    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19901
19902/* ------------------------------ */
19903    .balign 64
19904.L_ALT_OP_RETURN_VOID_BARRIER: /* 0xf1 */
19905/* File: armv5te/alt_stub.S */
19906/*
19907 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19908 * any interesting requests and then jump to the real instruction
19909 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19910 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19911 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19912 * bail to the real handler if breakFlags==0.
19913 */
19914    ldrb   r3, [rSELF, #offThread_breakFlags]
19915    adrl   lr, dvmAsmInstructionStart + (241 * 64)
19916    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19917    cmp    r3, #0
19918    bxeq   lr                   @ nothing to do - jump to real handler
19919    EXPORT_PC()
19920    mov    r0, rPC              @ arg0
19921    mov    r1, rFP              @ arg1
19922    mov    r2, rSELF            @ arg2
19923    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19924
19925/* ------------------------------ */
19926    .balign 64
19927.L_ALT_OP_IGET_QUICK: /* 0xf2 */
19928/* File: armv5te/alt_stub.S */
19929/*
19930 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19931 * any interesting requests and then jump to the real instruction
19932 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19933 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19934 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19935 * bail to the real handler if breakFlags==0.
19936 */
19937    ldrb   r3, [rSELF, #offThread_breakFlags]
19938    adrl   lr, dvmAsmInstructionStart + (242 * 64)
19939    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19940    cmp    r3, #0
19941    bxeq   lr                   @ nothing to do - jump to real handler
19942    EXPORT_PC()
19943    mov    r0, rPC              @ arg0
19944    mov    r1, rFP              @ arg1
19945    mov    r2, rSELF            @ arg2
19946    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19947
19948/* ------------------------------ */
19949    .balign 64
19950.L_ALT_OP_IGET_WIDE_QUICK: /* 0xf3 */
19951/* File: armv5te/alt_stub.S */
19952/*
19953 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19954 * any interesting requests and then jump to the real instruction
19955 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19956 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19957 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19958 * bail to the real handler if breakFlags==0.
19959 */
19960    ldrb   r3, [rSELF, #offThread_breakFlags]
19961    adrl   lr, dvmAsmInstructionStart + (243 * 64)
19962    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19963    cmp    r3, #0
19964    bxeq   lr                   @ nothing to do - jump to real handler
19965    EXPORT_PC()
19966    mov    r0, rPC              @ arg0
19967    mov    r1, rFP              @ arg1
19968    mov    r2, rSELF            @ arg2
19969    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19970
19971/* ------------------------------ */
19972    .balign 64
19973.L_ALT_OP_IGET_OBJECT_QUICK: /* 0xf4 */
19974/* File: armv5te/alt_stub.S */
19975/*
19976 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19977 * any interesting requests and then jump to the real instruction
19978 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19979 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19980 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19981 * bail to the real handler if breakFlags==0.
19982 */
19983    ldrb   r3, [rSELF, #offThread_breakFlags]
19984    adrl   lr, dvmAsmInstructionStart + (244 * 64)
19985    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19986    cmp    r3, #0
19987    bxeq   lr                   @ nothing to do - jump to real handler
19988    EXPORT_PC()
19989    mov    r0, rPC              @ arg0
19990    mov    r1, rFP              @ arg1
19991    mov    r2, rSELF            @ arg2
19992    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19993
19994/* ------------------------------ */
19995    .balign 64
19996.L_ALT_OP_IPUT_QUICK: /* 0xf5 */
19997/* File: armv5te/alt_stub.S */
19998/*
19999 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20000 * any interesting requests and then jump to the real instruction
20001 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20002 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20003 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20004 * bail to the real handler if breakFlags==0.
20005 */
20006    ldrb   r3, [rSELF, #offThread_breakFlags]
20007    adrl   lr, dvmAsmInstructionStart + (245 * 64)
20008    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20009    cmp    r3, #0
20010    bxeq   lr                   @ nothing to do - jump to real handler
20011    EXPORT_PC()
20012    mov    r0, rPC              @ arg0
20013    mov    r1, rFP              @ arg1
20014    mov    r2, rSELF            @ arg2
20015    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20016
20017/* ------------------------------ */
20018    .balign 64
20019.L_ALT_OP_IPUT_WIDE_QUICK: /* 0xf6 */
20020/* File: armv5te/alt_stub.S */
20021/*
20022 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20023 * any interesting requests and then jump to the real instruction
20024 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20025 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20026 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20027 * bail to the real handler if breakFlags==0.
20028 */
20029    ldrb   r3, [rSELF, #offThread_breakFlags]
20030    adrl   lr, dvmAsmInstructionStart + (246 * 64)
20031    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20032    cmp    r3, #0
20033    bxeq   lr                   @ nothing to do - jump to real handler
20034    EXPORT_PC()
20035    mov    r0, rPC              @ arg0
20036    mov    r1, rFP              @ arg1
20037    mov    r2, rSELF            @ arg2
20038    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20039
20040/* ------------------------------ */
20041    .balign 64
20042.L_ALT_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
20043/* File: armv5te/alt_stub.S */
20044/*
20045 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20046 * any interesting requests and then jump to the real instruction
20047 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20048 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20049 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20050 * bail to the real handler if breakFlags==0.
20051 */
20052    ldrb   r3, [rSELF, #offThread_breakFlags]
20053    adrl   lr, dvmAsmInstructionStart + (247 * 64)
20054    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20055    cmp    r3, #0
20056    bxeq   lr                   @ nothing to do - jump to real handler
20057    EXPORT_PC()
20058    mov    r0, rPC              @ arg0
20059    mov    r1, rFP              @ arg1
20060    mov    r2, rSELF            @ arg2
20061    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20062
20063/* ------------------------------ */
20064    .balign 64
20065.L_ALT_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
20066/* File: armv5te/alt_stub.S */
20067/*
20068 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20069 * any interesting requests and then jump to the real instruction
20070 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20071 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20072 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20073 * bail to the real handler if breakFlags==0.
20074 */
20075    ldrb   r3, [rSELF, #offThread_breakFlags]
20076    adrl   lr, dvmAsmInstructionStart + (248 * 64)
20077    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20078    cmp    r3, #0
20079    bxeq   lr                   @ nothing to do - jump to real handler
20080    EXPORT_PC()
20081    mov    r0, rPC              @ arg0
20082    mov    r1, rFP              @ arg1
20083    mov    r2, rSELF            @ arg2
20084    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20085
20086/* ------------------------------ */
20087    .balign 64
20088.L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
20089/* File: armv5te/alt_stub.S */
20090/*
20091 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20092 * any interesting requests and then jump to the real instruction
20093 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20094 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20095 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20096 * bail to the real handler if breakFlags==0.
20097 */
20098    ldrb   r3, [rSELF, #offThread_breakFlags]
20099    adrl   lr, dvmAsmInstructionStart + (249 * 64)
20100    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20101    cmp    r3, #0
20102    bxeq   lr                   @ nothing to do - jump to real handler
20103    EXPORT_PC()
20104    mov    r0, rPC              @ arg0
20105    mov    r1, rFP              @ arg1
20106    mov    r2, rSELF            @ arg2
20107    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20108
20109/* ------------------------------ */
20110    .balign 64
20111.L_ALT_OP_INVOKE_SUPER_QUICK: /* 0xfa */
20112/* File: armv5te/alt_stub.S */
20113/*
20114 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20115 * any interesting requests and then jump to the real instruction
20116 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20117 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20118 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20119 * bail to the real handler if breakFlags==0.
20120 */
20121    ldrb   r3, [rSELF, #offThread_breakFlags]
20122    adrl   lr, dvmAsmInstructionStart + (250 * 64)
20123    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20124    cmp    r3, #0
20125    bxeq   lr                   @ nothing to do - jump to real handler
20126    EXPORT_PC()
20127    mov    r0, rPC              @ arg0
20128    mov    r1, rFP              @ arg1
20129    mov    r2, rSELF            @ arg2
20130    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20131
20132/* ------------------------------ */
20133    .balign 64
20134.L_ALT_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
20135/* File: armv5te/alt_stub.S */
20136/*
20137 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20138 * any interesting requests and then jump to the real instruction
20139 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20140 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20141 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20142 * bail to the real handler if breakFlags==0.
20143 */
20144    ldrb   r3, [rSELF, #offThread_breakFlags]
20145    adrl   lr, dvmAsmInstructionStart + (251 * 64)
20146    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20147    cmp    r3, #0
20148    bxeq   lr                   @ nothing to do - jump to real handler
20149    EXPORT_PC()
20150    mov    r0, rPC              @ arg0
20151    mov    r1, rFP              @ arg1
20152    mov    r2, rSELF            @ arg2
20153    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20154
20155/* ------------------------------ */
20156    .balign 64
20157.L_ALT_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
20158/* File: armv5te/alt_stub.S */
20159/*
20160 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20161 * any interesting requests and then jump to the real instruction
20162 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20163 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20164 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20165 * bail to the real handler if breakFlags==0.
20166 */
20167    ldrb   r3, [rSELF, #offThread_breakFlags]
20168    adrl   lr, dvmAsmInstructionStart + (252 * 64)
20169    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20170    cmp    r3, #0
20171    bxeq   lr                   @ nothing to do - jump to real handler
20172    EXPORT_PC()
20173    mov    r0, rPC              @ arg0
20174    mov    r1, rFP              @ arg1
20175    mov    r2, rSELF            @ arg2
20176    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20177
20178/* ------------------------------ */
20179    .balign 64
20180.L_ALT_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
20181/* File: armv5te/alt_stub.S */
20182/*
20183 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20184 * any interesting requests and then jump to the real instruction
20185 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20186 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20187 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20188 * bail to the real handler if breakFlags==0.
20189 */
20190    ldrb   r3, [rSELF, #offThread_breakFlags]
20191    adrl   lr, dvmAsmInstructionStart + (253 * 64)
20192    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20193    cmp    r3, #0
20194    bxeq   lr                   @ nothing to do - jump to real handler
20195    EXPORT_PC()
20196    mov    r0, rPC              @ arg0
20197    mov    r1, rFP              @ arg1
20198    mov    r2, rSELF            @ arg2
20199    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20200
20201/* ------------------------------ */
20202    .balign 64
20203.L_ALT_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
20204/* File: armv5te/alt_stub.S */
20205/*
20206 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20207 * any interesting requests and then jump to the real instruction
20208 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20209 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20210 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20211 * bail to the real handler if breakFlags==0.
20212 */
20213    ldrb   r3, [rSELF, #offThread_breakFlags]
20214    adrl   lr, dvmAsmInstructionStart + (254 * 64)
20215    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20216    cmp    r3, #0
20217    bxeq   lr                   @ nothing to do - jump to real handler
20218    EXPORT_PC()
20219    mov    r0, rPC              @ arg0
20220    mov    r1, rFP              @ arg1
20221    mov    r2, rSELF            @ arg2
20222    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20223
20224/* ------------------------------ */
20225    .balign 64
20226.L_ALT_OP_DISPATCH_FF: /* 0xff */
20227/* File: armv5te/alt_stub.S */
20228/*
20229 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20230 * any interesting requests and then jump to the real instruction
20231 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20232 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20233 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20234 * bail to the real handler if breakFlags==0.
20235 */
20236    ldrb   r3, [rSELF, #offThread_breakFlags]
20237    adrl   lr, dvmAsmInstructionStart + (255 * 64)
20238    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20239    cmp    r3, #0
20240    bxeq   lr                   @ nothing to do - jump to real handler
20241    EXPORT_PC()
20242    mov    r0, rPC              @ arg0
20243    mov    r1, rFP              @ arg1
20244    mov    r2, rSELF            @ arg2
20245    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20246
20247/* ------------------------------ */
20248    .balign 64
20249.L_ALT_OP_CONST_CLASS_JUMBO: /* 0x100 */
20250/* File: armv5te/alt_stub.S */
20251/*
20252 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20253 * any interesting requests and then jump to the real instruction
20254 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20255 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20256 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20257 * bail to the real handler if breakFlags==0.
20258 */
20259    ldrb   r3, [rSELF, #offThread_breakFlags]
20260    adrl   lr, dvmAsmInstructionStart + (256 * 64)
20261    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20262    cmp    r3, #0
20263    bxeq   lr                   @ nothing to do - jump to real handler
20264    EXPORT_PC()
20265    mov    r0, rPC              @ arg0
20266    mov    r1, rFP              @ arg1
20267    mov    r2, rSELF            @ arg2
20268    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20269
20270/* ------------------------------ */
20271    .balign 64
20272.L_ALT_OP_CHECK_CAST_JUMBO: /* 0x101 */
20273/* File: armv5te/alt_stub.S */
20274/*
20275 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20276 * any interesting requests and then jump to the real instruction
20277 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20278 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20279 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20280 * bail to the real handler if breakFlags==0.
20281 */
20282    ldrb   r3, [rSELF, #offThread_breakFlags]
20283    adrl   lr, dvmAsmInstructionStart + (257 * 64)
20284    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20285    cmp    r3, #0
20286    bxeq   lr                   @ nothing to do - jump to real handler
20287    EXPORT_PC()
20288    mov    r0, rPC              @ arg0
20289    mov    r1, rFP              @ arg1
20290    mov    r2, rSELF            @ arg2
20291    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20292
20293/* ------------------------------ */
20294    .balign 64
20295.L_ALT_OP_INSTANCE_OF_JUMBO: /* 0x102 */
20296/* File: armv5te/alt_stub.S */
20297/*
20298 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20299 * any interesting requests and then jump to the real instruction
20300 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20301 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20302 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20303 * bail to the real handler if breakFlags==0.
20304 */
20305    ldrb   r3, [rSELF, #offThread_breakFlags]
20306    adrl   lr, dvmAsmInstructionStart + (258 * 64)
20307    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20308    cmp    r3, #0
20309    bxeq   lr                   @ nothing to do - jump to real handler
20310    EXPORT_PC()
20311    mov    r0, rPC              @ arg0
20312    mov    r1, rFP              @ arg1
20313    mov    r2, rSELF            @ arg2
20314    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20315
20316/* ------------------------------ */
20317    .balign 64
20318.L_ALT_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
20319/* File: armv5te/alt_stub.S */
20320/*
20321 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20322 * any interesting requests and then jump to the real instruction
20323 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20324 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20325 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20326 * bail to the real handler if breakFlags==0.
20327 */
20328    ldrb   r3, [rSELF, #offThread_breakFlags]
20329    adrl   lr, dvmAsmInstructionStart + (259 * 64)
20330    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20331    cmp    r3, #0
20332    bxeq   lr                   @ nothing to do - jump to real handler
20333    EXPORT_PC()
20334    mov    r0, rPC              @ arg0
20335    mov    r1, rFP              @ arg1
20336    mov    r2, rSELF            @ arg2
20337    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20338
20339/* ------------------------------ */
20340    .balign 64
20341.L_ALT_OP_NEW_ARRAY_JUMBO: /* 0x104 */
20342/* File: armv5te/alt_stub.S */
20343/*
20344 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20345 * any interesting requests and then jump to the real instruction
20346 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20347 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20348 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20349 * bail to the real handler if breakFlags==0.
20350 */
20351    ldrb   r3, [rSELF, #offThread_breakFlags]
20352    adrl   lr, dvmAsmInstructionStart + (260 * 64)
20353    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20354    cmp    r3, #0
20355    bxeq   lr                   @ nothing to do - jump to real handler
20356    EXPORT_PC()
20357    mov    r0, rPC              @ arg0
20358    mov    r1, rFP              @ arg1
20359    mov    r2, rSELF            @ arg2
20360    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20361
20362/* ------------------------------ */
20363    .balign 64
20364.L_ALT_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
20365/* File: armv5te/alt_stub.S */
20366/*
20367 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20368 * any interesting requests and then jump to the real instruction
20369 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20370 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20371 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20372 * bail to the real handler if breakFlags==0.
20373 */
20374    ldrb   r3, [rSELF, #offThread_breakFlags]
20375    adrl   lr, dvmAsmInstructionStart + (261 * 64)
20376    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20377    cmp    r3, #0
20378    bxeq   lr                   @ nothing to do - jump to real handler
20379    EXPORT_PC()
20380    mov    r0, rPC              @ arg0
20381    mov    r1, rFP              @ arg1
20382    mov    r2, rSELF            @ arg2
20383    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20384
20385/* ------------------------------ */
20386    .balign 64
20387.L_ALT_OP_IGET_JUMBO: /* 0x106 */
20388/* File: armv5te/alt_stub.S */
20389/*
20390 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20391 * any interesting requests and then jump to the real instruction
20392 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20393 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20394 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20395 * bail to the real handler if breakFlags==0.
20396 */
20397    ldrb   r3, [rSELF, #offThread_breakFlags]
20398    adrl   lr, dvmAsmInstructionStart + (262 * 64)
20399    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20400    cmp    r3, #0
20401    bxeq   lr                   @ nothing to do - jump to real handler
20402    EXPORT_PC()
20403    mov    r0, rPC              @ arg0
20404    mov    r1, rFP              @ arg1
20405    mov    r2, rSELF            @ arg2
20406    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20407
20408/* ------------------------------ */
20409    .balign 64
20410.L_ALT_OP_IGET_WIDE_JUMBO: /* 0x107 */
20411/* File: armv5te/alt_stub.S */
20412/*
20413 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20414 * any interesting requests and then jump to the real instruction
20415 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20416 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20417 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20418 * bail to the real handler if breakFlags==0.
20419 */
20420    ldrb   r3, [rSELF, #offThread_breakFlags]
20421    adrl   lr, dvmAsmInstructionStart + (263 * 64)
20422    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20423    cmp    r3, #0
20424    bxeq   lr                   @ nothing to do - jump to real handler
20425    EXPORT_PC()
20426    mov    r0, rPC              @ arg0
20427    mov    r1, rFP              @ arg1
20428    mov    r2, rSELF            @ arg2
20429    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20430
20431/* ------------------------------ */
20432    .balign 64
20433.L_ALT_OP_IGET_OBJECT_JUMBO: /* 0x108 */
20434/* File: armv5te/alt_stub.S */
20435/*
20436 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20437 * any interesting requests and then jump to the real instruction
20438 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20439 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20440 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20441 * bail to the real handler if breakFlags==0.
20442 */
20443    ldrb   r3, [rSELF, #offThread_breakFlags]
20444    adrl   lr, dvmAsmInstructionStart + (264 * 64)
20445    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20446    cmp    r3, #0
20447    bxeq   lr                   @ nothing to do - jump to real handler
20448    EXPORT_PC()
20449    mov    r0, rPC              @ arg0
20450    mov    r1, rFP              @ arg1
20451    mov    r2, rSELF            @ arg2
20452    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20453
20454/* ------------------------------ */
20455    .balign 64
20456.L_ALT_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
20457/* File: armv5te/alt_stub.S */
20458/*
20459 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20460 * any interesting requests and then jump to the real instruction
20461 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20462 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20463 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20464 * bail to the real handler if breakFlags==0.
20465 */
20466    ldrb   r3, [rSELF, #offThread_breakFlags]
20467    adrl   lr, dvmAsmInstructionStart + (265 * 64)
20468    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20469    cmp    r3, #0
20470    bxeq   lr                   @ nothing to do - jump to real handler
20471    EXPORT_PC()
20472    mov    r0, rPC              @ arg0
20473    mov    r1, rFP              @ arg1
20474    mov    r2, rSELF            @ arg2
20475    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20476
20477/* ------------------------------ */
20478    .balign 64
20479.L_ALT_OP_IGET_BYTE_JUMBO: /* 0x10a */
20480/* File: armv5te/alt_stub.S */
20481/*
20482 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20483 * any interesting requests and then jump to the real instruction
20484 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20485 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20486 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20487 * bail to the real handler if breakFlags==0.
20488 */
20489    ldrb   r3, [rSELF, #offThread_breakFlags]
20490    adrl   lr, dvmAsmInstructionStart + (266 * 64)
20491    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20492    cmp    r3, #0
20493    bxeq   lr                   @ nothing to do - jump to real handler
20494    EXPORT_PC()
20495    mov    r0, rPC              @ arg0
20496    mov    r1, rFP              @ arg1
20497    mov    r2, rSELF            @ arg2
20498    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20499
20500/* ------------------------------ */
20501    .balign 64
20502.L_ALT_OP_IGET_CHAR_JUMBO: /* 0x10b */
20503/* File: armv5te/alt_stub.S */
20504/*
20505 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20506 * any interesting requests and then jump to the real instruction
20507 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20508 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20509 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20510 * bail to the real handler if breakFlags==0.
20511 */
20512    ldrb   r3, [rSELF, #offThread_breakFlags]
20513    adrl   lr, dvmAsmInstructionStart + (267 * 64)
20514    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20515    cmp    r3, #0
20516    bxeq   lr                   @ nothing to do - jump to real handler
20517    EXPORT_PC()
20518    mov    r0, rPC              @ arg0
20519    mov    r1, rFP              @ arg1
20520    mov    r2, rSELF            @ arg2
20521    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20522
20523/* ------------------------------ */
20524    .balign 64
20525.L_ALT_OP_IGET_SHORT_JUMBO: /* 0x10c */
20526/* File: armv5te/alt_stub.S */
20527/*
20528 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20529 * any interesting requests and then jump to the real instruction
20530 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20531 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20532 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20533 * bail to the real handler if breakFlags==0.
20534 */
20535    ldrb   r3, [rSELF, #offThread_breakFlags]
20536    adrl   lr, dvmAsmInstructionStart + (268 * 64)
20537    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20538    cmp    r3, #0
20539    bxeq   lr                   @ nothing to do - jump to real handler
20540    EXPORT_PC()
20541    mov    r0, rPC              @ arg0
20542    mov    r1, rFP              @ arg1
20543    mov    r2, rSELF            @ arg2
20544    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20545
20546/* ------------------------------ */
20547    .balign 64
20548.L_ALT_OP_IPUT_JUMBO: /* 0x10d */
20549/* File: armv5te/alt_stub.S */
20550/*
20551 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20552 * any interesting requests and then jump to the real instruction
20553 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20554 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20555 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20556 * bail to the real handler if breakFlags==0.
20557 */
20558    ldrb   r3, [rSELF, #offThread_breakFlags]
20559    adrl   lr, dvmAsmInstructionStart + (269 * 64)
20560    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20561    cmp    r3, #0
20562    bxeq   lr                   @ nothing to do - jump to real handler
20563    EXPORT_PC()
20564    mov    r0, rPC              @ arg0
20565    mov    r1, rFP              @ arg1
20566    mov    r2, rSELF            @ arg2
20567    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20568
20569/* ------------------------------ */
20570    .balign 64
20571.L_ALT_OP_IPUT_WIDE_JUMBO: /* 0x10e */
20572/* File: armv5te/alt_stub.S */
20573/*
20574 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20575 * any interesting requests and then jump to the real instruction
20576 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20577 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20578 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20579 * bail to the real handler if breakFlags==0.
20580 */
20581    ldrb   r3, [rSELF, #offThread_breakFlags]
20582    adrl   lr, dvmAsmInstructionStart + (270 * 64)
20583    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20584    cmp    r3, #0
20585    bxeq   lr                   @ nothing to do - jump to real handler
20586    EXPORT_PC()
20587    mov    r0, rPC              @ arg0
20588    mov    r1, rFP              @ arg1
20589    mov    r2, rSELF            @ arg2
20590    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20591
20592/* ------------------------------ */
20593    .balign 64
20594.L_ALT_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
20595/* File: armv5te/alt_stub.S */
20596/*
20597 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20598 * any interesting requests and then jump to the real instruction
20599 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20600 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20601 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20602 * bail to the real handler if breakFlags==0.
20603 */
20604    ldrb   r3, [rSELF, #offThread_breakFlags]
20605    adrl   lr, dvmAsmInstructionStart + (271 * 64)
20606    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20607    cmp    r3, #0
20608    bxeq   lr                   @ nothing to do - jump to real handler
20609    EXPORT_PC()
20610    mov    r0, rPC              @ arg0
20611    mov    r1, rFP              @ arg1
20612    mov    r2, rSELF            @ arg2
20613    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20614
20615/* ------------------------------ */
20616    .balign 64
20617.L_ALT_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
20618/* File: armv5te/alt_stub.S */
20619/*
20620 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20621 * any interesting requests and then jump to the real instruction
20622 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20623 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20624 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20625 * bail to the real handler if breakFlags==0.
20626 */
20627    ldrb   r3, [rSELF, #offThread_breakFlags]
20628    adrl   lr, dvmAsmInstructionStart + (272 * 64)
20629    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20630    cmp    r3, #0
20631    bxeq   lr                   @ nothing to do - jump to real handler
20632    EXPORT_PC()
20633    mov    r0, rPC              @ arg0
20634    mov    r1, rFP              @ arg1
20635    mov    r2, rSELF            @ arg2
20636    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20637
20638/* ------------------------------ */
20639    .balign 64
20640.L_ALT_OP_IPUT_BYTE_JUMBO: /* 0x111 */
20641/* File: armv5te/alt_stub.S */
20642/*
20643 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20644 * any interesting requests and then jump to the real instruction
20645 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20646 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20647 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20648 * bail to the real handler if breakFlags==0.
20649 */
20650    ldrb   r3, [rSELF, #offThread_breakFlags]
20651    adrl   lr, dvmAsmInstructionStart + (273 * 64)
20652    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20653    cmp    r3, #0
20654    bxeq   lr                   @ nothing to do - jump to real handler
20655    EXPORT_PC()
20656    mov    r0, rPC              @ arg0
20657    mov    r1, rFP              @ arg1
20658    mov    r2, rSELF            @ arg2
20659    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20660
20661/* ------------------------------ */
20662    .balign 64
20663.L_ALT_OP_IPUT_CHAR_JUMBO: /* 0x112 */
20664/* File: armv5te/alt_stub.S */
20665/*
20666 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20667 * any interesting requests and then jump to the real instruction
20668 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20669 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20670 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20671 * bail to the real handler if breakFlags==0.
20672 */
20673    ldrb   r3, [rSELF, #offThread_breakFlags]
20674    adrl   lr, dvmAsmInstructionStart + (274 * 64)
20675    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20676    cmp    r3, #0
20677    bxeq   lr                   @ nothing to do - jump to real handler
20678    EXPORT_PC()
20679    mov    r0, rPC              @ arg0
20680    mov    r1, rFP              @ arg1
20681    mov    r2, rSELF            @ arg2
20682    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20683
20684/* ------------------------------ */
20685    .balign 64
20686.L_ALT_OP_IPUT_SHORT_JUMBO: /* 0x113 */
20687/* File: armv5te/alt_stub.S */
20688/*
20689 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20690 * any interesting requests and then jump to the real instruction
20691 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20692 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20693 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20694 * bail to the real handler if breakFlags==0.
20695 */
20696    ldrb   r3, [rSELF, #offThread_breakFlags]
20697    adrl   lr, dvmAsmInstructionStart + (275 * 64)
20698    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20699    cmp    r3, #0
20700    bxeq   lr                   @ nothing to do - jump to real handler
20701    EXPORT_PC()
20702    mov    r0, rPC              @ arg0
20703    mov    r1, rFP              @ arg1
20704    mov    r2, rSELF            @ arg2
20705    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20706
20707/* ------------------------------ */
20708    .balign 64
20709.L_ALT_OP_SGET_JUMBO: /* 0x114 */
20710/* File: armv5te/alt_stub.S */
20711/*
20712 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20713 * any interesting requests and then jump to the real instruction
20714 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20715 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20716 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20717 * bail to the real handler if breakFlags==0.
20718 */
20719    ldrb   r3, [rSELF, #offThread_breakFlags]
20720    adrl   lr, dvmAsmInstructionStart + (276 * 64)
20721    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20722    cmp    r3, #0
20723    bxeq   lr                   @ nothing to do - jump to real handler
20724    EXPORT_PC()
20725    mov    r0, rPC              @ arg0
20726    mov    r1, rFP              @ arg1
20727    mov    r2, rSELF            @ arg2
20728    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20729
20730/* ------------------------------ */
20731    .balign 64
20732.L_ALT_OP_SGET_WIDE_JUMBO: /* 0x115 */
20733/* File: armv5te/alt_stub.S */
20734/*
20735 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20736 * any interesting requests and then jump to the real instruction
20737 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20738 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20739 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20740 * bail to the real handler if breakFlags==0.
20741 */
20742    ldrb   r3, [rSELF, #offThread_breakFlags]
20743    adrl   lr, dvmAsmInstructionStart + (277 * 64)
20744    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20745    cmp    r3, #0
20746    bxeq   lr                   @ nothing to do - jump to real handler
20747    EXPORT_PC()
20748    mov    r0, rPC              @ arg0
20749    mov    r1, rFP              @ arg1
20750    mov    r2, rSELF            @ arg2
20751    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20752
20753/* ------------------------------ */
20754    .balign 64
20755.L_ALT_OP_SGET_OBJECT_JUMBO: /* 0x116 */
20756/* File: armv5te/alt_stub.S */
20757/*
20758 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20759 * any interesting requests and then jump to the real instruction
20760 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20761 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20762 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20763 * bail to the real handler if breakFlags==0.
20764 */
20765    ldrb   r3, [rSELF, #offThread_breakFlags]
20766    adrl   lr, dvmAsmInstructionStart + (278 * 64)
20767    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20768    cmp    r3, #0
20769    bxeq   lr                   @ nothing to do - jump to real handler
20770    EXPORT_PC()
20771    mov    r0, rPC              @ arg0
20772    mov    r1, rFP              @ arg1
20773    mov    r2, rSELF            @ arg2
20774    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20775
20776/* ------------------------------ */
20777    .balign 64
20778.L_ALT_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
20779/* File: armv5te/alt_stub.S */
20780/*
20781 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20782 * any interesting requests and then jump to the real instruction
20783 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20784 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20785 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20786 * bail to the real handler if breakFlags==0.
20787 */
20788    ldrb   r3, [rSELF, #offThread_breakFlags]
20789    adrl   lr, dvmAsmInstructionStart + (279 * 64)
20790    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20791    cmp    r3, #0
20792    bxeq   lr                   @ nothing to do - jump to real handler
20793    EXPORT_PC()
20794    mov    r0, rPC              @ arg0
20795    mov    r1, rFP              @ arg1
20796    mov    r2, rSELF            @ arg2
20797    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20798
20799/* ------------------------------ */
20800    .balign 64
20801.L_ALT_OP_SGET_BYTE_JUMBO: /* 0x118 */
20802/* File: armv5te/alt_stub.S */
20803/*
20804 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20805 * any interesting requests and then jump to the real instruction
20806 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20807 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20808 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20809 * bail to the real handler if breakFlags==0.
20810 */
20811    ldrb   r3, [rSELF, #offThread_breakFlags]
20812    adrl   lr, dvmAsmInstructionStart + (280 * 64)
20813    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20814    cmp    r3, #0
20815    bxeq   lr                   @ nothing to do - jump to real handler
20816    EXPORT_PC()
20817    mov    r0, rPC              @ arg0
20818    mov    r1, rFP              @ arg1
20819    mov    r2, rSELF            @ arg2
20820    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20821
20822/* ------------------------------ */
20823    .balign 64
20824.L_ALT_OP_SGET_CHAR_JUMBO: /* 0x119 */
20825/* File: armv5te/alt_stub.S */
20826/*
20827 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20828 * any interesting requests and then jump to the real instruction
20829 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20830 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20831 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20832 * bail to the real handler if breakFlags==0.
20833 */
20834    ldrb   r3, [rSELF, #offThread_breakFlags]
20835    adrl   lr, dvmAsmInstructionStart + (281 * 64)
20836    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20837    cmp    r3, #0
20838    bxeq   lr                   @ nothing to do - jump to real handler
20839    EXPORT_PC()
20840    mov    r0, rPC              @ arg0
20841    mov    r1, rFP              @ arg1
20842    mov    r2, rSELF            @ arg2
20843    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20844
20845/* ------------------------------ */
20846    .balign 64
20847.L_ALT_OP_SGET_SHORT_JUMBO: /* 0x11a */
20848/* File: armv5te/alt_stub.S */
20849/*
20850 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20851 * any interesting requests and then jump to the real instruction
20852 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20853 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20854 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20855 * bail to the real handler if breakFlags==0.
20856 */
20857    ldrb   r3, [rSELF, #offThread_breakFlags]
20858    adrl   lr, dvmAsmInstructionStart + (282 * 64)
20859    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20860    cmp    r3, #0
20861    bxeq   lr                   @ nothing to do - jump to real handler
20862    EXPORT_PC()
20863    mov    r0, rPC              @ arg0
20864    mov    r1, rFP              @ arg1
20865    mov    r2, rSELF            @ arg2
20866    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20867
20868/* ------------------------------ */
20869    .balign 64
20870.L_ALT_OP_SPUT_JUMBO: /* 0x11b */
20871/* File: armv5te/alt_stub.S */
20872/*
20873 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20874 * any interesting requests and then jump to the real instruction
20875 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20876 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20877 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20878 * bail to the real handler if breakFlags==0.
20879 */
20880    ldrb   r3, [rSELF, #offThread_breakFlags]
20881    adrl   lr, dvmAsmInstructionStart + (283 * 64)
20882    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20883    cmp    r3, #0
20884    bxeq   lr                   @ nothing to do - jump to real handler
20885    EXPORT_PC()
20886    mov    r0, rPC              @ arg0
20887    mov    r1, rFP              @ arg1
20888    mov    r2, rSELF            @ arg2
20889    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20890
20891/* ------------------------------ */
20892    .balign 64
20893.L_ALT_OP_SPUT_WIDE_JUMBO: /* 0x11c */
20894/* File: armv5te/alt_stub.S */
20895/*
20896 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20897 * any interesting requests and then jump to the real instruction
20898 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20899 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20900 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20901 * bail to the real handler if breakFlags==0.
20902 */
20903    ldrb   r3, [rSELF, #offThread_breakFlags]
20904    adrl   lr, dvmAsmInstructionStart + (284 * 64)
20905    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20906    cmp    r3, #0
20907    bxeq   lr                   @ nothing to do - jump to real handler
20908    EXPORT_PC()
20909    mov    r0, rPC              @ arg0
20910    mov    r1, rFP              @ arg1
20911    mov    r2, rSELF            @ arg2
20912    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20913
20914/* ------------------------------ */
20915    .balign 64
20916.L_ALT_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
20917/* File: armv5te/alt_stub.S */
20918/*
20919 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20920 * any interesting requests and then jump to the real instruction
20921 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20922 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20923 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20924 * bail to the real handler if breakFlags==0.
20925 */
20926    ldrb   r3, [rSELF, #offThread_breakFlags]
20927    adrl   lr, dvmAsmInstructionStart + (285 * 64)
20928    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20929    cmp    r3, #0
20930    bxeq   lr                   @ nothing to do - jump to real handler
20931    EXPORT_PC()
20932    mov    r0, rPC              @ arg0
20933    mov    r1, rFP              @ arg1
20934    mov    r2, rSELF            @ arg2
20935    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20936
20937/* ------------------------------ */
20938    .balign 64
20939.L_ALT_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
20940/* File: armv5te/alt_stub.S */
20941/*
20942 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20943 * any interesting requests and then jump to the real instruction
20944 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20945 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20946 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20947 * bail to the real handler if breakFlags==0.
20948 */
20949    ldrb   r3, [rSELF, #offThread_breakFlags]
20950    adrl   lr, dvmAsmInstructionStart + (286 * 64)
20951    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20952    cmp    r3, #0
20953    bxeq   lr                   @ nothing to do - jump to real handler
20954    EXPORT_PC()
20955    mov    r0, rPC              @ arg0
20956    mov    r1, rFP              @ arg1
20957    mov    r2, rSELF            @ arg2
20958    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20959
20960/* ------------------------------ */
20961    .balign 64
20962.L_ALT_OP_SPUT_BYTE_JUMBO: /* 0x11f */
20963/* File: armv5te/alt_stub.S */
20964/*
20965 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20966 * any interesting requests and then jump to the real instruction
20967 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20968 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20969 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20970 * bail to the real handler if breakFlags==0.
20971 */
20972    ldrb   r3, [rSELF, #offThread_breakFlags]
20973    adrl   lr, dvmAsmInstructionStart + (287 * 64)
20974    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20975    cmp    r3, #0
20976    bxeq   lr                   @ nothing to do - jump to real handler
20977    EXPORT_PC()
20978    mov    r0, rPC              @ arg0
20979    mov    r1, rFP              @ arg1
20980    mov    r2, rSELF            @ arg2
20981    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20982
20983/* ------------------------------ */
20984    .balign 64
20985.L_ALT_OP_SPUT_CHAR_JUMBO: /* 0x120 */
20986/* File: armv5te/alt_stub.S */
20987/*
20988 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20989 * any interesting requests and then jump to the real instruction
20990 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20991 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20992 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20993 * bail to the real handler if breakFlags==0.
20994 */
20995    ldrb   r3, [rSELF, #offThread_breakFlags]
20996    adrl   lr, dvmAsmInstructionStart + (288 * 64)
20997    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20998    cmp    r3, #0
20999    bxeq   lr                   @ nothing to do - jump to real handler
21000    EXPORT_PC()
21001    mov    r0, rPC              @ arg0
21002    mov    r1, rFP              @ arg1
21003    mov    r2, rSELF            @ arg2
21004    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21005
21006/* ------------------------------ */
21007    .balign 64
21008.L_ALT_OP_SPUT_SHORT_JUMBO: /* 0x121 */
21009/* File: armv5te/alt_stub.S */
21010/*
21011 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21012 * any interesting requests and then jump to the real instruction
21013 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21014 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21015 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21016 * bail to the real handler if breakFlags==0.
21017 */
21018    ldrb   r3, [rSELF, #offThread_breakFlags]
21019    adrl   lr, dvmAsmInstructionStart + (289 * 64)
21020    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21021    cmp    r3, #0
21022    bxeq   lr                   @ nothing to do - jump to real handler
21023    EXPORT_PC()
21024    mov    r0, rPC              @ arg0
21025    mov    r1, rFP              @ arg1
21026    mov    r2, rSELF            @ arg2
21027    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21028
21029/* ------------------------------ */
21030    .balign 64
21031.L_ALT_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
21032/* File: armv5te/alt_stub.S */
21033/*
21034 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21035 * any interesting requests and then jump to the real instruction
21036 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21037 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21038 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21039 * bail to the real handler if breakFlags==0.
21040 */
21041    ldrb   r3, [rSELF, #offThread_breakFlags]
21042    adrl   lr, dvmAsmInstructionStart + (290 * 64)
21043    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21044    cmp    r3, #0
21045    bxeq   lr                   @ nothing to do - jump to real handler
21046    EXPORT_PC()
21047    mov    r0, rPC              @ arg0
21048    mov    r1, rFP              @ arg1
21049    mov    r2, rSELF            @ arg2
21050    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21051
21052/* ------------------------------ */
21053    .balign 64
21054.L_ALT_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
21055/* File: armv5te/alt_stub.S */
21056/*
21057 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21058 * any interesting requests and then jump to the real instruction
21059 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21060 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21061 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21062 * bail to the real handler if breakFlags==0.
21063 */
21064    ldrb   r3, [rSELF, #offThread_breakFlags]
21065    adrl   lr, dvmAsmInstructionStart + (291 * 64)
21066    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21067    cmp    r3, #0
21068    bxeq   lr                   @ nothing to do - jump to real handler
21069    EXPORT_PC()
21070    mov    r0, rPC              @ arg0
21071    mov    r1, rFP              @ arg1
21072    mov    r2, rSELF            @ arg2
21073    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21074
21075/* ------------------------------ */
21076    .balign 64
21077.L_ALT_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
21078/* File: armv5te/alt_stub.S */
21079/*
21080 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21081 * any interesting requests and then jump to the real instruction
21082 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21083 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21084 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21085 * bail to the real handler if breakFlags==0.
21086 */
21087    ldrb   r3, [rSELF, #offThread_breakFlags]
21088    adrl   lr, dvmAsmInstructionStart + (292 * 64)
21089    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21090    cmp    r3, #0
21091    bxeq   lr                   @ nothing to do - jump to real handler
21092    EXPORT_PC()
21093    mov    r0, rPC              @ arg0
21094    mov    r1, rFP              @ arg1
21095    mov    r2, rSELF            @ arg2
21096    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21097
21098/* ------------------------------ */
21099    .balign 64
21100.L_ALT_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
21101/* File: armv5te/alt_stub.S */
21102/*
21103 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21104 * any interesting requests and then jump to the real instruction
21105 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21106 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21107 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21108 * bail to the real handler if breakFlags==0.
21109 */
21110    ldrb   r3, [rSELF, #offThread_breakFlags]
21111    adrl   lr, dvmAsmInstructionStart + (293 * 64)
21112    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21113    cmp    r3, #0
21114    bxeq   lr                   @ nothing to do - jump to real handler
21115    EXPORT_PC()
21116    mov    r0, rPC              @ arg0
21117    mov    r1, rFP              @ arg1
21118    mov    r2, rSELF            @ arg2
21119    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21120
21121/* ------------------------------ */
21122    .balign 64
21123.L_ALT_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
21124/* File: armv5te/alt_stub.S */
21125/*
21126 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21127 * any interesting requests and then jump to the real instruction
21128 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21129 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21130 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21131 * bail to the real handler if breakFlags==0.
21132 */
21133    ldrb   r3, [rSELF, #offThread_breakFlags]
21134    adrl   lr, dvmAsmInstructionStart + (294 * 64)
21135    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21136    cmp    r3, #0
21137    bxeq   lr                   @ nothing to do - jump to real handler
21138    EXPORT_PC()
21139    mov    r0, rPC              @ arg0
21140    mov    r1, rFP              @ arg1
21141    mov    r2, rSELF            @ arg2
21142    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21143
21144/* ------------------------------ */
21145    .balign 64
21146.L_ALT_OP_UNUSED_27FF: /* 0x127 */
21147/* File: armv5te/alt_stub.S */
21148/*
21149 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21150 * any interesting requests and then jump to the real instruction
21151 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21152 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21153 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21154 * bail to the real handler if breakFlags==0.
21155 */
21156    ldrb   r3, [rSELF, #offThread_breakFlags]
21157    adrl   lr, dvmAsmInstructionStart + (295 * 64)
21158    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21159    cmp    r3, #0
21160    bxeq   lr                   @ nothing to do - jump to real handler
21161    EXPORT_PC()
21162    mov    r0, rPC              @ arg0
21163    mov    r1, rFP              @ arg1
21164    mov    r2, rSELF            @ arg2
21165    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21166
21167/* ------------------------------ */
21168    .balign 64
21169.L_ALT_OP_UNUSED_28FF: /* 0x128 */
21170/* File: armv5te/alt_stub.S */
21171/*
21172 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21173 * any interesting requests and then jump to the real instruction
21174 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21175 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21176 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21177 * bail to the real handler if breakFlags==0.
21178 */
21179    ldrb   r3, [rSELF, #offThread_breakFlags]
21180    adrl   lr, dvmAsmInstructionStart + (296 * 64)
21181    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21182    cmp    r3, #0
21183    bxeq   lr                   @ nothing to do - jump to real handler
21184    EXPORT_PC()
21185    mov    r0, rPC              @ arg0
21186    mov    r1, rFP              @ arg1
21187    mov    r2, rSELF            @ arg2
21188    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21189
21190/* ------------------------------ */
21191    .balign 64
21192.L_ALT_OP_UNUSED_29FF: /* 0x129 */
21193/* File: armv5te/alt_stub.S */
21194/*
21195 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21196 * any interesting requests and then jump to the real instruction
21197 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21198 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21199 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21200 * bail to the real handler if breakFlags==0.
21201 */
21202    ldrb   r3, [rSELF, #offThread_breakFlags]
21203    adrl   lr, dvmAsmInstructionStart + (297 * 64)
21204    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21205    cmp    r3, #0
21206    bxeq   lr                   @ nothing to do - jump to real handler
21207    EXPORT_PC()
21208    mov    r0, rPC              @ arg0
21209    mov    r1, rFP              @ arg1
21210    mov    r2, rSELF            @ arg2
21211    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21212
21213/* ------------------------------ */
21214    .balign 64
21215.L_ALT_OP_UNUSED_2AFF: /* 0x12a */
21216/* File: armv5te/alt_stub.S */
21217/*
21218 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21219 * any interesting requests and then jump to the real instruction
21220 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21221 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21222 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21223 * bail to the real handler if breakFlags==0.
21224 */
21225    ldrb   r3, [rSELF, #offThread_breakFlags]
21226    adrl   lr, dvmAsmInstructionStart + (298 * 64)
21227    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21228    cmp    r3, #0
21229    bxeq   lr                   @ nothing to do - jump to real handler
21230    EXPORT_PC()
21231    mov    r0, rPC              @ arg0
21232    mov    r1, rFP              @ arg1
21233    mov    r2, rSELF            @ arg2
21234    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21235
21236/* ------------------------------ */
21237    .balign 64
21238.L_ALT_OP_UNUSED_2BFF: /* 0x12b */
21239/* File: armv5te/alt_stub.S */
21240/*
21241 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21242 * any interesting requests and then jump to the real instruction
21243 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21244 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21245 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21246 * bail to the real handler if breakFlags==0.
21247 */
21248    ldrb   r3, [rSELF, #offThread_breakFlags]
21249    adrl   lr, dvmAsmInstructionStart + (299 * 64)
21250    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21251    cmp    r3, #0
21252    bxeq   lr                   @ nothing to do - jump to real handler
21253    EXPORT_PC()
21254    mov    r0, rPC              @ arg0
21255    mov    r1, rFP              @ arg1
21256    mov    r2, rSELF            @ arg2
21257    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21258
21259/* ------------------------------ */
21260    .balign 64
21261.L_ALT_OP_UNUSED_2CFF: /* 0x12c */
21262/* File: armv5te/alt_stub.S */
21263/*
21264 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21265 * any interesting requests and then jump to the real instruction
21266 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21267 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21268 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21269 * bail to the real handler if breakFlags==0.
21270 */
21271    ldrb   r3, [rSELF, #offThread_breakFlags]
21272    adrl   lr, dvmAsmInstructionStart + (300 * 64)
21273    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21274    cmp    r3, #0
21275    bxeq   lr                   @ nothing to do - jump to real handler
21276    EXPORT_PC()
21277    mov    r0, rPC              @ arg0
21278    mov    r1, rFP              @ arg1
21279    mov    r2, rSELF            @ arg2
21280    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21281
21282/* ------------------------------ */
21283    .balign 64
21284.L_ALT_OP_UNUSED_2DFF: /* 0x12d */
21285/* File: armv5te/alt_stub.S */
21286/*
21287 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21288 * any interesting requests and then jump to the real instruction
21289 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21290 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21291 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21292 * bail to the real handler if breakFlags==0.
21293 */
21294    ldrb   r3, [rSELF, #offThread_breakFlags]
21295    adrl   lr, dvmAsmInstructionStart + (301 * 64)
21296    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21297    cmp    r3, #0
21298    bxeq   lr                   @ nothing to do - jump to real handler
21299    EXPORT_PC()
21300    mov    r0, rPC              @ arg0
21301    mov    r1, rFP              @ arg1
21302    mov    r2, rSELF            @ arg2
21303    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21304
21305/* ------------------------------ */
21306    .balign 64
21307.L_ALT_OP_UNUSED_2EFF: /* 0x12e */
21308/* File: armv5te/alt_stub.S */
21309/*
21310 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21311 * any interesting requests and then jump to the real instruction
21312 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21313 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21314 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21315 * bail to the real handler if breakFlags==0.
21316 */
21317    ldrb   r3, [rSELF, #offThread_breakFlags]
21318    adrl   lr, dvmAsmInstructionStart + (302 * 64)
21319    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21320    cmp    r3, #0
21321    bxeq   lr                   @ nothing to do - jump to real handler
21322    EXPORT_PC()
21323    mov    r0, rPC              @ arg0
21324    mov    r1, rFP              @ arg1
21325    mov    r2, rSELF            @ arg2
21326    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21327
21328/* ------------------------------ */
21329    .balign 64
21330.L_ALT_OP_UNUSED_2FFF: /* 0x12f */
21331/* File: armv5te/alt_stub.S */
21332/*
21333 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21334 * any interesting requests and then jump to the real instruction
21335 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21336 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21337 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21338 * bail to the real handler if breakFlags==0.
21339 */
21340    ldrb   r3, [rSELF, #offThread_breakFlags]
21341    adrl   lr, dvmAsmInstructionStart + (303 * 64)
21342    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21343    cmp    r3, #0
21344    bxeq   lr                   @ nothing to do - jump to real handler
21345    EXPORT_PC()
21346    mov    r0, rPC              @ arg0
21347    mov    r1, rFP              @ arg1
21348    mov    r2, rSELF            @ arg2
21349    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21350
21351/* ------------------------------ */
21352    .balign 64
21353.L_ALT_OP_UNUSED_30FF: /* 0x130 */
21354/* File: armv5te/alt_stub.S */
21355/*
21356 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21357 * any interesting requests and then jump to the real instruction
21358 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21359 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21360 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21361 * bail to the real handler if breakFlags==0.
21362 */
21363    ldrb   r3, [rSELF, #offThread_breakFlags]
21364    adrl   lr, dvmAsmInstructionStart + (304 * 64)
21365    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21366    cmp    r3, #0
21367    bxeq   lr                   @ nothing to do - jump to real handler
21368    EXPORT_PC()
21369    mov    r0, rPC              @ arg0
21370    mov    r1, rFP              @ arg1
21371    mov    r2, rSELF            @ arg2
21372    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21373
21374/* ------------------------------ */
21375    .balign 64
21376.L_ALT_OP_UNUSED_31FF: /* 0x131 */
21377/* File: armv5te/alt_stub.S */
21378/*
21379 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21380 * any interesting requests and then jump to the real instruction
21381 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21382 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21383 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21384 * bail to the real handler if breakFlags==0.
21385 */
21386    ldrb   r3, [rSELF, #offThread_breakFlags]
21387    adrl   lr, dvmAsmInstructionStart + (305 * 64)
21388    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21389    cmp    r3, #0
21390    bxeq   lr                   @ nothing to do - jump to real handler
21391    EXPORT_PC()
21392    mov    r0, rPC              @ arg0
21393    mov    r1, rFP              @ arg1
21394    mov    r2, rSELF            @ arg2
21395    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21396
21397/* ------------------------------ */
21398    .balign 64
21399.L_ALT_OP_UNUSED_32FF: /* 0x132 */
21400/* File: armv5te/alt_stub.S */
21401/*
21402 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21403 * any interesting requests and then jump to the real instruction
21404 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21405 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21406 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21407 * bail to the real handler if breakFlags==0.
21408 */
21409    ldrb   r3, [rSELF, #offThread_breakFlags]
21410    adrl   lr, dvmAsmInstructionStart + (306 * 64)
21411    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21412    cmp    r3, #0
21413    bxeq   lr                   @ nothing to do - jump to real handler
21414    EXPORT_PC()
21415    mov    r0, rPC              @ arg0
21416    mov    r1, rFP              @ arg1
21417    mov    r2, rSELF            @ arg2
21418    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21419
21420/* ------------------------------ */
21421    .balign 64
21422.L_ALT_OP_UNUSED_33FF: /* 0x133 */
21423/* File: armv5te/alt_stub.S */
21424/*
21425 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21426 * any interesting requests and then jump to the real instruction
21427 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21428 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21429 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21430 * bail to the real handler if breakFlags==0.
21431 */
21432    ldrb   r3, [rSELF, #offThread_breakFlags]
21433    adrl   lr, dvmAsmInstructionStart + (307 * 64)
21434    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21435    cmp    r3, #0
21436    bxeq   lr                   @ nothing to do - jump to real handler
21437    EXPORT_PC()
21438    mov    r0, rPC              @ arg0
21439    mov    r1, rFP              @ arg1
21440    mov    r2, rSELF            @ arg2
21441    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21442
21443/* ------------------------------ */
21444    .balign 64
21445.L_ALT_OP_UNUSED_34FF: /* 0x134 */
21446/* File: armv5te/alt_stub.S */
21447/*
21448 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21449 * any interesting requests and then jump to the real instruction
21450 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21451 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21452 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21453 * bail to the real handler if breakFlags==0.
21454 */
21455    ldrb   r3, [rSELF, #offThread_breakFlags]
21456    adrl   lr, dvmAsmInstructionStart + (308 * 64)
21457    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21458    cmp    r3, #0
21459    bxeq   lr                   @ nothing to do - jump to real handler
21460    EXPORT_PC()
21461    mov    r0, rPC              @ arg0
21462    mov    r1, rFP              @ arg1
21463    mov    r2, rSELF            @ arg2
21464    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21465
21466/* ------------------------------ */
21467    .balign 64
21468.L_ALT_OP_UNUSED_35FF: /* 0x135 */
21469/* File: armv5te/alt_stub.S */
21470/*
21471 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21472 * any interesting requests and then jump to the real instruction
21473 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21474 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21475 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21476 * bail to the real handler if breakFlags==0.
21477 */
21478    ldrb   r3, [rSELF, #offThread_breakFlags]
21479    adrl   lr, dvmAsmInstructionStart + (309 * 64)
21480    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21481    cmp    r3, #0
21482    bxeq   lr                   @ nothing to do - jump to real handler
21483    EXPORT_PC()
21484    mov    r0, rPC              @ arg0
21485    mov    r1, rFP              @ arg1
21486    mov    r2, rSELF            @ arg2
21487    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21488
21489/* ------------------------------ */
21490    .balign 64
21491.L_ALT_OP_UNUSED_36FF: /* 0x136 */
21492/* File: armv5te/alt_stub.S */
21493/*
21494 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21495 * any interesting requests and then jump to the real instruction
21496 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21497 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21498 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21499 * bail to the real handler if breakFlags==0.
21500 */
21501    ldrb   r3, [rSELF, #offThread_breakFlags]
21502    adrl   lr, dvmAsmInstructionStart + (310 * 64)
21503    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21504    cmp    r3, #0
21505    bxeq   lr                   @ nothing to do - jump to real handler
21506    EXPORT_PC()
21507    mov    r0, rPC              @ arg0
21508    mov    r1, rFP              @ arg1
21509    mov    r2, rSELF            @ arg2
21510    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21511
21512/* ------------------------------ */
21513    .balign 64
21514.L_ALT_OP_UNUSED_37FF: /* 0x137 */
21515/* File: armv5te/alt_stub.S */
21516/*
21517 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21518 * any interesting requests and then jump to the real instruction
21519 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21520 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21521 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21522 * bail to the real handler if breakFlags==0.
21523 */
21524    ldrb   r3, [rSELF, #offThread_breakFlags]
21525    adrl   lr, dvmAsmInstructionStart + (311 * 64)
21526    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21527    cmp    r3, #0
21528    bxeq   lr                   @ nothing to do - jump to real handler
21529    EXPORT_PC()
21530    mov    r0, rPC              @ arg0
21531    mov    r1, rFP              @ arg1
21532    mov    r2, rSELF            @ arg2
21533    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21534
21535/* ------------------------------ */
21536    .balign 64
21537.L_ALT_OP_UNUSED_38FF: /* 0x138 */
21538/* File: armv5te/alt_stub.S */
21539/*
21540 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21541 * any interesting requests and then jump to the real instruction
21542 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21543 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21544 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21545 * bail to the real handler if breakFlags==0.
21546 */
21547    ldrb   r3, [rSELF, #offThread_breakFlags]
21548    adrl   lr, dvmAsmInstructionStart + (312 * 64)
21549    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21550    cmp    r3, #0
21551    bxeq   lr                   @ nothing to do - jump to real handler
21552    EXPORT_PC()
21553    mov    r0, rPC              @ arg0
21554    mov    r1, rFP              @ arg1
21555    mov    r2, rSELF            @ arg2
21556    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21557
21558/* ------------------------------ */
21559    .balign 64
21560.L_ALT_OP_UNUSED_39FF: /* 0x139 */
21561/* File: armv5te/alt_stub.S */
21562/*
21563 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21564 * any interesting requests and then jump to the real instruction
21565 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21566 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21567 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21568 * bail to the real handler if breakFlags==0.
21569 */
21570    ldrb   r3, [rSELF, #offThread_breakFlags]
21571    adrl   lr, dvmAsmInstructionStart + (313 * 64)
21572    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21573    cmp    r3, #0
21574    bxeq   lr                   @ nothing to do - jump to real handler
21575    EXPORT_PC()
21576    mov    r0, rPC              @ arg0
21577    mov    r1, rFP              @ arg1
21578    mov    r2, rSELF            @ arg2
21579    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21580
21581/* ------------------------------ */
21582    .balign 64
21583.L_ALT_OP_UNUSED_3AFF: /* 0x13a */
21584/* File: armv5te/alt_stub.S */
21585/*
21586 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21587 * any interesting requests and then jump to the real instruction
21588 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21589 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21590 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21591 * bail to the real handler if breakFlags==0.
21592 */
21593    ldrb   r3, [rSELF, #offThread_breakFlags]
21594    adrl   lr, dvmAsmInstructionStart + (314 * 64)
21595    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21596    cmp    r3, #0
21597    bxeq   lr                   @ nothing to do - jump to real handler
21598    EXPORT_PC()
21599    mov    r0, rPC              @ arg0
21600    mov    r1, rFP              @ arg1
21601    mov    r2, rSELF            @ arg2
21602    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21603
21604/* ------------------------------ */
21605    .balign 64
21606.L_ALT_OP_UNUSED_3BFF: /* 0x13b */
21607/* File: armv5te/alt_stub.S */
21608/*
21609 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21610 * any interesting requests and then jump to the real instruction
21611 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21612 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21613 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21614 * bail to the real handler if breakFlags==0.
21615 */
21616    ldrb   r3, [rSELF, #offThread_breakFlags]
21617    adrl   lr, dvmAsmInstructionStart + (315 * 64)
21618    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21619    cmp    r3, #0
21620    bxeq   lr                   @ nothing to do - jump to real handler
21621    EXPORT_PC()
21622    mov    r0, rPC              @ arg0
21623    mov    r1, rFP              @ arg1
21624    mov    r2, rSELF            @ arg2
21625    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21626
21627/* ------------------------------ */
21628    .balign 64
21629.L_ALT_OP_UNUSED_3CFF: /* 0x13c */
21630/* File: armv5te/alt_stub.S */
21631/*
21632 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21633 * any interesting requests and then jump to the real instruction
21634 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21635 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21636 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21637 * bail to the real handler if breakFlags==0.
21638 */
21639    ldrb   r3, [rSELF, #offThread_breakFlags]
21640    adrl   lr, dvmAsmInstructionStart + (316 * 64)
21641    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21642    cmp    r3, #0
21643    bxeq   lr                   @ nothing to do - jump to real handler
21644    EXPORT_PC()
21645    mov    r0, rPC              @ arg0
21646    mov    r1, rFP              @ arg1
21647    mov    r2, rSELF            @ arg2
21648    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21649
21650/* ------------------------------ */
21651    .balign 64
21652.L_ALT_OP_UNUSED_3DFF: /* 0x13d */
21653/* File: armv5te/alt_stub.S */
21654/*
21655 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21656 * any interesting requests and then jump to the real instruction
21657 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21658 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21659 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21660 * bail to the real handler if breakFlags==0.
21661 */
21662    ldrb   r3, [rSELF, #offThread_breakFlags]
21663    adrl   lr, dvmAsmInstructionStart + (317 * 64)
21664    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21665    cmp    r3, #0
21666    bxeq   lr                   @ nothing to do - jump to real handler
21667    EXPORT_PC()
21668    mov    r0, rPC              @ arg0
21669    mov    r1, rFP              @ arg1
21670    mov    r2, rSELF            @ arg2
21671    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21672
21673/* ------------------------------ */
21674    .balign 64
21675.L_ALT_OP_UNUSED_3EFF: /* 0x13e */
21676/* File: armv5te/alt_stub.S */
21677/*
21678 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21679 * any interesting requests and then jump to the real instruction
21680 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21681 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21682 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21683 * bail to the real handler if breakFlags==0.
21684 */
21685    ldrb   r3, [rSELF, #offThread_breakFlags]
21686    adrl   lr, dvmAsmInstructionStart + (318 * 64)
21687    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21688    cmp    r3, #0
21689    bxeq   lr                   @ nothing to do - jump to real handler
21690    EXPORT_PC()
21691    mov    r0, rPC              @ arg0
21692    mov    r1, rFP              @ arg1
21693    mov    r2, rSELF            @ arg2
21694    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21695
21696/* ------------------------------ */
21697    .balign 64
21698.L_ALT_OP_UNUSED_3FFF: /* 0x13f */
21699/* File: armv5te/alt_stub.S */
21700/*
21701 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21702 * any interesting requests and then jump to the real instruction
21703 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21704 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21705 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21706 * bail to the real handler if breakFlags==0.
21707 */
21708    ldrb   r3, [rSELF, #offThread_breakFlags]
21709    adrl   lr, dvmAsmInstructionStart + (319 * 64)
21710    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21711    cmp    r3, #0
21712    bxeq   lr                   @ nothing to do - jump to real handler
21713    EXPORT_PC()
21714    mov    r0, rPC              @ arg0
21715    mov    r1, rFP              @ arg1
21716    mov    r2, rSELF            @ arg2
21717    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21718
21719/* ------------------------------ */
21720    .balign 64
21721.L_ALT_OP_UNUSED_40FF: /* 0x140 */
21722/* File: armv5te/alt_stub.S */
21723/*
21724 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21725 * any interesting requests and then jump to the real instruction
21726 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21727 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21728 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21729 * bail to the real handler if breakFlags==0.
21730 */
21731    ldrb   r3, [rSELF, #offThread_breakFlags]
21732    adrl   lr, dvmAsmInstructionStart + (320 * 64)
21733    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21734    cmp    r3, #0
21735    bxeq   lr                   @ nothing to do - jump to real handler
21736    EXPORT_PC()
21737    mov    r0, rPC              @ arg0
21738    mov    r1, rFP              @ arg1
21739    mov    r2, rSELF            @ arg2
21740    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21741
21742/* ------------------------------ */
21743    .balign 64
21744.L_ALT_OP_UNUSED_41FF: /* 0x141 */
21745/* File: armv5te/alt_stub.S */
21746/*
21747 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21748 * any interesting requests and then jump to the real instruction
21749 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21750 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21751 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21752 * bail to the real handler if breakFlags==0.
21753 */
21754    ldrb   r3, [rSELF, #offThread_breakFlags]
21755    adrl   lr, dvmAsmInstructionStart + (321 * 64)
21756    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21757    cmp    r3, #0
21758    bxeq   lr                   @ nothing to do - jump to real handler
21759    EXPORT_PC()
21760    mov    r0, rPC              @ arg0
21761    mov    r1, rFP              @ arg1
21762    mov    r2, rSELF            @ arg2
21763    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21764
21765/* ------------------------------ */
21766    .balign 64
21767.L_ALT_OP_UNUSED_42FF: /* 0x142 */
21768/* File: armv5te/alt_stub.S */
21769/*
21770 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21771 * any interesting requests and then jump to the real instruction
21772 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21773 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21774 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21775 * bail to the real handler if breakFlags==0.
21776 */
21777    ldrb   r3, [rSELF, #offThread_breakFlags]
21778    adrl   lr, dvmAsmInstructionStart + (322 * 64)
21779    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21780    cmp    r3, #0
21781    bxeq   lr                   @ nothing to do - jump to real handler
21782    EXPORT_PC()
21783    mov    r0, rPC              @ arg0
21784    mov    r1, rFP              @ arg1
21785    mov    r2, rSELF            @ arg2
21786    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21787
21788/* ------------------------------ */
21789    .balign 64
21790.L_ALT_OP_UNUSED_43FF: /* 0x143 */
21791/* File: armv5te/alt_stub.S */
21792/*
21793 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21794 * any interesting requests and then jump to the real instruction
21795 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21796 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21797 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21798 * bail to the real handler if breakFlags==0.
21799 */
21800    ldrb   r3, [rSELF, #offThread_breakFlags]
21801    adrl   lr, dvmAsmInstructionStart + (323 * 64)
21802    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21803    cmp    r3, #0
21804    bxeq   lr                   @ nothing to do - jump to real handler
21805    EXPORT_PC()
21806    mov    r0, rPC              @ arg0
21807    mov    r1, rFP              @ arg1
21808    mov    r2, rSELF            @ arg2
21809    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21810
21811/* ------------------------------ */
21812    .balign 64
21813.L_ALT_OP_UNUSED_44FF: /* 0x144 */
21814/* File: armv5te/alt_stub.S */
21815/*
21816 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21817 * any interesting requests and then jump to the real instruction
21818 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21819 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21820 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21821 * bail to the real handler if breakFlags==0.
21822 */
21823    ldrb   r3, [rSELF, #offThread_breakFlags]
21824    adrl   lr, dvmAsmInstructionStart + (324 * 64)
21825    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21826    cmp    r3, #0
21827    bxeq   lr                   @ nothing to do - jump to real handler
21828    EXPORT_PC()
21829    mov    r0, rPC              @ arg0
21830    mov    r1, rFP              @ arg1
21831    mov    r2, rSELF            @ arg2
21832    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21833
21834/* ------------------------------ */
21835    .balign 64
21836.L_ALT_OP_UNUSED_45FF: /* 0x145 */
21837/* File: armv5te/alt_stub.S */
21838/*
21839 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21840 * any interesting requests and then jump to the real instruction
21841 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21842 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21843 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21844 * bail to the real handler if breakFlags==0.
21845 */
21846    ldrb   r3, [rSELF, #offThread_breakFlags]
21847    adrl   lr, dvmAsmInstructionStart + (325 * 64)
21848    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21849    cmp    r3, #0
21850    bxeq   lr                   @ nothing to do - jump to real handler
21851    EXPORT_PC()
21852    mov    r0, rPC              @ arg0
21853    mov    r1, rFP              @ arg1
21854    mov    r2, rSELF            @ arg2
21855    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21856
21857/* ------------------------------ */
21858    .balign 64
21859.L_ALT_OP_UNUSED_46FF: /* 0x146 */
21860/* File: armv5te/alt_stub.S */
21861/*
21862 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21863 * any interesting requests and then jump to the real instruction
21864 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21865 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21866 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21867 * bail to the real handler if breakFlags==0.
21868 */
21869    ldrb   r3, [rSELF, #offThread_breakFlags]
21870    adrl   lr, dvmAsmInstructionStart + (326 * 64)
21871    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21872    cmp    r3, #0
21873    bxeq   lr                   @ nothing to do - jump to real handler
21874    EXPORT_PC()
21875    mov    r0, rPC              @ arg0
21876    mov    r1, rFP              @ arg1
21877    mov    r2, rSELF            @ arg2
21878    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21879
21880/* ------------------------------ */
21881    .balign 64
21882.L_ALT_OP_UNUSED_47FF: /* 0x147 */
21883/* File: armv5te/alt_stub.S */
21884/*
21885 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21886 * any interesting requests and then jump to the real instruction
21887 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21888 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21889 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21890 * bail to the real handler if breakFlags==0.
21891 */
21892    ldrb   r3, [rSELF, #offThread_breakFlags]
21893    adrl   lr, dvmAsmInstructionStart + (327 * 64)
21894    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21895    cmp    r3, #0
21896    bxeq   lr                   @ nothing to do - jump to real handler
21897    EXPORT_PC()
21898    mov    r0, rPC              @ arg0
21899    mov    r1, rFP              @ arg1
21900    mov    r2, rSELF            @ arg2
21901    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21902
21903/* ------------------------------ */
21904    .balign 64
21905.L_ALT_OP_UNUSED_48FF: /* 0x148 */
21906/* File: armv5te/alt_stub.S */
21907/*
21908 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21909 * any interesting requests and then jump to the real instruction
21910 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21911 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21912 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21913 * bail to the real handler if breakFlags==0.
21914 */
21915    ldrb   r3, [rSELF, #offThread_breakFlags]
21916    adrl   lr, dvmAsmInstructionStart + (328 * 64)
21917    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21918    cmp    r3, #0
21919    bxeq   lr                   @ nothing to do - jump to real handler
21920    EXPORT_PC()
21921    mov    r0, rPC              @ arg0
21922    mov    r1, rFP              @ arg1
21923    mov    r2, rSELF            @ arg2
21924    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21925
21926/* ------------------------------ */
21927    .balign 64
21928.L_ALT_OP_UNUSED_49FF: /* 0x149 */
21929/* File: armv5te/alt_stub.S */
21930/*
21931 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21932 * any interesting requests and then jump to the real instruction
21933 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21934 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21935 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21936 * bail to the real handler if breakFlags==0.
21937 */
21938    ldrb   r3, [rSELF, #offThread_breakFlags]
21939    adrl   lr, dvmAsmInstructionStart + (329 * 64)
21940    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21941    cmp    r3, #0
21942    bxeq   lr                   @ nothing to do - jump to real handler
21943    EXPORT_PC()
21944    mov    r0, rPC              @ arg0
21945    mov    r1, rFP              @ arg1
21946    mov    r2, rSELF            @ arg2
21947    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21948
21949/* ------------------------------ */
21950    .balign 64
21951.L_ALT_OP_UNUSED_4AFF: /* 0x14a */
21952/* File: armv5te/alt_stub.S */
21953/*
21954 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21955 * any interesting requests and then jump to the real instruction
21956 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21957 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21958 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21959 * bail to the real handler if breakFlags==0.
21960 */
21961    ldrb   r3, [rSELF, #offThread_breakFlags]
21962    adrl   lr, dvmAsmInstructionStart + (330 * 64)
21963    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21964    cmp    r3, #0
21965    bxeq   lr                   @ nothing to do - jump to real handler
21966    EXPORT_PC()
21967    mov    r0, rPC              @ arg0
21968    mov    r1, rFP              @ arg1
21969    mov    r2, rSELF            @ arg2
21970    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21971
21972/* ------------------------------ */
21973    .balign 64
21974.L_ALT_OP_UNUSED_4BFF: /* 0x14b */
21975/* File: armv5te/alt_stub.S */
21976/*
21977 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21978 * any interesting requests and then jump to the real instruction
21979 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21980 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21981 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21982 * bail to the real handler if breakFlags==0.
21983 */
21984    ldrb   r3, [rSELF, #offThread_breakFlags]
21985    adrl   lr, dvmAsmInstructionStart + (331 * 64)
21986    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21987    cmp    r3, #0
21988    bxeq   lr                   @ nothing to do - jump to real handler
21989    EXPORT_PC()
21990    mov    r0, rPC              @ arg0
21991    mov    r1, rFP              @ arg1
21992    mov    r2, rSELF            @ arg2
21993    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21994
21995/* ------------------------------ */
21996    .balign 64
21997.L_ALT_OP_UNUSED_4CFF: /* 0x14c */
21998/* File: armv5te/alt_stub.S */
21999/*
22000 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22001 * any interesting requests and then jump to the real instruction
22002 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22003 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22004 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22005 * bail to the real handler if breakFlags==0.
22006 */
22007    ldrb   r3, [rSELF, #offThread_breakFlags]
22008    adrl   lr, dvmAsmInstructionStart + (332 * 64)
22009    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22010    cmp    r3, #0
22011    bxeq   lr                   @ nothing to do - jump to real handler
22012    EXPORT_PC()
22013    mov    r0, rPC              @ arg0
22014    mov    r1, rFP              @ arg1
22015    mov    r2, rSELF            @ arg2
22016    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22017
22018/* ------------------------------ */
22019    .balign 64
22020.L_ALT_OP_UNUSED_4DFF: /* 0x14d */
22021/* File: armv5te/alt_stub.S */
22022/*
22023 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22024 * any interesting requests and then jump to the real instruction
22025 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22026 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22027 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22028 * bail to the real handler if breakFlags==0.
22029 */
22030    ldrb   r3, [rSELF, #offThread_breakFlags]
22031    adrl   lr, dvmAsmInstructionStart + (333 * 64)
22032    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22033    cmp    r3, #0
22034    bxeq   lr                   @ nothing to do - jump to real handler
22035    EXPORT_PC()
22036    mov    r0, rPC              @ arg0
22037    mov    r1, rFP              @ arg1
22038    mov    r2, rSELF            @ arg2
22039    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22040
22041/* ------------------------------ */
22042    .balign 64
22043.L_ALT_OP_UNUSED_4EFF: /* 0x14e */
22044/* File: armv5te/alt_stub.S */
22045/*
22046 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22047 * any interesting requests and then jump to the real instruction
22048 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22049 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22050 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22051 * bail to the real handler if breakFlags==0.
22052 */
22053    ldrb   r3, [rSELF, #offThread_breakFlags]
22054    adrl   lr, dvmAsmInstructionStart + (334 * 64)
22055    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22056    cmp    r3, #0
22057    bxeq   lr                   @ nothing to do - jump to real handler
22058    EXPORT_PC()
22059    mov    r0, rPC              @ arg0
22060    mov    r1, rFP              @ arg1
22061    mov    r2, rSELF            @ arg2
22062    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22063
22064/* ------------------------------ */
22065    .balign 64
22066.L_ALT_OP_UNUSED_4FFF: /* 0x14f */
22067/* File: armv5te/alt_stub.S */
22068/*
22069 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22070 * any interesting requests and then jump to the real instruction
22071 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22072 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22073 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22074 * bail to the real handler if breakFlags==0.
22075 */
22076    ldrb   r3, [rSELF, #offThread_breakFlags]
22077    adrl   lr, dvmAsmInstructionStart + (335 * 64)
22078    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22079    cmp    r3, #0
22080    bxeq   lr                   @ nothing to do - jump to real handler
22081    EXPORT_PC()
22082    mov    r0, rPC              @ arg0
22083    mov    r1, rFP              @ arg1
22084    mov    r2, rSELF            @ arg2
22085    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22086
22087/* ------------------------------ */
22088    .balign 64
22089.L_ALT_OP_UNUSED_50FF: /* 0x150 */
22090/* File: armv5te/alt_stub.S */
22091/*
22092 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22093 * any interesting requests and then jump to the real instruction
22094 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22095 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22096 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22097 * bail to the real handler if breakFlags==0.
22098 */
22099    ldrb   r3, [rSELF, #offThread_breakFlags]
22100    adrl   lr, dvmAsmInstructionStart + (336 * 64)
22101    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22102    cmp    r3, #0
22103    bxeq   lr                   @ nothing to do - jump to real handler
22104    EXPORT_PC()
22105    mov    r0, rPC              @ arg0
22106    mov    r1, rFP              @ arg1
22107    mov    r2, rSELF            @ arg2
22108    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22109
22110/* ------------------------------ */
22111    .balign 64
22112.L_ALT_OP_UNUSED_51FF: /* 0x151 */
22113/* File: armv5te/alt_stub.S */
22114/*
22115 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22116 * any interesting requests and then jump to the real instruction
22117 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22118 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22119 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22120 * bail to the real handler if breakFlags==0.
22121 */
22122    ldrb   r3, [rSELF, #offThread_breakFlags]
22123    adrl   lr, dvmAsmInstructionStart + (337 * 64)
22124    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22125    cmp    r3, #0
22126    bxeq   lr                   @ nothing to do - jump to real handler
22127    EXPORT_PC()
22128    mov    r0, rPC              @ arg0
22129    mov    r1, rFP              @ arg1
22130    mov    r2, rSELF            @ arg2
22131    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22132
22133/* ------------------------------ */
22134    .balign 64
22135.L_ALT_OP_UNUSED_52FF: /* 0x152 */
22136/* File: armv5te/alt_stub.S */
22137/*
22138 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22139 * any interesting requests and then jump to the real instruction
22140 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22141 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22142 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22143 * bail to the real handler if breakFlags==0.
22144 */
22145    ldrb   r3, [rSELF, #offThread_breakFlags]
22146    adrl   lr, dvmAsmInstructionStart + (338 * 64)
22147    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22148    cmp    r3, #0
22149    bxeq   lr                   @ nothing to do - jump to real handler
22150    EXPORT_PC()
22151    mov    r0, rPC              @ arg0
22152    mov    r1, rFP              @ arg1
22153    mov    r2, rSELF            @ arg2
22154    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22155
22156/* ------------------------------ */
22157    .balign 64
22158.L_ALT_OP_UNUSED_53FF: /* 0x153 */
22159/* File: armv5te/alt_stub.S */
22160/*
22161 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22162 * any interesting requests and then jump to the real instruction
22163 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22164 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22165 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22166 * bail to the real handler if breakFlags==0.
22167 */
22168    ldrb   r3, [rSELF, #offThread_breakFlags]
22169    adrl   lr, dvmAsmInstructionStart + (339 * 64)
22170    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22171    cmp    r3, #0
22172    bxeq   lr                   @ nothing to do - jump to real handler
22173    EXPORT_PC()
22174    mov    r0, rPC              @ arg0
22175    mov    r1, rFP              @ arg1
22176    mov    r2, rSELF            @ arg2
22177    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22178
22179/* ------------------------------ */
22180    .balign 64
22181.L_ALT_OP_UNUSED_54FF: /* 0x154 */
22182/* File: armv5te/alt_stub.S */
22183/*
22184 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22185 * any interesting requests and then jump to the real instruction
22186 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22187 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22188 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22189 * bail to the real handler if breakFlags==0.
22190 */
22191    ldrb   r3, [rSELF, #offThread_breakFlags]
22192    adrl   lr, dvmAsmInstructionStart + (340 * 64)
22193    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22194    cmp    r3, #0
22195    bxeq   lr                   @ nothing to do - jump to real handler
22196    EXPORT_PC()
22197    mov    r0, rPC              @ arg0
22198    mov    r1, rFP              @ arg1
22199    mov    r2, rSELF            @ arg2
22200    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22201
22202/* ------------------------------ */
22203    .balign 64
22204.L_ALT_OP_UNUSED_55FF: /* 0x155 */
22205/* File: armv5te/alt_stub.S */
22206/*
22207 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22208 * any interesting requests and then jump to the real instruction
22209 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22210 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22211 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22212 * bail to the real handler if breakFlags==0.
22213 */
22214    ldrb   r3, [rSELF, #offThread_breakFlags]
22215    adrl   lr, dvmAsmInstructionStart + (341 * 64)
22216    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22217    cmp    r3, #0
22218    bxeq   lr                   @ nothing to do - jump to real handler
22219    EXPORT_PC()
22220    mov    r0, rPC              @ arg0
22221    mov    r1, rFP              @ arg1
22222    mov    r2, rSELF            @ arg2
22223    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22224
22225/* ------------------------------ */
22226    .balign 64
22227.L_ALT_OP_UNUSED_56FF: /* 0x156 */
22228/* File: armv5te/alt_stub.S */
22229/*
22230 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22231 * any interesting requests and then jump to the real instruction
22232 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22233 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22234 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22235 * bail to the real handler if breakFlags==0.
22236 */
22237    ldrb   r3, [rSELF, #offThread_breakFlags]
22238    adrl   lr, dvmAsmInstructionStart + (342 * 64)
22239    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22240    cmp    r3, #0
22241    bxeq   lr                   @ nothing to do - jump to real handler
22242    EXPORT_PC()
22243    mov    r0, rPC              @ arg0
22244    mov    r1, rFP              @ arg1
22245    mov    r2, rSELF            @ arg2
22246    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22247
22248/* ------------------------------ */
22249    .balign 64
22250.L_ALT_OP_UNUSED_57FF: /* 0x157 */
22251/* File: armv5te/alt_stub.S */
22252/*
22253 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22254 * any interesting requests and then jump to the real instruction
22255 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22256 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22257 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22258 * bail to the real handler if breakFlags==0.
22259 */
22260    ldrb   r3, [rSELF, #offThread_breakFlags]
22261    adrl   lr, dvmAsmInstructionStart + (343 * 64)
22262    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22263    cmp    r3, #0
22264    bxeq   lr                   @ nothing to do - jump to real handler
22265    EXPORT_PC()
22266    mov    r0, rPC              @ arg0
22267    mov    r1, rFP              @ arg1
22268    mov    r2, rSELF            @ arg2
22269    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22270
22271/* ------------------------------ */
22272    .balign 64
22273.L_ALT_OP_UNUSED_58FF: /* 0x158 */
22274/* File: armv5te/alt_stub.S */
22275/*
22276 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22277 * any interesting requests and then jump to the real instruction
22278 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22279 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22280 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22281 * bail to the real handler if breakFlags==0.
22282 */
22283    ldrb   r3, [rSELF, #offThread_breakFlags]
22284    adrl   lr, dvmAsmInstructionStart + (344 * 64)
22285    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22286    cmp    r3, #0
22287    bxeq   lr                   @ nothing to do - jump to real handler
22288    EXPORT_PC()
22289    mov    r0, rPC              @ arg0
22290    mov    r1, rFP              @ arg1
22291    mov    r2, rSELF            @ arg2
22292    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22293
22294/* ------------------------------ */
22295    .balign 64
22296.L_ALT_OP_UNUSED_59FF: /* 0x159 */
22297/* File: armv5te/alt_stub.S */
22298/*
22299 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22300 * any interesting requests and then jump to the real instruction
22301 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22302 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22303 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22304 * bail to the real handler if breakFlags==0.
22305 */
22306    ldrb   r3, [rSELF, #offThread_breakFlags]
22307    adrl   lr, dvmAsmInstructionStart + (345 * 64)
22308    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22309    cmp    r3, #0
22310    bxeq   lr                   @ nothing to do - jump to real handler
22311    EXPORT_PC()
22312    mov    r0, rPC              @ arg0
22313    mov    r1, rFP              @ arg1
22314    mov    r2, rSELF            @ arg2
22315    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22316
22317/* ------------------------------ */
22318    .balign 64
22319.L_ALT_OP_UNUSED_5AFF: /* 0x15a */
22320/* File: armv5te/alt_stub.S */
22321/*
22322 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22323 * any interesting requests and then jump to the real instruction
22324 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22325 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22326 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22327 * bail to the real handler if breakFlags==0.
22328 */
22329    ldrb   r3, [rSELF, #offThread_breakFlags]
22330    adrl   lr, dvmAsmInstructionStart + (346 * 64)
22331    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22332    cmp    r3, #0
22333    bxeq   lr                   @ nothing to do - jump to real handler
22334    EXPORT_PC()
22335    mov    r0, rPC              @ arg0
22336    mov    r1, rFP              @ arg1
22337    mov    r2, rSELF            @ arg2
22338    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22339
22340/* ------------------------------ */
22341    .balign 64
22342.L_ALT_OP_UNUSED_5BFF: /* 0x15b */
22343/* File: armv5te/alt_stub.S */
22344/*
22345 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22346 * any interesting requests and then jump to the real instruction
22347 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22348 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22349 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22350 * bail to the real handler if breakFlags==0.
22351 */
22352    ldrb   r3, [rSELF, #offThread_breakFlags]
22353    adrl   lr, dvmAsmInstructionStart + (347 * 64)
22354    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22355    cmp    r3, #0
22356    bxeq   lr                   @ nothing to do - jump to real handler
22357    EXPORT_PC()
22358    mov    r0, rPC              @ arg0
22359    mov    r1, rFP              @ arg1
22360    mov    r2, rSELF            @ arg2
22361    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22362
22363/* ------------------------------ */
22364    .balign 64
22365.L_ALT_OP_UNUSED_5CFF: /* 0x15c */
22366/* File: armv5te/alt_stub.S */
22367/*
22368 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22369 * any interesting requests and then jump to the real instruction
22370 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22371 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22372 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22373 * bail to the real handler if breakFlags==0.
22374 */
22375    ldrb   r3, [rSELF, #offThread_breakFlags]
22376    adrl   lr, dvmAsmInstructionStart + (348 * 64)
22377    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22378    cmp    r3, #0
22379    bxeq   lr                   @ nothing to do - jump to real handler
22380    EXPORT_PC()
22381    mov    r0, rPC              @ arg0
22382    mov    r1, rFP              @ arg1
22383    mov    r2, rSELF            @ arg2
22384    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22385
22386/* ------------------------------ */
22387    .balign 64
22388.L_ALT_OP_UNUSED_5DFF: /* 0x15d */
22389/* File: armv5te/alt_stub.S */
22390/*
22391 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22392 * any interesting requests and then jump to the real instruction
22393 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22394 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22395 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22396 * bail to the real handler if breakFlags==0.
22397 */
22398    ldrb   r3, [rSELF, #offThread_breakFlags]
22399    adrl   lr, dvmAsmInstructionStart + (349 * 64)
22400    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22401    cmp    r3, #0
22402    bxeq   lr                   @ nothing to do - jump to real handler
22403    EXPORT_PC()
22404    mov    r0, rPC              @ arg0
22405    mov    r1, rFP              @ arg1
22406    mov    r2, rSELF            @ arg2
22407    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22408
22409/* ------------------------------ */
22410    .balign 64
22411.L_ALT_OP_UNUSED_5EFF: /* 0x15e */
22412/* File: armv5te/alt_stub.S */
22413/*
22414 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22415 * any interesting requests and then jump to the real instruction
22416 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22417 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22418 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22419 * bail to the real handler if breakFlags==0.
22420 */
22421    ldrb   r3, [rSELF, #offThread_breakFlags]
22422    adrl   lr, dvmAsmInstructionStart + (350 * 64)
22423    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22424    cmp    r3, #0
22425    bxeq   lr                   @ nothing to do - jump to real handler
22426    EXPORT_PC()
22427    mov    r0, rPC              @ arg0
22428    mov    r1, rFP              @ arg1
22429    mov    r2, rSELF            @ arg2
22430    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22431
22432/* ------------------------------ */
22433    .balign 64
22434.L_ALT_OP_UNUSED_5FFF: /* 0x15f */
22435/* File: armv5te/alt_stub.S */
22436/*
22437 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22438 * any interesting requests and then jump to the real instruction
22439 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22440 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22441 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22442 * bail to the real handler if breakFlags==0.
22443 */
22444    ldrb   r3, [rSELF, #offThread_breakFlags]
22445    adrl   lr, dvmAsmInstructionStart + (351 * 64)
22446    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22447    cmp    r3, #0
22448    bxeq   lr                   @ nothing to do - jump to real handler
22449    EXPORT_PC()
22450    mov    r0, rPC              @ arg0
22451    mov    r1, rFP              @ arg1
22452    mov    r2, rSELF            @ arg2
22453    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22454
22455/* ------------------------------ */
22456    .balign 64
22457.L_ALT_OP_UNUSED_60FF: /* 0x160 */
22458/* File: armv5te/alt_stub.S */
22459/*
22460 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22461 * any interesting requests and then jump to the real instruction
22462 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22463 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22464 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22465 * bail to the real handler if breakFlags==0.
22466 */
22467    ldrb   r3, [rSELF, #offThread_breakFlags]
22468    adrl   lr, dvmAsmInstructionStart + (352 * 64)
22469    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22470    cmp    r3, #0
22471    bxeq   lr                   @ nothing to do - jump to real handler
22472    EXPORT_PC()
22473    mov    r0, rPC              @ arg0
22474    mov    r1, rFP              @ arg1
22475    mov    r2, rSELF            @ arg2
22476    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22477
22478/* ------------------------------ */
22479    .balign 64
22480.L_ALT_OP_UNUSED_61FF: /* 0x161 */
22481/* File: armv5te/alt_stub.S */
22482/*
22483 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22484 * any interesting requests and then jump to the real instruction
22485 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22486 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22487 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22488 * bail to the real handler if breakFlags==0.
22489 */
22490    ldrb   r3, [rSELF, #offThread_breakFlags]
22491    adrl   lr, dvmAsmInstructionStart + (353 * 64)
22492    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22493    cmp    r3, #0
22494    bxeq   lr                   @ nothing to do - jump to real handler
22495    EXPORT_PC()
22496    mov    r0, rPC              @ arg0
22497    mov    r1, rFP              @ arg1
22498    mov    r2, rSELF            @ arg2
22499    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22500
22501/* ------------------------------ */
22502    .balign 64
22503.L_ALT_OP_UNUSED_62FF: /* 0x162 */
22504/* File: armv5te/alt_stub.S */
22505/*
22506 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22507 * any interesting requests and then jump to the real instruction
22508 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22509 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22510 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22511 * bail to the real handler if breakFlags==0.
22512 */
22513    ldrb   r3, [rSELF, #offThread_breakFlags]
22514    adrl   lr, dvmAsmInstructionStart + (354 * 64)
22515    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22516    cmp    r3, #0
22517    bxeq   lr                   @ nothing to do - jump to real handler
22518    EXPORT_PC()
22519    mov    r0, rPC              @ arg0
22520    mov    r1, rFP              @ arg1
22521    mov    r2, rSELF            @ arg2
22522    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22523
22524/* ------------------------------ */
22525    .balign 64
22526.L_ALT_OP_UNUSED_63FF: /* 0x163 */
22527/* File: armv5te/alt_stub.S */
22528/*
22529 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22530 * any interesting requests and then jump to the real instruction
22531 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22532 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22533 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22534 * bail to the real handler if breakFlags==0.
22535 */
22536    ldrb   r3, [rSELF, #offThread_breakFlags]
22537    adrl   lr, dvmAsmInstructionStart + (355 * 64)
22538    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22539    cmp    r3, #0
22540    bxeq   lr                   @ nothing to do - jump to real handler
22541    EXPORT_PC()
22542    mov    r0, rPC              @ arg0
22543    mov    r1, rFP              @ arg1
22544    mov    r2, rSELF            @ arg2
22545    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22546
22547/* ------------------------------ */
22548    .balign 64
22549.L_ALT_OP_UNUSED_64FF: /* 0x164 */
22550/* File: armv5te/alt_stub.S */
22551/*
22552 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22553 * any interesting requests and then jump to the real instruction
22554 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22555 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22556 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22557 * bail to the real handler if breakFlags==0.
22558 */
22559    ldrb   r3, [rSELF, #offThread_breakFlags]
22560    adrl   lr, dvmAsmInstructionStart + (356 * 64)
22561    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22562    cmp    r3, #0
22563    bxeq   lr                   @ nothing to do - jump to real handler
22564    EXPORT_PC()
22565    mov    r0, rPC              @ arg0
22566    mov    r1, rFP              @ arg1
22567    mov    r2, rSELF            @ arg2
22568    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22569
22570/* ------------------------------ */
22571    .balign 64
22572.L_ALT_OP_UNUSED_65FF: /* 0x165 */
22573/* File: armv5te/alt_stub.S */
22574/*
22575 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22576 * any interesting requests and then jump to the real instruction
22577 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22578 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22579 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22580 * bail to the real handler if breakFlags==0.
22581 */
22582    ldrb   r3, [rSELF, #offThread_breakFlags]
22583    adrl   lr, dvmAsmInstructionStart + (357 * 64)
22584    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22585    cmp    r3, #0
22586    bxeq   lr                   @ nothing to do - jump to real handler
22587    EXPORT_PC()
22588    mov    r0, rPC              @ arg0
22589    mov    r1, rFP              @ arg1
22590    mov    r2, rSELF            @ arg2
22591    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22592
22593/* ------------------------------ */
22594    .balign 64
22595.L_ALT_OP_UNUSED_66FF: /* 0x166 */
22596/* File: armv5te/alt_stub.S */
22597/*
22598 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22599 * any interesting requests and then jump to the real instruction
22600 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22601 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22602 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22603 * bail to the real handler if breakFlags==0.
22604 */
22605    ldrb   r3, [rSELF, #offThread_breakFlags]
22606    adrl   lr, dvmAsmInstructionStart + (358 * 64)
22607    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22608    cmp    r3, #0
22609    bxeq   lr                   @ nothing to do - jump to real handler
22610    EXPORT_PC()
22611    mov    r0, rPC              @ arg0
22612    mov    r1, rFP              @ arg1
22613    mov    r2, rSELF            @ arg2
22614    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22615
22616/* ------------------------------ */
22617    .balign 64
22618.L_ALT_OP_UNUSED_67FF: /* 0x167 */
22619/* File: armv5te/alt_stub.S */
22620/*
22621 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22622 * any interesting requests and then jump to the real instruction
22623 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22624 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22625 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22626 * bail to the real handler if breakFlags==0.
22627 */
22628    ldrb   r3, [rSELF, #offThread_breakFlags]
22629    adrl   lr, dvmAsmInstructionStart + (359 * 64)
22630    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22631    cmp    r3, #0
22632    bxeq   lr                   @ nothing to do - jump to real handler
22633    EXPORT_PC()
22634    mov    r0, rPC              @ arg0
22635    mov    r1, rFP              @ arg1
22636    mov    r2, rSELF            @ arg2
22637    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22638
22639/* ------------------------------ */
22640    .balign 64
22641.L_ALT_OP_UNUSED_68FF: /* 0x168 */
22642/* File: armv5te/alt_stub.S */
22643/*
22644 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22645 * any interesting requests and then jump to the real instruction
22646 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22647 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22648 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22649 * bail to the real handler if breakFlags==0.
22650 */
22651    ldrb   r3, [rSELF, #offThread_breakFlags]
22652    adrl   lr, dvmAsmInstructionStart + (360 * 64)
22653    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22654    cmp    r3, #0
22655    bxeq   lr                   @ nothing to do - jump to real handler
22656    EXPORT_PC()
22657    mov    r0, rPC              @ arg0
22658    mov    r1, rFP              @ arg1
22659    mov    r2, rSELF            @ arg2
22660    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22661
22662/* ------------------------------ */
22663    .balign 64
22664.L_ALT_OP_UNUSED_69FF: /* 0x169 */
22665/* File: armv5te/alt_stub.S */
22666/*
22667 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22668 * any interesting requests and then jump to the real instruction
22669 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22670 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22671 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22672 * bail to the real handler if breakFlags==0.
22673 */
22674    ldrb   r3, [rSELF, #offThread_breakFlags]
22675    adrl   lr, dvmAsmInstructionStart + (361 * 64)
22676    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22677    cmp    r3, #0
22678    bxeq   lr                   @ nothing to do - jump to real handler
22679    EXPORT_PC()
22680    mov    r0, rPC              @ arg0
22681    mov    r1, rFP              @ arg1
22682    mov    r2, rSELF            @ arg2
22683    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22684
22685/* ------------------------------ */
22686    .balign 64
22687.L_ALT_OP_UNUSED_6AFF: /* 0x16a */
22688/* File: armv5te/alt_stub.S */
22689/*
22690 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22691 * any interesting requests and then jump to the real instruction
22692 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22693 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22694 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22695 * bail to the real handler if breakFlags==0.
22696 */
22697    ldrb   r3, [rSELF, #offThread_breakFlags]
22698    adrl   lr, dvmAsmInstructionStart + (362 * 64)
22699    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22700    cmp    r3, #0
22701    bxeq   lr                   @ nothing to do - jump to real handler
22702    EXPORT_PC()
22703    mov    r0, rPC              @ arg0
22704    mov    r1, rFP              @ arg1
22705    mov    r2, rSELF            @ arg2
22706    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22707
22708/* ------------------------------ */
22709    .balign 64
22710.L_ALT_OP_UNUSED_6BFF: /* 0x16b */
22711/* File: armv5te/alt_stub.S */
22712/*
22713 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22714 * any interesting requests and then jump to the real instruction
22715 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22716 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22717 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22718 * bail to the real handler if breakFlags==0.
22719 */
22720    ldrb   r3, [rSELF, #offThread_breakFlags]
22721    adrl   lr, dvmAsmInstructionStart + (363 * 64)
22722    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22723    cmp    r3, #0
22724    bxeq   lr                   @ nothing to do - jump to real handler
22725    EXPORT_PC()
22726    mov    r0, rPC              @ arg0
22727    mov    r1, rFP              @ arg1
22728    mov    r2, rSELF            @ arg2
22729    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22730
22731/* ------------------------------ */
22732    .balign 64
22733.L_ALT_OP_UNUSED_6CFF: /* 0x16c */
22734/* File: armv5te/alt_stub.S */
22735/*
22736 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22737 * any interesting requests and then jump to the real instruction
22738 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22739 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22740 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22741 * bail to the real handler if breakFlags==0.
22742 */
22743    ldrb   r3, [rSELF, #offThread_breakFlags]
22744    adrl   lr, dvmAsmInstructionStart + (364 * 64)
22745    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22746    cmp    r3, #0
22747    bxeq   lr                   @ nothing to do - jump to real handler
22748    EXPORT_PC()
22749    mov    r0, rPC              @ arg0
22750    mov    r1, rFP              @ arg1
22751    mov    r2, rSELF            @ arg2
22752    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22753
22754/* ------------------------------ */
22755    .balign 64
22756.L_ALT_OP_UNUSED_6DFF: /* 0x16d */
22757/* File: armv5te/alt_stub.S */
22758/*
22759 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22760 * any interesting requests and then jump to the real instruction
22761 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22762 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22763 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22764 * bail to the real handler if breakFlags==0.
22765 */
22766    ldrb   r3, [rSELF, #offThread_breakFlags]
22767    adrl   lr, dvmAsmInstructionStart + (365 * 64)
22768    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22769    cmp    r3, #0
22770    bxeq   lr                   @ nothing to do - jump to real handler
22771    EXPORT_PC()
22772    mov    r0, rPC              @ arg0
22773    mov    r1, rFP              @ arg1
22774    mov    r2, rSELF            @ arg2
22775    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22776
22777/* ------------------------------ */
22778    .balign 64
22779.L_ALT_OP_UNUSED_6EFF: /* 0x16e */
22780/* File: armv5te/alt_stub.S */
22781/*
22782 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22783 * any interesting requests and then jump to the real instruction
22784 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22785 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22786 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22787 * bail to the real handler if breakFlags==0.
22788 */
22789    ldrb   r3, [rSELF, #offThread_breakFlags]
22790    adrl   lr, dvmAsmInstructionStart + (366 * 64)
22791    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22792    cmp    r3, #0
22793    bxeq   lr                   @ nothing to do - jump to real handler
22794    EXPORT_PC()
22795    mov    r0, rPC              @ arg0
22796    mov    r1, rFP              @ arg1
22797    mov    r2, rSELF            @ arg2
22798    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22799
22800/* ------------------------------ */
22801    .balign 64
22802.L_ALT_OP_UNUSED_6FFF: /* 0x16f */
22803/* File: armv5te/alt_stub.S */
22804/*
22805 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22806 * any interesting requests and then jump to the real instruction
22807 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22808 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22809 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22810 * bail to the real handler if breakFlags==0.
22811 */
22812    ldrb   r3, [rSELF, #offThread_breakFlags]
22813    adrl   lr, dvmAsmInstructionStart + (367 * 64)
22814    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22815    cmp    r3, #0
22816    bxeq   lr                   @ nothing to do - jump to real handler
22817    EXPORT_PC()
22818    mov    r0, rPC              @ arg0
22819    mov    r1, rFP              @ arg1
22820    mov    r2, rSELF            @ arg2
22821    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22822
22823/* ------------------------------ */
22824    .balign 64
22825.L_ALT_OP_UNUSED_70FF: /* 0x170 */
22826/* File: armv5te/alt_stub.S */
22827/*
22828 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22829 * any interesting requests and then jump to the real instruction
22830 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22831 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22832 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22833 * bail to the real handler if breakFlags==0.
22834 */
22835    ldrb   r3, [rSELF, #offThread_breakFlags]
22836    adrl   lr, dvmAsmInstructionStart + (368 * 64)
22837    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22838    cmp    r3, #0
22839    bxeq   lr                   @ nothing to do - jump to real handler
22840    EXPORT_PC()
22841    mov    r0, rPC              @ arg0
22842    mov    r1, rFP              @ arg1
22843    mov    r2, rSELF            @ arg2
22844    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22845
22846/* ------------------------------ */
22847    .balign 64
22848.L_ALT_OP_UNUSED_71FF: /* 0x171 */
22849/* File: armv5te/alt_stub.S */
22850/*
22851 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22852 * any interesting requests and then jump to the real instruction
22853 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22854 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22855 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22856 * bail to the real handler if breakFlags==0.
22857 */
22858    ldrb   r3, [rSELF, #offThread_breakFlags]
22859    adrl   lr, dvmAsmInstructionStart + (369 * 64)
22860    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22861    cmp    r3, #0
22862    bxeq   lr                   @ nothing to do - jump to real handler
22863    EXPORT_PC()
22864    mov    r0, rPC              @ arg0
22865    mov    r1, rFP              @ arg1
22866    mov    r2, rSELF            @ arg2
22867    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22868
22869/* ------------------------------ */
22870    .balign 64
22871.L_ALT_OP_UNUSED_72FF: /* 0x172 */
22872/* File: armv5te/alt_stub.S */
22873/*
22874 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22875 * any interesting requests and then jump to the real instruction
22876 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22877 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22878 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22879 * bail to the real handler if breakFlags==0.
22880 */
22881    ldrb   r3, [rSELF, #offThread_breakFlags]
22882    adrl   lr, dvmAsmInstructionStart + (370 * 64)
22883    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22884    cmp    r3, #0
22885    bxeq   lr                   @ nothing to do - jump to real handler
22886    EXPORT_PC()
22887    mov    r0, rPC              @ arg0
22888    mov    r1, rFP              @ arg1
22889    mov    r2, rSELF            @ arg2
22890    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22891
22892/* ------------------------------ */
22893    .balign 64
22894.L_ALT_OP_UNUSED_73FF: /* 0x173 */
22895/* File: armv5te/alt_stub.S */
22896/*
22897 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22898 * any interesting requests and then jump to the real instruction
22899 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22900 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22901 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22902 * bail to the real handler if breakFlags==0.
22903 */
22904    ldrb   r3, [rSELF, #offThread_breakFlags]
22905    adrl   lr, dvmAsmInstructionStart + (371 * 64)
22906    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22907    cmp    r3, #0
22908    bxeq   lr                   @ nothing to do - jump to real handler
22909    EXPORT_PC()
22910    mov    r0, rPC              @ arg0
22911    mov    r1, rFP              @ arg1
22912    mov    r2, rSELF            @ arg2
22913    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22914
22915/* ------------------------------ */
22916    .balign 64
22917.L_ALT_OP_UNUSED_74FF: /* 0x174 */
22918/* File: armv5te/alt_stub.S */
22919/*
22920 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22921 * any interesting requests and then jump to the real instruction
22922 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22923 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22924 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22925 * bail to the real handler if breakFlags==0.
22926 */
22927    ldrb   r3, [rSELF, #offThread_breakFlags]
22928    adrl   lr, dvmAsmInstructionStart + (372 * 64)
22929    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22930    cmp    r3, #0
22931    bxeq   lr                   @ nothing to do - jump to real handler
22932    EXPORT_PC()
22933    mov    r0, rPC              @ arg0
22934    mov    r1, rFP              @ arg1
22935    mov    r2, rSELF            @ arg2
22936    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22937
22938/* ------------------------------ */
22939    .balign 64
22940.L_ALT_OP_UNUSED_75FF: /* 0x175 */
22941/* File: armv5te/alt_stub.S */
22942/*
22943 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22944 * any interesting requests and then jump to the real instruction
22945 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22946 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22947 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22948 * bail to the real handler if breakFlags==0.
22949 */
22950    ldrb   r3, [rSELF, #offThread_breakFlags]
22951    adrl   lr, dvmAsmInstructionStart + (373 * 64)
22952    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22953    cmp    r3, #0
22954    bxeq   lr                   @ nothing to do - jump to real handler
22955    EXPORT_PC()
22956    mov    r0, rPC              @ arg0
22957    mov    r1, rFP              @ arg1
22958    mov    r2, rSELF            @ arg2
22959    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22960
22961/* ------------------------------ */
22962    .balign 64
22963.L_ALT_OP_UNUSED_76FF: /* 0x176 */
22964/* File: armv5te/alt_stub.S */
22965/*
22966 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22967 * any interesting requests and then jump to the real instruction
22968 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22969 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22970 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22971 * bail to the real handler if breakFlags==0.
22972 */
22973    ldrb   r3, [rSELF, #offThread_breakFlags]
22974    adrl   lr, dvmAsmInstructionStart + (374 * 64)
22975    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22976    cmp    r3, #0
22977    bxeq   lr                   @ nothing to do - jump to real handler
22978    EXPORT_PC()
22979    mov    r0, rPC              @ arg0
22980    mov    r1, rFP              @ arg1
22981    mov    r2, rSELF            @ arg2
22982    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22983
22984/* ------------------------------ */
22985    .balign 64
22986.L_ALT_OP_UNUSED_77FF: /* 0x177 */
22987/* File: armv5te/alt_stub.S */
22988/*
22989 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22990 * any interesting requests and then jump to the real instruction
22991 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22992 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22993 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22994 * bail to the real handler if breakFlags==0.
22995 */
22996    ldrb   r3, [rSELF, #offThread_breakFlags]
22997    adrl   lr, dvmAsmInstructionStart + (375 * 64)
22998    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22999    cmp    r3, #0
23000    bxeq   lr                   @ nothing to do - jump to real handler
23001    EXPORT_PC()
23002    mov    r0, rPC              @ arg0
23003    mov    r1, rFP              @ arg1
23004    mov    r2, rSELF            @ arg2
23005    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23006
23007/* ------------------------------ */
23008    .balign 64
23009.L_ALT_OP_UNUSED_78FF: /* 0x178 */
23010/* File: armv5te/alt_stub.S */
23011/*
23012 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23013 * any interesting requests and then jump to the real instruction
23014 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23015 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23016 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23017 * bail to the real handler if breakFlags==0.
23018 */
23019    ldrb   r3, [rSELF, #offThread_breakFlags]
23020    adrl   lr, dvmAsmInstructionStart + (376 * 64)
23021    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23022    cmp    r3, #0
23023    bxeq   lr                   @ nothing to do - jump to real handler
23024    EXPORT_PC()
23025    mov    r0, rPC              @ arg0
23026    mov    r1, rFP              @ arg1
23027    mov    r2, rSELF            @ arg2
23028    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23029
23030/* ------------------------------ */
23031    .balign 64
23032.L_ALT_OP_UNUSED_79FF: /* 0x179 */
23033/* File: armv5te/alt_stub.S */
23034/*
23035 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23036 * any interesting requests and then jump to the real instruction
23037 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23038 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23039 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23040 * bail to the real handler if breakFlags==0.
23041 */
23042    ldrb   r3, [rSELF, #offThread_breakFlags]
23043    adrl   lr, dvmAsmInstructionStart + (377 * 64)
23044    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23045    cmp    r3, #0
23046    bxeq   lr                   @ nothing to do - jump to real handler
23047    EXPORT_PC()
23048    mov    r0, rPC              @ arg0
23049    mov    r1, rFP              @ arg1
23050    mov    r2, rSELF            @ arg2
23051    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23052
23053/* ------------------------------ */
23054    .balign 64
23055.L_ALT_OP_UNUSED_7AFF: /* 0x17a */
23056/* File: armv5te/alt_stub.S */
23057/*
23058 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23059 * any interesting requests and then jump to the real instruction
23060 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23061 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23062 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23063 * bail to the real handler if breakFlags==0.
23064 */
23065    ldrb   r3, [rSELF, #offThread_breakFlags]
23066    adrl   lr, dvmAsmInstructionStart + (378 * 64)
23067    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23068    cmp    r3, #0
23069    bxeq   lr                   @ nothing to do - jump to real handler
23070    EXPORT_PC()
23071    mov    r0, rPC              @ arg0
23072    mov    r1, rFP              @ arg1
23073    mov    r2, rSELF            @ arg2
23074    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23075
23076/* ------------------------------ */
23077    .balign 64
23078.L_ALT_OP_UNUSED_7BFF: /* 0x17b */
23079/* File: armv5te/alt_stub.S */
23080/*
23081 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23082 * any interesting requests and then jump to the real instruction
23083 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23084 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23085 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23086 * bail to the real handler if breakFlags==0.
23087 */
23088    ldrb   r3, [rSELF, #offThread_breakFlags]
23089    adrl   lr, dvmAsmInstructionStart + (379 * 64)
23090    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23091    cmp    r3, #0
23092    bxeq   lr                   @ nothing to do - jump to real handler
23093    EXPORT_PC()
23094    mov    r0, rPC              @ arg0
23095    mov    r1, rFP              @ arg1
23096    mov    r2, rSELF            @ arg2
23097    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23098
23099/* ------------------------------ */
23100    .balign 64
23101.L_ALT_OP_UNUSED_7CFF: /* 0x17c */
23102/* File: armv5te/alt_stub.S */
23103/*
23104 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23105 * any interesting requests and then jump to the real instruction
23106 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23107 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23108 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23109 * bail to the real handler if breakFlags==0.
23110 */
23111    ldrb   r3, [rSELF, #offThread_breakFlags]
23112    adrl   lr, dvmAsmInstructionStart + (380 * 64)
23113    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23114    cmp    r3, #0
23115    bxeq   lr                   @ nothing to do - jump to real handler
23116    EXPORT_PC()
23117    mov    r0, rPC              @ arg0
23118    mov    r1, rFP              @ arg1
23119    mov    r2, rSELF            @ arg2
23120    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23121
23122/* ------------------------------ */
23123    .balign 64
23124.L_ALT_OP_UNUSED_7DFF: /* 0x17d */
23125/* File: armv5te/alt_stub.S */
23126/*
23127 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23128 * any interesting requests and then jump to the real instruction
23129 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23130 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23131 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23132 * bail to the real handler if breakFlags==0.
23133 */
23134    ldrb   r3, [rSELF, #offThread_breakFlags]
23135    adrl   lr, dvmAsmInstructionStart + (381 * 64)
23136    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23137    cmp    r3, #0
23138    bxeq   lr                   @ nothing to do - jump to real handler
23139    EXPORT_PC()
23140    mov    r0, rPC              @ arg0
23141    mov    r1, rFP              @ arg1
23142    mov    r2, rSELF            @ arg2
23143    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23144
23145/* ------------------------------ */
23146    .balign 64
23147.L_ALT_OP_UNUSED_7EFF: /* 0x17e */
23148/* File: armv5te/alt_stub.S */
23149/*
23150 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23151 * any interesting requests and then jump to the real instruction
23152 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23153 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23154 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23155 * bail to the real handler if breakFlags==0.
23156 */
23157    ldrb   r3, [rSELF, #offThread_breakFlags]
23158    adrl   lr, dvmAsmInstructionStart + (382 * 64)
23159    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23160    cmp    r3, #0
23161    bxeq   lr                   @ nothing to do - jump to real handler
23162    EXPORT_PC()
23163    mov    r0, rPC              @ arg0
23164    mov    r1, rFP              @ arg1
23165    mov    r2, rSELF            @ arg2
23166    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23167
23168/* ------------------------------ */
23169    .balign 64
23170.L_ALT_OP_UNUSED_7FFF: /* 0x17f */
23171/* File: armv5te/alt_stub.S */
23172/*
23173 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23174 * any interesting requests and then jump to the real instruction
23175 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23176 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23177 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23178 * bail to the real handler if breakFlags==0.
23179 */
23180    ldrb   r3, [rSELF, #offThread_breakFlags]
23181    adrl   lr, dvmAsmInstructionStart + (383 * 64)
23182    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23183    cmp    r3, #0
23184    bxeq   lr                   @ nothing to do - jump to real handler
23185    EXPORT_PC()
23186    mov    r0, rPC              @ arg0
23187    mov    r1, rFP              @ arg1
23188    mov    r2, rSELF            @ arg2
23189    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23190
23191/* ------------------------------ */
23192    .balign 64
23193.L_ALT_OP_UNUSED_80FF: /* 0x180 */
23194/* File: armv5te/alt_stub.S */
23195/*
23196 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23197 * any interesting requests and then jump to the real instruction
23198 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23199 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23200 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23201 * bail to the real handler if breakFlags==0.
23202 */
23203    ldrb   r3, [rSELF, #offThread_breakFlags]
23204    adrl   lr, dvmAsmInstructionStart + (384 * 64)
23205    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23206    cmp    r3, #0
23207    bxeq   lr                   @ nothing to do - jump to real handler
23208    EXPORT_PC()
23209    mov    r0, rPC              @ arg0
23210    mov    r1, rFP              @ arg1
23211    mov    r2, rSELF            @ arg2
23212    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23213
23214/* ------------------------------ */
23215    .balign 64
23216.L_ALT_OP_UNUSED_81FF: /* 0x181 */
23217/* File: armv5te/alt_stub.S */
23218/*
23219 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23220 * any interesting requests and then jump to the real instruction
23221 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23222 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23223 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23224 * bail to the real handler if breakFlags==0.
23225 */
23226    ldrb   r3, [rSELF, #offThread_breakFlags]
23227    adrl   lr, dvmAsmInstructionStart + (385 * 64)
23228    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23229    cmp    r3, #0
23230    bxeq   lr                   @ nothing to do - jump to real handler
23231    EXPORT_PC()
23232    mov    r0, rPC              @ arg0
23233    mov    r1, rFP              @ arg1
23234    mov    r2, rSELF            @ arg2
23235    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23236
23237/* ------------------------------ */
23238    .balign 64
23239.L_ALT_OP_UNUSED_82FF: /* 0x182 */
23240/* File: armv5te/alt_stub.S */
23241/*
23242 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23243 * any interesting requests and then jump to the real instruction
23244 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23245 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23246 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23247 * bail to the real handler if breakFlags==0.
23248 */
23249    ldrb   r3, [rSELF, #offThread_breakFlags]
23250    adrl   lr, dvmAsmInstructionStart + (386 * 64)
23251    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23252    cmp    r3, #0
23253    bxeq   lr                   @ nothing to do - jump to real handler
23254    EXPORT_PC()
23255    mov    r0, rPC              @ arg0
23256    mov    r1, rFP              @ arg1
23257    mov    r2, rSELF            @ arg2
23258    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23259
23260/* ------------------------------ */
23261    .balign 64
23262.L_ALT_OP_UNUSED_83FF: /* 0x183 */
23263/* File: armv5te/alt_stub.S */
23264/*
23265 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23266 * any interesting requests and then jump to the real instruction
23267 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23268 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23269 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23270 * bail to the real handler if breakFlags==0.
23271 */
23272    ldrb   r3, [rSELF, #offThread_breakFlags]
23273    adrl   lr, dvmAsmInstructionStart + (387 * 64)
23274    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23275    cmp    r3, #0
23276    bxeq   lr                   @ nothing to do - jump to real handler
23277    EXPORT_PC()
23278    mov    r0, rPC              @ arg0
23279    mov    r1, rFP              @ arg1
23280    mov    r2, rSELF            @ arg2
23281    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23282
23283/* ------------------------------ */
23284    .balign 64
23285.L_ALT_OP_UNUSED_84FF: /* 0x184 */
23286/* File: armv5te/alt_stub.S */
23287/*
23288 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23289 * any interesting requests and then jump to the real instruction
23290 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23291 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23292 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23293 * bail to the real handler if breakFlags==0.
23294 */
23295    ldrb   r3, [rSELF, #offThread_breakFlags]
23296    adrl   lr, dvmAsmInstructionStart + (388 * 64)
23297    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23298    cmp    r3, #0
23299    bxeq   lr                   @ nothing to do - jump to real handler
23300    EXPORT_PC()
23301    mov    r0, rPC              @ arg0
23302    mov    r1, rFP              @ arg1
23303    mov    r2, rSELF            @ arg2
23304    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23305
23306/* ------------------------------ */
23307    .balign 64
23308.L_ALT_OP_UNUSED_85FF: /* 0x185 */
23309/* File: armv5te/alt_stub.S */
23310/*
23311 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23312 * any interesting requests and then jump to the real instruction
23313 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23314 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23315 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23316 * bail to the real handler if breakFlags==0.
23317 */
23318    ldrb   r3, [rSELF, #offThread_breakFlags]
23319    adrl   lr, dvmAsmInstructionStart + (389 * 64)
23320    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23321    cmp    r3, #0
23322    bxeq   lr                   @ nothing to do - jump to real handler
23323    EXPORT_PC()
23324    mov    r0, rPC              @ arg0
23325    mov    r1, rFP              @ arg1
23326    mov    r2, rSELF            @ arg2
23327    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23328
23329/* ------------------------------ */
23330    .balign 64
23331.L_ALT_OP_UNUSED_86FF: /* 0x186 */
23332/* File: armv5te/alt_stub.S */
23333/*
23334 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23335 * any interesting requests and then jump to the real instruction
23336 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23337 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23338 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23339 * bail to the real handler if breakFlags==0.
23340 */
23341    ldrb   r3, [rSELF, #offThread_breakFlags]
23342    adrl   lr, dvmAsmInstructionStart + (390 * 64)
23343    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23344    cmp    r3, #0
23345    bxeq   lr                   @ nothing to do - jump to real handler
23346    EXPORT_PC()
23347    mov    r0, rPC              @ arg0
23348    mov    r1, rFP              @ arg1
23349    mov    r2, rSELF            @ arg2
23350    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23351
23352/* ------------------------------ */
23353    .balign 64
23354.L_ALT_OP_UNUSED_87FF: /* 0x187 */
23355/* File: armv5te/alt_stub.S */
23356/*
23357 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23358 * any interesting requests and then jump to the real instruction
23359 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23360 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23361 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23362 * bail to the real handler if breakFlags==0.
23363 */
23364    ldrb   r3, [rSELF, #offThread_breakFlags]
23365    adrl   lr, dvmAsmInstructionStart + (391 * 64)
23366    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23367    cmp    r3, #0
23368    bxeq   lr                   @ nothing to do - jump to real handler
23369    EXPORT_PC()
23370    mov    r0, rPC              @ arg0
23371    mov    r1, rFP              @ arg1
23372    mov    r2, rSELF            @ arg2
23373    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23374
23375/* ------------------------------ */
23376    .balign 64
23377.L_ALT_OP_UNUSED_88FF: /* 0x188 */
23378/* File: armv5te/alt_stub.S */
23379/*
23380 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23381 * any interesting requests and then jump to the real instruction
23382 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23383 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23384 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23385 * bail to the real handler if breakFlags==0.
23386 */
23387    ldrb   r3, [rSELF, #offThread_breakFlags]
23388    adrl   lr, dvmAsmInstructionStart + (392 * 64)
23389    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23390    cmp    r3, #0
23391    bxeq   lr                   @ nothing to do - jump to real handler
23392    EXPORT_PC()
23393    mov    r0, rPC              @ arg0
23394    mov    r1, rFP              @ arg1
23395    mov    r2, rSELF            @ arg2
23396    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23397
23398/* ------------------------------ */
23399    .balign 64
23400.L_ALT_OP_UNUSED_89FF: /* 0x189 */
23401/* File: armv5te/alt_stub.S */
23402/*
23403 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23404 * any interesting requests and then jump to the real instruction
23405 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23406 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23407 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23408 * bail to the real handler if breakFlags==0.
23409 */
23410    ldrb   r3, [rSELF, #offThread_breakFlags]
23411    adrl   lr, dvmAsmInstructionStart + (393 * 64)
23412    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23413    cmp    r3, #0
23414    bxeq   lr                   @ nothing to do - jump to real handler
23415    EXPORT_PC()
23416    mov    r0, rPC              @ arg0
23417    mov    r1, rFP              @ arg1
23418    mov    r2, rSELF            @ arg2
23419    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23420
23421/* ------------------------------ */
23422    .balign 64
23423.L_ALT_OP_UNUSED_8AFF: /* 0x18a */
23424/* File: armv5te/alt_stub.S */
23425/*
23426 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23427 * any interesting requests and then jump to the real instruction
23428 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23429 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23430 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23431 * bail to the real handler if breakFlags==0.
23432 */
23433    ldrb   r3, [rSELF, #offThread_breakFlags]
23434    adrl   lr, dvmAsmInstructionStart + (394 * 64)
23435    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23436    cmp    r3, #0
23437    bxeq   lr                   @ nothing to do - jump to real handler
23438    EXPORT_PC()
23439    mov    r0, rPC              @ arg0
23440    mov    r1, rFP              @ arg1
23441    mov    r2, rSELF            @ arg2
23442    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23443
23444/* ------------------------------ */
23445    .balign 64
23446.L_ALT_OP_UNUSED_8BFF: /* 0x18b */
23447/* File: armv5te/alt_stub.S */
23448/*
23449 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23450 * any interesting requests and then jump to the real instruction
23451 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23452 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23453 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23454 * bail to the real handler if breakFlags==0.
23455 */
23456    ldrb   r3, [rSELF, #offThread_breakFlags]
23457    adrl   lr, dvmAsmInstructionStart + (395 * 64)
23458    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23459    cmp    r3, #0
23460    bxeq   lr                   @ nothing to do - jump to real handler
23461    EXPORT_PC()
23462    mov    r0, rPC              @ arg0
23463    mov    r1, rFP              @ arg1
23464    mov    r2, rSELF            @ arg2
23465    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23466
23467/* ------------------------------ */
23468    .balign 64
23469.L_ALT_OP_UNUSED_8CFF: /* 0x18c */
23470/* File: armv5te/alt_stub.S */
23471/*
23472 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23473 * any interesting requests and then jump to the real instruction
23474 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23475 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23476 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23477 * bail to the real handler if breakFlags==0.
23478 */
23479    ldrb   r3, [rSELF, #offThread_breakFlags]
23480    adrl   lr, dvmAsmInstructionStart + (396 * 64)
23481    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23482    cmp    r3, #0
23483    bxeq   lr                   @ nothing to do - jump to real handler
23484    EXPORT_PC()
23485    mov    r0, rPC              @ arg0
23486    mov    r1, rFP              @ arg1
23487    mov    r2, rSELF            @ arg2
23488    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23489
23490/* ------------------------------ */
23491    .balign 64
23492.L_ALT_OP_UNUSED_8DFF: /* 0x18d */
23493/* File: armv5te/alt_stub.S */
23494/*
23495 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23496 * any interesting requests and then jump to the real instruction
23497 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23498 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23499 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23500 * bail to the real handler if breakFlags==0.
23501 */
23502    ldrb   r3, [rSELF, #offThread_breakFlags]
23503    adrl   lr, dvmAsmInstructionStart + (397 * 64)
23504    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23505    cmp    r3, #0
23506    bxeq   lr                   @ nothing to do - jump to real handler
23507    EXPORT_PC()
23508    mov    r0, rPC              @ arg0
23509    mov    r1, rFP              @ arg1
23510    mov    r2, rSELF            @ arg2
23511    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23512
23513/* ------------------------------ */
23514    .balign 64
23515.L_ALT_OP_UNUSED_8EFF: /* 0x18e */
23516/* File: armv5te/alt_stub.S */
23517/*
23518 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23519 * any interesting requests and then jump to the real instruction
23520 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23521 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23522 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23523 * bail to the real handler if breakFlags==0.
23524 */
23525    ldrb   r3, [rSELF, #offThread_breakFlags]
23526    adrl   lr, dvmAsmInstructionStart + (398 * 64)
23527    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23528    cmp    r3, #0
23529    bxeq   lr                   @ nothing to do - jump to real handler
23530    EXPORT_PC()
23531    mov    r0, rPC              @ arg0
23532    mov    r1, rFP              @ arg1
23533    mov    r2, rSELF            @ arg2
23534    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23535
23536/* ------------------------------ */
23537    .balign 64
23538.L_ALT_OP_UNUSED_8FFF: /* 0x18f */
23539/* File: armv5te/alt_stub.S */
23540/*
23541 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23542 * any interesting requests and then jump to the real instruction
23543 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23544 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23545 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23546 * bail to the real handler if breakFlags==0.
23547 */
23548    ldrb   r3, [rSELF, #offThread_breakFlags]
23549    adrl   lr, dvmAsmInstructionStart + (399 * 64)
23550    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23551    cmp    r3, #0
23552    bxeq   lr                   @ nothing to do - jump to real handler
23553    EXPORT_PC()
23554    mov    r0, rPC              @ arg0
23555    mov    r1, rFP              @ arg1
23556    mov    r2, rSELF            @ arg2
23557    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23558
23559/* ------------------------------ */
23560    .balign 64
23561.L_ALT_OP_UNUSED_90FF: /* 0x190 */
23562/* File: armv5te/alt_stub.S */
23563/*
23564 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23565 * any interesting requests and then jump to the real instruction
23566 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23567 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23568 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23569 * bail to the real handler if breakFlags==0.
23570 */
23571    ldrb   r3, [rSELF, #offThread_breakFlags]
23572    adrl   lr, dvmAsmInstructionStart + (400 * 64)
23573    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23574    cmp    r3, #0
23575    bxeq   lr                   @ nothing to do - jump to real handler
23576    EXPORT_PC()
23577    mov    r0, rPC              @ arg0
23578    mov    r1, rFP              @ arg1
23579    mov    r2, rSELF            @ arg2
23580    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23581
23582/* ------------------------------ */
23583    .balign 64
23584.L_ALT_OP_UNUSED_91FF: /* 0x191 */
23585/* File: armv5te/alt_stub.S */
23586/*
23587 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23588 * any interesting requests and then jump to the real instruction
23589 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23590 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23591 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23592 * bail to the real handler if breakFlags==0.
23593 */
23594    ldrb   r3, [rSELF, #offThread_breakFlags]
23595    adrl   lr, dvmAsmInstructionStart + (401 * 64)
23596    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23597    cmp    r3, #0
23598    bxeq   lr                   @ nothing to do - jump to real handler
23599    EXPORT_PC()
23600    mov    r0, rPC              @ arg0
23601    mov    r1, rFP              @ arg1
23602    mov    r2, rSELF            @ arg2
23603    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23604
23605/* ------------------------------ */
23606    .balign 64
23607.L_ALT_OP_UNUSED_92FF: /* 0x192 */
23608/* File: armv5te/alt_stub.S */
23609/*
23610 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23611 * any interesting requests and then jump to the real instruction
23612 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23613 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23614 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23615 * bail to the real handler if breakFlags==0.
23616 */
23617    ldrb   r3, [rSELF, #offThread_breakFlags]
23618    adrl   lr, dvmAsmInstructionStart + (402 * 64)
23619    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23620    cmp    r3, #0
23621    bxeq   lr                   @ nothing to do - jump to real handler
23622    EXPORT_PC()
23623    mov    r0, rPC              @ arg0
23624    mov    r1, rFP              @ arg1
23625    mov    r2, rSELF            @ arg2
23626    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23627
23628/* ------------------------------ */
23629    .balign 64
23630.L_ALT_OP_UNUSED_93FF: /* 0x193 */
23631/* File: armv5te/alt_stub.S */
23632/*
23633 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23634 * any interesting requests and then jump to the real instruction
23635 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23636 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23637 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23638 * bail to the real handler if breakFlags==0.
23639 */
23640    ldrb   r3, [rSELF, #offThread_breakFlags]
23641    adrl   lr, dvmAsmInstructionStart + (403 * 64)
23642    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23643    cmp    r3, #0
23644    bxeq   lr                   @ nothing to do - jump to real handler
23645    EXPORT_PC()
23646    mov    r0, rPC              @ arg0
23647    mov    r1, rFP              @ arg1
23648    mov    r2, rSELF            @ arg2
23649    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23650
23651/* ------------------------------ */
23652    .balign 64
23653.L_ALT_OP_UNUSED_94FF: /* 0x194 */
23654/* File: armv5te/alt_stub.S */
23655/*
23656 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23657 * any interesting requests and then jump to the real instruction
23658 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23659 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23660 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23661 * bail to the real handler if breakFlags==0.
23662 */
23663    ldrb   r3, [rSELF, #offThread_breakFlags]
23664    adrl   lr, dvmAsmInstructionStart + (404 * 64)
23665    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23666    cmp    r3, #0
23667    bxeq   lr                   @ nothing to do - jump to real handler
23668    EXPORT_PC()
23669    mov    r0, rPC              @ arg0
23670    mov    r1, rFP              @ arg1
23671    mov    r2, rSELF            @ arg2
23672    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23673
23674/* ------------------------------ */
23675    .balign 64
23676.L_ALT_OP_UNUSED_95FF: /* 0x195 */
23677/* File: armv5te/alt_stub.S */
23678/*
23679 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23680 * any interesting requests and then jump to the real instruction
23681 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23682 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23683 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23684 * bail to the real handler if breakFlags==0.
23685 */
23686    ldrb   r3, [rSELF, #offThread_breakFlags]
23687    adrl   lr, dvmAsmInstructionStart + (405 * 64)
23688    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23689    cmp    r3, #0
23690    bxeq   lr                   @ nothing to do - jump to real handler
23691    EXPORT_PC()
23692    mov    r0, rPC              @ arg0
23693    mov    r1, rFP              @ arg1
23694    mov    r2, rSELF            @ arg2
23695    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23696
23697/* ------------------------------ */
23698    .balign 64
23699.L_ALT_OP_UNUSED_96FF: /* 0x196 */
23700/* File: armv5te/alt_stub.S */
23701/*
23702 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23703 * any interesting requests and then jump to the real instruction
23704 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23705 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23706 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23707 * bail to the real handler if breakFlags==0.
23708 */
23709    ldrb   r3, [rSELF, #offThread_breakFlags]
23710    adrl   lr, dvmAsmInstructionStart + (406 * 64)
23711    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23712    cmp    r3, #0
23713    bxeq   lr                   @ nothing to do - jump to real handler
23714    EXPORT_PC()
23715    mov    r0, rPC              @ arg0
23716    mov    r1, rFP              @ arg1
23717    mov    r2, rSELF            @ arg2
23718    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23719
23720/* ------------------------------ */
23721    .balign 64
23722.L_ALT_OP_UNUSED_97FF: /* 0x197 */
23723/* File: armv5te/alt_stub.S */
23724/*
23725 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23726 * any interesting requests and then jump to the real instruction
23727 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23728 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23729 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23730 * bail to the real handler if breakFlags==0.
23731 */
23732    ldrb   r3, [rSELF, #offThread_breakFlags]
23733    adrl   lr, dvmAsmInstructionStart + (407 * 64)
23734    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23735    cmp    r3, #0
23736    bxeq   lr                   @ nothing to do - jump to real handler
23737    EXPORT_PC()
23738    mov    r0, rPC              @ arg0
23739    mov    r1, rFP              @ arg1
23740    mov    r2, rSELF            @ arg2
23741    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23742
23743/* ------------------------------ */
23744    .balign 64
23745.L_ALT_OP_UNUSED_98FF: /* 0x198 */
23746/* File: armv5te/alt_stub.S */
23747/*
23748 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23749 * any interesting requests and then jump to the real instruction
23750 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23751 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23752 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23753 * bail to the real handler if breakFlags==0.
23754 */
23755    ldrb   r3, [rSELF, #offThread_breakFlags]
23756    adrl   lr, dvmAsmInstructionStart + (408 * 64)
23757    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23758    cmp    r3, #0
23759    bxeq   lr                   @ nothing to do - jump to real handler
23760    EXPORT_PC()
23761    mov    r0, rPC              @ arg0
23762    mov    r1, rFP              @ arg1
23763    mov    r2, rSELF            @ arg2
23764    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23765
23766/* ------------------------------ */
23767    .balign 64
23768.L_ALT_OP_UNUSED_99FF: /* 0x199 */
23769/* File: armv5te/alt_stub.S */
23770/*
23771 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23772 * any interesting requests and then jump to the real instruction
23773 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23774 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23775 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23776 * bail to the real handler if breakFlags==0.
23777 */
23778    ldrb   r3, [rSELF, #offThread_breakFlags]
23779    adrl   lr, dvmAsmInstructionStart + (409 * 64)
23780    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23781    cmp    r3, #0
23782    bxeq   lr                   @ nothing to do - jump to real handler
23783    EXPORT_PC()
23784    mov    r0, rPC              @ arg0
23785    mov    r1, rFP              @ arg1
23786    mov    r2, rSELF            @ arg2
23787    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23788
23789/* ------------------------------ */
23790    .balign 64
23791.L_ALT_OP_UNUSED_9AFF: /* 0x19a */
23792/* File: armv5te/alt_stub.S */
23793/*
23794 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23795 * any interesting requests and then jump to the real instruction
23796 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23797 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23798 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23799 * bail to the real handler if breakFlags==0.
23800 */
23801    ldrb   r3, [rSELF, #offThread_breakFlags]
23802    adrl   lr, dvmAsmInstructionStart + (410 * 64)
23803    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23804    cmp    r3, #0
23805    bxeq   lr                   @ nothing to do - jump to real handler
23806    EXPORT_PC()
23807    mov    r0, rPC              @ arg0
23808    mov    r1, rFP              @ arg1
23809    mov    r2, rSELF            @ arg2
23810    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23811
23812/* ------------------------------ */
23813    .balign 64
23814.L_ALT_OP_UNUSED_9BFF: /* 0x19b */
23815/* File: armv5te/alt_stub.S */
23816/*
23817 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23818 * any interesting requests and then jump to the real instruction
23819 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23820 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23821 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23822 * bail to the real handler if breakFlags==0.
23823 */
23824    ldrb   r3, [rSELF, #offThread_breakFlags]
23825    adrl   lr, dvmAsmInstructionStart + (411 * 64)
23826    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23827    cmp    r3, #0
23828    bxeq   lr                   @ nothing to do - jump to real handler
23829    EXPORT_PC()
23830    mov    r0, rPC              @ arg0
23831    mov    r1, rFP              @ arg1
23832    mov    r2, rSELF            @ arg2
23833    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23834
23835/* ------------------------------ */
23836    .balign 64
23837.L_ALT_OP_UNUSED_9CFF: /* 0x19c */
23838/* File: armv5te/alt_stub.S */
23839/*
23840 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23841 * any interesting requests and then jump to the real instruction
23842 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23843 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23844 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23845 * bail to the real handler if breakFlags==0.
23846 */
23847    ldrb   r3, [rSELF, #offThread_breakFlags]
23848    adrl   lr, dvmAsmInstructionStart + (412 * 64)
23849    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23850    cmp    r3, #0
23851    bxeq   lr                   @ nothing to do - jump to real handler
23852    EXPORT_PC()
23853    mov    r0, rPC              @ arg0
23854    mov    r1, rFP              @ arg1
23855    mov    r2, rSELF            @ arg2
23856    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23857
23858/* ------------------------------ */
23859    .balign 64
23860.L_ALT_OP_UNUSED_9DFF: /* 0x19d */
23861/* File: armv5te/alt_stub.S */
23862/*
23863 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23864 * any interesting requests and then jump to the real instruction
23865 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23866 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23867 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23868 * bail to the real handler if breakFlags==0.
23869 */
23870    ldrb   r3, [rSELF, #offThread_breakFlags]
23871    adrl   lr, dvmAsmInstructionStart + (413 * 64)
23872    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23873    cmp    r3, #0
23874    bxeq   lr                   @ nothing to do - jump to real handler
23875    EXPORT_PC()
23876    mov    r0, rPC              @ arg0
23877    mov    r1, rFP              @ arg1
23878    mov    r2, rSELF            @ arg2
23879    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23880
23881/* ------------------------------ */
23882    .balign 64
23883.L_ALT_OP_UNUSED_9EFF: /* 0x19e */
23884/* File: armv5te/alt_stub.S */
23885/*
23886 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23887 * any interesting requests and then jump to the real instruction
23888 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23889 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23890 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23891 * bail to the real handler if breakFlags==0.
23892 */
23893    ldrb   r3, [rSELF, #offThread_breakFlags]
23894    adrl   lr, dvmAsmInstructionStart + (414 * 64)
23895    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23896    cmp    r3, #0
23897    bxeq   lr                   @ nothing to do - jump to real handler
23898    EXPORT_PC()
23899    mov    r0, rPC              @ arg0
23900    mov    r1, rFP              @ arg1
23901    mov    r2, rSELF            @ arg2
23902    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23903
23904/* ------------------------------ */
23905    .balign 64
23906.L_ALT_OP_UNUSED_9FFF: /* 0x19f */
23907/* File: armv5te/alt_stub.S */
23908/*
23909 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23910 * any interesting requests and then jump to the real instruction
23911 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23912 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23913 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23914 * bail to the real handler if breakFlags==0.
23915 */
23916    ldrb   r3, [rSELF, #offThread_breakFlags]
23917    adrl   lr, dvmAsmInstructionStart + (415 * 64)
23918    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23919    cmp    r3, #0
23920    bxeq   lr                   @ nothing to do - jump to real handler
23921    EXPORT_PC()
23922    mov    r0, rPC              @ arg0
23923    mov    r1, rFP              @ arg1
23924    mov    r2, rSELF            @ arg2
23925    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23926
23927/* ------------------------------ */
23928    .balign 64
23929.L_ALT_OP_UNUSED_A0FF: /* 0x1a0 */
23930/* File: armv5te/alt_stub.S */
23931/*
23932 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23933 * any interesting requests and then jump to the real instruction
23934 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23935 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23936 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23937 * bail to the real handler if breakFlags==0.
23938 */
23939    ldrb   r3, [rSELF, #offThread_breakFlags]
23940    adrl   lr, dvmAsmInstructionStart + (416 * 64)
23941    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23942    cmp    r3, #0
23943    bxeq   lr                   @ nothing to do - jump to real handler
23944    EXPORT_PC()
23945    mov    r0, rPC              @ arg0
23946    mov    r1, rFP              @ arg1
23947    mov    r2, rSELF            @ arg2
23948    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23949
23950/* ------------------------------ */
23951    .balign 64
23952.L_ALT_OP_UNUSED_A1FF: /* 0x1a1 */
23953/* File: armv5te/alt_stub.S */
23954/*
23955 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23956 * any interesting requests and then jump to the real instruction
23957 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23958 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23959 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23960 * bail to the real handler if breakFlags==0.
23961 */
23962    ldrb   r3, [rSELF, #offThread_breakFlags]
23963    adrl   lr, dvmAsmInstructionStart + (417 * 64)
23964    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23965    cmp    r3, #0
23966    bxeq   lr                   @ nothing to do - jump to real handler
23967    EXPORT_PC()
23968    mov    r0, rPC              @ arg0
23969    mov    r1, rFP              @ arg1
23970    mov    r2, rSELF            @ arg2
23971    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23972
23973/* ------------------------------ */
23974    .balign 64
23975.L_ALT_OP_UNUSED_A2FF: /* 0x1a2 */
23976/* File: armv5te/alt_stub.S */
23977/*
23978 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23979 * any interesting requests and then jump to the real instruction
23980 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23981 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23982 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23983 * bail to the real handler if breakFlags==0.
23984 */
23985    ldrb   r3, [rSELF, #offThread_breakFlags]
23986    adrl   lr, dvmAsmInstructionStart + (418 * 64)
23987    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23988    cmp    r3, #0
23989    bxeq   lr                   @ nothing to do - jump to real handler
23990    EXPORT_PC()
23991    mov    r0, rPC              @ arg0
23992    mov    r1, rFP              @ arg1
23993    mov    r2, rSELF            @ arg2
23994    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23995
23996/* ------------------------------ */
23997    .balign 64
23998.L_ALT_OP_UNUSED_A3FF: /* 0x1a3 */
23999/* File: armv5te/alt_stub.S */
24000/*
24001 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24002 * any interesting requests and then jump to the real instruction
24003 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24004 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24005 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24006 * bail to the real handler if breakFlags==0.
24007 */
24008    ldrb   r3, [rSELF, #offThread_breakFlags]
24009    adrl   lr, dvmAsmInstructionStart + (419 * 64)
24010    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24011    cmp    r3, #0
24012    bxeq   lr                   @ nothing to do - jump to real handler
24013    EXPORT_PC()
24014    mov    r0, rPC              @ arg0
24015    mov    r1, rFP              @ arg1
24016    mov    r2, rSELF            @ arg2
24017    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24018
24019/* ------------------------------ */
24020    .balign 64
24021.L_ALT_OP_UNUSED_A4FF: /* 0x1a4 */
24022/* File: armv5te/alt_stub.S */
24023/*
24024 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24025 * any interesting requests and then jump to the real instruction
24026 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24027 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24028 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24029 * bail to the real handler if breakFlags==0.
24030 */
24031    ldrb   r3, [rSELF, #offThread_breakFlags]
24032    adrl   lr, dvmAsmInstructionStart + (420 * 64)
24033    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24034    cmp    r3, #0
24035    bxeq   lr                   @ nothing to do - jump to real handler
24036    EXPORT_PC()
24037    mov    r0, rPC              @ arg0
24038    mov    r1, rFP              @ arg1
24039    mov    r2, rSELF            @ arg2
24040    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24041
24042/* ------------------------------ */
24043    .balign 64
24044.L_ALT_OP_UNUSED_A5FF: /* 0x1a5 */
24045/* File: armv5te/alt_stub.S */
24046/*
24047 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24048 * any interesting requests and then jump to the real instruction
24049 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24050 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24051 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24052 * bail to the real handler if breakFlags==0.
24053 */
24054    ldrb   r3, [rSELF, #offThread_breakFlags]
24055    adrl   lr, dvmAsmInstructionStart + (421 * 64)
24056    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24057    cmp    r3, #0
24058    bxeq   lr                   @ nothing to do - jump to real handler
24059    EXPORT_PC()
24060    mov    r0, rPC              @ arg0
24061    mov    r1, rFP              @ arg1
24062    mov    r2, rSELF            @ arg2
24063    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24064
24065/* ------------------------------ */
24066    .balign 64
24067.L_ALT_OP_UNUSED_A6FF: /* 0x1a6 */
24068/* File: armv5te/alt_stub.S */
24069/*
24070 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24071 * any interesting requests and then jump to the real instruction
24072 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24073 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24074 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24075 * bail to the real handler if breakFlags==0.
24076 */
24077    ldrb   r3, [rSELF, #offThread_breakFlags]
24078    adrl   lr, dvmAsmInstructionStart + (422 * 64)
24079    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24080    cmp    r3, #0
24081    bxeq   lr                   @ nothing to do - jump to real handler
24082    EXPORT_PC()
24083    mov    r0, rPC              @ arg0
24084    mov    r1, rFP              @ arg1
24085    mov    r2, rSELF            @ arg2
24086    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24087
24088/* ------------------------------ */
24089    .balign 64
24090.L_ALT_OP_UNUSED_A7FF: /* 0x1a7 */
24091/* File: armv5te/alt_stub.S */
24092/*
24093 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24094 * any interesting requests and then jump to the real instruction
24095 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24096 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24097 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24098 * bail to the real handler if breakFlags==0.
24099 */
24100    ldrb   r3, [rSELF, #offThread_breakFlags]
24101    adrl   lr, dvmAsmInstructionStart + (423 * 64)
24102    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24103    cmp    r3, #0
24104    bxeq   lr                   @ nothing to do - jump to real handler
24105    EXPORT_PC()
24106    mov    r0, rPC              @ arg0
24107    mov    r1, rFP              @ arg1
24108    mov    r2, rSELF            @ arg2
24109    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24110
24111/* ------------------------------ */
24112    .balign 64
24113.L_ALT_OP_UNUSED_A8FF: /* 0x1a8 */
24114/* File: armv5te/alt_stub.S */
24115/*
24116 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24117 * any interesting requests and then jump to the real instruction
24118 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24119 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24120 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24121 * bail to the real handler if breakFlags==0.
24122 */
24123    ldrb   r3, [rSELF, #offThread_breakFlags]
24124    adrl   lr, dvmAsmInstructionStart + (424 * 64)
24125    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24126    cmp    r3, #0
24127    bxeq   lr                   @ nothing to do - jump to real handler
24128    EXPORT_PC()
24129    mov    r0, rPC              @ arg0
24130    mov    r1, rFP              @ arg1
24131    mov    r2, rSELF            @ arg2
24132    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24133
24134/* ------------------------------ */
24135    .balign 64
24136.L_ALT_OP_UNUSED_A9FF: /* 0x1a9 */
24137/* File: armv5te/alt_stub.S */
24138/*
24139 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24140 * any interesting requests and then jump to the real instruction
24141 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24142 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24143 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24144 * bail to the real handler if breakFlags==0.
24145 */
24146    ldrb   r3, [rSELF, #offThread_breakFlags]
24147    adrl   lr, dvmAsmInstructionStart + (425 * 64)
24148    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24149    cmp    r3, #0
24150    bxeq   lr                   @ nothing to do - jump to real handler
24151    EXPORT_PC()
24152    mov    r0, rPC              @ arg0
24153    mov    r1, rFP              @ arg1
24154    mov    r2, rSELF            @ arg2
24155    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24156
24157/* ------------------------------ */
24158    .balign 64
24159.L_ALT_OP_UNUSED_AAFF: /* 0x1aa */
24160/* File: armv5te/alt_stub.S */
24161/*
24162 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24163 * any interesting requests and then jump to the real instruction
24164 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24165 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24166 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24167 * bail to the real handler if breakFlags==0.
24168 */
24169    ldrb   r3, [rSELF, #offThread_breakFlags]
24170    adrl   lr, dvmAsmInstructionStart + (426 * 64)
24171    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24172    cmp    r3, #0
24173    bxeq   lr                   @ nothing to do - jump to real handler
24174    EXPORT_PC()
24175    mov    r0, rPC              @ arg0
24176    mov    r1, rFP              @ arg1
24177    mov    r2, rSELF            @ arg2
24178    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24179
24180/* ------------------------------ */
24181    .balign 64
24182.L_ALT_OP_UNUSED_ABFF: /* 0x1ab */
24183/* File: armv5te/alt_stub.S */
24184/*
24185 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24186 * any interesting requests and then jump to the real instruction
24187 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24188 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24189 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24190 * bail to the real handler if breakFlags==0.
24191 */
24192    ldrb   r3, [rSELF, #offThread_breakFlags]
24193    adrl   lr, dvmAsmInstructionStart + (427 * 64)
24194    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24195    cmp    r3, #0
24196    bxeq   lr                   @ nothing to do - jump to real handler
24197    EXPORT_PC()
24198    mov    r0, rPC              @ arg0
24199    mov    r1, rFP              @ arg1
24200    mov    r2, rSELF            @ arg2
24201    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24202
24203/* ------------------------------ */
24204    .balign 64
24205.L_ALT_OP_UNUSED_ACFF: /* 0x1ac */
24206/* File: armv5te/alt_stub.S */
24207/*
24208 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24209 * any interesting requests and then jump to the real instruction
24210 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24211 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24212 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24213 * bail to the real handler if breakFlags==0.
24214 */
24215    ldrb   r3, [rSELF, #offThread_breakFlags]
24216    adrl   lr, dvmAsmInstructionStart + (428 * 64)
24217    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24218    cmp    r3, #0
24219    bxeq   lr                   @ nothing to do - jump to real handler
24220    EXPORT_PC()
24221    mov    r0, rPC              @ arg0
24222    mov    r1, rFP              @ arg1
24223    mov    r2, rSELF            @ arg2
24224    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24225
24226/* ------------------------------ */
24227    .balign 64
24228.L_ALT_OP_UNUSED_ADFF: /* 0x1ad */
24229/* File: armv5te/alt_stub.S */
24230/*
24231 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24232 * any interesting requests and then jump to the real instruction
24233 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24234 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24235 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24236 * bail to the real handler if breakFlags==0.
24237 */
24238    ldrb   r3, [rSELF, #offThread_breakFlags]
24239    adrl   lr, dvmAsmInstructionStart + (429 * 64)
24240    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24241    cmp    r3, #0
24242    bxeq   lr                   @ nothing to do - jump to real handler
24243    EXPORT_PC()
24244    mov    r0, rPC              @ arg0
24245    mov    r1, rFP              @ arg1
24246    mov    r2, rSELF            @ arg2
24247    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24248
24249/* ------------------------------ */
24250    .balign 64
24251.L_ALT_OP_UNUSED_AEFF: /* 0x1ae */
24252/* File: armv5te/alt_stub.S */
24253/*
24254 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24255 * any interesting requests and then jump to the real instruction
24256 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24257 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24258 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24259 * bail to the real handler if breakFlags==0.
24260 */
24261    ldrb   r3, [rSELF, #offThread_breakFlags]
24262    adrl   lr, dvmAsmInstructionStart + (430 * 64)
24263    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24264    cmp    r3, #0
24265    bxeq   lr                   @ nothing to do - jump to real handler
24266    EXPORT_PC()
24267    mov    r0, rPC              @ arg0
24268    mov    r1, rFP              @ arg1
24269    mov    r2, rSELF            @ arg2
24270    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24271
24272/* ------------------------------ */
24273    .balign 64
24274.L_ALT_OP_UNUSED_AFFF: /* 0x1af */
24275/* File: armv5te/alt_stub.S */
24276/*
24277 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24278 * any interesting requests and then jump to the real instruction
24279 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24280 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24281 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24282 * bail to the real handler if breakFlags==0.
24283 */
24284    ldrb   r3, [rSELF, #offThread_breakFlags]
24285    adrl   lr, dvmAsmInstructionStart + (431 * 64)
24286    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24287    cmp    r3, #0
24288    bxeq   lr                   @ nothing to do - jump to real handler
24289    EXPORT_PC()
24290    mov    r0, rPC              @ arg0
24291    mov    r1, rFP              @ arg1
24292    mov    r2, rSELF            @ arg2
24293    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24294
24295/* ------------------------------ */
24296    .balign 64
24297.L_ALT_OP_UNUSED_B0FF: /* 0x1b0 */
24298/* File: armv5te/alt_stub.S */
24299/*
24300 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24301 * any interesting requests and then jump to the real instruction
24302 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24303 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24304 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24305 * bail to the real handler if breakFlags==0.
24306 */
24307    ldrb   r3, [rSELF, #offThread_breakFlags]
24308    adrl   lr, dvmAsmInstructionStart + (432 * 64)
24309    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24310    cmp    r3, #0
24311    bxeq   lr                   @ nothing to do - jump to real handler
24312    EXPORT_PC()
24313    mov    r0, rPC              @ arg0
24314    mov    r1, rFP              @ arg1
24315    mov    r2, rSELF            @ arg2
24316    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24317
24318/* ------------------------------ */
24319    .balign 64
24320.L_ALT_OP_UNUSED_B1FF: /* 0x1b1 */
24321/* File: armv5te/alt_stub.S */
24322/*
24323 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24324 * any interesting requests and then jump to the real instruction
24325 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24326 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24327 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24328 * bail to the real handler if breakFlags==0.
24329 */
24330    ldrb   r3, [rSELF, #offThread_breakFlags]
24331    adrl   lr, dvmAsmInstructionStart + (433 * 64)
24332    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24333    cmp    r3, #0
24334    bxeq   lr                   @ nothing to do - jump to real handler
24335    EXPORT_PC()
24336    mov    r0, rPC              @ arg0
24337    mov    r1, rFP              @ arg1
24338    mov    r2, rSELF            @ arg2
24339    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24340
24341/* ------------------------------ */
24342    .balign 64
24343.L_ALT_OP_UNUSED_B2FF: /* 0x1b2 */
24344/* File: armv5te/alt_stub.S */
24345/*
24346 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24347 * any interesting requests and then jump to the real instruction
24348 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24349 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24350 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24351 * bail to the real handler if breakFlags==0.
24352 */
24353    ldrb   r3, [rSELF, #offThread_breakFlags]
24354    adrl   lr, dvmAsmInstructionStart + (434 * 64)
24355    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24356    cmp    r3, #0
24357    bxeq   lr                   @ nothing to do - jump to real handler
24358    EXPORT_PC()
24359    mov    r0, rPC              @ arg0
24360    mov    r1, rFP              @ arg1
24361    mov    r2, rSELF            @ arg2
24362    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24363
24364/* ------------------------------ */
24365    .balign 64
24366.L_ALT_OP_UNUSED_B3FF: /* 0x1b3 */
24367/* File: armv5te/alt_stub.S */
24368/*
24369 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24370 * any interesting requests and then jump to the real instruction
24371 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24372 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24373 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24374 * bail to the real handler if breakFlags==0.
24375 */
24376    ldrb   r3, [rSELF, #offThread_breakFlags]
24377    adrl   lr, dvmAsmInstructionStart + (435 * 64)
24378    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24379    cmp    r3, #0
24380    bxeq   lr                   @ nothing to do - jump to real handler
24381    EXPORT_PC()
24382    mov    r0, rPC              @ arg0
24383    mov    r1, rFP              @ arg1
24384    mov    r2, rSELF            @ arg2
24385    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24386
24387/* ------------------------------ */
24388    .balign 64
24389.L_ALT_OP_UNUSED_B4FF: /* 0x1b4 */
24390/* File: armv5te/alt_stub.S */
24391/*
24392 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24393 * any interesting requests and then jump to the real instruction
24394 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24395 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24396 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24397 * bail to the real handler if breakFlags==0.
24398 */
24399    ldrb   r3, [rSELF, #offThread_breakFlags]
24400    adrl   lr, dvmAsmInstructionStart + (436 * 64)
24401    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24402    cmp    r3, #0
24403    bxeq   lr                   @ nothing to do - jump to real handler
24404    EXPORT_PC()
24405    mov    r0, rPC              @ arg0
24406    mov    r1, rFP              @ arg1
24407    mov    r2, rSELF            @ arg2
24408    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24409
24410/* ------------------------------ */
24411    .balign 64
24412.L_ALT_OP_UNUSED_B5FF: /* 0x1b5 */
24413/* File: armv5te/alt_stub.S */
24414/*
24415 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24416 * any interesting requests and then jump to the real instruction
24417 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24418 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24419 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24420 * bail to the real handler if breakFlags==0.
24421 */
24422    ldrb   r3, [rSELF, #offThread_breakFlags]
24423    adrl   lr, dvmAsmInstructionStart + (437 * 64)
24424    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24425    cmp    r3, #0
24426    bxeq   lr                   @ nothing to do - jump to real handler
24427    EXPORT_PC()
24428    mov    r0, rPC              @ arg0
24429    mov    r1, rFP              @ arg1
24430    mov    r2, rSELF            @ arg2
24431    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24432
24433/* ------------------------------ */
24434    .balign 64
24435.L_ALT_OP_UNUSED_B6FF: /* 0x1b6 */
24436/* File: armv5te/alt_stub.S */
24437/*
24438 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24439 * any interesting requests and then jump to the real instruction
24440 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24441 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24442 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24443 * bail to the real handler if breakFlags==0.
24444 */
24445    ldrb   r3, [rSELF, #offThread_breakFlags]
24446    adrl   lr, dvmAsmInstructionStart + (438 * 64)
24447    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24448    cmp    r3, #0
24449    bxeq   lr                   @ nothing to do - jump to real handler
24450    EXPORT_PC()
24451    mov    r0, rPC              @ arg0
24452    mov    r1, rFP              @ arg1
24453    mov    r2, rSELF            @ arg2
24454    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24455
24456/* ------------------------------ */
24457    .balign 64
24458.L_ALT_OP_UNUSED_B7FF: /* 0x1b7 */
24459/* File: armv5te/alt_stub.S */
24460/*
24461 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24462 * any interesting requests and then jump to the real instruction
24463 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24464 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24465 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24466 * bail to the real handler if breakFlags==0.
24467 */
24468    ldrb   r3, [rSELF, #offThread_breakFlags]
24469    adrl   lr, dvmAsmInstructionStart + (439 * 64)
24470    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24471    cmp    r3, #0
24472    bxeq   lr                   @ nothing to do - jump to real handler
24473    EXPORT_PC()
24474    mov    r0, rPC              @ arg0
24475    mov    r1, rFP              @ arg1
24476    mov    r2, rSELF            @ arg2
24477    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24478
24479/* ------------------------------ */
24480    .balign 64
24481.L_ALT_OP_UNUSED_B8FF: /* 0x1b8 */
24482/* File: armv5te/alt_stub.S */
24483/*
24484 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24485 * any interesting requests and then jump to the real instruction
24486 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24487 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24488 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24489 * bail to the real handler if breakFlags==0.
24490 */
24491    ldrb   r3, [rSELF, #offThread_breakFlags]
24492    adrl   lr, dvmAsmInstructionStart + (440 * 64)
24493    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24494    cmp    r3, #0
24495    bxeq   lr                   @ nothing to do - jump to real handler
24496    EXPORT_PC()
24497    mov    r0, rPC              @ arg0
24498    mov    r1, rFP              @ arg1
24499    mov    r2, rSELF            @ arg2
24500    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24501
24502/* ------------------------------ */
24503    .balign 64
24504.L_ALT_OP_UNUSED_B9FF: /* 0x1b9 */
24505/* File: armv5te/alt_stub.S */
24506/*
24507 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24508 * any interesting requests and then jump to the real instruction
24509 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24510 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24511 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24512 * bail to the real handler if breakFlags==0.
24513 */
24514    ldrb   r3, [rSELF, #offThread_breakFlags]
24515    adrl   lr, dvmAsmInstructionStart + (441 * 64)
24516    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24517    cmp    r3, #0
24518    bxeq   lr                   @ nothing to do - jump to real handler
24519    EXPORT_PC()
24520    mov    r0, rPC              @ arg0
24521    mov    r1, rFP              @ arg1
24522    mov    r2, rSELF            @ arg2
24523    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24524
24525/* ------------------------------ */
24526    .balign 64
24527.L_ALT_OP_UNUSED_BAFF: /* 0x1ba */
24528/* File: armv5te/alt_stub.S */
24529/*
24530 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24531 * any interesting requests and then jump to the real instruction
24532 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24533 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24534 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24535 * bail to the real handler if breakFlags==0.
24536 */
24537    ldrb   r3, [rSELF, #offThread_breakFlags]
24538    adrl   lr, dvmAsmInstructionStart + (442 * 64)
24539    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24540    cmp    r3, #0
24541    bxeq   lr                   @ nothing to do - jump to real handler
24542    EXPORT_PC()
24543    mov    r0, rPC              @ arg0
24544    mov    r1, rFP              @ arg1
24545    mov    r2, rSELF            @ arg2
24546    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24547
24548/* ------------------------------ */
24549    .balign 64
24550.L_ALT_OP_UNUSED_BBFF: /* 0x1bb */
24551/* File: armv5te/alt_stub.S */
24552/*
24553 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24554 * any interesting requests and then jump to the real instruction
24555 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24556 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24557 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24558 * bail to the real handler if breakFlags==0.
24559 */
24560    ldrb   r3, [rSELF, #offThread_breakFlags]
24561    adrl   lr, dvmAsmInstructionStart + (443 * 64)
24562    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24563    cmp    r3, #0
24564    bxeq   lr                   @ nothing to do - jump to real handler
24565    EXPORT_PC()
24566    mov    r0, rPC              @ arg0
24567    mov    r1, rFP              @ arg1
24568    mov    r2, rSELF            @ arg2
24569    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24570
24571/* ------------------------------ */
24572    .balign 64
24573.L_ALT_OP_UNUSED_BCFF: /* 0x1bc */
24574/* File: armv5te/alt_stub.S */
24575/*
24576 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24577 * any interesting requests and then jump to the real instruction
24578 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24579 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24580 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24581 * bail to the real handler if breakFlags==0.
24582 */
24583    ldrb   r3, [rSELF, #offThread_breakFlags]
24584    adrl   lr, dvmAsmInstructionStart + (444 * 64)
24585    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24586    cmp    r3, #0
24587    bxeq   lr                   @ nothing to do - jump to real handler
24588    EXPORT_PC()
24589    mov    r0, rPC              @ arg0
24590    mov    r1, rFP              @ arg1
24591    mov    r2, rSELF            @ arg2
24592    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24593
24594/* ------------------------------ */
24595    .balign 64
24596.L_ALT_OP_UNUSED_BDFF: /* 0x1bd */
24597/* File: armv5te/alt_stub.S */
24598/*
24599 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24600 * any interesting requests and then jump to the real instruction
24601 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24602 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24603 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24604 * bail to the real handler if breakFlags==0.
24605 */
24606    ldrb   r3, [rSELF, #offThread_breakFlags]
24607    adrl   lr, dvmAsmInstructionStart + (445 * 64)
24608    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24609    cmp    r3, #0
24610    bxeq   lr                   @ nothing to do - jump to real handler
24611    EXPORT_PC()
24612    mov    r0, rPC              @ arg0
24613    mov    r1, rFP              @ arg1
24614    mov    r2, rSELF            @ arg2
24615    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24616
24617/* ------------------------------ */
24618    .balign 64
24619.L_ALT_OP_UNUSED_BEFF: /* 0x1be */
24620/* File: armv5te/alt_stub.S */
24621/*
24622 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24623 * any interesting requests and then jump to the real instruction
24624 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24625 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24626 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24627 * bail to the real handler if breakFlags==0.
24628 */
24629    ldrb   r3, [rSELF, #offThread_breakFlags]
24630    adrl   lr, dvmAsmInstructionStart + (446 * 64)
24631    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24632    cmp    r3, #0
24633    bxeq   lr                   @ nothing to do - jump to real handler
24634    EXPORT_PC()
24635    mov    r0, rPC              @ arg0
24636    mov    r1, rFP              @ arg1
24637    mov    r2, rSELF            @ arg2
24638    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24639
24640/* ------------------------------ */
24641    .balign 64
24642.L_ALT_OP_UNUSED_BFFF: /* 0x1bf */
24643/* File: armv5te/alt_stub.S */
24644/*
24645 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24646 * any interesting requests and then jump to the real instruction
24647 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24648 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24649 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24650 * bail to the real handler if breakFlags==0.
24651 */
24652    ldrb   r3, [rSELF, #offThread_breakFlags]
24653    adrl   lr, dvmAsmInstructionStart + (447 * 64)
24654    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24655    cmp    r3, #0
24656    bxeq   lr                   @ nothing to do - jump to real handler
24657    EXPORT_PC()
24658    mov    r0, rPC              @ arg0
24659    mov    r1, rFP              @ arg1
24660    mov    r2, rSELF            @ arg2
24661    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24662
24663/* ------------------------------ */
24664    .balign 64
24665.L_ALT_OP_UNUSED_C0FF: /* 0x1c0 */
24666/* File: armv5te/alt_stub.S */
24667/*
24668 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24669 * any interesting requests and then jump to the real instruction
24670 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24671 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24672 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24673 * bail to the real handler if breakFlags==0.
24674 */
24675    ldrb   r3, [rSELF, #offThread_breakFlags]
24676    adrl   lr, dvmAsmInstructionStart + (448 * 64)
24677    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24678    cmp    r3, #0
24679    bxeq   lr                   @ nothing to do - jump to real handler
24680    EXPORT_PC()
24681    mov    r0, rPC              @ arg0
24682    mov    r1, rFP              @ arg1
24683    mov    r2, rSELF            @ arg2
24684    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24685
24686/* ------------------------------ */
24687    .balign 64
24688.L_ALT_OP_UNUSED_C1FF: /* 0x1c1 */
24689/* File: armv5te/alt_stub.S */
24690/*
24691 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24692 * any interesting requests and then jump to the real instruction
24693 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24694 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24695 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24696 * bail to the real handler if breakFlags==0.
24697 */
24698    ldrb   r3, [rSELF, #offThread_breakFlags]
24699    adrl   lr, dvmAsmInstructionStart + (449 * 64)
24700    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24701    cmp    r3, #0
24702    bxeq   lr                   @ nothing to do - jump to real handler
24703    EXPORT_PC()
24704    mov    r0, rPC              @ arg0
24705    mov    r1, rFP              @ arg1
24706    mov    r2, rSELF            @ arg2
24707    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24708
24709/* ------------------------------ */
24710    .balign 64
24711.L_ALT_OP_UNUSED_C2FF: /* 0x1c2 */
24712/* File: armv5te/alt_stub.S */
24713/*
24714 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24715 * any interesting requests and then jump to the real instruction
24716 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24717 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24718 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24719 * bail to the real handler if breakFlags==0.
24720 */
24721    ldrb   r3, [rSELF, #offThread_breakFlags]
24722    adrl   lr, dvmAsmInstructionStart + (450 * 64)
24723    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24724    cmp    r3, #0
24725    bxeq   lr                   @ nothing to do - jump to real handler
24726    EXPORT_PC()
24727    mov    r0, rPC              @ arg0
24728    mov    r1, rFP              @ arg1
24729    mov    r2, rSELF            @ arg2
24730    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24731
24732/* ------------------------------ */
24733    .balign 64
24734.L_ALT_OP_UNUSED_C3FF: /* 0x1c3 */
24735/* File: armv5te/alt_stub.S */
24736/*
24737 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24738 * any interesting requests and then jump to the real instruction
24739 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24740 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24741 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24742 * bail to the real handler if breakFlags==0.
24743 */
24744    ldrb   r3, [rSELF, #offThread_breakFlags]
24745    adrl   lr, dvmAsmInstructionStart + (451 * 64)
24746    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24747    cmp    r3, #0
24748    bxeq   lr                   @ nothing to do - jump to real handler
24749    EXPORT_PC()
24750    mov    r0, rPC              @ arg0
24751    mov    r1, rFP              @ arg1
24752    mov    r2, rSELF            @ arg2
24753    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24754
24755/* ------------------------------ */
24756    .balign 64
24757.L_ALT_OP_UNUSED_C4FF: /* 0x1c4 */
24758/* File: armv5te/alt_stub.S */
24759/*
24760 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24761 * any interesting requests and then jump to the real instruction
24762 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24763 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24764 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24765 * bail to the real handler if breakFlags==0.
24766 */
24767    ldrb   r3, [rSELF, #offThread_breakFlags]
24768    adrl   lr, dvmAsmInstructionStart + (452 * 64)
24769    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24770    cmp    r3, #0
24771    bxeq   lr                   @ nothing to do - jump to real handler
24772    EXPORT_PC()
24773    mov    r0, rPC              @ arg0
24774    mov    r1, rFP              @ arg1
24775    mov    r2, rSELF            @ arg2
24776    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24777
24778/* ------------------------------ */
24779    .balign 64
24780.L_ALT_OP_UNUSED_C5FF: /* 0x1c5 */
24781/* File: armv5te/alt_stub.S */
24782/*
24783 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24784 * any interesting requests and then jump to the real instruction
24785 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24786 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24787 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24788 * bail to the real handler if breakFlags==0.
24789 */
24790    ldrb   r3, [rSELF, #offThread_breakFlags]
24791    adrl   lr, dvmAsmInstructionStart + (453 * 64)
24792    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24793    cmp    r3, #0
24794    bxeq   lr                   @ nothing to do - jump to real handler
24795    EXPORT_PC()
24796    mov    r0, rPC              @ arg0
24797    mov    r1, rFP              @ arg1
24798    mov    r2, rSELF            @ arg2
24799    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24800
24801/* ------------------------------ */
24802    .balign 64
24803.L_ALT_OP_UNUSED_C6FF: /* 0x1c6 */
24804/* File: armv5te/alt_stub.S */
24805/*
24806 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24807 * any interesting requests and then jump to the real instruction
24808 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24809 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24810 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24811 * bail to the real handler if breakFlags==0.
24812 */
24813    ldrb   r3, [rSELF, #offThread_breakFlags]
24814    adrl   lr, dvmAsmInstructionStart + (454 * 64)
24815    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24816    cmp    r3, #0
24817    bxeq   lr                   @ nothing to do - jump to real handler
24818    EXPORT_PC()
24819    mov    r0, rPC              @ arg0
24820    mov    r1, rFP              @ arg1
24821    mov    r2, rSELF            @ arg2
24822    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24823
24824/* ------------------------------ */
24825    .balign 64
24826.L_ALT_OP_UNUSED_C7FF: /* 0x1c7 */
24827/* File: armv5te/alt_stub.S */
24828/*
24829 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24830 * any interesting requests and then jump to the real instruction
24831 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24832 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24833 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24834 * bail to the real handler if breakFlags==0.
24835 */
24836    ldrb   r3, [rSELF, #offThread_breakFlags]
24837    adrl   lr, dvmAsmInstructionStart + (455 * 64)
24838    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24839    cmp    r3, #0
24840    bxeq   lr                   @ nothing to do - jump to real handler
24841    EXPORT_PC()
24842    mov    r0, rPC              @ arg0
24843    mov    r1, rFP              @ arg1
24844    mov    r2, rSELF            @ arg2
24845    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24846
24847/* ------------------------------ */
24848    .balign 64
24849.L_ALT_OP_UNUSED_C8FF: /* 0x1c8 */
24850/* File: armv5te/alt_stub.S */
24851/*
24852 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24853 * any interesting requests and then jump to the real instruction
24854 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24855 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24856 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24857 * bail to the real handler if breakFlags==0.
24858 */
24859    ldrb   r3, [rSELF, #offThread_breakFlags]
24860    adrl   lr, dvmAsmInstructionStart + (456 * 64)
24861    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24862    cmp    r3, #0
24863    bxeq   lr                   @ nothing to do - jump to real handler
24864    EXPORT_PC()
24865    mov    r0, rPC              @ arg0
24866    mov    r1, rFP              @ arg1
24867    mov    r2, rSELF            @ arg2
24868    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24869
24870/* ------------------------------ */
24871    .balign 64
24872.L_ALT_OP_UNUSED_C9FF: /* 0x1c9 */
24873/* File: armv5te/alt_stub.S */
24874/*
24875 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24876 * any interesting requests and then jump to the real instruction
24877 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24878 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24879 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24880 * bail to the real handler if breakFlags==0.
24881 */
24882    ldrb   r3, [rSELF, #offThread_breakFlags]
24883    adrl   lr, dvmAsmInstructionStart + (457 * 64)
24884    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24885    cmp    r3, #0
24886    bxeq   lr                   @ nothing to do - jump to real handler
24887    EXPORT_PC()
24888    mov    r0, rPC              @ arg0
24889    mov    r1, rFP              @ arg1
24890    mov    r2, rSELF            @ arg2
24891    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24892
24893/* ------------------------------ */
24894    .balign 64
24895.L_ALT_OP_UNUSED_CAFF: /* 0x1ca */
24896/* File: armv5te/alt_stub.S */
24897/*
24898 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24899 * any interesting requests and then jump to the real instruction
24900 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24901 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24902 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24903 * bail to the real handler if breakFlags==0.
24904 */
24905    ldrb   r3, [rSELF, #offThread_breakFlags]
24906    adrl   lr, dvmAsmInstructionStart + (458 * 64)
24907    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24908    cmp    r3, #0
24909    bxeq   lr                   @ nothing to do - jump to real handler
24910    EXPORT_PC()
24911    mov    r0, rPC              @ arg0
24912    mov    r1, rFP              @ arg1
24913    mov    r2, rSELF            @ arg2
24914    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24915
24916/* ------------------------------ */
24917    .balign 64
24918.L_ALT_OP_UNUSED_CBFF: /* 0x1cb */
24919/* File: armv5te/alt_stub.S */
24920/*
24921 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24922 * any interesting requests and then jump to the real instruction
24923 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24924 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24925 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24926 * bail to the real handler if breakFlags==0.
24927 */
24928    ldrb   r3, [rSELF, #offThread_breakFlags]
24929    adrl   lr, dvmAsmInstructionStart + (459 * 64)
24930    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24931    cmp    r3, #0
24932    bxeq   lr                   @ nothing to do - jump to real handler
24933    EXPORT_PC()
24934    mov    r0, rPC              @ arg0
24935    mov    r1, rFP              @ arg1
24936    mov    r2, rSELF            @ arg2
24937    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24938
24939/* ------------------------------ */
24940    .balign 64
24941.L_ALT_OP_UNUSED_CCFF: /* 0x1cc */
24942/* File: armv5te/alt_stub.S */
24943/*
24944 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24945 * any interesting requests and then jump to the real instruction
24946 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24947 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24948 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24949 * bail to the real handler if breakFlags==0.
24950 */
24951    ldrb   r3, [rSELF, #offThread_breakFlags]
24952    adrl   lr, dvmAsmInstructionStart + (460 * 64)
24953    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24954    cmp    r3, #0
24955    bxeq   lr                   @ nothing to do - jump to real handler
24956    EXPORT_PC()
24957    mov    r0, rPC              @ arg0
24958    mov    r1, rFP              @ arg1
24959    mov    r2, rSELF            @ arg2
24960    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24961
24962/* ------------------------------ */
24963    .balign 64
24964.L_ALT_OP_UNUSED_CDFF: /* 0x1cd */
24965/* File: armv5te/alt_stub.S */
24966/*
24967 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24968 * any interesting requests and then jump to the real instruction
24969 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24970 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24971 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24972 * bail to the real handler if breakFlags==0.
24973 */
24974    ldrb   r3, [rSELF, #offThread_breakFlags]
24975    adrl   lr, dvmAsmInstructionStart + (461 * 64)
24976    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24977    cmp    r3, #0
24978    bxeq   lr                   @ nothing to do - jump to real handler
24979    EXPORT_PC()
24980    mov    r0, rPC              @ arg0
24981    mov    r1, rFP              @ arg1
24982    mov    r2, rSELF            @ arg2
24983    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24984
24985/* ------------------------------ */
24986    .balign 64
24987.L_ALT_OP_UNUSED_CEFF: /* 0x1ce */
24988/* File: armv5te/alt_stub.S */
24989/*
24990 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24991 * any interesting requests and then jump to the real instruction
24992 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24993 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24994 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24995 * bail to the real handler if breakFlags==0.
24996 */
24997    ldrb   r3, [rSELF, #offThread_breakFlags]
24998    adrl   lr, dvmAsmInstructionStart + (462 * 64)
24999    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25000    cmp    r3, #0
25001    bxeq   lr                   @ nothing to do - jump to real handler
25002    EXPORT_PC()
25003    mov    r0, rPC              @ arg0
25004    mov    r1, rFP              @ arg1
25005    mov    r2, rSELF            @ arg2
25006    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25007
25008/* ------------------------------ */
25009    .balign 64
25010.L_ALT_OP_UNUSED_CFFF: /* 0x1cf */
25011/* File: armv5te/alt_stub.S */
25012/*
25013 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25014 * any interesting requests and then jump to the real instruction
25015 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25016 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25017 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25018 * bail to the real handler if breakFlags==0.
25019 */
25020    ldrb   r3, [rSELF, #offThread_breakFlags]
25021    adrl   lr, dvmAsmInstructionStart + (463 * 64)
25022    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25023    cmp    r3, #0
25024    bxeq   lr                   @ nothing to do - jump to real handler
25025    EXPORT_PC()
25026    mov    r0, rPC              @ arg0
25027    mov    r1, rFP              @ arg1
25028    mov    r2, rSELF            @ arg2
25029    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25030
25031/* ------------------------------ */
25032    .balign 64
25033.L_ALT_OP_UNUSED_D0FF: /* 0x1d0 */
25034/* File: armv5te/alt_stub.S */
25035/*
25036 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25037 * any interesting requests and then jump to the real instruction
25038 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25039 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25040 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25041 * bail to the real handler if breakFlags==0.
25042 */
25043    ldrb   r3, [rSELF, #offThread_breakFlags]
25044    adrl   lr, dvmAsmInstructionStart + (464 * 64)
25045    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25046    cmp    r3, #0
25047    bxeq   lr                   @ nothing to do - jump to real handler
25048    EXPORT_PC()
25049    mov    r0, rPC              @ arg0
25050    mov    r1, rFP              @ arg1
25051    mov    r2, rSELF            @ arg2
25052    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25053
25054/* ------------------------------ */
25055    .balign 64
25056.L_ALT_OP_UNUSED_D1FF: /* 0x1d1 */
25057/* File: armv5te/alt_stub.S */
25058/*
25059 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25060 * any interesting requests and then jump to the real instruction
25061 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25062 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25063 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25064 * bail to the real handler if breakFlags==0.
25065 */
25066    ldrb   r3, [rSELF, #offThread_breakFlags]
25067    adrl   lr, dvmAsmInstructionStart + (465 * 64)
25068    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25069    cmp    r3, #0
25070    bxeq   lr                   @ nothing to do - jump to real handler
25071    EXPORT_PC()
25072    mov    r0, rPC              @ arg0
25073    mov    r1, rFP              @ arg1
25074    mov    r2, rSELF            @ arg2
25075    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25076
25077/* ------------------------------ */
25078    .balign 64
25079.L_ALT_OP_UNUSED_D2FF: /* 0x1d2 */
25080/* File: armv5te/alt_stub.S */
25081/*
25082 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25083 * any interesting requests and then jump to the real instruction
25084 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25085 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25086 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25087 * bail to the real handler if breakFlags==0.
25088 */
25089    ldrb   r3, [rSELF, #offThread_breakFlags]
25090    adrl   lr, dvmAsmInstructionStart + (466 * 64)
25091    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25092    cmp    r3, #0
25093    bxeq   lr                   @ nothing to do - jump to real handler
25094    EXPORT_PC()
25095    mov    r0, rPC              @ arg0
25096    mov    r1, rFP              @ arg1
25097    mov    r2, rSELF            @ arg2
25098    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25099
25100/* ------------------------------ */
25101    .balign 64
25102.L_ALT_OP_UNUSED_D3FF: /* 0x1d3 */
25103/* File: armv5te/alt_stub.S */
25104/*
25105 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25106 * any interesting requests and then jump to the real instruction
25107 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25108 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25109 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25110 * bail to the real handler if breakFlags==0.
25111 */
25112    ldrb   r3, [rSELF, #offThread_breakFlags]
25113    adrl   lr, dvmAsmInstructionStart + (467 * 64)
25114    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25115    cmp    r3, #0
25116    bxeq   lr                   @ nothing to do - jump to real handler
25117    EXPORT_PC()
25118    mov    r0, rPC              @ arg0
25119    mov    r1, rFP              @ arg1
25120    mov    r2, rSELF            @ arg2
25121    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25122
25123/* ------------------------------ */
25124    .balign 64
25125.L_ALT_OP_UNUSED_D4FF: /* 0x1d4 */
25126/* File: armv5te/alt_stub.S */
25127/*
25128 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25129 * any interesting requests and then jump to the real instruction
25130 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25131 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25132 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25133 * bail to the real handler if breakFlags==0.
25134 */
25135    ldrb   r3, [rSELF, #offThread_breakFlags]
25136    adrl   lr, dvmAsmInstructionStart + (468 * 64)
25137    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25138    cmp    r3, #0
25139    bxeq   lr                   @ nothing to do - jump to real handler
25140    EXPORT_PC()
25141    mov    r0, rPC              @ arg0
25142    mov    r1, rFP              @ arg1
25143    mov    r2, rSELF            @ arg2
25144    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25145
25146/* ------------------------------ */
25147    .balign 64
25148.L_ALT_OP_UNUSED_D5FF: /* 0x1d5 */
25149/* File: armv5te/alt_stub.S */
25150/*
25151 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25152 * any interesting requests and then jump to the real instruction
25153 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25154 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25155 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25156 * bail to the real handler if breakFlags==0.
25157 */
25158    ldrb   r3, [rSELF, #offThread_breakFlags]
25159    adrl   lr, dvmAsmInstructionStart + (469 * 64)
25160    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25161    cmp    r3, #0
25162    bxeq   lr                   @ nothing to do - jump to real handler
25163    EXPORT_PC()
25164    mov    r0, rPC              @ arg0
25165    mov    r1, rFP              @ arg1
25166    mov    r2, rSELF            @ arg2
25167    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25168
25169/* ------------------------------ */
25170    .balign 64
25171.L_ALT_OP_UNUSED_D6FF: /* 0x1d6 */
25172/* File: armv5te/alt_stub.S */
25173/*
25174 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25175 * any interesting requests and then jump to the real instruction
25176 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25177 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25178 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25179 * bail to the real handler if breakFlags==0.
25180 */
25181    ldrb   r3, [rSELF, #offThread_breakFlags]
25182    adrl   lr, dvmAsmInstructionStart + (470 * 64)
25183    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25184    cmp    r3, #0
25185    bxeq   lr                   @ nothing to do - jump to real handler
25186    EXPORT_PC()
25187    mov    r0, rPC              @ arg0
25188    mov    r1, rFP              @ arg1
25189    mov    r2, rSELF            @ arg2
25190    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25191
25192/* ------------------------------ */
25193    .balign 64
25194.L_ALT_OP_UNUSED_D7FF: /* 0x1d7 */
25195/* File: armv5te/alt_stub.S */
25196/*
25197 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25198 * any interesting requests and then jump to the real instruction
25199 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25200 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25201 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25202 * bail to the real handler if breakFlags==0.
25203 */
25204    ldrb   r3, [rSELF, #offThread_breakFlags]
25205    adrl   lr, dvmAsmInstructionStart + (471 * 64)
25206    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25207    cmp    r3, #0
25208    bxeq   lr                   @ nothing to do - jump to real handler
25209    EXPORT_PC()
25210    mov    r0, rPC              @ arg0
25211    mov    r1, rFP              @ arg1
25212    mov    r2, rSELF            @ arg2
25213    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25214
25215/* ------------------------------ */
25216    .balign 64
25217.L_ALT_OP_UNUSED_D8FF: /* 0x1d8 */
25218/* File: armv5te/alt_stub.S */
25219/*
25220 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25221 * any interesting requests and then jump to the real instruction
25222 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25223 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25224 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25225 * bail to the real handler if breakFlags==0.
25226 */
25227    ldrb   r3, [rSELF, #offThread_breakFlags]
25228    adrl   lr, dvmAsmInstructionStart + (472 * 64)
25229    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25230    cmp    r3, #0
25231    bxeq   lr                   @ nothing to do - jump to real handler
25232    EXPORT_PC()
25233    mov    r0, rPC              @ arg0
25234    mov    r1, rFP              @ arg1
25235    mov    r2, rSELF            @ arg2
25236    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25237
25238/* ------------------------------ */
25239    .balign 64
25240.L_ALT_OP_UNUSED_D9FF: /* 0x1d9 */
25241/* File: armv5te/alt_stub.S */
25242/*
25243 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25244 * any interesting requests and then jump to the real instruction
25245 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25246 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25247 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25248 * bail to the real handler if breakFlags==0.
25249 */
25250    ldrb   r3, [rSELF, #offThread_breakFlags]
25251    adrl   lr, dvmAsmInstructionStart + (473 * 64)
25252    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25253    cmp    r3, #0
25254    bxeq   lr                   @ nothing to do - jump to real handler
25255    EXPORT_PC()
25256    mov    r0, rPC              @ arg0
25257    mov    r1, rFP              @ arg1
25258    mov    r2, rSELF            @ arg2
25259    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25260
25261/* ------------------------------ */
25262    .balign 64
25263.L_ALT_OP_UNUSED_DAFF: /* 0x1da */
25264/* File: armv5te/alt_stub.S */
25265/*
25266 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25267 * any interesting requests and then jump to the real instruction
25268 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25269 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25270 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25271 * bail to the real handler if breakFlags==0.
25272 */
25273    ldrb   r3, [rSELF, #offThread_breakFlags]
25274    adrl   lr, dvmAsmInstructionStart + (474 * 64)
25275    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25276    cmp    r3, #0
25277    bxeq   lr                   @ nothing to do - jump to real handler
25278    EXPORT_PC()
25279    mov    r0, rPC              @ arg0
25280    mov    r1, rFP              @ arg1
25281    mov    r2, rSELF            @ arg2
25282    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25283
25284/* ------------------------------ */
25285    .balign 64
25286.L_ALT_OP_UNUSED_DBFF: /* 0x1db */
25287/* File: armv5te/alt_stub.S */
25288/*
25289 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25290 * any interesting requests and then jump to the real instruction
25291 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25292 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25293 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25294 * bail to the real handler if breakFlags==0.
25295 */
25296    ldrb   r3, [rSELF, #offThread_breakFlags]
25297    adrl   lr, dvmAsmInstructionStart + (475 * 64)
25298    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25299    cmp    r3, #0
25300    bxeq   lr                   @ nothing to do - jump to real handler
25301    EXPORT_PC()
25302    mov    r0, rPC              @ arg0
25303    mov    r1, rFP              @ arg1
25304    mov    r2, rSELF            @ arg2
25305    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25306
25307/* ------------------------------ */
25308    .balign 64
25309.L_ALT_OP_UNUSED_DCFF: /* 0x1dc */
25310/* File: armv5te/alt_stub.S */
25311/*
25312 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25313 * any interesting requests and then jump to the real instruction
25314 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25315 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25316 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25317 * bail to the real handler if breakFlags==0.
25318 */
25319    ldrb   r3, [rSELF, #offThread_breakFlags]
25320    adrl   lr, dvmAsmInstructionStart + (476 * 64)
25321    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25322    cmp    r3, #0
25323    bxeq   lr                   @ nothing to do - jump to real handler
25324    EXPORT_PC()
25325    mov    r0, rPC              @ arg0
25326    mov    r1, rFP              @ arg1
25327    mov    r2, rSELF            @ arg2
25328    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25329
25330/* ------------------------------ */
25331    .balign 64
25332.L_ALT_OP_UNUSED_DDFF: /* 0x1dd */
25333/* File: armv5te/alt_stub.S */
25334/*
25335 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25336 * any interesting requests and then jump to the real instruction
25337 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25338 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25339 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25340 * bail to the real handler if breakFlags==0.
25341 */
25342    ldrb   r3, [rSELF, #offThread_breakFlags]
25343    adrl   lr, dvmAsmInstructionStart + (477 * 64)
25344    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25345    cmp    r3, #0
25346    bxeq   lr                   @ nothing to do - jump to real handler
25347    EXPORT_PC()
25348    mov    r0, rPC              @ arg0
25349    mov    r1, rFP              @ arg1
25350    mov    r2, rSELF            @ arg2
25351    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25352
25353/* ------------------------------ */
25354    .balign 64
25355.L_ALT_OP_UNUSED_DEFF: /* 0x1de */
25356/* File: armv5te/alt_stub.S */
25357/*
25358 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25359 * any interesting requests and then jump to the real instruction
25360 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25361 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25362 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25363 * bail to the real handler if breakFlags==0.
25364 */
25365    ldrb   r3, [rSELF, #offThread_breakFlags]
25366    adrl   lr, dvmAsmInstructionStart + (478 * 64)
25367    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25368    cmp    r3, #0
25369    bxeq   lr                   @ nothing to do - jump to real handler
25370    EXPORT_PC()
25371    mov    r0, rPC              @ arg0
25372    mov    r1, rFP              @ arg1
25373    mov    r2, rSELF            @ arg2
25374    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25375
25376/* ------------------------------ */
25377    .balign 64
25378.L_ALT_OP_UNUSED_DFFF: /* 0x1df */
25379/* File: armv5te/alt_stub.S */
25380/*
25381 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25382 * any interesting requests and then jump to the real instruction
25383 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25384 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25385 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25386 * bail to the real handler if breakFlags==0.
25387 */
25388    ldrb   r3, [rSELF, #offThread_breakFlags]
25389    adrl   lr, dvmAsmInstructionStart + (479 * 64)
25390    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25391    cmp    r3, #0
25392    bxeq   lr                   @ nothing to do - jump to real handler
25393    EXPORT_PC()
25394    mov    r0, rPC              @ arg0
25395    mov    r1, rFP              @ arg1
25396    mov    r2, rSELF            @ arg2
25397    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25398
25399/* ------------------------------ */
25400    .balign 64
25401.L_ALT_OP_UNUSED_E0FF: /* 0x1e0 */
25402/* File: armv5te/alt_stub.S */
25403/*
25404 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25405 * any interesting requests and then jump to the real instruction
25406 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25407 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25408 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25409 * bail to the real handler if breakFlags==0.
25410 */
25411    ldrb   r3, [rSELF, #offThread_breakFlags]
25412    adrl   lr, dvmAsmInstructionStart + (480 * 64)
25413    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25414    cmp    r3, #0
25415    bxeq   lr                   @ nothing to do - jump to real handler
25416    EXPORT_PC()
25417    mov    r0, rPC              @ arg0
25418    mov    r1, rFP              @ arg1
25419    mov    r2, rSELF            @ arg2
25420    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25421
25422/* ------------------------------ */
25423    .balign 64
25424.L_ALT_OP_UNUSED_E1FF: /* 0x1e1 */
25425/* File: armv5te/alt_stub.S */
25426/*
25427 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25428 * any interesting requests and then jump to the real instruction
25429 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25430 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25431 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25432 * bail to the real handler if breakFlags==0.
25433 */
25434    ldrb   r3, [rSELF, #offThread_breakFlags]
25435    adrl   lr, dvmAsmInstructionStart + (481 * 64)
25436    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25437    cmp    r3, #0
25438    bxeq   lr                   @ nothing to do - jump to real handler
25439    EXPORT_PC()
25440    mov    r0, rPC              @ arg0
25441    mov    r1, rFP              @ arg1
25442    mov    r2, rSELF            @ arg2
25443    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25444
25445/* ------------------------------ */
25446    .balign 64
25447.L_ALT_OP_UNUSED_E2FF: /* 0x1e2 */
25448/* File: armv5te/alt_stub.S */
25449/*
25450 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25451 * any interesting requests and then jump to the real instruction
25452 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25453 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25454 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25455 * bail to the real handler if breakFlags==0.
25456 */
25457    ldrb   r3, [rSELF, #offThread_breakFlags]
25458    adrl   lr, dvmAsmInstructionStart + (482 * 64)
25459    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25460    cmp    r3, #0
25461    bxeq   lr                   @ nothing to do - jump to real handler
25462    EXPORT_PC()
25463    mov    r0, rPC              @ arg0
25464    mov    r1, rFP              @ arg1
25465    mov    r2, rSELF            @ arg2
25466    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25467
25468/* ------------------------------ */
25469    .balign 64
25470.L_ALT_OP_UNUSED_E3FF: /* 0x1e3 */
25471/* File: armv5te/alt_stub.S */
25472/*
25473 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25474 * any interesting requests and then jump to the real instruction
25475 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25476 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25477 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25478 * bail to the real handler if breakFlags==0.
25479 */
25480    ldrb   r3, [rSELF, #offThread_breakFlags]
25481    adrl   lr, dvmAsmInstructionStart + (483 * 64)
25482    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25483    cmp    r3, #0
25484    bxeq   lr                   @ nothing to do - jump to real handler
25485    EXPORT_PC()
25486    mov    r0, rPC              @ arg0
25487    mov    r1, rFP              @ arg1
25488    mov    r2, rSELF            @ arg2
25489    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25490
25491/* ------------------------------ */
25492    .balign 64
25493.L_ALT_OP_UNUSED_E4FF: /* 0x1e4 */
25494/* File: armv5te/alt_stub.S */
25495/*
25496 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25497 * any interesting requests and then jump to the real instruction
25498 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25499 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25500 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25501 * bail to the real handler if breakFlags==0.
25502 */
25503    ldrb   r3, [rSELF, #offThread_breakFlags]
25504    adrl   lr, dvmAsmInstructionStart + (484 * 64)
25505    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25506    cmp    r3, #0
25507    bxeq   lr                   @ nothing to do - jump to real handler
25508    EXPORT_PC()
25509    mov    r0, rPC              @ arg0
25510    mov    r1, rFP              @ arg1
25511    mov    r2, rSELF            @ arg2
25512    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25513
25514/* ------------------------------ */
25515    .balign 64
25516.L_ALT_OP_UNUSED_E5FF: /* 0x1e5 */
25517/* File: armv5te/alt_stub.S */
25518/*
25519 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25520 * any interesting requests and then jump to the real instruction
25521 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25522 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25523 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25524 * bail to the real handler if breakFlags==0.
25525 */
25526    ldrb   r3, [rSELF, #offThread_breakFlags]
25527    adrl   lr, dvmAsmInstructionStart + (485 * 64)
25528    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25529    cmp    r3, #0
25530    bxeq   lr                   @ nothing to do - jump to real handler
25531    EXPORT_PC()
25532    mov    r0, rPC              @ arg0
25533    mov    r1, rFP              @ arg1
25534    mov    r2, rSELF            @ arg2
25535    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25536
25537/* ------------------------------ */
25538    .balign 64
25539.L_ALT_OP_UNUSED_E6FF: /* 0x1e6 */
25540/* File: armv5te/alt_stub.S */
25541/*
25542 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25543 * any interesting requests and then jump to the real instruction
25544 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25545 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25546 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25547 * bail to the real handler if breakFlags==0.
25548 */
25549    ldrb   r3, [rSELF, #offThread_breakFlags]
25550    adrl   lr, dvmAsmInstructionStart + (486 * 64)
25551    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25552    cmp    r3, #0
25553    bxeq   lr                   @ nothing to do - jump to real handler
25554    EXPORT_PC()
25555    mov    r0, rPC              @ arg0
25556    mov    r1, rFP              @ arg1
25557    mov    r2, rSELF            @ arg2
25558    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25559
25560/* ------------------------------ */
25561    .balign 64
25562.L_ALT_OP_UNUSED_E7FF: /* 0x1e7 */
25563/* File: armv5te/alt_stub.S */
25564/*
25565 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25566 * any interesting requests and then jump to the real instruction
25567 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25568 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25569 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25570 * bail to the real handler if breakFlags==0.
25571 */
25572    ldrb   r3, [rSELF, #offThread_breakFlags]
25573    adrl   lr, dvmAsmInstructionStart + (487 * 64)
25574    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25575    cmp    r3, #0
25576    bxeq   lr                   @ nothing to do - jump to real handler
25577    EXPORT_PC()
25578    mov    r0, rPC              @ arg0
25579    mov    r1, rFP              @ arg1
25580    mov    r2, rSELF            @ arg2
25581    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25582
25583/* ------------------------------ */
25584    .balign 64
25585.L_ALT_OP_UNUSED_E8FF: /* 0x1e8 */
25586/* File: armv5te/alt_stub.S */
25587/*
25588 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25589 * any interesting requests and then jump to the real instruction
25590 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25591 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25592 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25593 * bail to the real handler if breakFlags==0.
25594 */
25595    ldrb   r3, [rSELF, #offThread_breakFlags]
25596    adrl   lr, dvmAsmInstructionStart + (488 * 64)
25597    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25598    cmp    r3, #0
25599    bxeq   lr                   @ nothing to do - jump to real handler
25600    EXPORT_PC()
25601    mov    r0, rPC              @ arg0
25602    mov    r1, rFP              @ arg1
25603    mov    r2, rSELF            @ arg2
25604    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25605
25606/* ------------------------------ */
25607    .balign 64
25608.L_ALT_OP_UNUSED_E9FF: /* 0x1e9 */
25609/* File: armv5te/alt_stub.S */
25610/*
25611 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25612 * any interesting requests and then jump to the real instruction
25613 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25614 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25615 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25616 * bail to the real handler if breakFlags==0.
25617 */
25618    ldrb   r3, [rSELF, #offThread_breakFlags]
25619    adrl   lr, dvmAsmInstructionStart + (489 * 64)
25620    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25621    cmp    r3, #0
25622    bxeq   lr                   @ nothing to do - jump to real handler
25623    EXPORT_PC()
25624    mov    r0, rPC              @ arg0
25625    mov    r1, rFP              @ arg1
25626    mov    r2, rSELF            @ arg2
25627    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25628
25629/* ------------------------------ */
25630    .balign 64
25631.L_ALT_OP_UNUSED_EAFF: /* 0x1ea */
25632/* File: armv5te/alt_stub.S */
25633/*
25634 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25635 * any interesting requests and then jump to the real instruction
25636 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25637 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25638 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25639 * bail to the real handler if breakFlags==0.
25640 */
25641    ldrb   r3, [rSELF, #offThread_breakFlags]
25642    adrl   lr, dvmAsmInstructionStart + (490 * 64)
25643    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25644    cmp    r3, #0
25645    bxeq   lr                   @ nothing to do - jump to real handler
25646    EXPORT_PC()
25647    mov    r0, rPC              @ arg0
25648    mov    r1, rFP              @ arg1
25649    mov    r2, rSELF            @ arg2
25650    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25651
25652/* ------------------------------ */
25653    .balign 64
25654.L_ALT_OP_UNUSED_EBFF: /* 0x1eb */
25655/* File: armv5te/alt_stub.S */
25656/*
25657 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25658 * any interesting requests and then jump to the real instruction
25659 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25660 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25661 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25662 * bail to the real handler if breakFlags==0.
25663 */
25664    ldrb   r3, [rSELF, #offThread_breakFlags]
25665    adrl   lr, dvmAsmInstructionStart + (491 * 64)
25666    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25667    cmp    r3, #0
25668    bxeq   lr                   @ nothing to do - jump to real handler
25669    EXPORT_PC()
25670    mov    r0, rPC              @ arg0
25671    mov    r1, rFP              @ arg1
25672    mov    r2, rSELF            @ arg2
25673    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25674
25675/* ------------------------------ */
25676    .balign 64
25677.L_ALT_OP_UNUSED_ECFF: /* 0x1ec */
25678/* File: armv5te/alt_stub.S */
25679/*
25680 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25681 * any interesting requests and then jump to the real instruction
25682 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25683 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25684 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25685 * bail to the real handler if breakFlags==0.
25686 */
25687    ldrb   r3, [rSELF, #offThread_breakFlags]
25688    adrl   lr, dvmAsmInstructionStart + (492 * 64)
25689    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25690    cmp    r3, #0
25691    bxeq   lr                   @ nothing to do - jump to real handler
25692    EXPORT_PC()
25693    mov    r0, rPC              @ arg0
25694    mov    r1, rFP              @ arg1
25695    mov    r2, rSELF            @ arg2
25696    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25697
25698/* ------------------------------ */
25699    .balign 64
25700.L_ALT_OP_UNUSED_EDFF: /* 0x1ed */
25701/* File: armv5te/alt_stub.S */
25702/*
25703 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25704 * any interesting requests and then jump to the real instruction
25705 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25706 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25707 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25708 * bail to the real handler if breakFlags==0.
25709 */
25710    ldrb   r3, [rSELF, #offThread_breakFlags]
25711    adrl   lr, dvmAsmInstructionStart + (493 * 64)
25712    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25713    cmp    r3, #0
25714    bxeq   lr                   @ nothing to do - jump to real handler
25715    EXPORT_PC()
25716    mov    r0, rPC              @ arg0
25717    mov    r1, rFP              @ arg1
25718    mov    r2, rSELF            @ arg2
25719    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25720
25721/* ------------------------------ */
25722    .balign 64
25723.L_ALT_OP_UNUSED_EEFF: /* 0x1ee */
25724/* File: armv5te/alt_stub.S */
25725/*
25726 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25727 * any interesting requests and then jump to the real instruction
25728 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25729 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25730 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25731 * bail to the real handler if breakFlags==0.
25732 */
25733    ldrb   r3, [rSELF, #offThread_breakFlags]
25734    adrl   lr, dvmAsmInstructionStart + (494 * 64)
25735    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25736    cmp    r3, #0
25737    bxeq   lr                   @ nothing to do - jump to real handler
25738    EXPORT_PC()
25739    mov    r0, rPC              @ arg0
25740    mov    r1, rFP              @ arg1
25741    mov    r2, rSELF            @ arg2
25742    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25743
25744/* ------------------------------ */
25745    .balign 64
25746.L_ALT_OP_UNUSED_EFFF: /* 0x1ef */
25747/* File: armv5te/alt_stub.S */
25748/*
25749 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25750 * any interesting requests and then jump to the real instruction
25751 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25752 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25753 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25754 * bail to the real handler if breakFlags==0.
25755 */
25756    ldrb   r3, [rSELF, #offThread_breakFlags]
25757    adrl   lr, dvmAsmInstructionStart + (495 * 64)
25758    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25759    cmp    r3, #0
25760    bxeq   lr                   @ nothing to do - jump to real handler
25761    EXPORT_PC()
25762    mov    r0, rPC              @ arg0
25763    mov    r1, rFP              @ arg1
25764    mov    r2, rSELF            @ arg2
25765    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25766
25767/* ------------------------------ */
25768    .balign 64
25769.L_ALT_OP_UNUSED_F0FF: /* 0x1f0 */
25770/* File: armv5te/alt_stub.S */
25771/*
25772 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25773 * any interesting requests and then jump to the real instruction
25774 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25775 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25776 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25777 * bail to the real handler if breakFlags==0.
25778 */
25779    ldrb   r3, [rSELF, #offThread_breakFlags]
25780    adrl   lr, dvmAsmInstructionStart + (496 * 64)
25781    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25782    cmp    r3, #0
25783    bxeq   lr                   @ nothing to do - jump to real handler
25784    EXPORT_PC()
25785    mov    r0, rPC              @ arg0
25786    mov    r1, rFP              @ arg1
25787    mov    r2, rSELF            @ arg2
25788    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25789
25790/* ------------------------------ */
25791    .balign 64
25792.L_ALT_OP_UNUSED_F1FF: /* 0x1f1 */
25793/* File: armv5te/alt_stub.S */
25794/*
25795 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25796 * any interesting requests and then jump to the real instruction
25797 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25798 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25799 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25800 * bail to the real handler if breakFlags==0.
25801 */
25802    ldrb   r3, [rSELF, #offThread_breakFlags]
25803    adrl   lr, dvmAsmInstructionStart + (497 * 64)
25804    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25805    cmp    r3, #0
25806    bxeq   lr                   @ nothing to do - jump to real handler
25807    EXPORT_PC()
25808    mov    r0, rPC              @ arg0
25809    mov    r1, rFP              @ arg1
25810    mov    r2, rSELF            @ arg2
25811    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25812
25813/* ------------------------------ */
25814    .balign 64
25815.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
25816/* File: armv5te/alt_stub.S */
25817/*
25818 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25819 * any interesting requests and then jump to the real instruction
25820 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25821 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25822 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25823 * bail to the real handler if breakFlags==0.
25824 */
25825    ldrb   r3, [rSELF, #offThread_breakFlags]
25826    adrl   lr, dvmAsmInstructionStart + (498 * 64)
25827    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25828    cmp    r3, #0
25829    bxeq   lr                   @ nothing to do - jump to real handler
25830    EXPORT_PC()
25831    mov    r0, rPC              @ arg0
25832    mov    r1, rFP              @ arg1
25833    mov    r2, rSELF            @ arg2
25834    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25835
25836/* ------------------------------ */
25837    .balign 64
25838.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
25839/* File: armv5te/alt_stub.S */
25840/*
25841 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25842 * any interesting requests and then jump to the real instruction
25843 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25844 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25845 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25846 * bail to the real handler if breakFlags==0.
25847 */
25848    ldrb   r3, [rSELF, #offThread_breakFlags]
25849    adrl   lr, dvmAsmInstructionStart + (499 * 64)
25850    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25851    cmp    r3, #0
25852    bxeq   lr                   @ nothing to do - jump to real handler
25853    EXPORT_PC()
25854    mov    r0, rPC              @ arg0
25855    mov    r1, rFP              @ arg1
25856    mov    r2, rSELF            @ arg2
25857    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25858
25859/* ------------------------------ */
25860    .balign 64
25861.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
25862/* File: armv5te/alt_stub.S */
25863/*
25864 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25865 * any interesting requests and then jump to the real instruction
25866 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25867 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25868 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25869 * bail to the real handler if breakFlags==0.
25870 */
25871    ldrb   r3, [rSELF, #offThread_breakFlags]
25872    adrl   lr, dvmAsmInstructionStart + (500 * 64)
25873    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25874    cmp    r3, #0
25875    bxeq   lr                   @ nothing to do - jump to real handler
25876    EXPORT_PC()
25877    mov    r0, rPC              @ arg0
25878    mov    r1, rFP              @ arg1
25879    mov    r2, rSELF            @ arg2
25880    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25881
25882/* ------------------------------ */
25883    .balign 64
25884.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
25885/* File: armv5te/alt_stub.S */
25886/*
25887 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25888 * any interesting requests and then jump to the real instruction
25889 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25890 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25891 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25892 * bail to the real handler if breakFlags==0.
25893 */
25894    ldrb   r3, [rSELF, #offThread_breakFlags]
25895    adrl   lr, dvmAsmInstructionStart + (501 * 64)
25896    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25897    cmp    r3, #0
25898    bxeq   lr                   @ nothing to do - jump to real handler
25899    EXPORT_PC()
25900    mov    r0, rPC              @ arg0
25901    mov    r1, rFP              @ arg1
25902    mov    r2, rSELF            @ arg2
25903    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25904
25905/* ------------------------------ */
25906    .balign 64
25907.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
25908/* File: armv5te/alt_stub.S */
25909/*
25910 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25911 * any interesting requests and then jump to the real instruction
25912 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25913 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25914 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25915 * bail to the real handler if breakFlags==0.
25916 */
25917    ldrb   r3, [rSELF, #offThread_breakFlags]
25918    adrl   lr, dvmAsmInstructionStart + (502 * 64)
25919    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25920    cmp    r3, #0
25921    bxeq   lr                   @ nothing to do - jump to real handler
25922    EXPORT_PC()
25923    mov    r0, rPC              @ arg0
25924    mov    r1, rFP              @ arg1
25925    mov    r2, rSELF            @ arg2
25926    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25927
25928/* ------------------------------ */
25929    .balign 64
25930.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
25931/* File: armv5te/alt_stub.S */
25932/*
25933 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25934 * any interesting requests and then jump to the real instruction
25935 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25936 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25937 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25938 * bail to the real handler if breakFlags==0.
25939 */
25940    ldrb   r3, [rSELF, #offThread_breakFlags]
25941    adrl   lr, dvmAsmInstructionStart + (503 * 64)
25942    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25943    cmp    r3, #0
25944    bxeq   lr                   @ nothing to do - jump to real handler
25945    EXPORT_PC()
25946    mov    r0, rPC              @ arg0
25947    mov    r1, rFP              @ arg1
25948    mov    r2, rSELF            @ arg2
25949    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25950
25951/* ------------------------------ */
25952    .balign 64
25953.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
25954/* File: armv5te/alt_stub.S */
25955/*
25956 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25957 * any interesting requests and then jump to the real instruction
25958 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25959 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25960 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25961 * bail to the real handler if breakFlags==0.
25962 */
25963    ldrb   r3, [rSELF, #offThread_breakFlags]
25964    adrl   lr, dvmAsmInstructionStart + (504 * 64)
25965    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25966    cmp    r3, #0
25967    bxeq   lr                   @ nothing to do - jump to real handler
25968    EXPORT_PC()
25969    mov    r0, rPC              @ arg0
25970    mov    r1, rFP              @ arg1
25971    mov    r2, rSELF            @ arg2
25972    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25973
25974/* ------------------------------ */
25975    .balign 64
25976.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
25977/* File: armv5te/alt_stub.S */
25978/*
25979 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25980 * any interesting requests and then jump to the real instruction
25981 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25982 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25983 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25984 * bail to the real handler if breakFlags==0.
25985 */
25986    ldrb   r3, [rSELF, #offThread_breakFlags]
25987    adrl   lr, dvmAsmInstructionStart + (505 * 64)
25988    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25989    cmp    r3, #0
25990    bxeq   lr                   @ nothing to do - jump to real handler
25991    EXPORT_PC()
25992    mov    r0, rPC              @ arg0
25993    mov    r1, rFP              @ arg1
25994    mov    r2, rSELF            @ arg2
25995    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25996
25997/* ------------------------------ */
25998    .balign 64
25999.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
26000/* File: armv5te/alt_stub.S */
26001/*
26002 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26003 * any interesting requests and then jump to the real instruction
26004 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26005 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26006 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26007 * bail to the real handler if breakFlags==0.
26008 */
26009    ldrb   r3, [rSELF, #offThread_breakFlags]
26010    adrl   lr, dvmAsmInstructionStart + (506 * 64)
26011    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26012    cmp    r3, #0
26013    bxeq   lr                   @ nothing to do - jump to real handler
26014    EXPORT_PC()
26015    mov    r0, rPC              @ arg0
26016    mov    r1, rFP              @ arg1
26017    mov    r2, rSELF            @ arg2
26018    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26019
26020/* ------------------------------ */
26021    .balign 64
26022.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
26023/* File: armv5te/alt_stub.S */
26024/*
26025 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26026 * any interesting requests and then jump to the real instruction
26027 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26028 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26029 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26030 * bail to the real handler if breakFlags==0.
26031 */
26032    ldrb   r3, [rSELF, #offThread_breakFlags]
26033    adrl   lr, dvmAsmInstructionStart + (507 * 64)
26034    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26035    cmp    r3, #0
26036    bxeq   lr                   @ nothing to do - jump to real handler
26037    EXPORT_PC()
26038    mov    r0, rPC              @ arg0
26039    mov    r1, rFP              @ arg1
26040    mov    r2, rSELF            @ arg2
26041    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26042
26043/* ------------------------------ */
26044    .balign 64
26045.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
26046/* File: armv5te/alt_stub.S */
26047/*
26048 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26049 * any interesting requests and then jump to the real instruction
26050 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26051 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26052 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26053 * bail to the real handler if breakFlags==0.
26054 */
26055    ldrb   r3, [rSELF, #offThread_breakFlags]
26056    adrl   lr, dvmAsmInstructionStart + (508 * 64)
26057    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26058    cmp    r3, #0
26059    bxeq   lr                   @ nothing to do - jump to real handler
26060    EXPORT_PC()
26061    mov    r0, rPC              @ arg0
26062    mov    r1, rFP              @ arg1
26063    mov    r2, rSELF            @ arg2
26064    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26065
26066/* ------------------------------ */
26067    .balign 64
26068.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
26069/* File: armv5te/alt_stub.S */
26070/*
26071 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26072 * any interesting requests and then jump to the real instruction
26073 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26074 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26075 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26076 * bail to the real handler if breakFlags==0.
26077 */
26078    ldrb   r3, [rSELF, #offThread_breakFlags]
26079    adrl   lr, dvmAsmInstructionStart + (509 * 64)
26080    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26081    cmp    r3, #0
26082    bxeq   lr                   @ nothing to do - jump to real handler
26083    EXPORT_PC()
26084    mov    r0, rPC              @ arg0
26085    mov    r1, rFP              @ arg1
26086    mov    r2, rSELF            @ arg2
26087    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26088
26089/* ------------------------------ */
26090    .balign 64
26091.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
26092/* File: armv5te/alt_stub.S */
26093/*
26094 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26095 * any interesting requests and then jump to the real instruction
26096 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26097 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26098 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26099 * bail to the real handler if breakFlags==0.
26100 */
26101    ldrb   r3, [rSELF, #offThread_breakFlags]
26102    adrl   lr, dvmAsmInstructionStart + (510 * 64)
26103    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26104    cmp    r3, #0
26105    bxeq   lr                   @ nothing to do - jump to real handler
26106    EXPORT_PC()
26107    mov    r0, rPC              @ arg0
26108    mov    r1, rFP              @ arg1
26109    mov    r2, rSELF            @ arg2
26110    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26111
26112/* ------------------------------ */
26113    .balign 64
26114.L_ALT_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
26115/* File: armv5te/alt_stub.S */
26116/*
26117 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26118 * any interesting requests and then jump to the real instruction
26119 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26120 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26121 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26122 * bail to the real handler if breakFlags==0.
26123 */
26124    ldrb   r3, [rSELF, #offThread_breakFlags]
26125    adrl   lr, dvmAsmInstructionStart + (511 * 64)
26126    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26127    cmp    r3, #0
26128    bxeq   lr                   @ nothing to do - jump to real handler
26129    EXPORT_PC()
26130    mov    r0, rPC              @ arg0
26131    mov    r1, rFP              @ arg1
26132    mov    r2, rSELF            @ arg2
26133    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26134
26135    .balign 64
26136    .size   dvmAsmAltInstructionStart, .-dvmAsmAltInstructionStart
26137    .global dvmAsmAltInstructionEnd
26138dvmAsmAltInstructionEnd:
26139/* File: armv5te/footer.S */
26140/*
26141 * ===========================================================================
26142 *  Common subroutines and data
26143 * ===========================================================================
26144 */
26145
26146    .text
26147    .align  2
26148
26149#if defined(WITH_JIT)
26150
26151#if defined(WITH_SELF_VERIFICATION)
26152/*
26153 * "longjmp" to a translation after single-stepping.  Before returning
26154 * to translation, must save state for self-verification.
26155 */
26156    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26157dvmJitResumeTranslation:
26158    mov    rSELF, r0                             @ restore self
26159    mov    rPC, r1                               @ restore Dalvik pc
26160    mov    rFP, r2                               @ restore Dalvik fp
26161    ldr    r10, [rSELF,#offThread_jitResumeNPC]  @ resume address
26162    mov    r2, #0
26163    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26164    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26165    b      jitSVShadowRunStart                   @ resume as if cache hit
26166                                                 @ expects resume addr in r10
26167
26168    .global dvmJitToInterpPunt
26169dvmJitToInterpPunt:
26170    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
26171    mov    r3, #0
26172    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26173    b      jitSVShadowRunEnd            @ doesn't return
26174
26175    .global dvmJitToInterpSingleStep
26176dvmJitToInterpSingleStep:
26177    mov    rPC, r0              @ set up dalvik pc
26178    EXPORT_PC()
26179    str    lr, [rSELF,#offThread_jitResumeNPC]
26180    str    sp, [rSELF,#offThread_jitResumeNSP]
26181    str    r1, [rSELF,#offThread_jitResumeDPC]
26182    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
26183    b      jitSVShadowRunEnd            @ doesn't return
26184
26185
26186    .global dvmJitToInterpNoChainNoProfile
26187dvmJitToInterpNoChainNoProfile:
26188    mov    r0,rPC                       @ pass our target PC
26189    mov    r2,#kSVSNoProfile            @ r2<- interpreter entry point
26190    mov    r3, #0                       @ 0 means !inJitCodeCache
26191    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26192    b      jitSVShadowRunEnd            @ doesn't return
26193
26194    .global dvmJitToInterpTraceSelectNoChain
26195dvmJitToInterpTraceSelectNoChain:
26196    mov    r0,rPC                       @ pass our target PC
26197    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26198    mov    r3, #0                       @ 0 means !inJitCodeCache
26199    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26200    b      jitSVShadowRunEnd            @ doesn't return
26201
26202    .global dvmJitToInterpTraceSelect
26203dvmJitToInterpTraceSelect:
26204    ldr    r0,[lr, #-1]                 @ pass our target PC
26205    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26206    mov    r3, #0                       @ 0 means !inJitCodeCache
26207    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26208    b      jitSVShadowRunEnd            @ doesn't return
26209
26210    .global dvmJitToInterpBackwardBranch
26211dvmJitToInterpBackwardBranch:
26212    ldr    r0,[lr, #-1]                 @ pass our target PC
26213    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
26214    mov    r3, #0                       @ 0 means !inJitCodeCache
26215    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26216    b      jitSVShadowRunEnd            @ doesn't return
26217
26218    .global dvmJitToInterpNormal
26219dvmJitToInterpNormal:
26220    ldr    r0,[lr, #-1]                 @ pass our target PC
26221    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
26222    mov    r3, #0                       @ 0 means !inJitCodeCache
26223    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26224    b      jitSVShadowRunEnd            @ doesn't return
26225
26226    .global dvmJitToInterpNoChain
26227dvmJitToInterpNoChain:
26228    mov    r0,rPC                       @ pass our target PC
26229    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
26230    mov    r3, #0                       @ 0 means !inJitCodeCache
26231    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26232    b      jitSVShadowRunEnd            @ doesn't return
26233#else
26234
26235/*
26236 * "longjmp" to a translation after single-stepping.
26237 */
26238    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26239dvmJitResumeTranslation:
26240    mov    rSELF, r0                             @ restore self
26241    mov    rPC, r1                               @ restore Dalvik pc
26242    mov    rFP, r2                               @ restore Dalvik fp
26243    ldr    r0, [rSELF,#offThread_jitResumeNPC]
26244    mov    r2, #0
26245    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26246    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26247    bx     r0                                    @ resume translation
26248
26249/*
26250 * Return from the translation cache to the interpreter when the compiler is
26251 * having issues translating/executing a Dalvik instruction. We have to skip
26252 * the code cache lookup otherwise it is possible to indefinitely bouce
26253 * between the interpreter and the code cache if the instruction that fails
26254 * to be compiled happens to be at a trace start.
26255 */
26256    .global dvmJitToInterpPunt
26257dvmJitToInterpPunt:
26258    mov    rPC, r0
26259#if defined(WITH_JIT_TUNING)
26260    mov    r0,lr
26261    bl     dvmBumpPunt;
26262#endif
26263    EXPORT_PC()
26264    mov    r0, #0
26265    str    r0, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26266    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26267    FETCH_INST()
26268    GET_INST_OPCODE(ip)
26269    GOTO_OPCODE(ip)
26270
26271/*
26272 * Return to the interpreter to handle a single instruction.
26273 * We'll use the normal single-stepping mechanism via interpBreak,
26274 * but also save the native pc of the resume point in the translation
26275 * and the native sp so that we can later do the equivalent of a
26276 * longjmp() to resume.
26277 * On entry:
26278 *    dPC <= Dalvik PC of instrucion to interpret
26279 *    lr <= resume point in translation
26280 *    r1 <= Dalvik PC of next instruction
26281 */
26282    .global dvmJitToInterpSingleStep
26283dvmJitToInterpSingleStep:
26284    mov    rPC, r0              @ set up dalvik pc
26285    EXPORT_PC()
26286    str    lr, [rSELF,#offThread_jitResumeNPC]
26287    str    sp, [rSELF,#offThread_jitResumeNSP]
26288    str    r1, [rSELF,#offThread_jitResumeDPC]
26289    mov    r1, #1
26290    str    r1, [rSELF,#offThread_singleStepCount]  @ just step once
26291    mov    r0, rSELF
26292    mov    r1, #kInterpSingleStep
26293    mov    r2, #kSubModeNormal
26294    mov    r3, #1                @ true
26295    bl     dvmUpdateInterpBreak  @ (self, newBreak, newMode, enable)
26296    ldr    rIBASE, [rSELF,#offThread_curHandlerTable]
26297    FETCH_INST()
26298    GET_INST_OPCODE(ip)
26299    GOTO_OPCODE(ip)
26300
26301/*
26302 * Return from the translation cache and immediately request
26303 * a translation for the exit target.  Commonly used for callees.
26304 */
26305    .global dvmJitToInterpTraceSelectNoChain
26306dvmJitToInterpTraceSelectNoChain:
26307#if defined(WITH_JIT_TUNING)
26308    bl     dvmBumpNoChain
26309#endif
26310    mov    r0,rPC
26311    mov    r1,rSELF
26312    bl     dvmJitGetTraceAddrThread @ (pc, self)
26313    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26314    mov    r1, rPC                  @ arg1 of translation may need this
26315    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26316    cmp    r0,#0                    @ !0 means translation exists
26317    bxne   r0                       @ continue native execution if so
26318    b      2f                       @ branch over to use the interpreter
26319
26320/*
26321 * Return from the translation cache and immediately request
26322 * a translation for the exit target.  Commonly used following
26323 * invokes.
26324 */
26325    .global dvmJitToInterpTraceSelect
26326dvmJitToInterpTraceSelect:
26327    ldr    rPC,[lr, #-1]           @ get our target PC
26328    add    rINST,lr,#-5            @ save start of chain branch
26329    add    rINST, #-4              @  .. which is 9 bytes back
26330    mov    r0,rPC
26331    mov    r1,rSELF
26332    bl     dvmJitGetTraceAddrThread @ (pc, self)
26333    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26334    cmp    r0,#0
26335    beq    2f
26336    mov    r1,rINST
26337    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26338    mov    r1, rPC                  @ arg1 of translation may need this
26339    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
26340    cmp    r0,#0                    @ successful chain?
26341    bxne   r0                       @ continue native execution
26342    b      toInterpreter            @ didn't chain - resume with interpreter
26343
26344/* No translation, so request one if profiling isn't disabled*/
263452:
26346    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26347    ldr    r0, [rSELF, #offThread_pJitProfTable]
26348    FETCH_INST()
26349    cmp    r0, #0
26350    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
26351    bne    common_selectTrace
26352    GET_INST_OPCODE(ip)
26353    GOTO_OPCODE(ip)
26354
26355/*
26356 * Return from the translation cache to the interpreter.
26357 * The return was done with a BLX from thumb mode, and
26358 * the following 32-bit word contains the target rPC value.
26359 * Note that lr (r14) will have its low-order bit set to denote
26360 * its thumb-mode origin.
26361 *
26362 * We'll need to stash our lr origin away, recover the new
26363 * target and then check to see if there is a translation available
26364 * for our new target.  If so, we do a translation chain and
26365 * go back to native execution.  Otherwise, it's back to the
26366 * interpreter (after treating this entry as a potential
26367 * trace start).
26368 */
26369    .global dvmJitToInterpNormal
26370dvmJitToInterpNormal:
26371    ldr    rPC,[lr, #-1]           @ get our target PC
26372    add    rINST,lr,#-5            @ save start of chain branch
26373    add    rINST,#-4               @ .. which is 9 bytes back
26374#if defined(WITH_JIT_TUNING)
26375    bl     dvmBumpNormal
26376#endif
26377    mov    r0,rPC
26378    mov    r1,rSELF
26379    bl     dvmJitGetTraceAddrThread @ (pc, self)
26380    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26381    cmp    r0,#0
26382    beq    toInterpreter            @ go if not, otherwise do chain
26383    mov    r1,rINST
26384    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26385    mov    r1, rPC                  @ arg1 of translation may need this
26386    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26387    cmp    r0,#0                    @ successful chain?
26388    bxne   r0                       @ continue native execution
26389    b      toInterpreter            @ didn't chain - resume with interpreter
26390
26391/*
26392 * Return from the translation cache to the interpreter to do method invocation.
26393 * Check if translation exists for the callee, but don't chain to it.
26394 */
26395    .global dvmJitToInterpNoChainNoProfile
26396dvmJitToInterpNoChainNoProfile:
26397#if defined(WITH_JIT_TUNING)
26398    bl     dvmBumpNoChain
26399#endif
26400    mov    r0,rPC
26401    mov    r1,rSELF
26402    bl     dvmJitGetTraceAddrThread @ (pc, self)
26403    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26404    mov    r1, rPC                  @ arg1 of translation may need this
26405    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26406    cmp    r0,#0
26407    bxne   r0                       @ continue native execution if so
26408    EXPORT_PC()
26409    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26410    FETCH_INST()
26411    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26412    GOTO_OPCODE(ip)                     @ jump to next instruction
26413
26414/*
26415 * Return from the translation cache to the interpreter to do method invocation.
26416 * Check if translation exists for the callee, but don't chain to it.
26417 */
26418    .global dvmJitToInterpNoChain
26419dvmJitToInterpNoChain:
26420#if defined(WITH_JIT_TUNING)
26421    bl     dvmBumpNoChain
26422#endif
26423    mov    r0,rPC
26424    mov    r1,rSELF
26425    bl     dvmJitGetTraceAddrThread @ (pc, self)
26426    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26427    mov    r1, rPC                  @ arg1 of translation may need this
26428    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26429    cmp    r0,#0
26430    bxne   r0                       @ continue native execution if so
26431#endif
26432
26433/*
26434 * No translation, restore interpreter regs and start interpreting.
26435 * rSELF & rFP were preserved in the translated code, and rPC has
26436 * already been restored by the time we get here.  We'll need to set
26437 * up rIBASE & rINST, and load the address of the JitTable into r0.
26438 */
26439toInterpreter:
26440    EXPORT_PC()
26441    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26442    FETCH_INST()
26443    ldr    r0, [rSELF, #offThread_pJitProfTable]
26444    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26445    @ NOTE: intended fallthrough
26446
26447/*
26448 * Similar to common_updateProfile, but tests for null pJitProfTable
26449 * r0 holds pJifProfTAble, rINST is loaded, rPC is current and
26450 * rIBASE has been recently refreshed.
26451 */
26452common_testUpdateProfile:
26453    cmp     r0, #0               @ JIT switched off?
26454    beq     4f                   @ return to interp if so
26455
26456/*
26457 * Common code to update potential trace start counter, and initiate
26458 * a trace-build if appropriate.
26459 * On entry here:
26460 *    r0    <= pJitProfTable (verified non-NULL)
26461 *    rPC   <= Dalvik PC
26462 *    rINST <= next instruction
26463 */
26464common_updateProfile:
26465    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
26466    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
26467    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
26468    GET_INST_OPCODE(ip)
26469    subs    r1,r1,#1           @ decrement counter
26470    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
26471    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
26472
26473    /* Looks good, reset the counter */
26474    ldr     r1, [rSELF, #offThread_jitThreshold]
26475    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
26476    EXPORT_PC()
26477    mov     r0,rPC
26478    mov     r1,rSELF
26479    bl      dvmJitGetTraceAddrThread    @ (pc, self)
26480    str     r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26481    mov     r1, rPC                     @ arg1 of translation may need this
26482    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
26483    cmp     r0,#0
26484#if !defined(WITH_SELF_VERIFICATION)
26485    bxne    r0                          @ jump to the translation
26486    mov     r2,#kJitTSelectRequest      @ ask for trace selection
26487    @ fall-through to common_selectTrace
26488#else
26489    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
26490    beq     common_selectTrace
26491    /*
26492     * At this point, we have a target translation.  However, if
26493     * that translation is actually the interpret-only pseudo-translation
26494     * we want to treat it the same as no translation.
26495     */
26496    mov     r10, r0                     @ save target
26497    bl      dvmCompilerGetInterpretTemplate
26498    cmp     r0, r10                     @ special case?
26499    bne     jitSVShadowRunStart         @ set up self verification shadow space
26500    @ Need to clear the inJitCodeCache flag
26501    mov    r3, #0                       @ 0 means not in the JIT code cache
26502    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26503    GET_INST_OPCODE(ip)
26504    GOTO_OPCODE(ip)
26505    /* no return */
26506#endif
26507
26508/*
26509 * On entry:
26510 *  r2 is jit state.
26511 */
26512common_selectTrace:
26513    ldrb    r0,[rSELF,#offThread_breakFlags]
26514    ands    r0,#kInterpJitBreak
26515    bne     3f                         @ already doing JIT work, continue
26516    str     r2,[rSELF,#offThread_jitState]
26517    mov     r0, rSELF
26518/*
26519 * Call out to validate trace-building request.  If successful,
26520 * rIBASE will be swapped to to send us into single-stepping trace
26521 * building mode, so we need to refresh before we continue.
26522 */
26523    EXPORT_PC()
26524    SAVE_PC_FP_TO_SELF()                 @ copy of pc/fp to Thread
26525    bl      dvmJitCheckTraceRequest
265263:
26527    FETCH_INST()
26528    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
265294:
26530    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26531    GOTO_OPCODE(ip)
26532    /* no return */
26533#endif
26534
26535#if defined(WITH_SELF_VERIFICATION)
26536/*
26537 * Save PC and registers to shadow memory for self verification mode
26538 * before jumping to native translation.
26539 * On entry:
26540 *    rPC, rFP, rSELF: the values that they should contain
26541 *    r10: the address of the target translation.
26542 */
26543jitSVShadowRunStart:
26544    mov     r0,rPC                      @ r0<- program counter
26545    mov     r1,rFP                      @ r1<- frame pointer
26546    mov     r2,rSELF                    @ r2<- self (Thread) pointer
26547    mov     r3,r10                      @ r3<- target translation
26548    bl      dvmSelfVerificationSaveState @ save registers to shadow space
26549    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
26550    bx      r10                         @ jump to the translation
26551
26552/*
26553 * Restore PC, registers, and interpreter state to original values
26554 * before jumping back to the interpreter.
26555 * On entry:
26556 *   r0:  dPC
26557 *   r2:  self verification state
26558 */
26559jitSVShadowRunEnd:
26560    mov    r1,rFP                        @ pass ending fp
26561    mov    r3,rSELF                      @ pass self ptr for convenience
26562    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
26563    LOAD_PC_FP_FROM_SELF()               @ restore pc, fp
26564    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
26565    cmp    r1,#0                         @ check for punt condition
26566    beq    1f
26567    @ Set up SV single-stepping
26568    mov    r0, rSELF
26569    mov    r1, #kInterpJitBreak
26570    mov    r2, #kSubModeJitSV
26571    mov    r3, #1                @ true
26572    bl     dvmUpdateInterpBreak  @ (self, newBreak, newMode, enable)
26573    mov    r2,#kJitSelfVerification      @ ask for self verification
26574    str    r2,[rSELF,#offThread_jitState]
26575    @ intentional fallthrough
265761:                                       @ exit to interpreter without check
26577    EXPORT_PC()
26578    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26579    FETCH_INST()
26580    GET_INST_OPCODE(ip)
26581    GOTO_OPCODE(ip)
26582#endif
26583
26584/*
26585 * The equivalent of "goto bail", this calls through the "bail handler".
26586 * It will end this interpreter activation, and return to the caller
26587 * of dvmMterpStdRun.
26588 *
26589 * State registers will be saved to the "thread" area before bailing
26590 * debugging purposes
26591 */
26592common_gotoBail:
26593    SAVE_PC_FP_TO_SELF()                @ export state to "thread"
26594    mov     r0, rSELF                   @ r0<- self ptr
26595    b       dvmMterpStdBail             @ call(self, changeInterp)
26596
26597/*
26598 * The JIT's invoke method needs to remember the callsite class and
26599 * target pair.  Save them here so that they are available to
26600 * dvmCheckJit following the interpretation of this invoke.
26601 */
26602#if defined(WITH_JIT)
26603save_callsiteinfo:
26604    cmp     r9, #0
26605    ldrne   r9, [r9, #offObject_clazz]
26606    str     r0, [rSELF, #offThread_methodToCall]
26607    str     r9, [rSELF, #offThread_callsiteClass]
26608    bx      lr
26609#endif
26610
26611/*
26612 * Common code for jumbo method invocation.
26613 * NOTE: this adjusts rPC to account for the difference in instruction width.
26614 * As a result, the savedPc in the stack frame will not be wholly accurate. So
26615 * long as that is only used for source file line number calculations, we're
26616 * okay.
26617 */
26618common_invokeMethodJumboNoThis:
26619#if defined(WITH_JIT)
26620 /* On entry: r0 is "Method* methodToCall */
26621    mov     r9, #0                      @ clear "this"
26622#endif
26623common_invokeMethodJumbo:
26624 /* On entry: r0 is "Method* methodToCall, r9 is "this" */
26625.LinvokeNewJumbo:
26626#if defined(WITH_JIT)
26627    ldrb    r1, [rSELF, #offThread_subMode]
26628    ands    r1, #kSubModeJitTraceBuild
26629    blne    save_callsiteinfo
26630#endif
26631    @ prepare to copy args to "outs" area of current frame
26632    add     rPC, rPC, #4                @ adjust pc to make return consistent
26633    FETCH(r2, 1)                        @ r2<- BBBB (arg count)
26634    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26635    cmp     r2, #0                      @ no args?
26636    beq     .LinvokeArgsDone            @ if no args, skip the rest
26637    FETCH(r1, 2)                        @ r1<- CCCC
26638    b       .LinvokeRangeArgs           @ handle args like invoke range
26639
26640/*
26641 * Common code for method invocation with range.
26642 *
26643 * On entry:
26644 *  r0 is "Method* methodToCall", r9 is "this"
26645 */
26646common_invokeMethodRange:
26647.LinvokeNewRange:
26648#if defined(WITH_JIT)
26649    ldrb    r1, [rSELF, #offThread_subMode]
26650    ands    r1, #kSubModeJitTraceBuild
26651    blne    save_callsiteinfo
26652#endif
26653    @ prepare to copy args to "outs" area of current frame
26654    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
26655    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26656    beq     .LinvokeArgsDone            @ if no args, skip the rest
26657    FETCH(r1, 2)                        @ r1<- CCCC
26658
26659.LinvokeRangeArgs:
26660    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
26661    @ (very few methods have > 10 args; could unroll for common cases)
26662    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
26663    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
266641:  ldr     r1, [r3], #4                @ val = *fp++
26665    subs    r2, r2, #1                  @ count--
26666    str     r1, [r10], #4               @ *outs++ = val
26667    bne     1b                          @ ...while count != 0
26668    b       .LinvokeArgsDone
26669
26670/*
26671 * Common code for method invocation without range.
26672 *
26673 * On entry:
26674 *  r0 is "Method* methodToCall", r9 is "this"
26675 */
26676common_invokeMethodNoRange:
26677.LinvokeNewNoRange:
26678#if defined(WITH_JIT)
26679    ldrb    r1, [rSELF, #offThread_subMode]
26680    ands    r1, #kSubModeJitTraceBuild
26681    blne    save_callsiteinfo
26682#endif
26683    @ prepare to copy args to "outs" area of current frame
26684    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
26685    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26686    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
26687    beq     .LinvokeArgsDone
26688
26689    @ r0=methodToCall, r1=GFED, r2=count, r10=outs
26690.LinvokeNonRange:
26691    rsb     r2, r2, #5                  @ r2<- 5-r2
26692    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
26693    bl      common_abort                @ (skipped due to ARM prefetch)
266945:  and     ip, rINST, #0x0f00          @ isolate A
26695    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
26696    mov     r0, r0                      @ nop
26697    str     r2, [r10, #-4]!             @ *--outs = vA
266984:  and     ip, r1, #0xf000             @ isolate G
26699    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
26700    mov     r0, r0                      @ nop
26701    str     r2, [r10, #-4]!             @ *--outs = vG
267023:  and     ip, r1, #0x0f00             @ isolate F
26703    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
26704    mov     r0, r0                      @ nop
26705    str     r2, [r10, #-4]!             @ *--outs = vF
267062:  and     ip, r1, #0x00f0             @ isolate E
26707    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
26708    mov     r0, r0                      @ nop
26709    str     r2, [r10, #-4]!             @ *--outs = vE
267101:  and     ip, r1, #0x000f             @ isolate D
26711    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
26712    mov     r0, r0                      @ nop
26713    str     r2, [r10, #-4]!             @ *--outs = vD
267140:  @ fall through to .LinvokeArgsDone
26715
26716.LinvokeArgsDone: @ r0=methodToCall
26717    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
26718    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
26719    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
26720    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
26721    @ find space for the new stack frame, check for overflow
26722    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
26723    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
26724    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
26725@    bl      common_dumpRegs
26726    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
26727    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
26728    cmp     r3, r9                      @ bottom < interpStackEnd?
26729    ldrb    lr, [rSELF, #offThread_subMode]
26730    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
26731    blo     .LstackOverflow             @ yes, this frame will overflow stack
26732
26733    @ set up newSaveArea
26734#ifdef EASY_GDB
26735    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
26736    str     ip, [r10, #offStackSaveArea_prevSave]
26737#endif
26738    str     rFP, [r10, #offStackSaveArea_prevFrame]
26739    str     rPC, [r10, #offStackSaveArea_savedPc]
26740#if defined(WITH_JIT)
26741    mov     r9, #0
26742    str     r9, [r10, #offStackSaveArea_returnAddr]
26743#endif
26744    str     r0, [r10, #offStackSaveArea_method]
26745
26746    @ Profiling?
26747    cmp     lr, #0                      @ any special modes happening?
26748    bne     2f                          @ go if so
267491:
26750    tst     r3, #ACC_NATIVE
26751    bne     .LinvokeNative
26752
26753    /*
26754    stmfd   sp!, {r0-r3}
26755    bl      common_printNewline
26756    mov     r0, rFP
26757    mov     r1, #0
26758    bl      dvmDumpFp
26759    ldmfd   sp!, {r0-r3}
26760    stmfd   sp!, {r0-r3}
26761    mov     r0, r1
26762    mov     r1, r10
26763    bl      dvmDumpFp
26764    bl      common_printNewline
26765    ldmfd   sp!, {r0-r3}
26766    */
26767
26768    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
26769    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
26770    mov     rPC, r2                         @ publish new rPC
26771
26772    @ Update state values for the new method
26773    @ r0=methodToCall, r1=newFp, r3=newMethodClass, r9=newINST
26774    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
26775    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
26776    mov     r2, #1
26777    str     r2, [rSELF, #offThread_debugIsMethodEntry]
26778#if defined(WITH_JIT)
26779    ldr     r0, [rSELF, #offThread_pJitProfTable]
26780    mov     rFP, r1                         @ fp = newFp
26781    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
26782    mov     rINST, r9                       @ publish new rINST
26783    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
26784    cmp     r0,#0
26785    bne     common_updateProfile
26786    GOTO_OPCODE(ip)                         @ jump to next instruction
26787#else
26788    mov     rFP, r1                         @ fp = newFp
26789    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
26790    mov     rINST, r9                       @ publish new rINST
26791    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
26792    GOTO_OPCODE(ip)                         @ jump to next instruction
26793#endif
26794
267952:
26796    @ Profiling - record method entry.  r0: methodToCall
26797    stmfd   sp!, {r0-r3}                @ preserve r0-r3
26798    mov     r1, r0
26799    mov     r0, rSELF
26800    bl      dvmReportInvoke             @ (self, method)
26801    ldmfd   sp!, {r0-r3}                @ restore r0-r3
26802    b       1b
26803
26804.LinvokeNative:
26805    @ Prep for the native call
26806    @ r0=methodToCall, r1=newFp, r10=newSaveArea
26807    ldrb    lr, [rSELF, #offThread_subMode]
26808    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
26809    str     r1, [rSELF, #offThread_curFrame]   @ self->curFrame = newFp
26810    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
26811    mov     r2, r0                      @ r2<- methodToCall
26812    mov     r0, r1                      @ r0<- newFp (points to args)
26813    add     r1, rSELF, #offThread_retval  @ r1<- &retval
26814    mov     r3, rSELF                   @ arg3<- self
26815
26816#ifdef ASSIST_DEBUGGER
26817    /* insert fake function header to help gdb find the stack frame */
26818    b       .Lskip
26819    .type   dalvik_mterp, %function
26820dalvik_mterp:
26821    .fnstart
26822    MTERP_ENTRY1
26823    MTERP_ENTRY2
26824.Lskip:
26825#endif
26826
26827    cmp     lr, #0                      @ any special SubModes active?
26828    bne     11f                         @ go handle them if so
26829    mov     lr, pc                      @ set return addr
26830    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
268317:
26832
26833    @ native return; r10=newSaveArea
26834    @ equivalent to dvmPopJniLocals
26835    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
26836    ldr     r1, [rSELF, #offThread_exception] @ check for exception
26837    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
26838    cmp     r1, #0                      @ null?
26839    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
26840    bne     common_exceptionThrown      @ no, handle exception
26841
26842    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
26843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26844    GOTO_OPCODE(ip)                     @ jump to next instruction
26845
2684611:
26847    @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
26848    stmfd   sp!, {r0-r3}                @ save all but subModes
26849    mov     r0, rPC
26850    mov     r1, rSELF
26851    bl      dvmReportPreNativeInvoke    @ (pc, self, methodToCall)
26852    ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
26853
26854    @ Call the native method
26855    mov     lr, pc                      @ set return addr
26856    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
26857
26858    @ Restore the pre-call arguments
26859    ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
26860
26861    @ Finish up any post-invoke subMode requirements
26862    mov     r0, rPC
26863    mov     r1, rSELF
26864    bl      dvmReportPostNativeInvoke   @ (pc, self, methodToCall)
26865    b       7b                          @ resume
26866
26867.LstackOverflow:    @ r0=methodToCall
26868    mov     r1, r0                      @ r1<- methodToCall
26869    mov     r0, rSELF                   @ r0<- self
26870    bl      dvmHandleStackOverflow
26871    b       common_exceptionThrown
26872#ifdef ASSIST_DEBUGGER
26873    .fnend
26874    .size   dalvik_mterp, .-dalvik_mterp
26875#endif
26876
26877
26878    /*
26879     * Common code for method invocation, calling through "glue code".
26880     *
26881     * TODO: now that we have range and non-range invoke handlers, this
26882     *       needs to be split into two.  Maybe just create entry points
26883     *       that set r9 and jump here?
26884     *
26885     * On entry:
26886     *  r0 is "Method* methodToCall", the method we're trying to call
26887     *  r9 is "bool methodCallRange", indicating if this is a /range variant
26888     */
26889     .if    0
26890.LinvokeOld:
26891    sub     sp, sp, #8                  @ space for args + pad
26892    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
26893    mov     r2, r0                      @ A2<- methodToCall
26894    mov     r0, rSELF                   @ A0<- self
26895    SAVE_PC_FP_TO_SELF()                @ export state to "self"
26896    mov     r1, r9                      @ A1<- methodCallRange
26897    mov     r3, rINST, lsr #8           @ A3<- AA
26898    str     ip, [sp, #0]                @ A4<- ip
26899    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
26900    add     sp, sp, #8                  @ remove arg area
26901    b       common_resumeAfterGlueCall  @ continue to next instruction
26902    .endif
26903
26904
26905
26906/*
26907 * Common code for handling a return instruction.
26908 *
26909 * This does not return.
26910 */
26911common_returnFromMethod:
26912.LreturnNew:
26913    ldrb    lr, [rSELF, #offThread_subMode]
26914    SAVEAREA_FROM_FP(r0, rFP)
26915    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
26916    cmp     lr, #0                      @ any special subMode handling needed?
26917    bne     19f
2691814:
26919    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
26920    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
26921                                        @ r2<- method we're returning to
26922    cmp     r2, #0                      @ is this a break frame?
26923#if defined(WORKAROUND_CORTEX_A9_745320)
26924    /* Don't use conditional loads if the HW defect exists */
26925    beq     15f
26926    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
2692715:
26928#else
26929    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
26930#endif
26931    beq     common_gotoBail             @ break frame, bail out completely
26932
26933    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
26934    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
26935    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
26936    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
26937    str     rFP, [rSELF, #offThread_curFrame]  @ self->curFrame = fp
26938#if defined(WITH_JIT)
26939    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
26940    mov     rPC, r9                     @ publish new rPC
26941    str     r1, [rSELF, #offThread_methodClassDex]
26942    str     r10, [rSELF, #offThread_inJitCodeCache]  @ may return to JIT'ed land
26943    cmp     r10, #0                      @ caller is compiled code
26944    blxne   r10
26945    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26946    GOTO_OPCODE(ip)                     @ jump to next instruction
26947#else
26948    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26949    mov     rPC, r9                     @ publish new rPC
26950    str     r1, [rSELF, #offThread_methodClassDex]
26951    GOTO_OPCODE(ip)                     @ jump to next instruction
26952#endif
26953
2695419:
26955    @ Handle special actions
26956    @ On entry, r0: StackSaveArea
26957    ldr     r2, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
26958    mov     r1, rPC
26959    mov     r0, rSELF
26960    bl      dvmReportReturn             @ (self, pc, prevFP)
26961    SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
26962    b       14b                         @ continue
26963
26964    /*
26965     * Return handling, calls through "glue code".
26966     */
26967     .if    0
26968.LreturnOld:
26969    SAVE_PC_FP_TO_SELF()                @ export state
26970    mov     r0, rSELF                   @ arg to function
26971    bl      dvmMterp_returnFromMethod
26972    b       common_resumeAfterGlueCall
26973    .endif
26974
26975
26976/*
26977 * Somebody has thrown an exception.  Handle it.
26978 *
26979 * If the exception processing code returns to us (instead of falling
26980 * out of the interpreter), continue with whatever the next instruction
26981 * now happens to be.
26982 *
26983 * This does not return.
26984 */
26985     .global dvmMterpCommonExceptionThrown
26986dvmMterpCommonExceptionThrown:
26987common_exceptionThrown:
26988.LexceptionNew:
26989
26990    EXPORT_PC()
26991
26992    mov     r0, rSELF
26993    bl      dvmCheckSuspendPending
26994
26995    ldr     r9, [rSELF, #offThread_exception] @ r9<- self->exception
26996    mov     r1, rSELF                   @ r1<- self
26997    mov     r0, r9                      @ r0<- exception
26998    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
26999    ldrb    r2, [rSELF, #offThread_subMode]  @ get subMode flags
27000    mov     r3, #0                      @ r3<- NULL
27001    str     r3, [rSELF, #offThread_exception] @ self->exception = NULL
27002
27003    @ Special subMode?
27004    cmp     r2, #0                      @ any special subMode handling needed?
27005    bne     7f                          @ go if so
270068:
27007    /* set up args and a local for "&fp" */
27008    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
27009    str     rFP, [sp, #-4]!             @ *--sp = fp
27010    mov     ip, sp                      @ ip<- &fp
27011    mov     r3, #0                      @ r3<- false
27012    str     ip, [sp, #-4]!              @ *--sp = &fp
27013    ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
27014    mov     r0, rSELF                   @ r0<- self
27015    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
27016    ldrb    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
27017    mov     r2, r9                      @ r2<- exception
27018    sub     r1, rPC, r1                 @ r1<- pc - method->insns
27019    mov     r1, r1, asr #1              @ r1<- offset in code units
27020
27021    /* call, r0 gets catchRelPc (a code-unit offset) */
27022    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
27023
27024    /* fix earlier stack overflow if necessary; may trash rFP */
27025    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27026    cmp     r1, #0                      @ did we overflow earlier?
27027    beq     1f                          @ no, skip ahead
27028    mov     rFP, r0                     @ save relPc result in rFP
27029    mov     r0, rSELF                   @ r0<- self
27030    mov     r1, r9                      @ r1<- exception
27031    bl      dvmCleanupStackOverflow     @ call(self)
27032    mov     r0, rFP                     @ restore result
270331:
27034
27035    /* update frame pointer and check result from dvmFindCatchBlock */
27036    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
27037    cmp     r0, #0                      @ is catchRelPc < 0?
27038    add     sp, sp, #8                  @ restore stack
27039    bmi     .LnotCaughtLocally
27040
27041    /* adjust locals to match self->curFrame and updated PC */
27042    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
27043    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
27044    str     r1, [rSELF, #offThread_method]  @ self->method = new method
27045    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
27046    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
27047    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
27048    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
27049    str     r2, [rSELF, #offThread_methodClassDex] @ self->pDvmDex = meth...
27050
27051    /* release the tracked alloc on the exception */
27052    mov     r0, r9                      @ r0<- exception
27053    mov     r1, rSELF                   @ r1<- self
27054    bl      dvmReleaseTrackedAlloc      @ release the exception
27055
27056    /* restore the exception if the handler wants it */
27057    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
27058    FETCH_INST()                        @ load rINST from rPC
27059    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27060    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
27061    streq   r9, [rSELF, #offThread_exception] @ yes, restore the exception
27062    GOTO_OPCODE(ip)                     @ jump to next instruction
27063
27064    @ Manage debugger bookkeeping
270657:
27066    mov     r0, rSELF                       @ arg0<- self
27067    ldr     r1, [rSELF, #offThread_method]  @ arg1<- curMethod
27068    mov     r2, rPC                         @ arg2<- pc
27069    mov     r3, rFP                         @ arg3<- fp
27070    bl      dvmReportExceptionThrow         @ (self, method, pc, fp)
27071    b       8b                              @ resume with normal handling
27072
27073.LnotCaughtLocally: @ r9=exception
27074    /* fix stack overflow if necessary */
27075    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27076    cmp     r1, #0                      @ did we overflow earlier?
27077    movne   r0, rSELF                   @ if yes: r0<- self
27078    movne   r1, r9                      @ if yes: r1<- exception
27079    blne    dvmCleanupStackOverflow     @ if yes: call(self)
27080
27081    @ may want to show "not caught locally" debug messages here
27082#if DVM_SHOW_EXCEPTION >= 2
27083    /* call __android_log_print(prio, tag, format, ...) */
27084    /* "Exception %s from %s:%d not caught locally" */
27085    @ dvmLineNumFromPC(method, pc - method->insns)
27086    ldr     r0, [rSELF, #offThread_method]
27087    ldr     r1, [r0, #offMethod_insns]
27088    sub     r1, rPC, r1
27089    asr     r1, r1, #1
27090    bl      dvmLineNumFromPC
27091    str     r0, [sp, #-4]!
27092    @ dvmGetMethodSourceFile(method)
27093    ldr     r0, [rSELF, #offThread_method]
27094    bl      dvmGetMethodSourceFile
27095    str     r0, [sp, #-4]!
27096    @ exception->clazz->descriptor
27097    ldr     r3, [r9, #offObject_clazz]
27098    ldr     r3, [r3, #offClassObject_descriptor]
27099    @
27100    ldr     r2, strExceptionNotCaughtLocally
27101    ldr     r1, strLogTag
27102    mov     r0, #3                      @ LOG_DEBUG
27103    bl      __android_log_print
27104#endif
27105    str     r9, [rSELF, #offThread_exception] @ restore exception
27106    mov     r0, r9                      @ r0<- exception
27107    mov     r1, rSELF                   @ r1<- self
27108    bl      dvmReleaseTrackedAlloc      @ release the exception
27109    b       common_gotoBail             @ bail out
27110
27111
27112    /*
27113     * Exception handling, calls through "glue code".
27114     */
27115    .if     0
27116.LexceptionOld:
27117    SAVE_PC_FP_TO_SELF()                @ export state
27118    mov     r0, rSELF                   @ arg to function
27119    bl      dvmMterp_exceptionThrown
27120    b       common_resumeAfterGlueCall
27121    .endif
27122
27123#if defined(WITH_JIT)
27124    /*
27125     * If the JIT is actively building a trace we need to make sure
27126     * that the field is fully resolved before including the current
27127     * instruction.
27128     *
27129     * On entry:
27130     *     r10: &dvmDex->pResFields[field]
27131     *     r0:  field pointer (must preserve)
27132     */
27133common_verifyField:
27134    ldrb    r3, [rSELF, #offThread_subMode]  @ r3 <- submode byte
27135    ands    r3, #kSubModeJitTraceBuild
27136    bxeq    lr                          @ Not building trace, continue
27137    ldr     r1, [r10]                   @ r1<- reload resolved StaticField ptr
27138    cmp     r1, #0                      @ resolution complete?
27139    bxne    lr                          @ yes, continue
27140    stmfd   sp!, {r0-r2,lr}             @ save regs
27141    mov     r0, rSELF
27142    mov     r1, rPC
27143    bl      dvmJitEndTraceSelect        @ (self,pc) end trace before this inst
27144    ldmfd   sp!, {r0-r2, lr}
27145    bx      lr                          @ return
27146#endif
27147
27148/*
27149 * After returning from a "glued" function, pull out the updated
27150 * values and start executing at the next instruction.
27151 */
27152common_resumeAfterGlueCall:
27153    LOAD_PC_FP_FROM_SELF()              @ pull rPC and rFP out of thread
27154    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh
27155    FETCH_INST()                        @ load rINST from rPC
27156    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27157    GOTO_OPCODE(ip)                     @ jump to next instruction
27158
27159/*
27160 * Invalid array index. Note that our calling convention is strange; we use r1
27161 * and r3 because those just happen to be the registers all our callers are
27162 * using. We move r3 before calling the C function, but r1 happens to match.
27163 * r1: index
27164 * r3: size
27165 */
27166common_errArrayIndex:
27167    EXPORT_PC()
27168    mov     r0, r3
27169    bl      dvmThrowArrayIndexOutOfBoundsException
27170    b       common_exceptionThrown
27171
27172/*
27173 * Integer divide or mod by zero.
27174 */
27175common_errDivideByZero:
27176    EXPORT_PC()
27177    ldr     r0, strDivideByZero
27178    bl      dvmThrowArithmeticException
27179    b       common_exceptionThrown
27180
27181/*
27182 * Attempt to allocate an array with a negative size.
27183 * On entry: length in r1
27184 */
27185common_errNegativeArraySize:
27186    EXPORT_PC()
27187    mov     r0, r1                                @ arg0 <- len
27188    bl      dvmThrowNegativeArraySizeException    @ (len)
27189    b       common_exceptionThrown
27190
27191/*
27192 * Invocation of a non-existent method.
27193 * On entry: method name in r1
27194 */
27195common_errNoSuchMethod:
27196    EXPORT_PC()
27197    mov     r0, r1
27198    bl      dvmThrowNoSuchMethodError
27199    b       common_exceptionThrown
27200
27201/*
27202 * We encountered a null object when we weren't expecting one.  We
27203 * export the PC, throw a NullPointerException, and goto the exception
27204 * processing code.
27205 */
27206common_errNullObject:
27207    EXPORT_PC()
27208    mov     r0, #0
27209    bl      dvmThrowNullPointerException
27210    b       common_exceptionThrown
27211
27212/*
27213 * For debugging, cause an immediate fault.  The source address will
27214 * be in lr (use a bl instruction to jump here).
27215 */
27216common_abort:
27217    ldr     pc, .LdeadFood
27218.LdeadFood:
27219    .word   0xdeadf00d
27220
27221/*
27222 * Spit out a "we were here", preserving all registers.  (The attempt
27223 * to save ip won't work, but we need to save an even number of
27224 * registers for EABI 64-bit stack alignment.)
27225 */
27226    .macro  SQUEAK num
27227common_squeak\num:
27228    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27229    ldr     r0, strSqueak
27230    mov     r1, #\num
27231    bl      printf
27232    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27233    bx      lr
27234    .endm
27235
27236    SQUEAK  0
27237    SQUEAK  1
27238    SQUEAK  2
27239    SQUEAK  3
27240    SQUEAK  4
27241    SQUEAK  5
27242
27243/*
27244 * Spit out the number in r0, preserving registers.
27245 */
27246common_printNum:
27247    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27248    mov     r1, r0
27249    ldr     r0, strSqueak
27250    bl      printf
27251    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27252    bx      lr
27253
27254/*
27255 * Print a newline, preserving registers.
27256 */
27257common_printNewline:
27258    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27259    ldr     r0, strNewline
27260    bl      printf
27261    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27262    bx      lr
27263
27264    /*
27265     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
27266     */
27267common_printHex:
27268    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27269    mov     r1, r0
27270    ldr     r0, strPrintHex
27271    bl      printf
27272    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27273    bx      lr
27274
27275/*
27276 * Print the 64-bit quantity in r0-r1, preserving registers.
27277 */
27278common_printLong:
27279    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27280    mov     r3, r1
27281    mov     r2, r0
27282    ldr     r0, strPrintLong
27283    bl      printf
27284    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27285    bx      lr
27286
27287/*
27288 * Print full method info.  Pass the Method* in r0.  Preserves regs.
27289 */
27290common_printMethod:
27291    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27292    bl      dvmMterpPrintMethod
27293    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27294    bx      lr
27295
27296/*
27297 * Call a C helper function that dumps regs and possibly some
27298 * additional info.  Requires the C function to be compiled in.
27299 */
27300    .if     0
27301common_dumpRegs:
27302    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27303    bl      dvmMterpDumpArmRegs
27304    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27305    bx      lr
27306    .endif
27307
27308#if 0
27309/*
27310 * Experiment on VFP mode.
27311 *
27312 * uint32_t setFPSCR(uint32_t val, uint32_t mask)
27313 *
27314 * Updates the bits specified by "mask", setting them to the values in "val".
27315 */
27316setFPSCR:
27317    and     r0, r0, r1                  @ make sure no stray bits are set
27318    fmrx    r2, fpscr                   @ get VFP reg
27319    mvn     r1, r1                      @ bit-invert mask
27320    and     r2, r2, r1                  @ clear masked bits
27321    orr     r2, r2, r0                  @ set specified bits
27322    fmxr    fpscr, r2                   @ set VFP reg
27323    mov     r0, r2                      @ return new value
27324    bx      lr
27325
27326    .align  2
27327    .global dvmConfigureFP
27328    .type   dvmConfigureFP, %function
27329dvmConfigureFP:
27330    stmfd   sp!, {ip, lr}
27331    /* 0x03000000 sets DN/FZ */
27332    /* 0x00009f00 clears the six exception enable flags */
27333    bl      common_squeak0
27334    mov     r0, #0x03000000             @ r0<- 0x03000000
27335    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
27336    bl      setFPSCR
27337    ldmfd   sp!, {ip, pc}
27338#endif
27339
27340
27341/*
27342 * String references, must be close to the code that uses them.
27343 */
27344    .align  2
27345strDivideByZero:
27346    .word   .LstrDivideByZero
27347strLogTag:
27348    .word   .LstrLogTag
27349strExceptionNotCaughtLocally:
27350    .word   .LstrExceptionNotCaughtLocally
27351
27352strNewline:
27353    .word   .LstrNewline
27354strSqueak:
27355    .word   .LstrSqueak
27356strPrintHex:
27357    .word   .LstrPrintHex
27358strPrintLong:
27359    .word   .LstrPrintLong
27360
27361/*
27362 * Zero-terminated ASCII string data.
27363 *
27364 * On ARM we have two choices: do like gcc does, and LDR from a .word
27365 * with the address, or use an ADR pseudo-op to get the address
27366 * directly.  ADR saves 4 bytes and an indirection, but it's using a
27367 * PC-relative addressing mode and hence has a limited range, which
27368 * makes it not work well with mergeable string sections.
27369 */
27370    .section .rodata.str1.4,"aMS",%progbits,1
27371
27372.LstrBadEntryPoint:
27373    .asciz  "Bad entry point %d\n"
27374.LstrFilledNewArrayNotImpl:
27375    .asciz  "filled-new-array only implemented for objects and 'int'"
27376.LstrDivideByZero:
27377    .asciz  "divide by zero"
27378.LstrLogTag:
27379    .asciz  "mterp"
27380.LstrExceptionNotCaughtLocally:
27381    .asciz  "Exception %s from %s:%d not caught locally\n"
27382
27383.LstrNewline:
27384    .asciz  "\n"
27385.LstrSqueak:
27386    .asciz  "<%d>"
27387.LstrPrintHex:
27388    .asciz  "<0x%x>"
27389.LstrPrintLong:
27390    .asciz  "<%lld>"
27391
27392