InterpAsm-armv7-a.S revision 30bc0d46ae730d78c42c39cfa56a59ba3025380b
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_curFrame]
86#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
87#define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
88#define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
89
90/*
91 * "export" the PC to the stack frame, f/b/o future exception objects.  Must
92 * be done *before* something throws.
93 *
94 * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
95 * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
96 *
97 * It's okay to do this more than once.
98 */
99#define EXPORT_PC() \
100    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
101
102/*
103 * Given a frame pointer, find the stack save area.
104 *
105 * In C this is "((StackSaveArea*)(_fp) -1)".
106 */
107#define SAVEAREA_FROM_FP(_reg, _fpreg) \
108    sub     _reg, _fpreg, #sizeofStackSaveArea
109
110/*
111 * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
112 */
113#define FETCH_INST()            ldrh    rINST, [rPC]
114
115/*
116 * Fetch the next instruction from the specified offset.  Advances rPC
117 * to point to the next instruction.  "_count" is in 16-bit code units.
118 *
119 * Because of the limited size of immediate constants on ARM, this is only
120 * suitable for small forward movements (i.e. don't try to implement "goto"
121 * with this).
122 *
123 * This must come AFTER anything that can throw an exception, or the
124 * exception catch may miss.  (This also implies that it must come after
125 * EXPORT_PC().)
126 */
127#define FETCH_ADVANCE_INST(_count) ldrh    rINST, [rPC, #((_count)*2)]!
128
129/*
130 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
131 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
132 */
133#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
134        ldrh    _dreg, [_sreg, #((_count)*2)]!
135
136/*
137 * Fetch the next instruction from an offset specified by _reg.  Updates
138 * rPC to point to the next instruction.  "_reg" must specify the distance
139 * in bytes, *not* 16-bit code units, and may be a signed value.
140 *
141 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
142 * bits that hold the shift distance are used for the half/byte/sign flags.
143 * In some cases we can pre-double _reg for free, so we require a byte offset
144 * here.
145 */
146#define FETCH_ADVANCE_INST_RB(_reg) ldrh    rINST, [rPC, _reg]!
147
148/*
149 * Fetch a half-word code unit from an offset past the current PC.  The
150 * "_count" value is in 16-bit code units.  Does not advance rPC.
151 *
152 * The "_S" variant works the same but treats the value as signed.
153 */
154#define FETCH(_reg, _count)     ldrh    _reg, [rPC, #((_count)*2)]
155#define FETCH_S(_reg, _count)   ldrsh   _reg, [rPC, #((_count)*2)]
156
157/*
158 * Fetch one byte from an offset past the current PC.  Pass in the same
159 * "_count" as you would for FETCH, and an additional 0/1 indicating which
160 * byte of the halfword you want (lo/hi).
161 */
162#define FETCH_B(_reg, _count, _byte) ldrb     _reg, [rPC, #((_count)*2+(_byte))]
163
164/*
165 * Put the instruction's opcode field into the specified register.
166 */
167#define GET_INST_OPCODE(_reg)   and     _reg, rINST, #255
168
169/*
170 * Put the prefetched instruction's opcode field into the specified register.
171 */
172#define GET_PREFETCHED_OPCODE(_oreg, _ireg)   and     _oreg, _ireg, #255
173
174/*
175 * Begin executing the opcode in _reg.  Because this only jumps within the
176 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
177 */
178#define GOTO_OPCODE(_reg)       add     pc, rIBASE, _reg, lsl #6
179#define GOTO_OPCODE_BASE(_base,_reg)  add     pc, _base, _reg, lsl #6
180#define GOTO_OPCODE_IFEQ(_reg)  addeq   pc, rIBASE, _reg, lsl #6
181#define GOTO_OPCODE_IFNE(_reg)  addne   pc, rIBASE, _reg, lsl #6
182
183/*
184 * Get/set the 32-bit value from a Dalvik register.
185 */
186#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
187#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
188
189/*
190 * Convert a virtual register index into an address.
191 */
192#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
193        add     _reg, rFP, _vreg, lsl #2
194
195/*
196 * This is a #include, not a %include, because we want the C pre-processor
197 * to expand the macros into assembler assignment statements.
198 */
199#include "../common/asm-constants.h"
200
201#if defined(WITH_JIT)
202#include "../common/jit-config.h"
203#endif
204
205/* File: armv7-a/platform.S */
206/*
207 * ===========================================================================
208 *  CPU-version-specific defines
209 * ===========================================================================
210 */
211
212#if !defined(ANDROID_SMP)
213# error "Must define ANDROID_SMP"
214#endif
215
216/*
217 * Macro for data memory barrier.
218 */
219.macro  SMP_DMB
220#if ANDROID_SMP != 0
221    dmb
222#else
223    /* not SMP */
224#endif
225.endm
226
227/*
228 * Macro for data memory barrier (store/store variant).
229 */
230.macro  SMP_DMB_ST
231#if ANDROID_SMP != 0
232    dmb     st
233#else
234    /* not SMP */
235#endif
236.endm
237
238/* File: armv5te/entry.S */
239/*
240 * Copyright (C) 2008 The Android Open Source Project
241 *
242 * Licensed under the Apache License, Version 2.0 (the "License");
243 * you may not use this file except in compliance with the License.
244 * You may obtain a copy of the License at
245 *
246 *      http://www.apache.org/licenses/LICENSE-2.0
247 *
248 * Unless required by applicable law or agreed to in writing, software
249 * distributed under the License is distributed on an "AS IS" BASIS,
250 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
251 * See the License for the specific language governing permissions and
252 * limitations under the License.
253 */
254/*
255 * Interpreter entry point.
256 */
257
258/*
259 * We don't have formal stack frames, so gdb scans upward in the code
260 * to find the start of the function (a label with the %function type),
261 * and then looks at the next few instructions to figure out what
262 * got pushed onto the stack.  From this it figures out how to restore
263 * the registers, including PC, for the previous stack frame.  If gdb
264 * sees a non-function label, it stops scanning, so either we need to
265 * have nothing but assembler-local labels between the entry point and
266 * the break, or we need to fake it out.
267 *
268 * When this is defined, we add some stuff to make gdb less confused.
269 */
270#define ASSIST_DEBUGGER 1
271
272    .text
273    .align  2
274    .global dvmMterpStdRun
275    .type   dvmMterpStdRun, %function
276
277/*
278 * On entry:
279 *  r0  Thread* self
280 *
281 * The return comes via a call to dvmMterpStdBail().
282 */
283dvmMterpStdRun:
284#define MTERP_ENTRY1 \
285    .save {r4-r10,fp,lr}; \
286    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
287#define MTERP_ENTRY2 \
288    .pad    #4; \
289    sub     sp, sp, #4                  @ align 64
290
291    .fnstart
292    MTERP_ENTRY1
293    MTERP_ENTRY2
294
295    /* save stack pointer, add magic word for debuggerd */
296    str     sp, [r0, #offThread_bailPtr]  @ save SP for eventual return
297
298    /* set up "named" registers, figure out entry point */
299    mov     rSELF, r0                   @ set rSELF
300    LOAD_PC_FP_FROM_SELF()              @ load rPC and rFP from "thread"
301    ldr     rIBASE, [rSELF, #offThread_curHandlerTable] @ set rIBASE
302
303#if defined(WITH_JIT)
304.LentryInstr:
305    /* Entry is always a possible trace start */
306    ldr     r0, [rSELF, #offThread_pJitProfTable]
307    FETCH_INST()
308    mov     r1, #0                      @ prepare the value for the new state
309    str     r1, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
310    cmp     r0,#0                       @ is profiling disabled?
311#if !defined(WITH_SELF_VERIFICATION)
312    bne     common_updateProfile        @ profiling is enabled
313#else
314    ldr     r2, [rSELF, #offThread_shadowSpace] @ to find out the jit exit state
315    beq     1f                          @ profiling is disabled
316    ldr     r3, [r2, #offShadowSpace_jitExitState]  @ jit exit state
317    cmp     r3, #kSVSTraceSelect        @ hot trace following?
318    moveq   r2,#kJitTSelectRequestHot   @ ask for trace selection
319    beq     common_selectTrace          @ go build the trace
320    cmp     r3, #kSVSNoProfile          @ don't profile the next instruction?
321    beq     1f                          @ intrepret the next instruction
322    b       common_updateProfile        @ collect profiles
323#endif
3241:
325    GET_INST_OPCODE(ip)
326    GOTO_OPCODE(ip)
327#else
328    /* start executing the instruction at rPC */
329    FETCH_INST()                        @ load rINST from rPC
330    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
331    GOTO_OPCODE(ip)                     @ jump to next instruction
332#endif
333
334.Lbad_arg:
335    ldr     r0, strBadEntryPoint
336    @ r1 holds value of entryPoint
337    bl      printf
338    bl      dvmAbort
339    .fnend
340    .size   dvmMterpStdRun, .-dvmMterpStdRun
341
342
343    .global dvmMterpStdBail
344    .type   dvmMterpStdBail, %function
345
346/*
347 * Restore the stack pointer and PC from the save point established on entry.
348 * This is essentially the same as a longjmp, but should be cheaper.  The
349 * last instruction causes us to return to whoever called dvmMterpStdRun.
350 *
351 * We pushed some registers on the stack in dvmMterpStdRun, then saved
352 * SP and LR.  Here we restore SP, restore the registers, and then restore
353 * LR to PC.
354 *
355 * On entry:
356 *  r0  Thread* self
357 */
358dvmMterpStdBail:
359    ldr     sp, [r0, #offThread_bailPtr]    @ sp<- saved SP
360    add     sp, sp, #4                      @ un-align 64
361    ldmfd   sp!, {r4-r10,fp,pc}             @ restore 9 regs and return
362
363
364/*
365 * String references.
366 */
367strBadEntryPoint:
368    .word   .LstrBadEntryPoint
369
370
371    .global dvmAsmInstructionStart
372    .type   dvmAsmInstructionStart, %function
373dvmAsmInstructionStart = .L_OP_NOP
374    .text
375
376/* ------------------------------ */
377    .balign 64
378.L_OP_NOP: /* 0x00 */
379/* File: armv5te/OP_NOP.S */
380    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
381    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
382    GOTO_OPCODE(ip)                     @ execute it
383
384#ifdef ASSIST_DEBUGGER
385    /* insert fake function header to help gdb find the stack frame */
386    .type   dalvik_inst, %function
387dalvik_inst:
388    .fnstart
389    MTERP_ENTRY1
390    MTERP_ENTRY2
391    .fnend
392#endif
393
394/* ------------------------------ */
395    .balign 64
396.L_OP_MOVE: /* 0x01 */
397/* File: armv6t2/OP_MOVE.S */
398    /* for move, move-object, long-to-int */
399    /* op vA, vB */
400    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
401    ubfx    r0, rINST, #8, #4           @ r0<- A from 11:8
402    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
403    GET_VREG(r2, r1)                    @ r2<- fp[B]
404    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
405    SET_VREG(r2, r0)                    @ fp[A]<- r2
406    GOTO_OPCODE(ip)                     @ execute next instruction
407
408/* ------------------------------ */
409    .balign 64
410.L_OP_MOVE_FROM16: /* 0x02 */
411/* File: armv5te/OP_MOVE_FROM16.S */
412    /* for: move/from16, move-object/from16 */
413    /* op vAA, vBBBB */
414    FETCH(r1, 1)                        @ r1<- BBBB
415    mov     r0, rINST, lsr #8           @ r0<- AA
416    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
417    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
418    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
419    SET_VREG(r2, r0)                    @ fp[AA]<- r2
420    GOTO_OPCODE(ip)                     @ jump to next instruction
421
422/* ------------------------------ */
423    .balign 64
424.L_OP_MOVE_16: /* 0x03 */
425/* File: armv5te/OP_MOVE_16.S */
426    /* for: move/16, move-object/16 */
427    /* op vAAAA, vBBBB */
428    FETCH(r1, 2)                        @ r1<- BBBB
429    FETCH(r0, 1)                        @ r0<- AAAA
430    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
431    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
432    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
433    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
434    GOTO_OPCODE(ip)                     @ jump to next instruction
435
436/* ------------------------------ */
437    .balign 64
438.L_OP_MOVE_WIDE: /* 0x04 */
439/* File: armv6t2/OP_MOVE_WIDE.S */
440    /* move-wide vA, vB */
441    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
442    mov     r3, rINST, lsr #12          @ r3<- B
443    ubfx    r2, rINST, #8, #4           @ r2<- A
444    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
445    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
446    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
447    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
448    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
449    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
450    GOTO_OPCODE(ip)                     @ jump to next instruction
451
452/* ------------------------------ */
453    .balign 64
454.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
455/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
456    /* move-wide/from16 vAA, vBBBB */
457    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
458    FETCH(r3, 1)                        @ r3<- BBBB
459    mov     r2, rINST, lsr #8           @ r2<- AA
460    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
461    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
462    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
463    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
464    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
465    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
466    GOTO_OPCODE(ip)                     @ jump to next instruction
467
468/* ------------------------------ */
469    .balign 64
470.L_OP_MOVE_WIDE_16: /* 0x06 */
471/* File: armv5te/OP_MOVE_WIDE_16.S */
472    /* move-wide/16 vAAAA, vBBBB */
473    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
474    FETCH(r3, 2)                        @ r3<- BBBB
475    FETCH(r2, 1)                        @ r2<- AAAA
476    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
477    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
478    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
479    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
480    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
481    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
482    GOTO_OPCODE(ip)                     @ jump to next instruction
483
484/* ------------------------------ */
485    .balign 64
486.L_OP_MOVE_OBJECT: /* 0x07 */
487/* File: armv5te/OP_MOVE_OBJECT.S */
488/* File: armv5te/OP_MOVE.S */
489    /* for move, move-object, long-to-int */
490    /* op vA, vB */
491    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
492    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
493    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
494    GET_VREG(r2, r1)                    @ r2<- fp[B]
495    and     r0, r0, #15
496    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
497    SET_VREG(r2, r0)                    @ fp[A]<- r2
498    GOTO_OPCODE(ip)                     @ execute next instruction
499
500
501/* ------------------------------ */
502    .balign 64
503.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
504/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
505/* File: armv5te/OP_MOVE_FROM16.S */
506    /* for: move/from16, move-object/from16 */
507    /* op vAA, vBBBB */
508    FETCH(r1, 1)                        @ r1<- BBBB
509    mov     r0, rINST, lsr #8           @ r0<- AA
510    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
511    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
512    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
513    SET_VREG(r2, r0)                    @ fp[AA]<- r2
514    GOTO_OPCODE(ip)                     @ jump to next instruction
515
516
517/* ------------------------------ */
518    .balign 64
519.L_OP_MOVE_OBJECT_16: /* 0x09 */
520/* File: armv5te/OP_MOVE_OBJECT_16.S */
521/* File: armv5te/OP_MOVE_16.S */
522    /* for: move/16, move-object/16 */
523    /* op vAAAA, vBBBB */
524    FETCH(r1, 2)                        @ r1<- BBBB
525    FETCH(r0, 1)                        @ r0<- AAAA
526    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
527    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
528    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
529    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
530    GOTO_OPCODE(ip)                     @ jump to next instruction
531
532
533/* ------------------------------ */
534    .balign 64
535.L_OP_MOVE_RESULT: /* 0x0a */
536/* File: armv5te/OP_MOVE_RESULT.S */
537    /* for: move-result, move-result-object */
538    /* op vAA */
539    mov     r2, rINST, lsr #8           @ r2<- AA
540    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
541    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
542    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
543    SET_VREG(r0, r2)                    @ fp[AA]<- r0
544    GOTO_OPCODE(ip)                     @ jump to next instruction
545
546/* ------------------------------ */
547    .balign 64
548.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
549/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
550    /* move-result-wide vAA */
551    mov     r2, rINST, lsr #8           @ r2<- AA
552    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
553    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
554    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
555    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
556    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
557    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
558    GOTO_OPCODE(ip)                     @ jump to next instruction
559
560/* ------------------------------ */
561    .balign 64
562.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
563/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
564/* File: armv5te/OP_MOVE_RESULT.S */
565    /* for: move-result, move-result-object */
566    /* op vAA */
567    mov     r2, rINST, lsr #8           @ r2<- AA
568    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
569    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
570    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
571    SET_VREG(r0, r2)                    @ fp[AA]<- r0
572    GOTO_OPCODE(ip)                     @ jump to next instruction
573
574
575/* ------------------------------ */
576    .balign 64
577.L_OP_MOVE_EXCEPTION: /* 0x0d */
578/* File: armv5te/OP_MOVE_EXCEPTION.S */
579    /* move-exception vAA */
580    mov     r2, rINST, lsr #8           @ r2<- AA
581    ldr     r3, [rSELF, #offThread_exception]  @ r3<- dvmGetException bypass
582    mov     r1, #0                      @ r1<- 0
583    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
584    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
585    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
586    str     r1, [rSELF, #offThread_exception]  @ dvmClearException bypass
587    GOTO_OPCODE(ip)                     @ jump to next instruction
588
589/* ------------------------------ */
590    .balign 64
591.L_OP_RETURN_VOID: /* 0x0e */
592/* File: armv5te/OP_RETURN_VOID.S */
593    b       common_returnFromMethod
594
595/* ------------------------------ */
596    .balign 64
597.L_OP_RETURN: /* 0x0f */
598/* File: armv5te/OP_RETURN.S */
599    /*
600     * Return a 32-bit value.  Copies the return value into the "thread"
601     * structure, then jumps to the return handler.
602     *
603     * for: return, return-object
604     */
605    /* op vAA */
606    mov     r2, rINST, lsr #8           @ r2<- AA
607    GET_VREG(r0, r2)                    @ r0<- vAA
608    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
609    b       common_returnFromMethod
610
611/* ------------------------------ */
612    .balign 64
613.L_OP_RETURN_WIDE: /* 0x10 */
614/* File: armv5te/OP_RETURN_WIDE.S */
615    /*
616     * Return a 64-bit value.  Copies the return value into the "thread"
617     * structure, then jumps to the return handler.
618     */
619    /* return-wide vAA */
620    mov     r2, rINST, lsr #8           @ r2<- AA
621    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
622    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
623    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
624    stmia   r3, {r0-r1}                 @ retval<- r0/r1
625    b       common_returnFromMethod
626
627/* ------------------------------ */
628    .balign 64
629.L_OP_RETURN_OBJECT: /* 0x11 */
630/* File: armv5te/OP_RETURN_OBJECT.S */
631/* File: armv5te/OP_RETURN.S */
632    /*
633     * Return a 32-bit value.  Copies the return value into the "thread"
634     * structure, then jumps to the return handler.
635     *
636     * for: return, return-object
637     */
638    /* op vAA */
639    mov     r2, rINST, lsr #8           @ r2<- AA
640    GET_VREG(r0, r2)                    @ r0<- vAA
641    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
642    b       common_returnFromMethod
643
644
645/* ------------------------------ */
646    .balign 64
647.L_OP_CONST_4: /* 0x12 */
648/* File: armv6t2/OP_CONST_4.S */
649    /* const/4 vA, #+B */
650    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
651    ubfx    r0, rINST, #8, #4           @ r0<- A
652    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
653    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
654    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
655    SET_VREG(r1, r0)                    @ fp[A]<- r1
656    GOTO_OPCODE(ip)                     @ execute next instruction
657
658/* ------------------------------ */
659    .balign 64
660.L_OP_CONST_16: /* 0x13 */
661/* File: armv5te/OP_CONST_16.S */
662    /* const/16 vAA, #+BBBB */
663    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
664    mov     r3, rINST, lsr #8           @ r3<- AA
665    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
666    SET_VREG(r0, r3)                    @ vAA<- r0
667    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
668    GOTO_OPCODE(ip)                     @ jump to next instruction
669
670/* ------------------------------ */
671    .balign 64
672.L_OP_CONST: /* 0x14 */
673/* File: armv5te/OP_CONST.S */
674    /* const vAA, #+BBBBbbbb */
675    mov     r3, rINST, lsr #8           @ r3<- AA
676    FETCH(r0, 1)                        @ r0<- bbbb (low)
677    FETCH(r1, 2)                        @ r1<- BBBB (high)
678    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
679    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
680    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
681    SET_VREG(r0, r3)                    @ vAA<- r0
682    GOTO_OPCODE(ip)                     @ jump to next instruction
683
684/* ------------------------------ */
685    .balign 64
686.L_OP_CONST_HIGH16: /* 0x15 */
687/* File: armv5te/OP_CONST_HIGH16.S */
688    /* const/high16 vAA, #+BBBB0000 */
689    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
690    mov     r3, rINST, lsr #8           @ r3<- AA
691    mov     r0, r0, lsl #16             @ r0<- BBBB0000
692    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
693    SET_VREG(r0, r3)                    @ vAA<- r0
694    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
695    GOTO_OPCODE(ip)                     @ jump to next instruction
696
697/* ------------------------------ */
698    .balign 64
699.L_OP_CONST_WIDE_16: /* 0x16 */
700/* File: armv5te/OP_CONST_WIDE_16.S */
701    /* const-wide/16 vAA, #+BBBB */
702    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
703    mov     r3, rINST, lsr #8           @ r3<- AA
704    mov     r1, r0, asr #31             @ r1<- ssssssss
705    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
706    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
707    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
708    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
709    GOTO_OPCODE(ip)                     @ jump to next instruction
710
711/* ------------------------------ */
712    .balign 64
713.L_OP_CONST_WIDE_32: /* 0x17 */
714/* File: armv5te/OP_CONST_WIDE_32.S */
715    /* const-wide/32 vAA, #+BBBBbbbb */
716    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
717    mov     r3, rINST, lsr #8           @ r3<- AA
718    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
719    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
720    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
721    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
722    mov     r1, r0, asr #31             @ r1<- ssssssss
723    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
724    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
725    GOTO_OPCODE(ip)                     @ jump to next instruction
726
727/* ------------------------------ */
728    .balign 64
729.L_OP_CONST_WIDE: /* 0x18 */
730/* File: armv5te/OP_CONST_WIDE.S */
731    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
732    FETCH(r0, 1)                        @ r0<- bbbb (low)
733    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
734    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
735    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
736    FETCH(r3, 4)                        @ r3<- HHHH (high)
737    mov     r9, rINST, lsr #8           @ r9<- AA
738    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
739    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
740    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
741    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
742    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
743    GOTO_OPCODE(ip)                     @ jump to next instruction
744
745/* ------------------------------ */
746    .balign 64
747.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
748/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
749    /* const-wide/high16 vAA, #+BBBB000000000000 */
750    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
751    mov     r3, rINST, lsr #8           @ r3<- AA
752    mov     r0, #0                      @ r0<- 00000000
753    mov     r1, r1, lsl #16             @ r1<- BBBB0000
754    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
755    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
756    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
757    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
758    GOTO_OPCODE(ip)                     @ jump to next instruction
759
760/* ------------------------------ */
761    .balign 64
762.L_OP_CONST_STRING: /* 0x1a */
763/* File: armv5te/OP_CONST_STRING.S */
764    /* const/string vAA, String@BBBB */
765    FETCH(r1, 1)                        @ r1<- BBBB
766    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
767    mov     r9, rINST, lsr #8           @ r9<- AA
768    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
769    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
770    cmp     r0, #0                      @ not yet resolved?
771    beq     .LOP_CONST_STRING_resolve
772    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
773    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
774    SET_VREG(r0, r9)                    @ vAA<- r0
775    GOTO_OPCODE(ip)                     @ jump to next instruction
776
777/* ------------------------------ */
778    .balign 64
779.L_OP_CONST_STRING_JUMBO: /* 0x1b */
780/* File: armv5te/OP_CONST_STRING_JUMBO.S */
781    /* const/string vAA, String@BBBBBBBB */
782    FETCH(r0, 1)                        @ r0<- bbbb (low)
783    FETCH(r1, 2)                        @ r1<- BBBB (high)
784    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
785    mov     r9, rINST, lsr #8           @ r9<- AA
786    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
787    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
788    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
789    cmp     r0, #0
790    beq     .LOP_CONST_STRING_JUMBO_resolve
791    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
792    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
793    SET_VREG(r0, r9)                    @ vAA<- r0
794    GOTO_OPCODE(ip)                     @ jump to next instruction
795
796/* ------------------------------ */
797    .balign 64
798.L_OP_CONST_CLASS: /* 0x1c */
799/* File: armv5te/OP_CONST_CLASS.S */
800    /* const/class vAA, Class@BBBB */
801    FETCH(r1, 1)                        @ r1<- BBBB
802    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
803    mov     r9, rINST, lsr #8           @ r9<- AA
804    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
805    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
806    cmp     r0, #0                      @ not yet resolved?
807    beq     .LOP_CONST_CLASS_resolve
808    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
809    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
810    SET_VREG(r0, r9)                    @ vAA<- r0
811    GOTO_OPCODE(ip)                     @ jump to next instruction
812
813/* ------------------------------ */
814    .balign 64
815.L_OP_MONITOR_ENTER: /* 0x1d */
816/* File: armv5te/OP_MONITOR_ENTER.S */
817    /*
818     * Synchronize on an object.
819     */
820    /* monitor-enter vAA */
821    mov     r2, rINST, lsr #8           @ r2<- AA
822    GET_VREG(r1, r2)                    @ r1<- vAA (object)
823    mov     r0, rSELF                   @ r0<- self
824    cmp     r1, #0                      @ null object?
825    EXPORT_PC()                         @ need for precise GC
826    beq     common_errNullObject        @ null object, throw an exception
827    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
828    bl      dvmLockObject               @ call(self, obj)
829    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
830    GOTO_OPCODE(ip)                     @ jump to next instruction
831
832/* ------------------------------ */
833    .balign 64
834.L_OP_MONITOR_EXIT: /* 0x1e */
835/* File: armv5te/OP_MONITOR_EXIT.S */
836    /*
837     * Unlock an object.
838     *
839     * Exceptions that occur when unlocking a monitor need to appear as
840     * if they happened at the following instruction.  See the Dalvik
841     * instruction spec.
842     */
843    /* monitor-exit vAA */
844    mov     r2, rINST, lsr #8           @ r2<- AA
845    EXPORT_PC()                         @ before fetch: export the PC
846    GET_VREG(r1, r2)                    @ r1<- vAA (object)
847    cmp     r1, #0                      @ null object?
848    beq     1f                          @ yes
849    mov     r0, rSELF                   @ r0<- self
850    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
851    cmp     r0, #0                      @ failed?
852    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
853    beq     common_exceptionThrown      @ yes, exception is pending
854    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
855    GOTO_OPCODE(ip)                     @ jump to next instruction
8561:
857    FETCH_ADVANCE_INST(1)               @ advance before throw
858    b      common_errNullObject
859
860/* ------------------------------ */
861    .balign 64
862.L_OP_CHECK_CAST: /* 0x1f */
863/* File: armv5te/OP_CHECK_CAST.S */
864    /*
865     * Check to see if a cast from one class to another is allowed.
866     */
867    /* check-cast vAA, class@BBBB */
868    mov     r3, rINST, lsr #8           @ r3<- AA
869    FETCH(r2, 1)                        @ r2<- BBBB
870    GET_VREG(r9, r3)                    @ r9<- object
871    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
872    cmp     r9, #0                      @ is object null?
873    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
874    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
875    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
876    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
877    cmp     r1, #0                      @ have we resolved this before?
878    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
879.LOP_CHECK_CAST_resolved:
880    cmp     r0, r1                      @ same class (trivial success)?
881    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
882.LOP_CHECK_CAST_okay:
883    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
884    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
885    GOTO_OPCODE(ip)                     @ jump to next instruction
886
887/* ------------------------------ */
888    .balign 64
889.L_OP_INSTANCE_OF: /* 0x20 */
890/* File: armv5te/OP_INSTANCE_OF.S */
891    /*
892     * Check to see if an object reference is an instance of a class.
893     *
894     * Most common situation is a non-null object, being compared against
895     * an already-resolved class.
896     */
897    /* instance-of vA, vB, class@CCCC */
898    mov     r3, rINST, lsr #12          @ r3<- B
899    mov     r9, rINST, lsr #8           @ r9<- A+
900    GET_VREG(r0, r3)                    @ r0<- vB (object)
901    and     r9, r9, #15                 @ r9<- A
902    cmp     r0, #0                      @ is object null?
903    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
904    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
905    FETCH(r3, 1)                        @ r3<- CCCC
906    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
907    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
908    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
909    cmp     r1, #0                      @ have we resolved this before?
910    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
911.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
912    cmp     r0, r1                      @ same class (trivial success)?
913    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
914    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
915
916/* ------------------------------ */
917    .balign 64
918.L_OP_ARRAY_LENGTH: /* 0x21 */
919/* File: armv6t2/OP_ARRAY_LENGTH.S */
920    /*
921     * Return the length of an array.
922     */
923    mov     r1, rINST, lsr #12          @ r1<- B
924    ubfx    r2, rINST, #8, #4           @ r2<- A
925    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
926    cmp     r0, #0                      @ is object null?
927    beq     common_errNullObject        @ yup, fail
928    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
929    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
930    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
931    SET_VREG(r3, r2)                    @ vB<- length
932    GOTO_OPCODE(ip)                     @ jump to next instruction
933
934/* ------------------------------ */
935    .balign 64
936.L_OP_NEW_INSTANCE: /* 0x22 */
937/* File: armv5te/OP_NEW_INSTANCE.S */
938    /*
939     * Create a new instance of a class.
940     */
941    /* new-instance vAA, class@BBBB */
942    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
943    FETCH(r1, 1)                        @ r1<- BBBB
944    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
945    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
946#if defined(WITH_JIT)
947    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
948#endif
949    EXPORT_PC()                         @ req'd for init, resolve, alloc
950    cmp     r0, #0                      @ already resolved?
951    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
952.LOP_NEW_INSTANCE_resolved:   @ r0=class
953    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
954    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
955    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
956.LOP_NEW_INSTANCE_initialized: @ r0=class
957    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
958    bl      dvmAllocObject              @ r0<- new object
959    b       .LOP_NEW_INSTANCE_finish          @ continue
960
961/* ------------------------------ */
962    .balign 64
963.L_OP_NEW_ARRAY: /* 0x23 */
964/* File: armv5te/OP_NEW_ARRAY.S */
965    /*
966     * Allocate an array of objects, specified with the array class
967     * and a count.
968     *
969     * The verifier guarantees that this is an array class, so we don't
970     * check for it here.
971     */
972    /* new-array vA, vB, class@CCCC */
973    mov     r0, rINST, lsr #12          @ r0<- B
974    FETCH(r2, 1)                        @ r2<- CCCC
975    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
976    GET_VREG(r1, r0)                    @ r1<- vB (array length)
977    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
978    cmp     r1, #0                      @ check length
979    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
980    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
981    cmp     r0, #0                      @ already resolved?
982    EXPORT_PC()                         @ req'd for resolve, alloc
983    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
984    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
985
986/* ------------------------------ */
987    .balign 64
988.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
989/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
990    /*
991     * Create a new array with elements filled from registers.
992     *
993     * for: filled-new-array, filled-new-array/range
994     */
995    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
996    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
997    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
998    FETCH(r1, 1)                        @ r1<- BBBB
999    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1000    EXPORT_PC()                         @ need for resolve and alloc
1001    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1002    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1003    cmp     r0, #0                      @ already resolved?
1004    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
10058:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1006    mov     r2, #0                      @ r2<- false
1007    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1008    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1009    cmp     r0, #0                      @ got null?
1010    beq     common_exceptionThrown      @ yes, handle exception
1011    b       .LOP_FILLED_NEW_ARRAY_continue
1012
1013/* ------------------------------ */
1014    .balign 64
1015.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1016/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1017/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1018    /*
1019     * Create a new array with elements filled from registers.
1020     *
1021     * for: filled-new-array, filled-new-array/range
1022     */
1023    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1024    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1025    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
1026    FETCH(r1, 1)                        @ r1<- BBBB
1027    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1028    EXPORT_PC()                         @ need for resolve and alloc
1029    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1030    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1031    cmp     r0, #0                      @ already resolved?
1032    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
10338:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1034    mov     r2, #0                      @ r2<- false
1035    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1036    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1037    cmp     r0, #0                      @ got null?
1038    beq     common_exceptionThrown      @ yes, handle exception
1039    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1040
1041
1042/* ------------------------------ */
1043    .balign 64
1044.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1045/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1046    /* fill-array-data vAA, +BBBBBBBB */
1047    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1048    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1049    mov     r3, rINST, lsr #8           @ r3<- AA
1050    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1051    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1052    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1053    EXPORT_PC();
1054    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1055    cmp     r0, #0                      @ 0 means an exception is thrown
1056    beq     common_exceptionThrown      @ has exception
1057    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1058    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1059    GOTO_OPCODE(ip)                     @ jump to next instruction
1060
1061/* ------------------------------ */
1062    .balign 64
1063.L_OP_THROW: /* 0x27 */
1064/* File: armv5te/OP_THROW.S */
1065    /*
1066     * Throw an exception object in the current thread.
1067     */
1068    /* throw vAA */
1069    mov     r2, rINST, lsr #8           @ r2<- AA
1070    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1071    EXPORT_PC()                         @ exception handler can throw
1072    cmp     r1, #0                      @ null object?
1073    beq     common_errNullObject        @ yes, throw an NPE instead
1074    @ bypass dvmSetException, just store it
1075    str     r1, [rSELF, #offThread_exception]  @ thread->exception<- obj
1076    b       common_exceptionThrown
1077
1078/* ------------------------------ */
1079    .balign 64
1080.L_OP_GOTO: /* 0x28 */
1081/* File: armv5te/OP_GOTO.S */
1082    /*
1083     * Unconditional branch, 8-bit offset.
1084     *
1085     * The branch distance is a signed code-unit offset, which we need to
1086     * double to get a byte offset.
1087     */
1088    /* goto +AA */
1089    /* tuning: use sbfx for 6t2+ targets */
1090    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1091    movs    r1, r0, asr #24             @ r1<- ssssssAA (sign-extended)
1092    add     r2, r1, r1                  @ r2<- byte offset, set flags
1093       @ If backwards branch refresh rIBASE
1094    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1095    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1096#if defined(WITH_JIT)
1097    ldr     r0, [rSELF, #offThread_pJitProfTable]
1098    bmi     common_testUpdateProfile    @ (r0) check for trace hotness
1099#endif
1100    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1101    GOTO_OPCODE(ip)                     @ jump to next instruction
1102
1103/* ------------------------------ */
1104    .balign 64
1105.L_OP_GOTO_16: /* 0x29 */
1106/* File: armv5te/OP_GOTO_16.S */
1107    /*
1108     * Unconditional branch, 16-bit offset.
1109     *
1110     * The branch distance is a signed code-unit offset, which we need to
1111     * double to get a byte offset.
1112     */
1113    /* goto/16 +AAAA */
1114    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1115    adds    r1, r0, r0                  @ r1<- byte offset, flags set
1116    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1117    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1118#if defined(WITH_JIT)
1119    ldr     r0, [rSELF, #offThread_pJitProfTable]
1120    bmi     common_testUpdateProfile    @ (r0) hot trace head?
1121#endif
1122    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1123    GOTO_OPCODE(ip)                     @ jump to next instruction
1124
1125/* ------------------------------ */
1126    .balign 64
1127.L_OP_GOTO_32: /* 0x2a */
1128/* File: armv5te/OP_GOTO_32.S */
1129    /*
1130     * Unconditional branch, 32-bit offset.
1131     *
1132     * The branch distance is a signed code-unit offset, which we need to
1133     * double to get a byte offset.
1134     *
1135     * Unlike most opcodes, this one is allowed to branch to itself, so
1136     * our "backward branch" test must be "<=0" instead of "<0".  Because
1137     * we need the V bit set, we'll use an adds to convert from Dalvik
1138     * offset to byte offset.
1139     */
1140    /* goto/32 +AAAAAAAA */
1141    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1142    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1143    orr     r0, r0, r1, lsl #16         @ r0<- AAAAaaaa
1144    adds    r1, r0, r0                  @ r1<- byte offset
1145#if defined(WITH_JIT)
1146    ldr     r0, [rSELF, #offThread_pJitProfTable]
1147    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1148    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1149    ble     common_testUpdateProfile    @ (r0) hot trace head?
1150#else
1151    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1152    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1153#endif
1154    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1155    GOTO_OPCODE(ip)                     @ jump to next instruction
1156
1157/* ------------------------------ */
1158    .balign 64
1159.L_OP_PACKED_SWITCH: /* 0x2b */
1160/* File: armv5te/OP_PACKED_SWITCH.S */
1161    /*
1162     * Handle a packed-switch or sparse-switch instruction.  In both cases
1163     * we decode it and hand it off to a helper function.
1164     *
1165     * We don't really expect backward branches in a switch statement, but
1166     * they're perfectly legal, so we check for them here.
1167     *
1168     * When the JIT is present, all targets are considered treated as
1169     * a potential trace heads regardless of branch direction.
1170     *
1171     * for: packed-switch, sparse-switch
1172     */
1173    /* op vAA, +BBBB */
1174    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1175    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1176    mov     r3, rINST, lsr #8           @ r3<- AA
1177    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1178    GET_VREG(r1, r3)                    @ r1<- vAA
1179    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1180    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1181    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1182#if defined(WITH_JIT)
1183    ldr     r0, [rSELF, #offThread_pJitProfTable]
1184    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1185    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1186    cmp     r0, #0
1187    bne     common_updateProfile
1188#else
1189    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1190    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1191#endif
1192    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1193    GOTO_OPCODE(ip)                     @ jump to next instruction
1194
1195/* ------------------------------ */
1196    .balign 64
1197.L_OP_SPARSE_SWITCH: /* 0x2c */
1198/* File: armv5te/OP_SPARSE_SWITCH.S */
1199/* File: armv5te/OP_PACKED_SWITCH.S */
1200    /*
1201     * Handle a packed-switch or sparse-switch instruction.  In both cases
1202     * we decode it and hand it off to a helper function.
1203     *
1204     * We don't really expect backward branches in a switch statement, but
1205     * they're perfectly legal, so we check for them here.
1206     *
1207     * When the JIT is present, all targets are considered treated as
1208     * a potential trace heads regardless of branch direction.
1209     *
1210     * for: packed-switch, sparse-switch
1211     */
1212    /* op vAA, +BBBB */
1213    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1214    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1215    mov     r3, rINST, lsr #8           @ r3<- AA
1216    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1217    GET_VREG(r1, r3)                    @ r1<- vAA
1218    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1219    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1220    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1221#if defined(WITH_JIT)
1222    ldr     r0, [rSELF, #offThread_pJitProfTable]
1223    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1224    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1225    cmp     r0, #0
1226    bne     common_updateProfile
1227#else
1228    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1229    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1230#endif
1231    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1232    GOTO_OPCODE(ip)                     @ jump to next instruction
1233
1234
1235/* ------------------------------ */
1236    .balign 64
1237.L_OP_CMPL_FLOAT: /* 0x2d */
1238/* File: arm-vfp/OP_CMPL_FLOAT.S */
1239    /*
1240     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1241     * destination register based on the results of the comparison.
1242     *
1243     * int compare(x, y) {
1244     *     if (x == y) {
1245     *         return 0;
1246     *     } else if (x > y) {
1247     *         return 1;
1248     *     } else if (x < y) {
1249     *         return -1;
1250     *     } else {
1251     *         return -1;
1252     *     }
1253     * }
1254     */
1255    /* op vAA, vBB, vCC */
1256    FETCH(r0, 1)                        @ r0<- CCBB
1257    mov     r9, rINST, lsr #8           @ r9<- AA
1258    and     r2, r0, #255                @ r2<- BB
1259    mov     r3, r0, lsr #8              @ r3<- CC
1260    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1261    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1262    flds    s0, [r2]                    @ s0<- vBB
1263    flds    s1, [r3]                    @ s1<- vCC
1264    fcmpes  s0, s1                      @ compare (vBB, vCC)
1265    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1266    mvn     r0, #0                      @ r0<- -1 (default)
1267    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1268    fmstat                              @ export status flags
1269    movgt   r0, #1                      @ (greater than) r1<- 1
1270    moveq   r0, #0                      @ (equal) r1<- 0
1271    b       .LOP_CMPL_FLOAT_finish          @ argh
1272
1273
1274/* ------------------------------ */
1275    .balign 64
1276.L_OP_CMPG_FLOAT: /* 0x2e */
1277/* File: arm-vfp/OP_CMPG_FLOAT.S */
1278    /*
1279     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1280     * destination register based on the results of the comparison.
1281     *
1282     * int compare(x, y) {
1283     *     if (x == y) {
1284     *         return 0;
1285     *     } else if (x < y) {
1286     *         return -1;
1287     *     } else if (x > y) {
1288     *         return 1;
1289     *     } else {
1290     *         return 1;
1291     *     }
1292     * }
1293     */
1294    /* op vAA, vBB, vCC */
1295    FETCH(r0, 1)                        @ r0<- CCBB
1296    mov     r9, rINST, lsr #8           @ r9<- AA
1297    and     r2, r0, #255                @ r2<- BB
1298    mov     r3, r0, lsr #8              @ r3<- CC
1299    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1300    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1301    flds    s0, [r2]                    @ s0<- vBB
1302    flds    s1, [r3]                    @ s1<- vCC
1303    fcmpes  s0, s1                      @ compare (vBB, vCC)
1304    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1305    mov     r0, #1                      @ r0<- 1 (default)
1306    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1307    fmstat                              @ export status flags
1308    mvnmi   r0, #0                      @ (less than) r1<- -1
1309    moveq   r0, #0                      @ (equal) r1<- 0
1310    b       .LOP_CMPG_FLOAT_finish          @ argh
1311
1312
1313/* ------------------------------ */
1314    .balign 64
1315.L_OP_CMPL_DOUBLE: /* 0x2f */
1316/* File: arm-vfp/OP_CMPL_DOUBLE.S */
1317    /*
1318     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1319     * destination register based on the results of the comparison.
1320     *
1321     * int compare(x, y) {
1322     *     if (x == y) {
1323     *         return 0;
1324     *     } else if (x > y) {
1325     *         return 1;
1326     *     } else if (x < y) {
1327     *         return -1;
1328     *     } else {
1329     *         return -1;
1330     *     }
1331     * }
1332     */
1333    /* op vAA, vBB, vCC */
1334    FETCH(r0, 1)                        @ r0<- CCBB
1335    mov     r9, rINST, lsr #8           @ r9<- AA
1336    and     r2, r0, #255                @ r2<- BB
1337    mov     r3, r0, lsr #8              @ r3<- CC
1338    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1339    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1340    fldd    d0, [r2]                    @ d0<- vBB
1341    fldd    d1, [r3]                    @ d1<- vCC
1342    fcmped  d0, d1                      @ compare (vBB, vCC)
1343    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1344    mvn     r0, #0                      @ r0<- -1 (default)
1345    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1346    fmstat                              @ export status flags
1347    movgt   r0, #1                      @ (greater than) r1<- 1
1348    moveq   r0, #0                      @ (equal) r1<- 0
1349    b       .LOP_CMPL_DOUBLE_finish          @ argh
1350
1351
1352/* ------------------------------ */
1353    .balign 64
1354.L_OP_CMPG_DOUBLE: /* 0x30 */
1355/* File: arm-vfp/OP_CMPG_DOUBLE.S */
1356    /*
1357     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1358     * destination register based on the results of the comparison.
1359     *
1360     * int compare(x, y) {
1361     *     if (x == y) {
1362     *         return 0;
1363     *     } else if (x < y) {
1364     *         return -1;
1365     *     } else if (x > y) {
1366     *         return 1;
1367     *     } else {
1368     *         return 1;
1369     *     }
1370     * }
1371     */
1372    /* op vAA, vBB, vCC */
1373    FETCH(r0, 1)                        @ r0<- CCBB
1374    mov     r9, rINST, lsr #8           @ r9<- AA
1375    and     r2, r0, #255                @ r2<- BB
1376    mov     r3, r0, lsr #8              @ r3<- CC
1377    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1378    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1379    fldd    d0, [r2]                    @ d0<- vBB
1380    fldd    d1, [r3]                    @ d1<- vCC
1381    fcmped  d0, d1                      @ compare (vBB, vCC)
1382    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1383    mov     r0, #1                      @ r0<- 1 (default)
1384    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1385    fmstat                              @ export status flags
1386    mvnmi   r0, #0                      @ (less than) r1<- -1
1387    moveq   r0, #0                      @ (equal) r1<- 0
1388    b       .LOP_CMPG_DOUBLE_finish          @ argh
1389
1390
1391/* ------------------------------ */
1392    .balign 64
1393.L_OP_CMP_LONG: /* 0x31 */
1394/* File: armv5te/OP_CMP_LONG.S */
1395    /*
1396     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1397     * register based on the results of the comparison.
1398     *
1399     * We load the full values with LDM, but in practice many values could
1400     * be resolved by only looking at the high word.  This could be made
1401     * faster or slower by splitting the LDM into a pair of LDRs.
1402     *
1403     * If we just wanted to set condition flags, we could do this:
1404     *  subs    ip, r0, r2
1405     *  sbcs    ip, r1, r3
1406     *  subeqs  ip, r0, r2
1407     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1408     * integer value, which we can do with 2 conditional mov/mvn instructions
1409     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1410     * us a constant 5-cycle path plus a branch at the end to the
1411     * instruction epilogue code.  The multi-compare approach below needs
1412     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1413     * in the worst case (the 64-bit values are equal).
1414     */
1415    /* cmp-long vAA, vBB, vCC */
1416    FETCH(r0, 1)                        @ r0<- CCBB
1417    mov     r9, rINST, lsr #8           @ r9<- AA
1418    and     r2, r0, #255                @ r2<- BB
1419    mov     r3, r0, lsr #8              @ r3<- CC
1420    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1421    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1422    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1423    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1424    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1425    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1426    bgt     .LOP_CMP_LONG_greater
1427    subs    r1, r0, r2                  @ r1<- r0 - r2
1428    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1429    bne     .LOP_CMP_LONG_less
1430    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1431
1432/* ------------------------------ */
1433    .balign 64
1434.L_OP_IF_EQ: /* 0x32 */
1435/* File: armv6t2/OP_IF_EQ.S */
1436/* File: armv6t2/bincmp.S */
1437    /*
1438     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1439     * fragment that specifies the *reverse* comparison to perform, e.g.
1440     * for "if-le" you would use "gt".
1441     *
1442     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1443     */
1444    /* if-cmp vA, vB, +CCCC */
1445    mov     r1, rINST, lsr #12          @ r1<- B
1446    ubfx    r0, rINST, #8, #4           @ r0<- A
1447    GET_VREG(r3, r1)                    @ r3<- vB
1448    GET_VREG(r2, r0)                    @ r2<- vA
1449    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1450    cmp     r2, r3                      @ compare (vA, vB)
1451    movne r1, #2                 @ r1<- BYTE branch dist for not-taken
1452    adds    r2, r1, r1                  @ convert to bytes, check sign
1453    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1454#if defined(WITH_JIT)
1455    ldr     r0, [rSELF, #offThread_pJitProfTable]
1456    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1457    cmp     r0, #0
1458    bne     common_updateProfile
1459#else
1460    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1461#endif
1462    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1463    GOTO_OPCODE(ip)                     @ jump to next instruction
1464
1465
1466/* ------------------------------ */
1467    .balign 64
1468.L_OP_IF_NE: /* 0x33 */
1469/* File: armv6t2/OP_IF_NE.S */
1470/* File: armv6t2/bincmp.S */
1471    /*
1472     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1473     * fragment that specifies the *reverse* comparison to perform, e.g.
1474     * for "if-le" you would use "gt".
1475     *
1476     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1477     */
1478    /* if-cmp vA, vB, +CCCC */
1479    mov     r1, rINST, lsr #12          @ r1<- B
1480    ubfx    r0, rINST, #8, #4           @ r0<- A
1481    GET_VREG(r3, r1)                    @ r3<- vB
1482    GET_VREG(r2, r0)                    @ r2<- vA
1483    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1484    cmp     r2, r3                      @ compare (vA, vB)
1485    moveq r1, #2                 @ r1<- BYTE branch dist for not-taken
1486    adds    r2, r1, r1                  @ convert to bytes, check sign
1487    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1488#if defined(WITH_JIT)
1489    ldr     r0, [rSELF, #offThread_pJitProfTable]
1490    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1491    cmp     r0, #0
1492    bne     common_updateProfile
1493#else
1494    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1495#endif
1496    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1497    GOTO_OPCODE(ip)                     @ jump to next instruction
1498
1499
1500/* ------------------------------ */
1501    .balign 64
1502.L_OP_IF_LT: /* 0x34 */
1503/* File: armv6t2/OP_IF_LT.S */
1504/* File: armv6t2/bincmp.S */
1505    /*
1506     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1507     * fragment that specifies the *reverse* comparison to perform, e.g.
1508     * for "if-le" you would use "gt".
1509     *
1510     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1511     */
1512    /* if-cmp vA, vB, +CCCC */
1513    mov     r1, rINST, lsr #12          @ r1<- B
1514    ubfx    r0, rINST, #8, #4           @ r0<- A
1515    GET_VREG(r3, r1)                    @ r3<- vB
1516    GET_VREG(r2, r0)                    @ r2<- vA
1517    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1518    cmp     r2, r3                      @ compare (vA, vB)
1519    movge r1, #2                 @ r1<- BYTE branch dist for not-taken
1520    adds    r2, r1, r1                  @ convert to bytes, check sign
1521    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1522#if defined(WITH_JIT)
1523    ldr     r0, [rSELF, #offThread_pJitProfTable]
1524    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1525    cmp     r0, #0
1526    bne     common_updateProfile
1527#else
1528    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1529#endif
1530    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1531    GOTO_OPCODE(ip)                     @ jump to next instruction
1532
1533
1534/* ------------------------------ */
1535    .balign 64
1536.L_OP_IF_GE: /* 0x35 */
1537/* File: armv6t2/OP_IF_GE.S */
1538/* File: armv6t2/bincmp.S */
1539    /*
1540     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1541     * fragment that specifies the *reverse* comparison to perform, e.g.
1542     * for "if-le" you would use "gt".
1543     *
1544     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1545     */
1546    /* if-cmp vA, vB, +CCCC */
1547    mov     r1, rINST, lsr #12          @ r1<- B
1548    ubfx    r0, rINST, #8, #4           @ r0<- A
1549    GET_VREG(r3, r1)                    @ r3<- vB
1550    GET_VREG(r2, r0)                    @ r2<- vA
1551    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1552    cmp     r2, r3                      @ compare (vA, vB)
1553    movlt r1, #2                 @ r1<- BYTE branch dist for not-taken
1554    adds    r2, r1, r1                  @ convert to bytes, check sign
1555    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1556#if defined(WITH_JIT)
1557    ldr     r0, [rSELF, #offThread_pJitProfTable]
1558    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1559    cmp     r0, #0
1560    bne     common_updateProfile
1561#else
1562    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1563#endif
1564    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1565    GOTO_OPCODE(ip)                     @ jump to next instruction
1566
1567
1568/* ------------------------------ */
1569    .balign 64
1570.L_OP_IF_GT: /* 0x36 */
1571/* File: armv6t2/OP_IF_GT.S */
1572/* File: armv6t2/bincmp.S */
1573    /*
1574     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1575     * fragment that specifies the *reverse* comparison to perform, e.g.
1576     * for "if-le" you would use "gt".
1577     *
1578     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1579     */
1580    /* if-cmp vA, vB, +CCCC */
1581    mov     r1, rINST, lsr #12          @ r1<- B
1582    ubfx    r0, rINST, #8, #4           @ r0<- A
1583    GET_VREG(r3, r1)                    @ r3<- vB
1584    GET_VREG(r2, r0)                    @ r2<- vA
1585    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1586    cmp     r2, r3                      @ compare (vA, vB)
1587    movle r1, #2                 @ r1<- BYTE branch dist for not-taken
1588    adds    r2, r1, r1                  @ convert to bytes, check sign
1589    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1590#if defined(WITH_JIT)
1591    ldr     r0, [rSELF, #offThread_pJitProfTable]
1592    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1593    cmp     r0, #0
1594    bne     common_updateProfile
1595#else
1596    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1597#endif
1598    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1599    GOTO_OPCODE(ip)                     @ jump to next instruction
1600
1601
1602/* ------------------------------ */
1603    .balign 64
1604.L_OP_IF_LE: /* 0x37 */
1605/* File: armv6t2/OP_IF_LE.S */
1606/* File: armv6t2/bincmp.S */
1607    /*
1608     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1609     * fragment that specifies the *reverse* comparison to perform, e.g.
1610     * for "if-le" you would use "gt".
1611     *
1612     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1613     */
1614    /* if-cmp vA, vB, +CCCC */
1615    mov     r1, rINST, lsr #12          @ r1<- B
1616    ubfx    r0, rINST, #8, #4           @ r0<- A
1617    GET_VREG(r3, r1)                    @ r3<- vB
1618    GET_VREG(r2, r0)                    @ r2<- vA
1619    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1620    cmp     r2, r3                      @ compare (vA, vB)
1621    movgt r1, #2                 @ r1<- BYTE branch dist for not-taken
1622    adds    r2, r1, r1                  @ convert to bytes, check sign
1623    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1624#if defined(WITH_JIT)
1625    ldr     r0, [rSELF, #offThread_pJitProfTable]
1626    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1627    cmp     r0, #0
1628    bne     common_updateProfile
1629#else
1630    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1631#endif
1632    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1633    GOTO_OPCODE(ip)                     @ jump to next instruction
1634
1635
1636/* ------------------------------ */
1637    .balign 64
1638.L_OP_IF_EQZ: /* 0x38 */
1639/* File: armv5te/OP_IF_EQZ.S */
1640/* File: armv5te/zcmp.S */
1641    /*
1642     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1643     * fragment that specifies the *reverse* comparison to perform, e.g.
1644     * for "if-le" you would use "gt".
1645     *
1646     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1647     */
1648    /* if-cmp vAA, +BBBB */
1649    mov     r0, rINST, lsr #8           @ r0<- AA
1650    GET_VREG(r2, r0)                    @ r2<- vAA
1651    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1652    cmp     r2, #0                      @ compare (vA, 0)
1653    movne r1, #2                 @ r1<- inst branch dist for not-taken
1654    adds    r1, r1, r1                  @ convert to bytes & set flags
1655    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1656#if defined(WITH_JIT)
1657    ldr     r0, [rSELF, #offThread_pJitProfTable]
1658    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1659    cmp     r0,#0
1660    bne     common_updateProfile        @ test for JIT off at target
1661#else
1662    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1663#endif
1664    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1665    GOTO_OPCODE(ip)                     @ jump to next instruction
1666
1667
1668/* ------------------------------ */
1669    .balign 64
1670.L_OP_IF_NEZ: /* 0x39 */
1671/* File: armv5te/OP_IF_NEZ.S */
1672/* File: armv5te/zcmp.S */
1673    /*
1674     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1675     * fragment that specifies the *reverse* comparison to perform, e.g.
1676     * for "if-le" you would use "gt".
1677     *
1678     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1679     */
1680    /* if-cmp vAA, +BBBB */
1681    mov     r0, rINST, lsr #8           @ r0<- AA
1682    GET_VREG(r2, r0)                    @ r2<- vAA
1683    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1684    cmp     r2, #0                      @ compare (vA, 0)
1685    moveq r1, #2                 @ r1<- inst branch dist for not-taken
1686    adds    r1, r1, r1                  @ convert to bytes & set flags
1687    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1688#if defined(WITH_JIT)
1689    ldr     r0, [rSELF, #offThread_pJitProfTable]
1690    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1691    cmp     r0,#0
1692    bne     common_updateProfile        @ test for JIT off at target
1693#else
1694    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1695#endif
1696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1697    GOTO_OPCODE(ip)                     @ jump to next instruction
1698
1699
1700/* ------------------------------ */
1701    .balign 64
1702.L_OP_IF_LTZ: /* 0x3a */
1703/* File: armv5te/OP_IF_LTZ.S */
1704/* File: armv5te/zcmp.S */
1705    /*
1706     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1707     * fragment that specifies the *reverse* comparison to perform, e.g.
1708     * for "if-le" you would use "gt".
1709     *
1710     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1711     */
1712    /* if-cmp vAA, +BBBB */
1713    mov     r0, rINST, lsr #8           @ r0<- AA
1714    GET_VREG(r2, r0)                    @ r2<- vAA
1715    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1716    cmp     r2, #0                      @ compare (vA, 0)
1717    movge r1, #2                 @ r1<- inst branch dist for not-taken
1718    adds    r1, r1, r1                  @ convert to bytes & set flags
1719    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1720#if defined(WITH_JIT)
1721    ldr     r0, [rSELF, #offThread_pJitProfTable]
1722    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1723    cmp     r0,#0
1724    bne     common_updateProfile        @ test for JIT off at target
1725#else
1726    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1727#endif
1728    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1729    GOTO_OPCODE(ip)                     @ jump to next instruction
1730
1731
1732/* ------------------------------ */
1733    .balign 64
1734.L_OP_IF_GEZ: /* 0x3b */
1735/* File: armv5te/OP_IF_GEZ.S */
1736/* File: armv5te/zcmp.S */
1737    /*
1738     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1739     * fragment that specifies the *reverse* comparison to perform, e.g.
1740     * for "if-le" you would use "gt".
1741     *
1742     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1743     */
1744    /* if-cmp vAA, +BBBB */
1745    mov     r0, rINST, lsr #8           @ r0<- AA
1746    GET_VREG(r2, r0)                    @ r2<- vAA
1747    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1748    cmp     r2, #0                      @ compare (vA, 0)
1749    movlt r1, #2                 @ r1<- inst branch dist for not-taken
1750    adds    r1, r1, r1                  @ convert to bytes & set flags
1751    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1752#if defined(WITH_JIT)
1753    ldr     r0, [rSELF, #offThread_pJitProfTable]
1754    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1755    cmp     r0,#0
1756    bne     common_updateProfile        @ test for JIT off at target
1757#else
1758    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1759#endif
1760    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1761    GOTO_OPCODE(ip)                     @ jump to next instruction
1762
1763
1764/* ------------------------------ */
1765    .balign 64
1766.L_OP_IF_GTZ: /* 0x3c */
1767/* File: armv5te/OP_IF_GTZ.S */
1768/* File: armv5te/zcmp.S */
1769    /*
1770     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1771     * fragment that specifies the *reverse* comparison to perform, e.g.
1772     * for "if-le" you would use "gt".
1773     *
1774     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1775     */
1776    /* if-cmp vAA, +BBBB */
1777    mov     r0, rINST, lsr #8           @ r0<- AA
1778    GET_VREG(r2, r0)                    @ r2<- vAA
1779    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1780    cmp     r2, #0                      @ compare (vA, 0)
1781    movle r1, #2                 @ r1<- inst branch dist for not-taken
1782    adds    r1, r1, r1                  @ convert to bytes & set flags
1783    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1784#if defined(WITH_JIT)
1785    ldr     r0, [rSELF, #offThread_pJitProfTable]
1786    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1787    cmp     r0,#0
1788    bne     common_updateProfile        @ test for JIT off at target
1789#else
1790    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1791#endif
1792    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1793    GOTO_OPCODE(ip)                     @ jump to next instruction
1794
1795
1796/* ------------------------------ */
1797    .balign 64
1798.L_OP_IF_LEZ: /* 0x3d */
1799/* File: armv5te/OP_IF_LEZ.S */
1800/* File: armv5te/zcmp.S */
1801    /*
1802     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1803     * fragment that specifies the *reverse* comparison to perform, e.g.
1804     * for "if-le" you would use "gt".
1805     *
1806     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1807     */
1808    /* if-cmp vAA, +BBBB */
1809    mov     r0, rINST, lsr #8           @ r0<- AA
1810    GET_VREG(r2, r0)                    @ r2<- vAA
1811    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1812    cmp     r2, #0                      @ compare (vA, 0)
1813    movgt r1, #2                 @ r1<- inst branch dist for not-taken
1814    adds    r1, r1, r1                  @ convert to bytes & set flags
1815    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1816#if defined(WITH_JIT)
1817    ldr     r0, [rSELF, #offThread_pJitProfTable]
1818    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1819    cmp     r0,#0
1820    bne     common_updateProfile        @ test for JIT off at target
1821#else
1822    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1823#endif
1824    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1825    GOTO_OPCODE(ip)                     @ jump to next instruction
1826
1827
1828/* ------------------------------ */
1829    .balign 64
1830.L_OP_UNUSED_3E: /* 0x3e */
1831/* File: armv5te/OP_UNUSED_3E.S */
1832/* File: armv5te/unused.S */
1833    bl      common_abort
1834
1835
1836/* ------------------------------ */
1837    .balign 64
1838.L_OP_UNUSED_3F: /* 0x3f */
1839/* File: armv5te/OP_UNUSED_3F.S */
1840/* File: armv5te/unused.S */
1841    bl      common_abort
1842
1843
1844/* ------------------------------ */
1845    .balign 64
1846.L_OP_UNUSED_40: /* 0x40 */
1847/* File: armv5te/OP_UNUSED_40.S */
1848/* File: armv5te/unused.S */
1849    bl      common_abort
1850
1851
1852/* ------------------------------ */
1853    .balign 64
1854.L_OP_UNUSED_41: /* 0x41 */
1855/* File: armv5te/OP_UNUSED_41.S */
1856/* File: armv5te/unused.S */
1857    bl      common_abort
1858
1859
1860/* ------------------------------ */
1861    .balign 64
1862.L_OP_UNUSED_42: /* 0x42 */
1863/* File: armv5te/OP_UNUSED_42.S */
1864/* File: armv5te/unused.S */
1865    bl      common_abort
1866
1867
1868/* ------------------------------ */
1869    .balign 64
1870.L_OP_UNUSED_43: /* 0x43 */
1871/* File: armv5te/OP_UNUSED_43.S */
1872/* File: armv5te/unused.S */
1873    bl      common_abort
1874
1875
1876/* ------------------------------ */
1877    .balign 64
1878.L_OP_AGET: /* 0x44 */
1879/* File: armv5te/OP_AGET.S */
1880    /*
1881     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1882     *
1883     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1884     * instructions.  We use a pair of FETCH_Bs instead.
1885     *
1886     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1887     */
1888    /* op vAA, vBB, vCC */
1889    FETCH_B(r2, 1, 0)                   @ r2<- BB
1890    mov     r9, rINST, lsr #8           @ r9<- AA
1891    FETCH_B(r3, 1, 1)                   @ r3<- CC
1892    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1893    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1894    cmp     r0, #0                      @ null array object?
1895    beq     common_errNullObject        @ yes, bail
1896    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1897    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1898    cmp     r1, r3                      @ compare unsigned index, length
1899    bcs     common_errArrayIndex        @ index >= length, bail
1900    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1901    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1902    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1903    SET_VREG(r2, r9)                    @ vAA<- r2
1904    GOTO_OPCODE(ip)                     @ jump to next instruction
1905
1906/* ------------------------------ */
1907    .balign 64
1908.L_OP_AGET_WIDE: /* 0x45 */
1909/* File: armv5te/OP_AGET_WIDE.S */
1910    /*
1911     * Array get, 64 bits.  vAA <- vBB[vCC].
1912     *
1913     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
1914     */
1915    /* aget-wide vAA, vBB, vCC */
1916    FETCH(r0, 1)                        @ r0<- CCBB
1917    mov     r9, rINST, lsr #8           @ r9<- AA
1918    and     r2, r0, #255                @ r2<- BB
1919    mov     r3, r0, lsr #8              @ r3<- CC
1920    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1921    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1922    cmp     r0, #0                      @ null array object?
1923    beq     common_errNullObject        @ yes, bail
1924    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1925    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
1926    cmp     r1, r3                      @ compare unsigned index, length
1927    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
1928    b       common_errArrayIndex        @ index >= length, bail
1929    @ May want to swap the order of these two branches depending on how the
1930    @ branch prediction (if any) handles conditional forward branches vs.
1931    @ unconditional forward branches.
1932
1933/* ------------------------------ */
1934    .balign 64
1935.L_OP_AGET_OBJECT: /* 0x46 */
1936/* File: armv5te/OP_AGET_OBJECT.S */
1937/* File: armv5te/OP_AGET.S */
1938    /*
1939     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1940     *
1941     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1942     * instructions.  We use a pair of FETCH_Bs instead.
1943     *
1944     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1945     */
1946    /* op vAA, vBB, vCC */
1947    FETCH_B(r2, 1, 0)                   @ r2<- BB
1948    mov     r9, rINST, lsr #8           @ r9<- AA
1949    FETCH_B(r3, 1, 1)                   @ r3<- CC
1950    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1951    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1952    cmp     r0, #0                      @ null array object?
1953    beq     common_errNullObject        @ yes, bail
1954    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1955    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1956    cmp     r1, r3                      @ compare unsigned index, length
1957    bcs     common_errArrayIndex        @ index >= length, bail
1958    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1959    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1960    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1961    SET_VREG(r2, r9)                    @ vAA<- r2
1962    GOTO_OPCODE(ip)                     @ jump to next instruction
1963
1964
1965/* ------------------------------ */
1966    .balign 64
1967.L_OP_AGET_BOOLEAN: /* 0x47 */
1968/* File: armv5te/OP_AGET_BOOLEAN.S */
1969/* File: armv5te/OP_AGET.S */
1970    /*
1971     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1972     *
1973     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1974     * instructions.  We use a pair of FETCH_Bs instead.
1975     *
1976     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1977     */
1978    /* op vAA, vBB, vCC */
1979    FETCH_B(r2, 1, 0)                   @ r2<- BB
1980    mov     r9, rINST, lsr #8           @ r9<- AA
1981    FETCH_B(r3, 1, 1)                   @ r3<- CC
1982    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1983    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1984    cmp     r0, #0                      @ null array object?
1985    beq     common_errNullObject        @ yes, bail
1986    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1987    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
1988    cmp     r1, r3                      @ compare unsigned index, length
1989    bcs     common_errArrayIndex        @ index >= length, bail
1990    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1991    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1992    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1993    SET_VREG(r2, r9)                    @ vAA<- r2
1994    GOTO_OPCODE(ip)                     @ jump to next instruction
1995
1996
1997/* ------------------------------ */
1998    .balign 64
1999.L_OP_AGET_BYTE: /* 0x48 */
2000/* File: armv5te/OP_AGET_BYTE.S */
2001/* File: armv5te/OP_AGET.S */
2002    /*
2003     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2004     *
2005     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2006     * instructions.  We use a pair of FETCH_Bs instead.
2007     *
2008     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2009     */
2010    /* op vAA, vBB, vCC */
2011    FETCH_B(r2, 1, 0)                   @ r2<- BB
2012    mov     r9, rINST, lsr #8           @ r9<- AA
2013    FETCH_B(r3, 1, 1)                   @ r3<- CC
2014    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2015    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2016    cmp     r0, #0                      @ null array object?
2017    beq     common_errNullObject        @ yes, bail
2018    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2019    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2020    cmp     r1, r3                      @ compare unsigned index, length
2021    bcs     common_errArrayIndex        @ index >= length, bail
2022    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2023    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2024    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2025    SET_VREG(r2, r9)                    @ vAA<- r2
2026    GOTO_OPCODE(ip)                     @ jump to next instruction
2027
2028
2029/* ------------------------------ */
2030    .balign 64
2031.L_OP_AGET_CHAR: /* 0x49 */
2032/* File: armv5te/OP_AGET_CHAR.S */
2033/* File: armv5te/OP_AGET.S */
2034    /*
2035     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2036     *
2037     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2038     * instructions.  We use a pair of FETCH_Bs instead.
2039     *
2040     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2041     */
2042    /* op vAA, vBB, vCC */
2043    FETCH_B(r2, 1, 0)                   @ r2<- BB
2044    mov     r9, rINST, lsr #8           @ r9<- AA
2045    FETCH_B(r3, 1, 1)                   @ r3<- CC
2046    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2047    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2048    cmp     r0, #0                      @ null array object?
2049    beq     common_errNullObject        @ yes, bail
2050    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2051    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2052    cmp     r1, r3                      @ compare unsigned index, length
2053    bcs     common_errArrayIndex        @ index >= length, bail
2054    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2055    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2056    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2057    SET_VREG(r2, r9)                    @ vAA<- r2
2058    GOTO_OPCODE(ip)                     @ jump to next instruction
2059
2060
2061/* ------------------------------ */
2062    .balign 64
2063.L_OP_AGET_SHORT: /* 0x4a */
2064/* File: armv5te/OP_AGET_SHORT.S */
2065/* File: armv5te/OP_AGET.S */
2066    /*
2067     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2068     *
2069     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2070     * instructions.  We use a pair of FETCH_Bs instead.
2071     *
2072     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2073     */
2074    /* op vAA, vBB, vCC */
2075    FETCH_B(r2, 1, 0)                   @ r2<- BB
2076    mov     r9, rINST, lsr #8           @ r9<- AA
2077    FETCH_B(r3, 1, 1)                   @ r3<- CC
2078    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2079    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2080    cmp     r0, #0                      @ null array object?
2081    beq     common_errNullObject        @ yes, bail
2082    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2083    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2084    cmp     r1, r3                      @ compare unsigned index, length
2085    bcs     common_errArrayIndex        @ index >= length, bail
2086    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2087    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2088    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2089    SET_VREG(r2, r9)                    @ vAA<- r2
2090    GOTO_OPCODE(ip)                     @ jump to next instruction
2091
2092
2093/* ------------------------------ */
2094    .balign 64
2095.L_OP_APUT: /* 0x4b */
2096/* File: armv5te/OP_APUT.S */
2097    /*
2098     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2099     *
2100     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2101     * instructions.  We use a pair of FETCH_Bs instead.
2102     *
2103     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2104     */
2105    /* op vAA, vBB, vCC */
2106    FETCH_B(r2, 1, 0)                   @ r2<- BB
2107    mov     r9, rINST, lsr #8           @ r9<- AA
2108    FETCH_B(r3, 1, 1)                   @ r3<- CC
2109    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2110    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2111    cmp     r0, #0                      @ null array object?
2112    beq     common_errNullObject        @ yes, bail
2113    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2114    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2115    cmp     r1, r3                      @ compare unsigned index, length
2116    bcs     common_errArrayIndex        @ index >= length, bail
2117    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2118    GET_VREG(r2, r9)                    @ r2<- vAA
2119    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2120    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2121    GOTO_OPCODE(ip)                     @ jump to next instruction
2122
2123/* ------------------------------ */
2124    .balign 64
2125.L_OP_APUT_WIDE: /* 0x4c */
2126/* File: armv5te/OP_APUT_WIDE.S */
2127    /*
2128     * Array put, 64 bits.  vBB[vCC] <- vAA.
2129     *
2130     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2131     */
2132    /* aput-wide vAA, vBB, vCC */
2133    FETCH(r0, 1)                        @ r0<- CCBB
2134    mov     r9, rINST, lsr #8           @ r9<- AA
2135    and     r2, r0, #255                @ r2<- BB
2136    mov     r3, r0, lsr #8              @ r3<- CC
2137    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2138    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2139    cmp     r0, #0                      @ null array object?
2140    beq     common_errNullObject        @ yes, bail
2141    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2142    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2143    cmp     r1, r3                      @ compare unsigned index, length
2144    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2145    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2146    b       common_errArrayIndex        @ index >= length, bail
2147    @ May want to swap the order of these two branches depending on how the
2148    @ branch prediction (if any) handles conditional forward branches vs.
2149    @ unconditional forward branches.
2150
2151/* ------------------------------ */
2152    .balign 64
2153.L_OP_APUT_OBJECT: /* 0x4d */
2154/* File: armv5te/OP_APUT_OBJECT.S */
2155    /*
2156     * Store an object into an array.  vBB[vCC] <- vAA.
2157     */
2158    /* op vAA, vBB, vCC */
2159    FETCH(r0, 1)                        @ r0<- CCBB
2160    mov     r9, rINST, lsr #8           @ r9<- AA
2161    and     r2, r0, #255                @ r2<- BB
2162    mov     r3, r0, lsr #8              @ r3<- CC
2163    GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
2164    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2165    cmp     rINST, #0                   @ null array object?
2166    GET_VREG(r9, r9)                    @ r9<- vAA
2167    beq     common_errNullObject        @ yes, bail
2168    ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
2169    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
2170    cmp     r1, r3                      @ compare unsigned index, length
2171    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2172    b       common_errArrayIndex        @ index >= length, bail
2173
2174
2175/* ------------------------------ */
2176    .balign 64
2177.L_OP_APUT_BOOLEAN: /* 0x4e */
2178/* File: armv5te/OP_APUT_BOOLEAN.S */
2179/* File: armv5te/OP_APUT.S */
2180    /*
2181     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2182     *
2183     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2184     * instructions.  We use a pair of FETCH_Bs instead.
2185     *
2186     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2187     */
2188    /* op vAA, vBB, vCC */
2189    FETCH_B(r2, 1, 0)                   @ r2<- BB
2190    mov     r9, rINST, lsr #8           @ r9<- AA
2191    FETCH_B(r3, 1, 1)                   @ r3<- CC
2192    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2193    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2194    cmp     r0, #0                      @ null array object?
2195    beq     common_errNullObject        @ yes, bail
2196    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2197    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2198    cmp     r1, r3                      @ compare unsigned index, length
2199    bcs     common_errArrayIndex        @ index >= length, bail
2200    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2201    GET_VREG(r2, r9)                    @ r2<- vAA
2202    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2203    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2204    GOTO_OPCODE(ip)                     @ jump to next instruction
2205
2206
2207/* ------------------------------ */
2208    .balign 64
2209.L_OP_APUT_BYTE: /* 0x4f */
2210/* File: armv5te/OP_APUT_BYTE.S */
2211/* File: armv5te/OP_APUT.S */
2212    /*
2213     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2214     *
2215     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2216     * instructions.  We use a pair of FETCH_Bs instead.
2217     *
2218     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2219     */
2220    /* op vAA, vBB, vCC */
2221    FETCH_B(r2, 1, 0)                   @ r2<- BB
2222    mov     r9, rINST, lsr #8           @ r9<- AA
2223    FETCH_B(r3, 1, 1)                   @ r3<- CC
2224    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2225    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2226    cmp     r0, #0                      @ null array object?
2227    beq     common_errNullObject        @ yes, bail
2228    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2229    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2230    cmp     r1, r3                      @ compare unsigned index, length
2231    bcs     common_errArrayIndex        @ index >= length, bail
2232    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2233    GET_VREG(r2, r9)                    @ r2<- vAA
2234    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2235    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2236    GOTO_OPCODE(ip)                     @ jump to next instruction
2237
2238
2239/* ------------------------------ */
2240    .balign 64
2241.L_OP_APUT_CHAR: /* 0x50 */
2242/* File: armv5te/OP_APUT_CHAR.S */
2243/* File: armv5te/OP_APUT.S */
2244    /*
2245     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2246     *
2247     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2248     * instructions.  We use a pair of FETCH_Bs instead.
2249     *
2250     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2251     */
2252    /* op vAA, vBB, vCC */
2253    FETCH_B(r2, 1, 0)                   @ r2<- BB
2254    mov     r9, rINST, lsr #8           @ r9<- AA
2255    FETCH_B(r3, 1, 1)                   @ r3<- CC
2256    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2257    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2258    cmp     r0, #0                      @ null array object?
2259    beq     common_errNullObject        @ yes, bail
2260    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2261    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2262    cmp     r1, r3                      @ compare unsigned index, length
2263    bcs     common_errArrayIndex        @ index >= length, bail
2264    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2265    GET_VREG(r2, r9)                    @ r2<- vAA
2266    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2267    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2268    GOTO_OPCODE(ip)                     @ jump to next instruction
2269
2270
2271/* ------------------------------ */
2272    .balign 64
2273.L_OP_APUT_SHORT: /* 0x51 */
2274/* File: armv5te/OP_APUT_SHORT.S */
2275/* File: armv5te/OP_APUT.S */
2276    /*
2277     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2278     *
2279     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2280     * instructions.  We use a pair of FETCH_Bs instead.
2281     *
2282     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2283     */
2284    /* op vAA, vBB, vCC */
2285    FETCH_B(r2, 1, 0)                   @ r2<- BB
2286    mov     r9, rINST, lsr #8           @ r9<- AA
2287    FETCH_B(r3, 1, 1)                   @ r3<- CC
2288    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2289    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2290    cmp     r0, #0                      @ null array object?
2291    beq     common_errNullObject        @ yes, bail
2292    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2293    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2294    cmp     r1, r3                      @ compare unsigned index, length
2295    bcs     common_errArrayIndex        @ index >= length, bail
2296    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2297    GET_VREG(r2, r9)                    @ r2<- vAA
2298    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2299    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2300    GOTO_OPCODE(ip)                     @ jump to next instruction
2301
2302
2303/* ------------------------------ */
2304    .balign 64
2305.L_OP_IGET: /* 0x52 */
2306/* File: armv6t2/OP_IGET.S */
2307    /*
2308     * General 32-bit instance field get.
2309     *
2310     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2311     */
2312    /* op vA, vB, field@CCCC */
2313    mov     r0, rINST, lsr #12          @ r0<- B
2314    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2315    FETCH(r1, 1)                        @ r1<- field ref CCCC
2316    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2317    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2318    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2319    cmp     r0, #0                      @ is resolved entry null?
2320    bne     .LOP_IGET_finish          @ no, already resolved
23218:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2322    EXPORT_PC()                         @ resolve() could throw
2323    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2324    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2325    cmp     r0, #0
2326    bne     .LOP_IGET_finish
2327    b       common_exceptionThrown
2328
2329/* ------------------------------ */
2330    .balign 64
2331.L_OP_IGET_WIDE: /* 0x53 */
2332/* File: armv6t2/OP_IGET_WIDE.S */
2333    /*
2334     * Wide 32-bit instance field get.
2335     */
2336    /* iget-wide vA, vB, field@CCCC */
2337    mov     r0, rINST, lsr #12          @ r0<- B
2338    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2339    FETCH(r1, 1)                        @ r1<- field ref CCCC
2340    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2341    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2342    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2343    cmp     r0, #0                      @ is resolved entry null?
2344    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
23458:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2346    EXPORT_PC()                         @ resolve() could throw
2347    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2348    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2349    cmp     r0, #0
2350    bne     .LOP_IGET_WIDE_finish
2351    b       common_exceptionThrown
2352
2353/* ------------------------------ */
2354    .balign 64
2355.L_OP_IGET_OBJECT: /* 0x54 */
2356/* File: armv5te/OP_IGET_OBJECT.S */
2357/* File: armv5te/OP_IGET.S */
2358    /*
2359     * General 32-bit instance field get.
2360     *
2361     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2362     */
2363    /* op vA, vB, field@CCCC */
2364    mov     r0, rINST, lsr #12          @ r0<- B
2365    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2366    FETCH(r1, 1)                        @ r1<- field ref CCCC
2367    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2368    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2369    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2370    cmp     r0, #0                      @ is resolved entry null?
2371    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
23728:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2373    EXPORT_PC()                         @ resolve() could throw
2374    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2375    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2376    cmp     r0, #0
2377    bne     .LOP_IGET_OBJECT_finish
2378    b       common_exceptionThrown
2379
2380
2381/* ------------------------------ */
2382    .balign 64
2383.L_OP_IGET_BOOLEAN: /* 0x55 */
2384/* File: armv5te/OP_IGET_BOOLEAN.S */
2385@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2386/* File: armv5te/OP_IGET.S */
2387    /*
2388     * General 32-bit instance field get.
2389     *
2390     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2391     */
2392    /* op vA, vB, field@CCCC */
2393    mov     r0, rINST, lsr #12          @ r0<- B
2394    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2395    FETCH(r1, 1)                        @ r1<- field ref CCCC
2396    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2397    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2398    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2399    cmp     r0, #0                      @ is resolved entry null?
2400    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
24018:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2402    EXPORT_PC()                         @ resolve() could throw
2403    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2404    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2405    cmp     r0, #0
2406    bne     .LOP_IGET_BOOLEAN_finish
2407    b       common_exceptionThrown
2408
2409
2410/* ------------------------------ */
2411    .balign 64
2412.L_OP_IGET_BYTE: /* 0x56 */
2413/* File: armv5te/OP_IGET_BYTE.S */
2414@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2415/* File: armv5te/OP_IGET.S */
2416    /*
2417     * General 32-bit instance field get.
2418     *
2419     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2420     */
2421    /* op vA, vB, field@CCCC */
2422    mov     r0, rINST, lsr #12          @ r0<- B
2423    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2424    FETCH(r1, 1)                        @ r1<- field ref CCCC
2425    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2426    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2427    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2428    cmp     r0, #0                      @ is resolved entry null?
2429    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
24308:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2431    EXPORT_PC()                         @ resolve() could throw
2432    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2433    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2434    cmp     r0, #0
2435    bne     .LOP_IGET_BYTE_finish
2436    b       common_exceptionThrown
2437
2438
2439/* ------------------------------ */
2440    .balign 64
2441.L_OP_IGET_CHAR: /* 0x57 */
2442/* File: armv5te/OP_IGET_CHAR.S */
2443@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2444/* File: armv5te/OP_IGET.S */
2445    /*
2446     * General 32-bit instance field get.
2447     *
2448     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2449     */
2450    /* op vA, vB, field@CCCC */
2451    mov     r0, rINST, lsr #12          @ r0<- B
2452    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2453    FETCH(r1, 1)                        @ r1<- field ref CCCC
2454    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2455    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2456    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2457    cmp     r0, #0                      @ is resolved entry null?
2458    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
24598:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2460    EXPORT_PC()                         @ resolve() could throw
2461    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2462    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2463    cmp     r0, #0
2464    bne     .LOP_IGET_CHAR_finish
2465    b       common_exceptionThrown
2466
2467
2468/* ------------------------------ */
2469    .balign 64
2470.L_OP_IGET_SHORT: /* 0x58 */
2471/* File: armv5te/OP_IGET_SHORT.S */
2472@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2473/* File: armv5te/OP_IGET.S */
2474    /*
2475     * General 32-bit instance field get.
2476     *
2477     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2478     */
2479    /* op vA, vB, field@CCCC */
2480    mov     r0, rINST, lsr #12          @ r0<- B
2481    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2482    FETCH(r1, 1)                        @ r1<- field ref CCCC
2483    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2484    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2485    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2486    cmp     r0, #0                      @ is resolved entry null?
2487    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
24888:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2489    EXPORT_PC()                         @ resolve() could throw
2490    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2491    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2492    cmp     r0, #0
2493    bne     .LOP_IGET_SHORT_finish
2494    b       common_exceptionThrown
2495
2496
2497/* ------------------------------ */
2498    .balign 64
2499.L_OP_IPUT: /* 0x59 */
2500/* File: armv6t2/OP_IPUT.S */
2501    /*
2502     * General 32-bit instance field put.
2503     *
2504     * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short
2505     */
2506    /* op vA, vB, field@CCCC */
2507    mov     r0, rINST, lsr #12          @ r0<- B
2508    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2509    FETCH(r1, 1)                        @ r1<- field ref CCCC
2510    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2511    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2512    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2513    cmp     r0, #0                      @ is resolved entry null?
2514    bne     .LOP_IPUT_finish          @ no, already resolved
25158:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2516    EXPORT_PC()                         @ resolve() could throw
2517    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2518    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2519    cmp     r0, #0                      @ success?
2520    bne     .LOP_IPUT_finish          @ yes, finish up
2521    b       common_exceptionThrown
2522
2523/* ------------------------------ */
2524    .balign 64
2525.L_OP_IPUT_WIDE: /* 0x5a */
2526/* File: armv6t2/OP_IPUT_WIDE.S */
2527    /* iput-wide vA, vB, field@CCCC */
2528    mov     r0, rINST, lsr #12          @ r0<- B
2529    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2530    FETCH(r1, 1)                        @ r1<- field ref CCCC
2531    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2532    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2533    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2534    cmp     r0, #0                      @ is resolved entry null?
2535    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
25368:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2537    EXPORT_PC()                         @ resolve() could throw
2538    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2539    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2540    cmp     r0, #0                      @ success?
2541    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2542    b       common_exceptionThrown
2543
2544/* ------------------------------ */
2545    .balign 64
2546.L_OP_IPUT_OBJECT: /* 0x5b */
2547/* File: armv5te/OP_IPUT_OBJECT.S */
2548    /*
2549     * 32-bit instance field put.
2550     *
2551     * for: iput-object, iput-object-volatile
2552     */
2553    /* op vA, vB, field@CCCC */
2554    mov     r0, rINST, lsr #12          @ r0<- B
2555    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2556    FETCH(r1, 1)                        @ r1<- field ref CCCC
2557    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2558    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2559    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2560    cmp     r0, #0                      @ is resolved entry null?
2561    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
25628:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2563    EXPORT_PC()                         @ resolve() could throw
2564    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2565    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2566    cmp     r0, #0                      @ success?
2567    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2568    b       common_exceptionThrown
2569
2570/* ------------------------------ */
2571    .balign 64
2572.L_OP_IPUT_BOOLEAN: /* 0x5c */
2573/* File: armv5te/OP_IPUT_BOOLEAN.S */
2574@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2575/* File: armv5te/OP_IPUT.S */
2576    /*
2577     * General 32-bit instance field put.
2578     *
2579     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2580     */
2581    /* op vA, vB, field@CCCC */
2582    mov     r0, rINST, lsr #12          @ r0<- B
2583    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2584    FETCH(r1, 1)                        @ r1<- field ref CCCC
2585    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2586    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2587    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2588    cmp     r0, #0                      @ is resolved entry null?
2589    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
25908:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2591    EXPORT_PC()                         @ resolve() could throw
2592    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2593    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2594    cmp     r0, #0                      @ success?
2595    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2596    b       common_exceptionThrown
2597
2598
2599/* ------------------------------ */
2600    .balign 64
2601.L_OP_IPUT_BYTE: /* 0x5d */
2602/* File: armv5te/OP_IPUT_BYTE.S */
2603@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2604/* File: armv5te/OP_IPUT.S */
2605    /*
2606     * General 32-bit instance field put.
2607     *
2608     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2609     */
2610    /* op vA, vB, field@CCCC */
2611    mov     r0, rINST, lsr #12          @ r0<- B
2612    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2613    FETCH(r1, 1)                        @ r1<- field ref CCCC
2614    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2615    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2616    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2617    cmp     r0, #0                      @ is resolved entry null?
2618    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
26198:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2620    EXPORT_PC()                         @ resolve() could throw
2621    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2622    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2623    cmp     r0, #0                      @ success?
2624    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2625    b       common_exceptionThrown
2626
2627
2628/* ------------------------------ */
2629    .balign 64
2630.L_OP_IPUT_CHAR: /* 0x5e */
2631/* File: armv5te/OP_IPUT_CHAR.S */
2632@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2633/* File: armv5te/OP_IPUT.S */
2634    /*
2635     * General 32-bit instance field put.
2636     *
2637     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2638     */
2639    /* op vA, vB, field@CCCC */
2640    mov     r0, rINST, lsr #12          @ r0<- B
2641    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2642    FETCH(r1, 1)                        @ r1<- field ref CCCC
2643    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2644    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2645    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2646    cmp     r0, #0                      @ is resolved entry null?
2647    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
26488:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2649    EXPORT_PC()                         @ resolve() could throw
2650    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2651    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2652    cmp     r0, #0                      @ success?
2653    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2654    b       common_exceptionThrown
2655
2656
2657/* ------------------------------ */
2658    .balign 64
2659.L_OP_IPUT_SHORT: /* 0x5f */
2660/* File: armv5te/OP_IPUT_SHORT.S */
2661@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2662/* File: armv5te/OP_IPUT.S */
2663    /*
2664     * General 32-bit instance field put.
2665     *
2666     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2667     */
2668    /* op vA, vB, field@CCCC */
2669    mov     r0, rINST, lsr #12          @ r0<- B
2670    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2671    FETCH(r1, 1)                        @ r1<- field ref CCCC
2672    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2673    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2674    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2675    cmp     r0, #0                      @ is resolved entry null?
2676    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
26778:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2678    EXPORT_PC()                         @ resolve() could throw
2679    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2680    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2681    cmp     r0, #0                      @ success?
2682    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2683    b       common_exceptionThrown
2684
2685
2686/* ------------------------------ */
2687    .balign 64
2688.L_OP_SGET: /* 0x60 */
2689/* File: armv5te/OP_SGET.S */
2690    /*
2691     * General 32-bit SGET handler.
2692     *
2693     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2694     */
2695    /* op vAA, field@BBBB */
2696    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2697    FETCH(r1, 1)                        @ r1<- field ref BBBB
2698    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2699    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2700    cmp     r0, #0                      @ is resolved entry null?
2701    beq     .LOP_SGET_resolve         @ yes, do resolve
2702.LOP_SGET_finish: @ field ptr in r0
2703    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2704    @ no-op                             @ acquiring load
2705    mov     r2, rINST, lsr #8           @ r2<- AA
2706    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2707    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2708    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2709    GOTO_OPCODE(ip)                     @ jump to next instruction
2710
2711/* ------------------------------ */
2712    .balign 64
2713.L_OP_SGET_WIDE: /* 0x61 */
2714/* File: armv5te/OP_SGET_WIDE.S */
2715    /*
2716     * 64-bit SGET handler.
2717     */
2718    /* sget-wide vAA, field@BBBB */
2719    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2720    FETCH(r1, 1)                        @ r1<- field ref BBBB
2721    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2722    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2723    cmp     r0, #0                      @ is resolved entry null?
2724    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2725.LOP_SGET_WIDE_finish:
2726    mov     r9, rINST, lsr #8           @ r9<- AA
2727    .if 0
2728    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2729    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
2730    .else
2731    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2732    .endif
2733    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2734    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2735    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2736    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2737    GOTO_OPCODE(ip)                     @ jump to next instruction
2738
2739/* ------------------------------ */
2740    .balign 64
2741.L_OP_SGET_OBJECT: /* 0x62 */
2742/* File: armv5te/OP_SGET_OBJECT.S */
2743/* File: armv5te/OP_SGET.S */
2744    /*
2745     * General 32-bit SGET handler.
2746     *
2747     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2748     */
2749    /* op vAA, field@BBBB */
2750    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2751    FETCH(r1, 1)                        @ r1<- field ref BBBB
2752    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2753    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2754    cmp     r0, #0                      @ is resolved entry null?
2755    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2756.LOP_SGET_OBJECT_finish: @ field ptr in r0
2757    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2758    @ no-op                             @ acquiring load
2759    mov     r2, rINST, lsr #8           @ r2<- AA
2760    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2761    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2762    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2763    GOTO_OPCODE(ip)                     @ jump to next instruction
2764
2765
2766/* ------------------------------ */
2767    .balign 64
2768.L_OP_SGET_BOOLEAN: /* 0x63 */
2769/* File: armv5te/OP_SGET_BOOLEAN.S */
2770/* File: armv5te/OP_SGET.S */
2771    /*
2772     * General 32-bit SGET handler.
2773     *
2774     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2775     */
2776    /* op vAA, field@BBBB */
2777    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2778    FETCH(r1, 1)                        @ r1<- field ref BBBB
2779    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2780    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2781    cmp     r0, #0                      @ is resolved entry null?
2782    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2783.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2784    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2785    @ no-op                             @ acquiring load
2786    mov     r2, rINST, lsr #8           @ r2<- AA
2787    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2788    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2789    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2790    GOTO_OPCODE(ip)                     @ jump to next instruction
2791
2792
2793/* ------------------------------ */
2794    .balign 64
2795.L_OP_SGET_BYTE: /* 0x64 */
2796/* File: armv5te/OP_SGET_BYTE.S */
2797/* File: armv5te/OP_SGET.S */
2798    /*
2799     * General 32-bit SGET handler.
2800     *
2801     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2802     */
2803    /* op vAA, field@BBBB */
2804    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2805    FETCH(r1, 1)                        @ r1<- field ref BBBB
2806    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2807    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2808    cmp     r0, #0                      @ is resolved entry null?
2809    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2810.LOP_SGET_BYTE_finish: @ field ptr in r0
2811    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2812    @ no-op                             @ acquiring load
2813    mov     r2, rINST, lsr #8           @ r2<- AA
2814    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2815    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2816    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2817    GOTO_OPCODE(ip)                     @ jump to next instruction
2818
2819
2820/* ------------------------------ */
2821    .balign 64
2822.L_OP_SGET_CHAR: /* 0x65 */
2823/* File: armv5te/OP_SGET_CHAR.S */
2824/* File: armv5te/OP_SGET.S */
2825    /*
2826     * General 32-bit SGET handler.
2827     *
2828     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2829     */
2830    /* op vAA, field@BBBB */
2831    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2832    FETCH(r1, 1)                        @ r1<- field ref BBBB
2833    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2834    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2835    cmp     r0, #0                      @ is resolved entry null?
2836    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2837.LOP_SGET_CHAR_finish: @ field ptr in r0
2838    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2839    @ no-op                             @ acquiring load
2840    mov     r2, rINST, lsr #8           @ r2<- AA
2841    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2842    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2844    GOTO_OPCODE(ip)                     @ jump to next instruction
2845
2846
2847/* ------------------------------ */
2848    .balign 64
2849.L_OP_SGET_SHORT: /* 0x66 */
2850/* File: armv5te/OP_SGET_SHORT.S */
2851/* File: armv5te/OP_SGET.S */
2852    /*
2853     * General 32-bit SGET handler.
2854     *
2855     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2856     */
2857    /* op vAA, field@BBBB */
2858    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2859    FETCH(r1, 1)                        @ r1<- field ref BBBB
2860    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2861    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2862    cmp     r0, #0                      @ is resolved entry null?
2863    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
2864.LOP_SGET_SHORT_finish: @ field ptr in r0
2865    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2866    @ no-op                             @ acquiring load
2867    mov     r2, rINST, lsr #8           @ r2<- AA
2868    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2869    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2870    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2871    GOTO_OPCODE(ip)                     @ jump to next instruction
2872
2873
2874/* ------------------------------ */
2875    .balign 64
2876.L_OP_SPUT: /* 0x67 */
2877/* File: armv5te/OP_SPUT.S */
2878    /*
2879     * General 32-bit SPUT handler.
2880     *
2881     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2882     */
2883    /* op vAA, field@BBBB */
2884    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2885    FETCH(r1, 1)                        @ r1<- field ref BBBB
2886    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2887    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2888    cmp     r0, #0                      @ is resolved entry null?
2889    beq     .LOP_SPUT_resolve         @ yes, do resolve
2890.LOP_SPUT_finish:   @ field ptr in r0
2891    mov     r2, rINST, lsr #8           @ r2<- AA
2892    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2893    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2894    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2895    @ no-op                             @ releasing store
2896    str     r1, [r0, #offStaticField_value] @ field<- vAA
2897    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(rINST, 2)                     @ rINST<- 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, rINST, #0xf000          @ isolate F
12556    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
125573:  and     ip, rINST, #0x0f00          @ isolate E
12558    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
125592:  and     ip, rINST, #0x00f0          @ isolate D
12560    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
125611:  and     ip, rINST, #0x000f          @ isolate C
12562    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
125630:
12564    ldr     rINST, .LOP_EXECUTE_INLINE_table    @ table of InlineOperation
12565    ldr     pc, [rINST, 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     r9, r0                      @ remember method
12578    mov     r1, rSELF
12579    bl      dvmFastMethodTraceEnter     @ (method, self)
12580    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
12581    sub     sp, sp, #8                  @ make room for arg, +64 bit align
12582    mov     r0, rINST, lsr #12          @ r0<- B
12583    str     r1, [sp]                    @ push &self->retval
12584    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
12585    mov     rINST, r0                   @ save result of inline
12586    add     sp, sp, #8                  @ pop stack
12587    mov     r0, r9                      @ r0<- method
12588    mov     r1, rSELF
12589    bl      dvmFastNativeMethodTraceExit @ (method, self)
12590    cmp     rINST, #0                   @ test boolean result of inline
12591    beq     common_exceptionThrown      @ returned false, handle exception
12592    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
12593    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12594    GOTO_OPCODE(ip)                     @ jump to next instruction
12595
12596
12597
12598
12599.LOP_EXECUTE_INLINE_table:
12600    .word   gDvmInlineOpsTable
12601
12602/* continuation for OP_EXECUTE_INLINE_RANGE */
12603
12604    /*
12605     * Extract args, call function.
12606     *  r0 = #of args (0-4)
12607     *  r10 = call index
12608     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
12609     */
12610.LOP_EXECUTE_INLINE_RANGE_continue:
12611    rsb     r0, r0, #4                  @ r0<- 4-r0
12612    FETCH(r9, 2)                        @ r9<- CCCC
12613    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
12614    bl      common_abort                @ (skipped due to ARM prefetch)
126154:  add     ip, r9, #3                  @ base+3
12616    GET_VREG(r3, ip)                    @ r3<- vBase[3]
126173:  add     ip, r9, #2                  @ base+2
12618    GET_VREG(r2, ip)                    @ r2<- vBase[2]
126192:  add     ip, r9, #1                  @ base+1
12620    GET_VREG(r1, ip)                    @ r1<- vBase[1]
126211:  add     ip, r9, #0                  @ (nop)
12622    GET_VREG(r0, ip)                    @ r0<- vBase[0]
126230:
12624    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
12625    ldr     pc, [r9, r10, lsl #4]       @ sizeof=16, "func" is first entry
12626    @ (not reached)
12627
12628
12629    /*
12630     * We're debugging or profiling.
12631     * r10: opIndex
12632     */
12633.LOP_EXECUTE_INLINE_RANGE_debugmode:
12634    mov     r0, r10
12635    bl      dvmResolveInlineNative
12636    cmp     r0, #0                      @ did it resolve?
12637    beq     .LOP_EXECUTE_INLINE_RANGE_resume          @ no, just move on
12638    mov     r9, r0                      @ remember method
12639    mov     r1, rSELF
12640    bl      dvmFastMethodTraceEnter     @ (method, self)
12641    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
12642    sub     sp, sp, #8                  @ make room for arg, +64 bit align
12643    mov     r0, rINST, lsr #8           @ r0<- B
12644    mov     rINST, r9                   @ rINST<- method
12645    str     r1, [sp]                    @ push &self->retval
12646    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
12647    mov     r9, r0                      @ save result of inline
12648    add     sp, sp, #8                  @ pop stack
12649    mov     r0, rINST                   @ r0<- method
12650    mov     r1, rSELF
12651    bl      dvmFastNativeMethodTraceExit  @ (method, self)
12652    cmp     r9, #0                      @ test boolean result of inline
12653    beq     common_exceptionThrown      @ returned false, handle exception
12654    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
12655    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12656    GOTO_OPCODE(ip)                     @ jump to next instruction
12657
12658
12659
12660
12661.LOP_EXECUTE_INLINE_RANGE_table:
12662    .word   gDvmInlineOpsTable
12663
12664
12665/* continuation for OP_INVOKE_OBJECT_INIT_RANGE */
12666
12667.LOP_INVOKE_OBJECT_INIT_RANGE_setFinal:
12668    EXPORT_PC()                         @ can throw
12669    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
12670    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
12671    cmp     r0, #0                      @ exception pending?
12672    bne     common_exceptionThrown      @ yes, handle it
12673    b       .LOP_INVOKE_OBJECT_INIT_RANGE_finish
12674
12675    /*
12676     * A debugger is attached, so we need to go ahead and do
12677     * this.  For simplicity, we'll just jump directly to the
12678     * corresponding handler.  Note that we can't use
12679     * rIBASE here because it may be in single-step mode.
12680     * Load the primary table base directly.
12681     */
12682.LOP_INVOKE_OBJECT_INIT_RANGE_debugger:
12683    ldr     r1, [rSELF, #offThread_mainHandlerTable]
12684    .if 0
12685    mov     ip, #OP_INVOKE_DIRECT_JUMBO
12686    .else
12687    mov     ip, #OP_INVOKE_DIRECT_RANGE
12688    .endif
12689    GOTO_OPCODE_BASE(r1,ip)             @ execute it
12690
12691/* continuation for OP_IPUT_OBJECT_VOLATILE */
12692
12693    /*
12694     * Currently:
12695     *  r0 holds resolved field
12696     *  r9 holds object
12697     */
12698.LOP_IPUT_OBJECT_VOLATILE_finish:
12699    @bl      common_squeak0
12700    mov     r1, rINST, lsr #8           @ r1<- A+
12701    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12702    and     r1, r1, #15                 @ r1<- A
12703    cmp     r9, #0                      @ check object for null
12704    GET_VREG(r0, r1)                    @ r0<- fp[A]
12705    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
12706    beq     common_errNullObject        @ object was null
12707    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12708    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12709    SMP_DMB                            @ releasing store
12710    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
12711    cmp     r0, #0                      @ stored a null reference?
12712    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
12713    GOTO_OPCODE(ip)                     @ jump to next instruction
12714
12715/* continuation for OP_SGET_OBJECT_VOLATILE */
12716
12717    /*
12718     * Continuation if the field has not yet been resolved.
12719     *  r1:  BBBB field ref
12720     *  r10: dvmDex->pResFields
12721     */
12722.LOP_SGET_OBJECT_VOLATILE_resolve:
12723    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12724#if defined(WITH_JIT)
12725    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12726#endif
12727    EXPORT_PC()                         @ resolve() could throw, so export now
12728    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12729    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12730    cmp     r0, #0                      @ success?
12731    beq     common_exceptionThrown      @ no, handle exception
12732#if defined(WITH_JIT)
12733    /*
12734     * If the JIT is actively building a trace we need to make sure
12735     * that the field is fully resolved before including this instruction.
12736     */
12737    bl      common_verifyField
12738#endif
12739    b       .LOP_SGET_OBJECT_VOLATILE_finish
12740
12741/* continuation for OP_SPUT_OBJECT_VOLATILE */
12742
12743
12744.LOP_SPUT_OBJECT_VOLATILE_end:
12745    str     r1, [r0, #offStaticField_value]  @ field<- vAA
12746    cmp     r1, #0                      @ stored a null object?
12747    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
12748    GOTO_OPCODE(ip)                     @ jump to next instruction
12749
12750    /* Continuation if the field has not yet been resolved.
12751     * r1:  BBBB field ref
12752     * r10: dvmDex->pResFields
12753     */
12754.LOP_SPUT_OBJECT_VOLATILE_resolve:
12755    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12756#if defined(WITH_JIT)
12757    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12758#endif
12759    EXPORT_PC()                         @ resolve() could throw, so export now
12760    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12761    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12762    cmp     r0, #0                      @ success?
12763    beq     common_exceptionThrown      @ no, handle exception
12764#if defined(WITH_JIT)
12765    /*
12766     * If the JIT is actively building a trace we need to make sure
12767     * that the field is fully resolved before including this instruction.
12768     */
12769    bl      common_verifyField
12770#endif
12771    b       .LOP_SPUT_OBJECT_VOLATILE_finish          @ resume
12772
12773
12774/* continuation for OP_CONST_CLASS_JUMBO */
12775
12776    /*
12777     * Continuation if the Class has not yet been resolved.
12778     *  r1: AAAAAAAA (Class ref)
12779     *  r9: target register
12780     */
12781.LOP_CONST_CLASS_JUMBO_resolve:
12782    EXPORT_PC()
12783    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
12784    mov     r2, #1                      @ r2<- true
12785    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
12786    bl      dvmResolveClass             @ r0<- Class reference
12787    cmp     r0, #0                      @ failed?
12788    beq     common_exceptionThrown      @ yup, handle the exception
12789    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12790    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12791    SET_VREG(r0, r9)                    @ vBBBB<- r0
12792    GOTO_OPCODE(ip)                     @ jump to next instruction
12793
12794/* continuation for OP_CHECK_CAST_JUMBO */
12795
12796    /*
12797     * Trivial test failed, need to perform full check.  This is common.
12798     *  r0 holds obj->clazz
12799     *  r1 holds desired class resolved from AAAAAAAA
12800     *  r9 holds object
12801     */
12802.LOP_CHECK_CAST_JUMBO_fullcheck:
12803    mov     r10, r1                     @ avoid ClassObject getting clobbered
12804    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
12805    cmp     r0, #0                      @ failed?
12806    bne     .LOP_CHECK_CAST_JUMBO_okay            @ no, success
12807
12808    @ A cast has failed.  We need to throw a ClassCastException.
12809    EXPORT_PC()                         @ about to throw
12810    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
12811    mov     r1, r10                     @ r1<- desired class
12812    bl      dvmThrowClassCastException
12813    b       common_exceptionThrown
12814
12815    /*
12816     * Advance PC and get the next opcode.
12817     */
12818.LOP_CHECK_CAST_JUMBO_okay:
12819    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12820    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12821    GOTO_OPCODE(ip)                     @ jump to next instruction
12822
12823    /*
12824     * Resolution required.  This is the least-likely path.
12825     *
12826     *  r2 holds AAAAAAAA
12827     *  r9 holds object
12828     */
12829.LOP_CHECK_CAST_JUMBO_resolve:
12830    EXPORT_PC()                         @ resolve() could throw
12831    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12832    mov     r1, r2                      @ r1<- AAAAAAAA
12833    mov     r2, #0                      @ r2<- false
12834    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12835    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12836    cmp     r0, #0                      @ got null?
12837    beq     common_exceptionThrown      @ yes, handle exception
12838    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
12839    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
12840    b       .LOP_CHECK_CAST_JUMBO_resolved        @ pick up where we left off
12841
12842/* continuation for OP_INSTANCE_OF_JUMBO */
12843
12844    /*
12845     * Class resolved, determine type of check necessary.  This is common.
12846     *  r0 holds obj->clazz
12847     *  r1 holds class resolved from AAAAAAAA
12848     *  r9 holds BBBB
12849     */
12850.LOP_INSTANCE_OF_JUMBO_resolved:
12851    cmp     r0, r1                      @ same class (trivial success)?
12852    beq     .LOP_INSTANCE_OF_JUMBO_trivial         @ yes, trivial finish
12853    @ fall through to OP_INSTANCE_OF_JUMBO_fullcheck
12854
12855    /*
12856     * Trivial test failed, need to perform full check.  This is common.
12857     *  r0 holds obj->clazz
12858     *  r1 holds class resolved from AAAAAAAA
12859     *  r9 holds BBBB
12860     */
12861.LOP_INSTANCE_OF_JUMBO_fullcheck:
12862    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
12863    @ fall through to OP_INSTANCE_OF_JUMBO_store
12864
12865    /*
12866     * r0 holds boolean result
12867     * r9 holds BBBB
12868     */
12869.LOP_INSTANCE_OF_JUMBO_store:
12870    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
12871    SET_VREG(r0, r9)                    @ vBBBB<- r0
12872    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12873    GOTO_OPCODE(ip)                     @ jump to next instruction
12874
12875    /*
12876     * Trivial test succeeded, save and bail.
12877     *  r9 holds BBBB
12878     */
12879.LOP_INSTANCE_OF_JUMBO_trivial:
12880    mov     r0, #1                      @ indicate success
12881    @ could b OP_INSTANCE_OF_JUMBO_store, but copying is faster and cheaper
12882    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
12883    SET_VREG(r0, r9)                    @ vBBBB<- r0
12884    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12885    GOTO_OPCODE(ip)                     @ jump to next instruction
12886
12887    /*
12888     * Resolution required.  This is the least-likely path.
12889     *
12890     *  r3 holds AAAAAAAA
12891     *  r9 holds BBBB
12892     */
12893
12894.LOP_INSTANCE_OF_JUMBO_resolve:
12895    EXPORT_PC()                         @ resolve() could throw
12896    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
12897    mov     r1, r3                      @ r1<- AAAAAAAA
12898    mov     r2, #1                      @ r2<- true
12899    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
12900    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12901    cmp     r0, #0                      @ got null?
12902    beq     common_exceptionThrown      @ yes, handle exception
12903    FETCH(r3, 4)                        @ r3<- vCCCC
12904    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
12905    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
12906    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
12907    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ pick up where we left off
12908
12909/* continuation for OP_NEW_INSTANCE_JUMBO */
12910
12911    .balign 32                          @ minimize cache lines
12912.LOP_NEW_INSTANCE_JUMBO_finish: @ r0=new object
12913    FETCH(r3, 3)                        @ r3<- BBBB
12914    cmp     r0, #0                      @ failed?
12915#if defined(WITH_JIT)
12916    /*
12917     * The JIT needs the class to be fully resolved before it can
12918     * include this instruction in a trace.
12919     */
12920    ldrb    r1, [rSELF, #offThread_subMode]
12921    beq     common_exceptionThrown      @ yes, handle the exception
12922    ands    r1, #kSubModeJitTraceBuild  @ under construction?
12923    bne     .LOP_NEW_INSTANCE_JUMBO_jitCheck
12924#else
12925    beq     common_exceptionThrown      @ yes, handle the exception
12926#endif
12927.LOP_NEW_INSTANCE_JUMBO_end:
12928    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12929    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12930    SET_VREG(r0, r3)                    @ vBBBB<- r0
12931    GOTO_OPCODE(ip)                     @ jump to next instruction
12932
12933#if defined(WITH_JIT)
12934    /*
12935     * Check to see if we need to stop the trace building early.
12936     * r0: new object
12937     * r3: vAA
12938     */
12939.LOP_NEW_INSTANCE_JUMBO_jitCheck:
12940    ldr     r1, [r10]                   @ reload resolved class
12941    cmp     r1, #0                      @ okay?
12942    bne     .LOP_NEW_INSTANCE_JUMBO_end             @ yes, finish
12943    mov     r9, r0                      @ preserve new object
12944    mov     r10, r3                     @ preserve vAA
12945    mov     r0, rSELF
12946    mov     r1, rPC
12947    bl      dvmJitEndTraceSelect        @ (self, pc)
12948    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12949    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12950    SET_VREG(r9, r10)                   @ vAA<- new object
12951    GOTO_OPCODE(ip)                     @ jump to next instruction
12952#endif
12953
12954    /*
12955     * Class initialization required.
12956     *
12957     *  r0 holds class object
12958     */
12959.LOP_NEW_INSTANCE_JUMBO_needinit:
12960    mov     r9, r0                      @ save r0
12961    bl      dvmInitClass                @ initialize class
12962    cmp     r0, #0                      @ check boolean result
12963    mov     r0, r9                      @ restore r0
12964    bne     .LOP_NEW_INSTANCE_JUMBO_initialized     @ success, continue
12965    b       common_exceptionThrown      @ failed, deal with init exception
12966
12967    /*
12968     * Resolution required.  This is the least-likely path.
12969     *
12970     *  r1 holds AAAAAAAA
12971     */
12972.LOP_NEW_INSTANCE_JUMBO_resolve:
12973    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12974    mov     r2, #0                      @ r2<- false
12975    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12976    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12977    cmp     r0, #0                      @ got null?
12978    bne     .LOP_NEW_INSTANCE_JUMBO_resolved        @ no, continue
12979    b       common_exceptionThrown      @ yes, handle exception
12980
12981/* continuation for OP_NEW_ARRAY_JUMBO */
12982
12983
12984    /*
12985     * Resolve class.  (This is an uncommon case.)
12986     *
12987     *  r1 holds array length
12988     *  r2 holds class ref AAAAAAAA
12989     */
12990.LOP_NEW_ARRAY_JUMBO_resolve:
12991    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12992    mov     r9, r1                      @ r9<- length (save)
12993    mov     r1, r2                      @ r1<- AAAAAAAA
12994    mov     r2, #0                      @ r2<- false
12995    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12996    bl      dvmResolveClass             @ r0<- call(clazz, ref)
12997    cmp     r0, #0                      @ got null?
12998    mov     r1, r9                      @ r1<- length (restore)
12999    beq     common_exceptionThrown      @ yes, handle exception
13000    @ fall through to OP_NEW_ARRAY_JUMBO_finish
13001
13002    /*
13003     * Finish allocation.
13004     *
13005     *  r0 holds class
13006     *  r1 holds array length
13007     */
13008.LOP_NEW_ARRAY_JUMBO_finish:
13009    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
13010    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
13011    cmp     r0, #0                      @ failed?
13012    FETCH(r2, 3)                        @ r2<- vBBBB
13013    beq     common_exceptionThrown      @ yes, handle the exception
13014    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13015    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13016    SET_VREG(r0, r2)                    @ vBBBB<- r0
13017    GOTO_OPCODE(ip)                     @ jump to next instruction
13018
13019/* continuation for OP_FILLED_NEW_ARRAY_JUMBO */
13020
13021    /*
13022     * On entry:
13023     *  r0 holds array class
13024     */
13025.LOP_FILLED_NEW_ARRAY_JUMBO_continue:
13026    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
13027    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
13028    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
13029    FETCH(r1, 3)                        @ r1<- BBBB (length)
13030    cmp     rINST, #'I'                 @ array of ints?
13031    cmpne   rINST, #'L'                 @ array of objects?
13032    cmpne   rINST, #'['                 @ array of arrays?
13033    mov     r9, r1                      @ save length in r9
13034    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_notimpl         @ no, not handled yet
13035    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
13036    cmp     r0, #0                      @ null return?
13037    beq     common_exceptionThrown      @ alloc failed, handle exception
13038
13039    FETCH(r1, 4)                        @ r1<- CCCC
13040    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
13041    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
13042    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
13043    subs    r9, r9, #1                  @ length--, check for neg
13044    FETCH_ADVANCE_INST(5)               @ advance to next instr, load rINST
13045    bmi     2f                          @ was zero, bail
13046
13047    @ copy values from registers into the array
13048    @ r0=array, r1=CCCC, r9=BBBB (length)
13049    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
130501:  ldr     r3, [r2], #4                @ r3<- *r2++
13051    subs    r9, r9, #1                  @ count--
13052    str     r3, [r0], #4                @ *contents++ = vX
13053    bpl     1b
13054
130552:  ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
13056    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
13057    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13058    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
13059    cmp     r1, #'I'                         @ Is int array?
13060    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
13061    GOTO_OPCODE(ip)                          @ execute it
13062
13063    /*
13064     * Throw an exception indicating that we have not implemented this
13065     * mode of filled-new-array.
13066     */
13067.LOP_FILLED_NEW_ARRAY_JUMBO_notimpl:
13068    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO
13069    bl      dvmThrowInternalError
13070    b       common_exceptionThrown
13071
13072    /*
13073     * Ideally we'd only define this once, but depending on layout we can
13074     * exceed the range of the load above.
13075     */
13076
13077.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO:
13078    .word   .LstrFilledNewArrayNotImpl
13079
13080/* continuation for OP_IGET_JUMBO */
13081
13082    /*
13083     * Currently:
13084     *  r0 holds resolved field
13085     *  r9 holds object
13086     */
13087.LOP_IGET_JUMBO_resolved:
13088    cmp     r0, #0                      @ resolution unsuccessful?
13089    beq     common_exceptionThrown      @ yes, throw exception
13090    @ fall through to OP_IGET_JUMBO_finish
13091
13092    /*
13093     * Currently:
13094     *  r0 holds resolved field
13095     *  r9 holds object
13096     */
13097.LOP_IGET_JUMBO_finish:
13098    @bl      common_squeak0
13099    cmp     r9, #0                      @ check object for null
13100    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13101    beq     common_errNullObject        @ object was null
13102    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13103    @ no-op                             @ acquiring load
13104    FETCH(r2, 3)                        @ r2<- BBBB
13105    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13106    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13107    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13108    GOTO_OPCODE(ip)                     @ jump to next instruction
13109
13110/* continuation for OP_IGET_WIDE_JUMBO */
13111
13112    /*
13113     * Currently:
13114     *  r0 holds resolved field
13115     *  r9 holds object
13116     */
13117.LOP_IGET_WIDE_JUMBO_resolved:
13118    cmp     r0, #0                      @ resolution unsuccessful?
13119    beq     common_exceptionThrown      @ yes, throw exception
13120    @ fall through to OP_IGET_WIDE_JUMBO_finish
13121
13122    /*
13123     * Currently:
13124     *  r0 holds resolved field
13125     *  r9 holds object
13126     */
13127.LOP_IGET_WIDE_JUMBO_finish:
13128    cmp     r9, #0                      @ check object for null
13129    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13130    beq     common_errNullObject        @ object was null
13131    .if     0
13132    add     r0, r9, r3                  @ r0<- address of field
13133    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
13134    .else
13135    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
13136    .endif
13137    FETCH(r2, 3)                        @ r2<- BBBB
13138    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13139    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13140    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13141    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
13142    GOTO_OPCODE(ip)                     @ jump to next instruction
13143
13144/* continuation for OP_IGET_OBJECT_JUMBO */
13145
13146    /*
13147     * Currently:
13148     *  r0 holds resolved field
13149     *  r9 holds object
13150     */
13151.LOP_IGET_OBJECT_JUMBO_resolved:
13152    cmp     r0, #0                      @ resolution unsuccessful?
13153    beq     common_exceptionThrown      @ yes, throw exception
13154    @ fall through to OP_IGET_OBJECT_JUMBO_finish
13155
13156    /*
13157     * Currently:
13158     *  r0 holds resolved field
13159     *  r9 holds object
13160     */
13161.LOP_IGET_OBJECT_JUMBO_finish:
13162    @bl      common_squeak0
13163    cmp     r9, #0                      @ check object for null
13164    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13165    beq     common_errNullObject        @ object was null
13166    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13167    @ no-op                             @ acquiring load
13168    FETCH(r2, 3)                        @ r2<- BBBB
13169    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13170    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13171    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13172    GOTO_OPCODE(ip)                     @ jump to next instruction
13173
13174/* continuation for OP_IGET_BOOLEAN_JUMBO */
13175
13176    /*
13177     * Currently:
13178     *  r0 holds resolved field
13179     *  r9 holds object
13180     */
13181.LOP_IGET_BOOLEAN_JUMBO_resolved:
13182    cmp     r0, #0                      @ resolution unsuccessful?
13183    beq     common_exceptionThrown      @ yes, throw exception
13184    @ fall through to OP_IGET_BOOLEAN_JUMBO_finish
13185
13186    /*
13187     * Currently:
13188     *  r0 holds resolved field
13189     *  r9 holds object
13190     */
13191.LOP_IGET_BOOLEAN_JUMBO_finish:
13192    @bl      common_squeak1
13193    cmp     r9, #0                      @ check object for null
13194    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13195    beq     common_errNullObject        @ object was null
13196    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13197    @ no-op                             @ acquiring load
13198    FETCH(r2, 3)                        @ r2<- BBBB
13199    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13200    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13201    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13202    GOTO_OPCODE(ip)                     @ jump to next instruction
13203
13204/* continuation for OP_IGET_BYTE_JUMBO */
13205
13206    /*
13207     * Currently:
13208     *  r0 holds resolved field
13209     *  r9 holds object
13210     */
13211.LOP_IGET_BYTE_JUMBO_resolved:
13212    cmp     r0, #0                      @ resolution unsuccessful?
13213    beq     common_exceptionThrown      @ yes, throw exception
13214    @ fall through to OP_IGET_BYTE_JUMBO_finish
13215
13216    /*
13217     * Currently:
13218     *  r0 holds resolved field
13219     *  r9 holds object
13220     */
13221.LOP_IGET_BYTE_JUMBO_finish:
13222    @bl      common_squeak2
13223    cmp     r9, #0                      @ check object for null
13224    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13225    beq     common_errNullObject        @ object was null
13226    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13227    @ no-op                             @ acquiring load
13228    FETCH(r2, 3)                        @ r2<- BBBB
13229    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13230    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13231    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13232    GOTO_OPCODE(ip)                     @ jump to next instruction
13233
13234/* continuation for OP_IGET_CHAR_JUMBO */
13235
13236    /*
13237     * Currently:
13238     *  r0 holds resolved field
13239     *  r9 holds object
13240     */
13241.LOP_IGET_CHAR_JUMBO_resolved:
13242    cmp     r0, #0                      @ resolution unsuccessful?
13243    beq     common_exceptionThrown      @ yes, throw exception
13244    @ fall through to OP_IGET_CHAR_JUMBO_finish
13245
13246    /*
13247     * Currently:
13248     *  r0 holds resolved field
13249     *  r9 holds object
13250     */
13251.LOP_IGET_CHAR_JUMBO_finish:
13252    @bl      common_squeak3
13253    cmp     r9, #0                      @ check object for null
13254    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13255    beq     common_errNullObject        @ object was null
13256    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13257    @ no-op                             @ acquiring load
13258    FETCH(r2, 3)                        @ r2<- BBBB
13259    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13260    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13261    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13262    GOTO_OPCODE(ip)                     @ jump to next instruction
13263
13264/* continuation for OP_IGET_SHORT_JUMBO */
13265
13266    /*
13267     * Currently:
13268     *  r0 holds resolved field
13269     *  r9 holds object
13270     */
13271.LOP_IGET_SHORT_JUMBO_resolved:
13272    cmp     r0, #0                      @ resolution unsuccessful?
13273    beq     common_exceptionThrown      @ yes, throw exception
13274    @ fall through to OP_IGET_SHORT_JUMBO_finish
13275
13276    /*
13277     * Currently:
13278     *  r0 holds resolved field
13279     *  r9 holds object
13280     */
13281.LOP_IGET_SHORT_JUMBO_finish:
13282    @bl      common_squeak4
13283    cmp     r9, #0                      @ check object for null
13284    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13285    beq     common_errNullObject        @ object was null
13286    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13287    @ no-op                             @ acquiring load
13288    FETCH(r2, 3)                        @ r2<- BBBB
13289    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13290    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13291    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13292    GOTO_OPCODE(ip)                     @ jump to next instruction
13293
13294/* continuation for OP_IPUT_JUMBO */
13295
13296    /*
13297     * Currently:
13298     *  r0 holds resolved field
13299     *  r9 holds object
13300     */
13301.LOP_IPUT_JUMBO_resolved:
13302     cmp     r0, #0                     @ resolution unsuccessful?
13303     beq     common_exceptionThrown     @ yes, throw exception
13304     @ fall through to OP_IPUT_JUMBO_finish
13305
13306    /*
13307     * Currently:
13308     *  r0 holds resolved field
13309     *  r9 holds object
13310     */
13311.LOP_IPUT_JUMBO_finish:
13312    @bl      common_squeak0
13313    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13314    FETCH(r1, 3)                        @ r1<- BBBB
13315    cmp     r9, #0                      @ check object for null
13316    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13317    beq     common_errNullObject        @ object was null
13318    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13319    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13320    @ no-op                             @ releasing store
13321    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13322    GOTO_OPCODE(ip)                     @ jump to next instruction
13323
13324/* continuation for OP_IPUT_WIDE_JUMBO */
13325
13326    /*
13327     * Currently:
13328     *  r0 holds resolved field
13329     *  r9 holds object
13330     */
13331.LOP_IPUT_WIDE_JUMBO_resolved:
13332     cmp     r0, #0                     @ resolution unsuccessful?
13333     beq     common_exceptionThrown     @ yes, throw exception
13334     @ fall through to OP_IPUT_WIDE_JUMBO_finish
13335
13336    /*
13337     * Currently:
13338     *  r0 holds resolved field
13339     *  r9 holds object
13340     */
13341.LOP_IPUT_WIDE_JUMBO_finish:
13342    cmp     r9, #0                      @ check object for null
13343    FETCH(r2, 3)                        @ r1<- BBBB
13344    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13345    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13346    beq     common_errNullObject        @ object was null
13347    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13348    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
13349    GET_INST_OPCODE(r10)                @ extract opcode from rINST
13350    .if     0
13351    add     r2, r9, r3                  @ r2<- target address
13352    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
13353    .else
13354    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
13355    .endif
13356    GOTO_OPCODE(r10)                    @ jump to next instruction
13357
13358/* continuation for OP_IPUT_OBJECT_JUMBO */
13359
13360    /*
13361     * Currently:
13362     *  r0 holds resolved field
13363     *  r9 holds object
13364     */
13365.LOP_IPUT_OBJECT_JUMBO_resolved:
13366     cmp     r0, #0                     @ resolution unsuccessful?
13367     beq     common_exceptionThrown     @ yes, throw exception
13368     @ fall through to OP_IPUT_OBJECT_JUMBO_finish
13369
13370    /*
13371     * Currently:
13372     *  r0 holds resolved field
13373     *  r9 holds object
13374     */
13375.LOP_IPUT_OBJECT_JUMBO_finish:
13376    @bl      common_squeak0
13377    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13378    FETCH(r1, 3)                        @ r1<- BBBB
13379    cmp     r9, #0                      @ check object for null
13380    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13381    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13382    beq     common_errNullObject        @ object was null
13383    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13384    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13385    @ no-op                             @ releasing store
13386    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
13387    cmp     r0, #0                      @ stored a null reference?
13388    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
13389    GOTO_OPCODE(ip)                     @ jump to next instruction
13390
13391/* continuation for OP_IPUT_BOOLEAN_JUMBO */
13392
13393    /*
13394     * Currently:
13395     *  r0 holds resolved field
13396     *  r9 holds object
13397     */
13398.LOP_IPUT_BOOLEAN_JUMBO_resolved:
13399     cmp     r0, #0                     @ resolution unsuccessful?
13400     beq     common_exceptionThrown     @ yes, throw exception
13401     @ fall through to OP_IPUT_BOOLEAN_JUMBO_finish
13402
13403    /*
13404     * Currently:
13405     *  r0 holds resolved field
13406     *  r9 holds object
13407     */
13408.LOP_IPUT_BOOLEAN_JUMBO_finish:
13409    @bl      common_squeak1
13410    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13411    FETCH(r1, 3)                        @ r1<- BBBB
13412    cmp     r9, #0                      @ check object for null
13413    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13414    beq     common_errNullObject        @ object was null
13415    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13416    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13417    @ no-op                             @ releasing store
13418    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13419    GOTO_OPCODE(ip)                     @ jump to next instruction
13420
13421/* continuation for OP_IPUT_BYTE_JUMBO */
13422
13423    /*
13424     * Currently:
13425     *  r0 holds resolved field
13426     *  r9 holds object
13427     */
13428.LOP_IPUT_BYTE_JUMBO_resolved:
13429     cmp     r0, #0                     @ resolution unsuccessful?
13430     beq     common_exceptionThrown     @ yes, throw exception
13431     @ fall through to OP_IPUT_BYTE_JUMBO_finish
13432
13433    /*
13434     * Currently:
13435     *  r0 holds resolved field
13436     *  r9 holds object
13437     */
13438.LOP_IPUT_BYTE_JUMBO_finish:
13439    @bl      common_squeak2
13440    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13441    FETCH(r1, 3)                        @ r1<- BBBB
13442    cmp     r9, #0                      @ check object for null
13443    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13444    beq     common_errNullObject        @ object was null
13445    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13446    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13447    @ no-op                             @ releasing store
13448    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13449    GOTO_OPCODE(ip)                     @ jump to next instruction
13450
13451/* continuation for OP_IPUT_CHAR_JUMBO */
13452
13453    /*
13454     * Currently:
13455     *  r0 holds resolved field
13456     *  r9 holds object
13457     */
13458.LOP_IPUT_CHAR_JUMBO_resolved:
13459     cmp     r0, #0                     @ resolution unsuccessful?
13460     beq     common_exceptionThrown     @ yes, throw exception
13461     @ fall through to OP_IPUT_CHAR_JUMBO_finish
13462
13463    /*
13464     * Currently:
13465     *  r0 holds resolved field
13466     *  r9 holds object
13467     */
13468.LOP_IPUT_CHAR_JUMBO_finish:
13469    @bl      common_squeak3
13470    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13471    FETCH(r1, 3)                        @ r1<- BBBB
13472    cmp     r9, #0                      @ check object for null
13473    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13474    beq     common_errNullObject        @ object was null
13475    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13476    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13477    @ no-op                             @ releasing store
13478    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13479    GOTO_OPCODE(ip)                     @ jump to next instruction
13480
13481/* continuation for OP_IPUT_SHORT_JUMBO */
13482
13483    /*
13484     * Currently:
13485     *  r0 holds resolved field
13486     *  r9 holds object
13487     */
13488.LOP_IPUT_SHORT_JUMBO_resolved:
13489     cmp     r0, #0                     @ resolution unsuccessful?
13490     beq     common_exceptionThrown     @ yes, throw exception
13491     @ fall through to OP_IPUT_SHORT_JUMBO_finish
13492
13493    /*
13494     * Currently:
13495     *  r0 holds resolved field
13496     *  r9 holds object
13497     */
13498.LOP_IPUT_SHORT_JUMBO_finish:
13499    @bl      common_squeak4
13500    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13501    FETCH(r1, 3)                        @ r1<- BBBB
13502    cmp     r9, #0                      @ check object for null
13503    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13504    beq     common_errNullObject        @ object was null
13505    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13506    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13507    @ no-op                             @ releasing store
13508    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13509    GOTO_OPCODE(ip)                     @ jump to next instruction
13510
13511/* continuation for OP_SGET_JUMBO */
13512
13513    /*
13514     * Continuation if the field has not yet been resolved.
13515     *  r1:  AAAAAAAA field ref
13516     *  r10: dvmDex->pResFields
13517     */
13518.LOP_SGET_JUMBO_resolve:
13519    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13520#if defined(WITH_JIT)
13521    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13522#endif
13523    EXPORT_PC()                         @ resolve() could throw, so export now
13524    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13525    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13526    cmp     r0, #0                      @ success?
13527    beq     common_exceptionThrown      @ no, handle exception
13528#if defined(WITH_JIT)
13529    /*
13530     * If the JIT is actively building a trace we need to make sure
13531     * that the field is fully resolved before including this instruction.
13532     */
13533    bl      common_verifyField
13534#endif
13535    b       .LOP_SGET_JUMBO_finish          @ resume
13536
13537/* continuation for OP_SGET_WIDE_JUMBO */
13538
13539    /*
13540     * Continuation if the field has not yet been resolved.
13541     *  r1: AAAAAAAA field ref
13542     *
13543     * Returns StaticField pointer in r0.
13544     */
13545.LOP_SGET_WIDE_JUMBO_resolve:
13546    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13547    EXPORT_PC()                         @ resolve() could throw, so export now
13548    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13549    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13550    cmp     r0, #0                      @ success?
13551    bne     .LOP_SGET_WIDE_JUMBO_finish          @ yes, finish
13552    b       common_exceptionThrown      @ no, handle exception
13553
13554/* continuation for OP_SGET_OBJECT_JUMBO */
13555
13556    /*
13557     * Continuation if the field has not yet been resolved.
13558     *  r1:  AAAAAAAA field ref
13559     *  r10: dvmDex->pResFields
13560     */
13561.LOP_SGET_OBJECT_JUMBO_resolve:
13562    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13563#if defined(WITH_JIT)
13564    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13565#endif
13566    EXPORT_PC()                         @ resolve() could throw, so export now
13567    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13568    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13569    cmp     r0, #0                      @ success?
13570    beq     common_exceptionThrown      @ no, handle exception
13571#if defined(WITH_JIT)
13572    /*
13573     * If the JIT is actively building a trace we need to make sure
13574     * that the field is fully resolved before including this instruction.
13575     */
13576    bl      common_verifyField
13577#endif
13578    b       .LOP_SGET_OBJECT_JUMBO_finish          @ resume
13579
13580/* continuation for OP_SGET_BOOLEAN_JUMBO */
13581
13582    /*
13583     * Continuation if the field has not yet been resolved.
13584     *  r1:  AAAAAAAA field ref
13585     *  r10: dvmDex->pResFields
13586     */
13587.LOP_SGET_BOOLEAN_JUMBO_resolve:
13588    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13589#if defined(WITH_JIT)
13590    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13591#endif
13592    EXPORT_PC()                         @ resolve() could throw, so export now
13593    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13594    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13595    cmp     r0, #0                      @ success?
13596    beq     common_exceptionThrown      @ no, handle exception
13597#if defined(WITH_JIT)
13598    /*
13599     * If the JIT is actively building a trace we need to make sure
13600     * that the field is fully resolved before including this instruction.
13601     */
13602    bl      common_verifyField
13603#endif
13604    b       .LOP_SGET_BOOLEAN_JUMBO_finish          @ resume
13605
13606/* continuation for OP_SGET_BYTE_JUMBO */
13607
13608    /*
13609     * Continuation if the field has not yet been resolved.
13610     *  r1:  AAAAAAAA field ref
13611     *  r10: dvmDex->pResFields
13612     */
13613.LOP_SGET_BYTE_JUMBO_resolve:
13614    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13615#if defined(WITH_JIT)
13616    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13617#endif
13618    EXPORT_PC()                         @ resolve() could throw, so export now
13619    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13620    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13621    cmp     r0, #0                      @ success?
13622    beq     common_exceptionThrown      @ no, handle exception
13623#if defined(WITH_JIT)
13624    /*
13625     * If the JIT is actively building a trace we need to make sure
13626     * that the field is fully resolved before including this instruction.
13627     */
13628    bl      common_verifyField
13629#endif
13630    b       .LOP_SGET_BYTE_JUMBO_finish          @ resume
13631
13632/* continuation for OP_SGET_CHAR_JUMBO */
13633
13634    /*
13635     * Continuation if the field has not yet been resolved.
13636     *  r1:  AAAAAAAA field ref
13637     *  r10: dvmDex->pResFields
13638     */
13639.LOP_SGET_CHAR_JUMBO_resolve:
13640    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13641#if defined(WITH_JIT)
13642    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13643#endif
13644    EXPORT_PC()                         @ resolve() could throw, so export now
13645    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13646    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13647    cmp     r0, #0                      @ success?
13648    beq     common_exceptionThrown      @ no, handle exception
13649#if defined(WITH_JIT)
13650    /*
13651     * If the JIT is actively building a trace we need to make sure
13652     * that the field is fully resolved before including this instruction.
13653     */
13654    bl      common_verifyField
13655#endif
13656    b       .LOP_SGET_CHAR_JUMBO_finish          @ resume
13657
13658/* continuation for OP_SGET_SHORT_JUMBO */
13659
13660    /*
13661     * Continuation if the field has not yet been resolved.
13662     *  r1:  AAAAAAAA field ref
13663     *  r10: dvmDex->pResFields
13664     */
13665.LOP_SGET_SHORT_JUMBO_resolve:
13666    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13667#if defined(WITH_JIT)
13668    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13669#endif
13670    EXPORT_PC()                         @ resolve() could throw, so export now
13671    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13672    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13673    cmp     r0, #0                      @ success?
13674    beq     common_exceptionThrown      @ no, handle exception
13675#if defined(WITH_JIT)
13676    /*
13677     * If the JIT is actively building a trace we need to make sure
13678     * that the field is fully resolved before including this instruction.
13679     */
13680    bl      common_verifyField
13681#endif
13682    b       .LOP_SGET_SHORT_JUMBO_finish          @ resume
13683
13684/* continuation for OP_SPUT_JUMBO */
13685
13686    /*
13687     * Continuation if the field has not yet been resolved.
13688     *  r1:  AAAAAAAA field ref
13689     *  r10: dvmDex->pResFields
13690     */
13691.LOP_SPUT_JUMBO_resolve:
13692    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13693#if defined(WITH_JIT)
13694    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13695#endif
13696    EXPORT_PC()                         @ resolve() could throw, so export now
13697    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13698    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13699    cmp     r0, #0                      @ success?
13700    beq     common_exceptionThrown      @ no, handle exception
13701#if defined(WITH_JIT)
13702    /*
13703     * If the JIT is actively building a trace we need to make sure
13704     * that the field is fully resolved before including this instruction.
13705     */
13706    bl      common_verifyField
13707#endif
13708    b       .LOP_SPUT_JUMBO_finish          @ resume
13709
13710/* continuation for OP_SPUT_WIDE_JUMBO */
13711
13712    /*
13713     * Continuation if the field has not yet been resolved.
13714     *  r1:  AAAAAAAA field ref
13715     *  r9:  &fp[BBBB]
13716     *  r10: dvmDex->pResFields
13717     *
13718     * Returns StaticField pointer in r2.
13719     */
13720.LOP_SPUT_WIDE_JUMBO_resolve:
13721    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13722#if defined(WITH_JIT)
13723    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13724#endif
13725    EXPORT_PC()                         @ resolve() could throw, so export now
13726    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13727    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13728    cmp     r0, #0                      @ success?
13729    mov     r2, r0                      @ copy to r2
13730    beq     common_exceptionThrown      @ no, handle exception
13731#if defined(WITH_JIT)
13732    /*
13733     * If the JIT is actively building a trace we need to make sure
13734     * that the field is fully resolved before including this instruction.
13735     */
13736    bl      common_verifyField
13737#endif
13738    b       .LOP_SPUT_WIDE_JUMBO_finish          @ resume
13739
13740/* continuation for OP_SPUT_OBJECT_JUMBO */
13741
13742
13743.LOP_SPUT_OBJECT_JUMBO_end:
13744    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
13745    cmp     r1, #0                      @ stored a null object?
13746    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
13747    GOTO_OPCODE(ip)                     @ jump to next instruction
13748
13749    /* Continuation if the field has not yet been resolved.
13750     * r1:  AAAAaaaa field ref
13751     * r10: dvmDex->pResFields
13752     */
13753.LOP_SPUT_OBJECT_JUMBO_resolve:
13754    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
13755#if defined(WITH_JIT)
13756    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13757#endif
13758    EXPORT_PC()                         @ resolve() could throw, so export now
13759    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13760    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13761    cmp     r0, #0                      @ success?
13762    beq     common_exceptionThrown      @ no, handle exception
13763#if defined(WITH_JIT)
13764    /*
13765     * If the JIT is actively building a trace we need to make sure
13766     * that the field is fully resolved before including this instruction.
13767     */
13768    bl      common_verifyField
13769#endif
13770    b       .LOP_SPUT_OBJECT_JUMBO_finish          @ resume
13771
13772
13773/* continuation for OP_SPUT_BOOLEAN_JUMBO */
13774
13775    /*
13776     * Continuation if the field has not yet been resolved.
13777     *  r1:  AAAAAAAA field ref
13778     *  r10: dvmDex->pResFields
13779     */
13780.LOP_SPUT_BOOLEAN_JUMBO_resolve:
13781    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13782#if defined(WITH_JIT)
13783    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13784#endif
13785    EXPORT_PC()                         @ resolve() could throw, so export now
13786    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13787    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13788    cmp     r0, #0                      @ success?
13789    beq     common_exceptionThrown      @ no, handle exception
13790#if defined(WITH_JIT)
13791    /*
13792     * If the JIT is actively building a trace we need to make sure
13793     * that the field is fully resolved before including this instruction.
13794     */
13795    bl      common_verifyField
13796#endif
13797    b       .LOP_SPUT_BOOLEAN_JUMBO_finish          @ resume
13798
13799/* continuation for OP_SPUT_BYTE_JUMBO */
13800
13801    /*
13802     * Continuation if the field has not yet been resolved.
13803     *  r1:  AAAAAAAA field ref
13804     *  r10: dvmDex->pResFields
13805     */
13806.LOP_SPUT_BYTE_JUMBO_resolve:
13807    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13808#if defined(WITH_JIT)
13809    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13810#endif
13811    EXPORT_PC()                         @ resolve() could throw, so export now
13812    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13813    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13814    cmp     r0, #0                      @ success?
13815    beq     common_exceptionThrown      @ no, handle exception
13816#if defined(WITH_JIT)
13817    /*
13818     * If the JIT is actively building a trace we need to make sure
13819     * that the field is fully resolved before including this instruction.
13820     */
13821    bl      common_verifyField
13822#endif
13823    b       .LOP_SPUT_BYTE_JUMBO_finish          @ resume
13824
13825/* continuation for OP_SPUT_CHAR_JUMBO */
13826
13827    /*
13828     * Continuation if the field has not yet been resolved.
13829     *  r1:  AAAAAAAA field ref
13830     *  r10: dvmDex->pResFields
13831     */
13832.LOP_SPUT_CHAR_JUMBO_resolve:
13833    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13834#if defined(WITH_JIT)
13835    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13836#endif
13837    EXPORT_PC()                         @ resolve() could throw, so export now
13838    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13839    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13840    cmp     r0, #0                      @ success?
13841    beq     common_exceptionThrown      @ no, handle exception
13842#if defined(WITH_JIT)
13843    /*
13844     * If the JIT is actively building a trace we need to make sure
13845     * that the field is fully resolved before including this instruction.
13846     */
13847    bl      common_verifyField
13848#endif
13849    b       .LOP_SPUT_CHAR_JUMBO_finish          @ resume
13850
13851/* continuation for OP_SPUT_SHORT_JUMBO */
13852
13853    /*
13854     * Continuation if the field has not yet been resolved.
13855     *  r1:  AAAAAAAA field ref
13856     *  r10: dvmDex->pResFields
13857     */
13858.LOP_SPUT_SHORT_JUMBO_resolve:
13859    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13860#if defined(WITH_JIT)
13861    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13862#endif
13863    EXPORT_PC()                         @ resolve() could throw, so export now
13864    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13865    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13866    cmp     r0, #0                      @ success?
13867    beq     common_exceptionThrown      @ no, handle exception
13868#if defined(WITH_JIT)
13869    /*
13870     * If the JIT is actively building a trace we need to make sure
13871     * that the field is fully resolved before including this instruction.
13872     */
13873    bl      common_verifyField
13874#endif
13875    b       .LOP_SPUT_SHORT_JUMBO_finish          @ resume
13876
13877/* continuation for OP_INVOKE_VIRTUAL_JUMBO */
13878
13879    /*
13880     * At this point:
13881     *  r0 = resolved base method
13882     */
13883.LOP_INVOKE_VIRTUAL_JUMBO_continue:
13884    FETCH(r10, 4)                       @ r10<- CCCC
13885    GET_VREG(r9, r10)                   @ r9<- "this" ptr
13886    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
13887    cmp     r9, #0                      @ is "this" null?
13888    beq     common_errNullObject        @ null "this", throw exception
13889    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
13890    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
13891    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
13892    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
13893
13894/* continuation for OP_INVOKE_SUPER_JUMBO */
13895
13896    /*
13897     * At this point:
13898     *  r0 = resolved base method
13899     *  r10 = method->clazz
13900     */
13901.LOP_INVOKE_SUPER_JUMBO_continue:
13902    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
13903    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
13904    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
13905    EXPORT_PC()                         @ must export for invoke
13906    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
13907    bcs     .LOP_INVOKE_SUPER_JUMBO_nsm             @ method not present in superclass
13908    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
13909    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
13910    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
13911
13912.LOP_INVOKE_SUPER_JUMBO_resolve:
13913    mov     r0, r10                     @ r0<- method->clazz
13914    mov     r2, #METHOD_VIRTUAL         @ resolver method type
13915    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
13916    cmp     r0, #0                      @ got null?
13917    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ no, continue
13918    b       common_exceptionThrown      @ yes, handle exception
13919
13920    /*
13921     * Throw a NoSuchMethodError with the method name as the message.
13922     *  r0 = resolved base method
13923     */
13924.LOP_INVOKE_SUPER_JUMBO_nsm:
13925    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
13926    b       common_errNoSuchMethod
13927
13928/* continuation for OP_INVOKE_DIRECT_JUMBO */
13929
13930    /*
13931     * On entry:
13932     *  r1 = reference (CCCC)
13933     *  r10 = "this" register
13934     */
13935.LOP_INVOKE_DIRECT_JUMBO_resolve:
13936    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13937    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13938    mov     r2, #METHOD_DIRECT          @ resolver method type
13939    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
13940    cmp     r0, #0                      @ got null?
13941    bne     .LOP_INVOKE_DIRECT_JUMBO_finish          @ no, continue
13942    b       common_exceptionThrown      @ yes, handle exception
13943
13944/* continuation for OP_INVOKE_STATIC_JUMBO */
13945
13946
13947.LOP_INVOKE_STATIC_JUMBO_resolve:
13948    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13949    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13950    mov     r2, #METHOD_STATIC          @ resolver method type
13951    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
13952    cmp     r0, #0                      @ got null?
13953#if defined(WITH_JIT)
13954    /*
13955     * Check to see if we're actively building a trace.  If so,
13956     * we need to keep this instruction out of it.
13957     * r10: &resolved_methodToCall
13958     */
13959    ldrb    r2, [rSELF, #offThread_subMode]
13960    beq     common_exceptionThrown            @ null, handle exception
13961    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
13962    beq     common_invokeMethodJumboNoThis    @ no (r0=method, r9="this")
13963    ldr     r1, [r10]                         @ reload resolved method
13964    cmp     r1, #0                            @ finished resolving?
13965    bne     common_invokeMethodJumboNoThis    @ yes (r0=method, r9="this")
13966    mov     r10, r0                           @ preserve method
13967    mov     r0, rSELF
13968    mov     r1, rPC
13969    bl      dvmJitEndTraceSelect              @ (self, pc)
13970    mov     r0, r10
13971    b       common_invokeMethodJumboNoThis    @ whew, finally!
13972#else
13973    bne     common_invokeMethodJumboNoThis    @ (r0=method, r9="this")
13974    b       common_exceptionThrown            @ yes, handle exception
13975#endif
13976
13977/* continuation for OP_INVOKE_OBJECT_INIT_JUMBO */
13978
13979.LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal:
13980    EXPORT_PC()                         @ can throw
13981    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
13982    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
13983    cmp     r0, #0                      @ exception pending?
13984    bne     common_exceptionThrown      @ yes, handle it
13985    b       .LOP_INVOKE_OBJECT_INIT_JUMBO_finish
13986
13987    /*
13988     * A debugger is attached, so we need to go ahead and do
13989     * this.  For simplicity, we'll just jump directly to the
13990     * corresponding handler.  Note that we can't use
13991     * rIBASE here because it may be in single-step mode.
13992     * Load the primary table base directly.
13993     */
13994.LOP_INVOKE_OBJECT_INIT_JUMBO_debugger:
13995    ldr     r1, [rSELF, #offThread_mainHandlerTable]
13996    .if 1
13997    mov     ip, #OP_INVOKE_DIRECT_JUMBO
13998    .else
13999    mov     ip, #OP_INVOKE_DIRECT_RANGE
14000    .endif
14001    GOTO_OPCODE_BASE(r1,ip)             @ execute it
14002
14003/* continuation for OP_IGET_VOLATILE_JUMBO */
14004
14005    /*
14006     * Currently:
14007     *  r0 holds resolved field
14008     *  r9 holds object
14009     */
14010.LOP_IGET_VOLATILE_JUMBO_resolved:
14011    cmp     r0, #0                      @ resolution unsuccessful?
14012    beq     common_exceptionThrown      @ yes, throw exception
14013    @ fall through to OP_IGET_VOLATILE_JUMBO_finish
14014
14015    /*
14016     * Currently:
14017     *  r0 holds resolved field
14018     *  r9 holds object
14019     */
14020.LOP_IGET_VOLATILE_JUMBO_finish:
14021    @bl      common_squeak0
14022    cmp     r9, #0                      @ check object for null
14023    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14024    beq     common_errNullObject        @ object was null
14025    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14026    SMP_DMB                            @ acquiring load
14027    FETCH(r2, 3)                        @ r2<- BBBB
14028    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14029    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14030    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14031    GOTO_OPCODE(ip)                     @ jump to next instruction
14032
14033/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
14034
14035    /*
14036     * Currently:
14037     *  r0 holds resolved field
14038     *  r9 holds object
14039     */
14040.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
14041    cmp     r0, #0                      @ resolution unsuccessful?
14042    beq     common_exceptionThrown      @ yes, throw exception
14043    @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
14044
14045    /*
14046     * Currently:
14047     *  r0 holds resolved field
14048     *  r9 holds object
14049     */
14050.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
14051    cmp     r9, #0                      @ check object for null
14052    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14053    beq     common_errNullObject        @ object was null
14054    .if     1
14055    add     r0, r9, r3                  @ r0<- address of field
14056    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
14057    .else
14058    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
14059    .endif
14060    FETCH(r2, 3)                        @ r2<- BBBB
14061    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14062    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14063    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14064    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
14065    GOTO_OPCODE(ip)                     @ jump to next instruction
14066
14067/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
14068
14069    /*
14070     * Currently:
14071     *  r0 holds resolved field
14072     *  r9 holds object
14073     */
14074.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
14075    cmp     r0, #0                      @ resolution unsuccessful?
14076    beq     common_exceptionThrown      @ yes, throw exception
14077    @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
14078
14079    /*
14080     * Currently:
14081     *  r0 holds resolved field
14082     *  r9 holds object
14083     */
14084.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
14085    @bl      common_squeak0
14086    cmp     r9, #0                      @ check object for null
14087    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14088    beq     common_errNullObject        @ object was null
14089    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14090    SMP_DMB                            @ acquiring load
14091    FETCH(r2, 3)                        @ r2<- BBBB
14092    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14093    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14094    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14095    GOTO_OPCODE(ip)                     @ jump to next instruction
14096
14097/* continuation for OP_IPUT_VOLATILE_JUMBO */
14098
14099    /*
14100     * Currently:
14101     *  r0 holds resolved field
14102     *  r9 holds object
14103     */
14104.LOP_IPUT_VOLATILE_JUMBO_resolved:
14105     cmp     r0, #0                     @ resolution unsuccessful?
14106     beq     common_exceptionThrown     @ yes, throw exception
14107     @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
14108
14109    /*
14110     * Currently:
14111     *  r0 holds resolved field
14112     *  r9 holds object
14113     */
14114.LOP_IPUT_VOLATILE_JUMBO_finish:
14115    @bl      common_squeak0
14116    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14117    FETCH(r1, 3)                        @ r1<- BBBB
14118    cmp     r9, #0                      @ check object for null
14119    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14120    beq     common_errNullObject        @ object was null
14121    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14122    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14123    SMP_DMB                            @ releasing store
14124    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14125    GOTO_OPCODE(ip)                     @ jump to next instruction
14126
14127/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
14128
14129    /*
14130     * Currently:
14131     *  r0 holds resolved field
14132     *  r9 holds object
14133     */
14134.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
14135     cmp     r0, #0                     @ resolution unsuccessful?
14136     beq     common_exceptionThrown     @ yes, throw exception
14137     @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
14138
14139    /*
14140     * Currently:
14141     *  r0 holds resolved field
14142     *  r9 holds object
14143     */
14144.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
14145    cmp     r9, #0                      @ check object for null
14146    FETCH(r2, 3)                        @ r1<- BBBB
14147    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14148    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14149    beq     common_errNullObject        @ object was null
14150    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14151    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
14152    GET_INST_OPCODE(r10)                @ extract opcode from rINST
14153    .if     1
14154    add     r2, r9, r3                  @ r2<- target address
14155    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
14156    .else
14157    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
14158    .endif
14159    GOTO_OPCODE(r10)                    @ jump to next instruction
14160
14161/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
14162
14163    /*
14164     * Currently:
14165     *  r0 holds resolved field
14166     *  r9 holds object
14167     */
14168.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
14169     cmp     r0, #0                     @ resolution unsuccessful?
14170     beq     common_exceptionThrown     @ yes, throw exception
14171     @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
14172
14173    /*
14174     * Currently:
14175     *  r0 holds resolved field
14176     *  r9 holds object
14177     */
14178.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
14179    @bl      common_squeak0
14180    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14181    FETCH(r1, 3)                        @ r1<- BBBB
14182    cmp     r9, #0                      @ check object for null
14183    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14184    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
14185    beq     common_errNullObject        @ object was null
14186    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14187    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14188    SMP_DMB                            @ releasing store
14189    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
14190    cmp     r0, #0                      @ stored a null reference?
14191    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
14192    GOTO_OPCODE(ip)                     @ jump to next instruction
14193
14194/* continuation for OP_SGET_VOLATILE_JUMBO */
14195
14196    /*
14197     * Continuation if the field has not yet been resolved.
14198     *  r1:  AAAAAAAA field ref
14199     *  r10: dvmDex->pResFields
14200     */
14201.LOP_SGET_VOLATILE_JUMBO_resolve:
14202    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14203#if defined(WITH_JIT)
14204    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14205#endif
14206    EXPORT_PC()                         @ resolve() could throw, so export now
14207    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14208    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14209    cmp     r0, #0                      @ success?
14210    beq     common_exceptionThrown      @ no, handle exception
14211#if defined(WITH_JIT)
14212    /*
14213     * If the JIT is actively building a trace we need to make sure
14214     * that the field is fully resolved before including this instruction.
14215     */
14216    bl      common_verifyField
14217#endif
14218    b       .LOP_SGET_VOLATILE_JUMBO_finish          @ resume
14219
14220/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
14221
14222    /*
14223     * Continuation if the field has not yet been resolved.
14224     *  r1: AAAAAAAA field ref
14225     *
14226     * Returns StaticField pointer in r0.
14227     */
14228.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
14229    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14230    EXPORT_PC()                         @ resolve() could throw, so export now
14231    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14232    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14233    cmp     r0, #0                      @ success?
14234    bne     .LOP_SGET_WIDE_VOLATILE_JUMBO_finish          @ yes, finish
14235    b       common_exceptionThrown      @ no, handle exception
14236
14237/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
14238
14239    /*
14240     * Continuation if the field has not yet been resolved.
14241     *  r1:  AAAAAAAA field ref
14242     *  r10: dvmDex->pResFields
14243     */
14244.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
14245    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14246#if defined(WITH_JIT)
14247    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14248#endif
14249    EXPORT_PC()                         @ resolve() could throw, so export now
14250    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14251    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14252    cmp     r0, #0                      @ success?
14253    beq     common_exceptionThrown      @ no, handle exception
14254#if defined(WITH_JIT)
14255    /*
14256     * If the JIT is actively building a trace we need to make sure
14257     * that the field is fully resolved before including this instruction.
14258     */
14259    bl      common_verifyField
14260#endif
14261    b       .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish          @ resume
14262
14263/* continuation for OP_SPUT_VOLATILE_JUMBO */
14264
14265    /*
14266     * Continuation if the field has not yet been resolved.
14267     *  r1:  AAAAAAAA field ref
14268     *  r10: dvmDex->pResFields
14269     */
14270.LOP_SPUT_VOLATILE_JUMBO_resolve:
14271    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14272#if defined(WITH_JIT)
14273    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14274#endif
14275    EXPORT_PC()                         @ resolve() could throw, so export now
14276    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14277    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14278    cmp     r0, #0                      @ success?
14279    beq     common_exceptionThrown      @ no, handle exception
14280#if defined(WITH_JIT)
14281    /*
14282     * If the JIT is actively building a trace we need to make sure
14283     * that the field is fully resolved before including this instruction.
14284     */
14285    bl      common_verifyField
14286#endif
14287    b       .LOP_SPUT_VOLATILE_JUMBO_finish          @ resume
14288
14289/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
14290
14291    /*
14292     * Continuation if the field has not yet been resolved.
14293     *  r1:  AAAAAAAA field ref
14294     *  r9:  &fp[BBBB]
14295     *  r10: dvmDex->pResFields
14296     *
14297     * Returns StaticField pointer in r2.
14298     */
14299.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
14300    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14301#if defined(WITH_JIT)
14302    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14303#endif
14304    EXPORT_PC()                         @ resolve() could throw, so export now
14305    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14306    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14307    cmp     r0, #0                      @ success?
14308    mov     r2, r0                      @ copy to r2
14309    beq     common_exceptionThrown      @ no, handle exception
14310#if defined(WITH_JIT)
14311    /*
14312     * If the JIT is actively building a trace we need to make sure
14313     * that the field is fully resolved before including this instruction.
14314     */
14315    bl      common_verifyField
14316#endif
14317    b       .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish          @ resume
14318
14319/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
14320
14321
14322.LOP_SPUT_OBJECT_VOLATILE_JUMBO_end:
14323    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
14324    cmp     r1, #0                      @ stored a null object?
14325    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
14326    GOTO_OPCODE(ip)                     @ jump to next instruction
14327
14328    /* Continuation if the field has not yet been resolved.
14329     * r1:  AAAAaaaa field ref
14330     * r10: dvmDex->pResFields
14331     */
14332.LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve:
14333    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
14334#if defined(WITH_JIT)
14335    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14336#endif
14337    EXPORT_PC()                         @ resolve() could throw, so export now
14338    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14339    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14340    cmp     r0, #0                      @ success?
14341    beq     common_exceptionThrown      @ no, handle exception
14342#if defined(WITH_JIT)
14343    /*
14344     * If the JIT is actively building a trace we need to make sure
14345     * that the field is fully resolved before including this instruction.
14346     */
14347    bl      common_verifyField
14348#endif
14349    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish          @ resume
14350
14351
14352    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
14353    .global dvmAsmSisterEnd
14354dvmAsmSisterEnd:
14355
14356
14357    .global dvmAsmAltInstructionStart
14358    .type   dvmAsmAltInstructionStart, %function
14359    .text
14360
14361dvmAsmAltInstructionStart = .L_ALT_OP_NOP
14362/* ------------------------------ */
14363    .balign 64
14364.L_ALT_OP_NOP: /* 0x00 */
14365/* File: armv5te/alt_stub.S */
14366/*
14367 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14368 * any interesting requests and then jump to the real instruction
14369 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14370 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14371 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14372 * bail to the real handler if breakFlags==0.
14373 */
14374    ldrb   r3, [rSELF, #offThread_breakFlags]
14375    adrl   lr, dvmAsmInstructionStart + (0 * 64)
14376    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14377    cmp    r3, #0
14378    bxeq   lr                   @ nothing to do - jump to real handler
14379    EXPORT_PC()
14380    mov    r0, rPC              @ arg0
14381    mov    r1, rFP              @ arg1
14382    mov    r2, rSELF            @ arg2
14383    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14384
14385/* ------------------------------ */
14386    .balign 64
14387.L_ALT_OP_MOVE: /* 0x01 */
14388/* File: armv5te/alt_stub.S */
14389/*
14390 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14391 * any interesting requests and then jump to the real instruction
14392 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14393 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14394 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14395 * bail to the real handler if breakFlags==0.
14396 */
14397    ldrb   r3, [rSELF, #offThread_breakFlags]
14398    adrl   lr, dvmAsmInstructionStart + (1 * 64)
14399    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14400    cmp    r3, #0
14401    bxeq   lr                   @ nothing to do - jump to real handler
14402    EXPORT_PC()
14403    mov    r0, rPC              @ arg0
14404    mov    r1, rFP              @ arg1
14405    mov    r2, rSELF            @ arg2
14406    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14407
14408/* ------------------------------ */
14409    .balign 64
14410.L_ALT_OP_MOVE_FROM16: /* 0x02 */
14411/* File: armv5te/alt_stub.S */
14412/*
14413 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14414 * any interesting requests and then jump to the real instruction
14415 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14416 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14417 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14418 * bail to the real handler if breakFlags==0.
14419 */
14420    ldrb   r3, [rSELF, #offThread_breakFlags]
14421    adrl   lr, dvmAsmInstructionStart + (2 * 64)
14422    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14423    cmp    r3, #0
14424    bxeq   lr                   @ nothing to do - jump to real handler
14425    EXPORT_PC()
14426    mov    r0, rPC              @ arg0
14427    mov    r1, rFP              @ arg1
14428    mov    r2, rSELF            @ arg2
14429    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14430
14431/* ------------------------------ */
14432    .balign 64
14433.L_ALT_OP_MOVE_16: /* 0x03 */
14434/* File: armv5te/alt_stub.S */
14435/*
14436 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14437 * any interesting requests and then jump to the real instruction
14438 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14439 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14440 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14441 * bail to the real handler if breakFlags==0.
14442 */
14443    ldrb   r3, [rSELF, #offThread_breakFlags]
14444    adrl   lr, dvmAsmInstructionStart + (3 * 64)
14445    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14446    cmp    r3, #0
14447    bxeq   lr                   @ nothing to do - jump to real handler
14448    EXPORT_PC()
14449    mov    r0, rPC              @ arg0
14450    mov    r1, rFP              @ arg1
14451    mov    r2, rSELF            @ arg2
14452    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14453
14454/* ------------------------------ */
14455    .balign 64
14456.L_ALT_OP_MOVE_WIDE: /* 0x04 */
14457/* File: armv5te/alt_stub.S */
14458/*
14459 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14460 * any interesting requests and then jump to the real instruction
14461 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14462 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14463 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14464 * bail to the real handler if breakFlags==0.
14465 */
14466    ldrb   r3, [rSELF, #offThread_breakFlags]
14467    adrl   lr, dvmAsmInstructionStart + (4 * 64)
14468    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14469    cmp    r3, #0
14470    bxeq   lr                   @ nothing to do - jump to real handler
14471    EXPORT_PC()
14472    mov    r0, rPC              @ arg0
14473    mov    r1, rFP              @ arg1
14474    mov    r2, rSELF            @ arg2
14475    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14476
14477/* ------------------------------ */
14478    .balign 64
14479.L_ALT_OP_MOVE_WIDE_FROM16: /* 0x05 */
14480/* File: armv5te/alt_stub.S */
14481/*
14482 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14483 * any interesting requests and then jump to the real instruction
14484 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14485 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14486 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14487 * bail to the real handler if breakFlags==0.
14488 */
14489    ldrb   r3, [rSELF, #offThread_breakFlags]
14490    adrl   lr, dvmAsmInstructionStart + (5 * 64)
14491    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14492    cmp    r3, #0
14493    bxeq   lr                   @ nothing to do - jump to real handler
14494    EXPORT_PC()
14495    mov    r0, rPC              @ arg0
14496    mov    r1, rFP              @ arg1
14497    mov    r2, rSELF            @ arg2
14498    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14499
14500/* ------------------------------ */
14501    .balign 64
14502.L_ALT_OP_MOVE_WIDE_16: /* 0x06 */
14503/* File: armv5te/alt_stub.S */
14504/*
14505 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14506 * any interesting requests and then jump to the real instruction
14507 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14508 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14509 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14510 * bail to the real handler if breakFlags==0.
14511 */
14512    ldrb   r3, [rSELF, #offThread_breakFlags]
14513    adrl   lr, dvmAsmInstructionStart + (6 * 64)
14514    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14515    cmp    r3, #0
14516    bxeq   lr                   @ nothing to do - jump to real handler
14517    EXPORT_PC()
14518    mov    r0, rPC              @ arg0
14519    mov    r1, rFP              @ arg1
14520    mov    r2, rSELF            @ arg2
14521    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14522
14523/* ------------------------------ */
14524    .balign 64
14525.L_ALT_OP_MOVE_OBJECT: /* 0x07 */
14526/* File: armv5te/alt_stub.S */
14527/*
14528 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14529 * any interesting requests and then jump to the real instruction
14530 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14531 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14532 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14533 * bail to the real handler if breakFlags==0.
14534 */
14535    ldrb   r3, [rSELF, #offThread_breakFlags]
14536    adrl   lr, dvmAsmInstructionStart + (7 * 64)
14537    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14538    cmp    r3, #0
14539    bxeq   lr                   @ nothing to do - jump to real handler
14540    EXPORT_PC()
14541    mov    r0, rPC              @ arg0
14542    mov    r1, rFP              @ arg1
14543    mov    r2, rSELF            @ arg2
14544    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14545
14546/* ------------------------------ */
14547    .balign 64
14548.L_ALT_OP_MOVE_OBJECT_FROM16: /* 0x08 */
14549/* File: armv5te/alt_stub.S */
14550/*
14551 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14552 * any interesting requests and then jump to the real instruction
14553 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14554 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14555 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14556 * bail to the real handler if breakFlags==0.
14557 */
14558    ldrb   r3, [rSELF, #offThread_breakFlags]
14559    adrl   lr, dvmAsmInstructionStart + (8 * 64)
14560    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14561    cmp    r3, #0
14562    bxeq   lr                   @ nothing to do - jump to real handler
14563    EXPORT_PC()
14564    mov    r0, rPC              @ arg0
14565    mov    r1, rFP              @ arg1
14566    mov    r2, rSELF            @ arg2
14567    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14568
14569/* ------------------------------ */
14570    .balign 64
14571.L_ALT_OP_MOVE_OBJECT_16: /* 0x09 */
14572/* File: armv5te/alt_stub.S */
14573/*
14574 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14575 * any interesting requests and then jump to the real instruction
14576 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14577 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14578 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14579 * bail to the real handler if breakFlags==0.
14580 */
14581    ldrb   r3, [rSELF, #offThread_breakFlags]
14582    adrl   lr, dvmAsmInstructionStart + (9 * 64)
14583    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14584    cmp    r3, #0
14585    bxeq   lr                   @ nothing to do - jump to real handler
14586    EXPORT_PC()
14587    mov    r0, rPC              @ arg0
14588    mov    r1, rFP              @ arg1
14589    mov    r2, rSELF            @ arg2
14590    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14591
14592/* ------------------------------ */
14593    .balign 64
14594.L_ALT_OP_MOVE_RESULT: /* 0x0a */
14595/* File: armv5te/alt_stub.S */
14596/*
14597 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14598 * any interesting requests and then jump to the real instruction
14599 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14600 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14601 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14602 * bail to the real handler if breakFlags==0.
14603 */
14604    ldrb   r3, [rSELF, #offThread_breakFlags]
14605    adrl   lr, dvmAsmInstructionStart + (10 * 64)
14606    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14607    cmp    r3, #0
14608    bxeq   lr                   @ nothing to do - jump to real handler
14609    EXPORT_PC()
14610    mov    r0, rPC              @ arg0
14611    mov    r1, rFP              @ arg1
14612    mov    r2, rSELF            @ arg2
14613    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14614
14615/* ------------------------------ */
14616    .balign 64
14617.L_ALT_OP_MOVE_RESULT_WIDE: /* 0x0b */
14618/* File: armv5te/alt_stub.S */
14619/*
14620 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14621 * any interesting requests and then jump to the real instruction
14622 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14623 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14624 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14625 * bail to the real handler if breakFlags==0.
14626 */
14627    ldrb   r3, [rSELF, #offThread_breakFlags]
14628    adrl   lr, dvmAsmInstructionStart + (11 * 64)
14629    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14630    cmp    r3, #0
14631    bxeq   lr                   @ nothing to do - jump to real handler
14632    EXPORT_PC()
14633    mov    r0, rPC              @ arg0
14634    mov    r1, rFP              @ arg1
14635    mov    r2, rSELF            @ arg2
14636    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14637
14638/* ------------------------------ */
14639    .balign 64
14640.L_ALT_OP_MOVE_RESULT_OBJECT: /* 0x0c */
14641/* File: armv5te/alt_stub.S */
14642/*
14643 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14644 * any interesting requests and then jump to the real instruction
14645 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14646 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14647 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14648 * bail to the real handler if breakFlags==0.
14649 */
14650    ldrb   r3, [rSELF, #offThread_breakFlags]
14651    adrl   lr, dvmAsmInstructionStart + (12 * 64)
14652    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14653    cmp    r3, #0
14654    bxeq   lr                   @ nothing to do - jump to real handler
14655    EXPORT_PC()
14656    mov    r0, rPC              @ arg0
14657    mov    r1, rFP              @ arg1
14658    mov    r2, rSELF            @ arg2
14659    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14660
14661/* ------------------------------ */
14662    .balign 64
14663.L_ALT_OP_MOVE_EXCEPTION: /* 0x0d */
14664/* File: armv5te/alt_stub.S */
14665/*
14666 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14667 * any interesting requests and then jump to the real instruction
14668 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14669 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14670 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14671 * bail to the real handler if breakFlags==0.
14672 */
14673    ldrb   r3, [rSELF, #offThread_breakFlags]
14674    adrl   lr, dvmAsmInstructionStart + (13 * 64)
14675    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14676    cmp    r3, #0
14677    bxeq   lr                   @ nothing to do - jump to real handler
14678    EXPORT_PC()
14679    mov    r0, rPC              @ arg0
14680    mov    r1, rFP              @ arg1
14681    mov    r2, rSELF            @ arg2
14682    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14683
14684/* ------------------------------ */
14685    .balign 64
14686.L_ALT_OP_RETURN_VOID: /* 0x0e */
14687/* File: armv5te/alt_stub.S */
14688/*
14689 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14690 * any interesting requests and then jump to the real instruction
14691 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14692 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14693 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14694 * bail to the real handler if breakFlags==0.
14695 */
14696    ldrb   r3, [rSELF, #offThread_breakFlags]
14697    adrl   lr, dvmAsmInstructionStart + (14 * 64)
14698    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14699    cmp    r3, #0
14700    bxeq   lr                   @ nothing to do - jump to real handler
14701    EXPORT_PC()
14702    mov    r0, rPC              @ arg0
14703    mov    r1, rFP              @ arg1
14704    mov    r2, rSELF            @ arg2
14705    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14706
14707/* ------------------------------ */
14708    .balign 64
14709.L_ALT_OP_RETURN: /* 0x0f */
14710/* File: armv5te/alt_stub.S */
14711/*
14712 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14713 * any interesting requests and then jump to the real instruction
14714 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14715 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14716 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14717 * bail to the real handler if breakFlags==0.
14718 */
14719    ldrb   r3, [rSELF, #offThread_breakFlags]
14720    adrl   lr, dvmAsmInstructionStart + (15 * 64)
14721    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14722    cmp    r3, #0
14723    bxeq   lr                   @ nothing to do - jump to real handler
14724    EXPORT_PC()
14725    mov    r0, rPC              @ arg0
14726    mov    r1, rFP              @ arg1
14727    mov    r2, rSELF            @ arg2
14728    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14729
14730/* ------------------------------ */
14731    .balign 64
14732.L_ALT_OP_RETURN_WIDE: /* 0x10 */
14733/* File: armv5te/alt_stub.S */
14734/*
14735 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14736 * any interesting requests and then jump to the real instruction
14737 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14738 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14739 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14740 * bail to the real handler if breakFlags==0.
14741 */
14742    ldrb   r3, [rSELF, #offThread_breakFlags]
14743    adrl   lr, dvmAsmInstructionStart + (16 * 64)
14744    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14745    cmp    r3, #0
14746    bxeq   lr                   @ nothing to do - jump to real handler
14747    EXPORT_PC()
14748    mov    r0, rPC              @ arg0
14749    mov    r1, rFP              @ arg1
14750    mov    r2, rSELF            @ arg2
14751    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14752
14753/* ------------------------------ */
14754    .balign 64
14755.L_ALT_OP_RETURN_OBJECT: /* 0x11 */
14756/* File: armv5te/alt_stub.S */
14757/*
14758 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14759 * any interesting requests and then jump to the real instruction
14760 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14761 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14762 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14763 * bail to the real handler if breakFlags==0.
14764 */
14765    ldrb   r3, [rSELF, #offThread_breakFlags]
14766    adrl   lr, dvmAsmInstructionStart + (17 * 64)
14767    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14768    cmp    r3, #0
14769    bxeq   lr                   @ nothing to do - jump to real handler
14770    EXPORT_PC()
14771    mov    r0, rPC              @ arg0
14772    mov    r1, rFP              @ arg1
14773    mov    r2, rSELF            @ arg2
14774    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14775
14776/* ------------------------------ */
14777    .balign 64
14778.L_ALT_OP_CONST_4: /* 0x12 */
14779/* File: armv5te/alt_stub.S */
14780/*
14781 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14782 * any interesting requests and then jump to the real instruction
14783 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14784 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14785 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14786 * bail to the real handler if breakFlags==0.
14787 */
14788    ldrb   r3, [rSELF, #offThread_breakFlags]
14789    adrl   lr, dvmAsmInstructionStart + (18 * 64)
14790    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14791    cmp    r3, #0
14792    bxeq   lr                   @ nothing to do - jump to real handler
14793    EXPORT_PC()
14794    mov    r0, rPC              @ arg0
14795    mov    r1, rFP              @ arg1
14796    mov    r2, rSELF            @ arg2
14797    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14798
14799/* ------------------------------ */
14800    .balign 64
14801.L_ALT_OP_CONST_16: /* 0x13 */
14802/* File: armv5te/alt_stub.S */
14803/*
14804 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14805 * any interesting requests and then jump to the real instruction
14806 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14807 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14808 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14809 * bail to the real handler if breakFlags==0.
14810 */
14811    ldrb   r3, [rSELF, #offThread_breakFlags]
14812    adrl   lr, dvmAsmInstructionStart + (19 * 64)
14813    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14814    cmp    r3, #0
14815    bxeq   lr                   @ nothing to do - jump to real handler
14816    EXPORT_PC()
14817    mov    r0, rPC              @ arg0
14818    mov    r1, rFP              @ arg1
14819    mov    r2, rSELF            @ arg2
14820    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14821
14822/* ------------------------------ */
14823    .balign 64
14824.L_ALT_OP_CONST: /* 0x14 */
14825/* File: armv5te/alt_stub.S */
14826/*
14827 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14828 * any interesting requests and then jump to the real instruction
14829 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14830 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14831 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14832 * bail to the real handler if breakFlags==0.
14833 */
14834    ldrb   r3, [rSELF, #offThread_breakFlags]
14835    adrl   lr, dvmAsmInstructionStart + (20 * 64)
14836    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14837    cmp    r3, #0
14838    bxeq   lr                   @ nothing to do - jump to real handler
14839    EXPORT_PC()
14840    mov    r0, rPC              @ arg0
14841    mov    r1, rFP              @ arg1
14842    mov    r2, rSELF            @ arg2
14843    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14844
14845/* ------------------------------ */
14846    .balign 64
14847.L_ALT_OP_CONST_HIGH16: /* 0x15 */
14848/* File: armv5te/alt_stub.S */
14849/*
14850 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14851 * any interesting requests and then jump to the real instruction
14852 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14853 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14854 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14855 * bail to the real handler if breakFlags==0.
14856 */
14857    ldrb   r3, [rSELF, #offThread_breakFlags]
14858    adrl   lr, dvmAsmInstructionStart + (21 * 64)
14859    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14860    cmp    r3, #0
14861    bxeq   lr                   @ nothing to do - jump to real handler
14862    EXPORT_PC()
14863    mov    r0, rPC              @ arg0
14864    mov    r1, rFP              @ arg1
14865    mov    r2, rSELF            @ arg2
14866    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14867
14868/* ------------------------------ */
14869    .balign 64
14870.L_ALT_OP_CONST_WIDE_16: /* 0x16 */
14871/* File: armv5te/alt_stub.S */
14872/*
14873 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14874 * any interesting requests and then jump to the real instruction
14875 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14876 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14877 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14878 * bail to the real handler if breakFlags==0.
14879 */
14880    ldrb   r3, [rSELF, #offThread_breakFlags]
14881    adrl   lr, dvmAsmInstructionStart + (22 * 64)
14882    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14883    cmp    r3, #0
14884    bxeq   lr                   @ nothing to do - jump to real handler
14885    EXPORT_PC()
14886    mov    r0, rPC              @ arg0
14887    mov    r1, rFP              @ arg1
14888    mov    r2, rSELF            @ arg2
14889    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14890
14891/* ------------------------------ */
14892    .balign 64
14893.L_ALT_OP_CONST_WIDE_32: /* 0x17 */
14894/* File: armv5te/alt_stub.S */
14895/*
14896 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14897 * any interesting requests and then jump to the real instruction
14898 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14899 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14900 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14901 * bail to the real handler if breakFlags==0.
14902 */
14903    ldrb   r3, [rSELF, #offThread_breakFlags]
14904    adrl   lr, dvmAsmInstructionStart + (23 * 64)
14905    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14906    cmp    r3, #0
14907    bxeq   lr                   @ nothing to do - jump to real handler
14908    EXPORT_PC()
14909    mov    r0, rPC              @ arg0
14910    mov    r1, rFP              @ arg1
14911    mov    r2, rSELF            @ arg2
14912    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14913
14914/* ------------------------------ */
14915    .balign 64
14916.L_ALT_OP_CONST_WIDE: /* 0x18 */
14917/* File: armv5te/alt_stub.S */
14918/*
14919 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14920 * any interesting requests and then jump to the real instruction
14921 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14922 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14923 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14924 * bail to the real handler if breakFlags==0.
14925 */
14926    ldrb   r3, [rSELF, #offThread_breakFlags]
14927    adrl   lr, dvmAsmInstructionStart + (24 * 64)
14928    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14929    cmp    r3, #0
14930    bxeq   lr                   @ nothing to do - jump to real handler
14931    EXPORT_PC()
14932    mov    r0, rPC              @ arg0
14933    mov    r1, rFP              @ arg1
14934    mov    r2, rSELF            @ arg2
14935    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14936
14937/* ------------------------------ */
14938    .balign 64
14939.L_ALT_OP_CONST_WIDE_HIGH16: /* 0x19 */
14940/* File: armv5te/alt_stub.S */
14941/*
14942 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14943 * any interesting requests and then jump to the real instruction
14944 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14945 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14946 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14947 * bail to the real handler if breakFlags==0.
14948 */
14949    ldrb   r3, [rSELF, #offThread_breakFlags]
14950    adrl   lr, dvmAsmInstructionStart + (25 * 64)
14951    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14952    cmp    r3, #0
14953    bxeq   lr                   @ nothing to do - jump to real handler
14954    EXPORT_PC()
14955    mov    r0, rPC              @ arg0
14956    mov    r1, rFP              @ arg1
14957    mov    r2, rSELF            @ arg2
14958    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14959
14960/* ------------------------------ */
14961    .balign 64
14962.L_ALT_OP_CONST_STRING: /* 0x1a */
14963/* File: armv5te/alt_stub.S */
14964/*
14965 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14966 * any interesting requests and then jump to the real instruction
14967 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14968 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14969 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14970 * bail to the real handler if breakFlags==0.
14971 */
14972    ldrb   r3, [rSELF, #offThread_breakFlags]
14973    adrl   lr, dvmAsmInstructionStart + (26 * 64)
14974    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14975    cmp    r3, #0
14976    bxeq   lr                   @ nothing to do - jump to real handler
14977    EXPORT_PC()
14978    mov    r0, rPC              @ arg0
14979    mov    r1, rFP              @ arg1
14980    mov    r2, rSELF            @ arg2
14981    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14982
14983/* ------------------------------ */
14984    .balign 64
14985.L_ALT_OP_CONST_STRING_JUMBO: /* 0x1b */
14986/* File: armv5te/alt_stub.S */
14987/*
14988 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14989 * any interesting requests and then jump to the real instruction
14990 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14991 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14992 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14993 * bail to the real handler if breakFlags==0.
14994 */
14995    ldrb   r3, [rSELF, #offThread_breakFlags]
14996    adrl   lr, dvmAsmInstructionStart + (27 * 64)
14997    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14998    cmp    r3, #0
14999    bxeq   lr                   @ nothing to do - jump to real handler
15000    EXPORT_PC()
15001    mov    r0, rPC              @ arg0
15002    mov    r1, rFP              @ arg1
15003    mov    r2, rSELF            @ arg2
15004    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15005
15006/* ------------------------------ */
15007    .balign 64
15008.L_ALT_OP_CONST_CLASS: /* 0x1c */
15009/* File: armv5te/alt_stub.S */
15010/*
15011 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15012 * any interesting requests and then jump to the real instruction
15013 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15014 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15015 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15016 * bail to the real handler if breakFlags==0.
15017 */
15018    ldrb   r3, [rSELF, #offThread_breakFlags]
15019    adrl   lr, dvmAsmInstructionStart + (28 * 64)
15020    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15021    cmp    r3, #0
15022    bxeq   lr                   @ nothing to do - jump to real handler
15023    EXPORT_PC()
15024    mov    r0, rPC              @ arg0
15025    mov    r1, rFP              @ arg1
15026    mov    r2, rSELF            @ arg2
15027    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15028
15029/* ------------------------------ */
15030    .balign 64
15031.L_ALT_OP_MONITOR_ENTER: /* 0x1d */
15032/* File: armv5te/alt_stub.S */
15033/*
15034 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15035 * any interesting requests and then jump to the real instruction
15036 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15037 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15038 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15039 * bail to the real handler if breakFlags==0.
15040 */
15041    ldrb   r3, [rSELF, #offThread_breakFlags]
15042    adrl   lr, dvmAsmInstructionStart + (29 * 64)
15043    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15044    cmp    r3, #0
15045    bxeq   lr                   @ nothing to do - jump to real handler
15046    EXPORT_PC()
15047    mov    r0, rPC              @ arg0
15048    mov    r1, rFP              @ arg1
15049    mov    r2, rSELF            @ arg2
15050    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15051
15052/* ------------------------------ */
15053    .balign 64
15054.L_ALT_OP_MONITOR_EXIT: /* 0x1e */
15055/* File: armv5te/alt_stub.S */
15056/*
15057 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15058 * any interesting requests and then jump to the real instruction
15059 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15060 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15061 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15062 * bail to the real handler if breakFlags==0.
15063 */
15064    ldrb   r3, [rSELF, #offThread_breakFlags]
15065    adrl   lr, dvmAsmInstructionStart + (30 * 64)
15066    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15067    cmp    r3, #0
15068    bxeq   lr                   @ nothing to do - jump to real handler
15069    EXPORT_PC()
15070    mov    r0, rPC              @ arg0
15071    mov    r1, rFP              @ arg1
15072    mov    r2, rSELF            @ arg2
15073    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15074
15075/* ------------------------------ */
15076    .balign 64
15077.L_ALT_OP_CHECK_CAST: /* 0x1f */
15078/* File: armv5te/alt_stub.S */
15079/*
15080 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15081 * any interesting requests and then jump to the real instruction
15082 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15083 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15084 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15085 * bail to the real handler if breakFlags==0.
15086 */
15087    ldrb   r3, [rSELF, #offThread_breakFlags]
15088    adrl   lr, dvmAsmInstructionStart + (31 * 64)
15089    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15090    cmp    r3, #0
15091    bxeq   lr                   @ nothing to do - jump to real handler
15092    EXPORT_PC()
15093    mov    r0, rPC              @ arg0
15094    mov    r1, rFP              @ arg1
15095    mov    r2, rSELF            @ arg2
15096    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15097
15098/* ------------------------------ */
15099    .balign 64
15100.L_ALT_OP_INSTANCE_OF: /* 0x20 */
15101/* File: armv5te/alt_stub.S */
15102/*
15103 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15104 * any interesting requests and then jump to the real instruction
15105 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15106 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15107 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15108 * bail to the real handler if breakFlags==0.
15109 */
15110    ldrb   r3, [rSELF, #offThread_breakFlags]
15111    adrl   lr, dvmAsmInstructionStart + (32 * 64)
15112    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15113    cmp    r3, #0
15114    bxeq   lr                   @ nothing to do - jump to real handler
15115    EXPORT_PC()
15116    mov    r0, rPC              @ arg0
15117    mov    r1, rFP              @ arg1
15118    mov    r2, rSELF            @ arg2
15119    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15120
15121/* ------------------------------ */
15122    .balign 64
15123.L_ALT_OP_ARRAY_LENGTH: /* 0x21 */
15124/* File: armv5te/alt_stub.S */
15125/*
15126 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15127 * any interesting requests and then jump to the real instruction
15128 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15129 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15130 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15131 * bail to the real handler if breakFlags==0.
15132 */
15133    ldrb   r3, [rSELF, #offThread_breakFlags]
15134    adrl   lr, dvmAsmInstructionStart + (33 * 64)
15135    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15136    cmp    r3, #0
15137    bxeq   lr                   @ nothing to do - jump to real handler
15138    EXPORT_PC()
15139    mov    r0, rPC              @ arg0
15140    mov    r1, rFP              @ arg1
15141    mov    r2, rSELF            @ arg2
15142    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15143
15144/* ------------------------------ */
15145    .balign 64
15146.L_ALT_OP_NEW_INSTANCE: /* 0x22 */
15147/* File: armv5te/alt_stub.S */
15148/*
15149 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15150 * any interesting requests and then jump to the real instruction
15151 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15152 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15153 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15154 * bail to the real handler if breakFlags==0.
15155 */
15156    ldrb   r3, [rSELF, #offThread_breakFlags]
15157    adrl   lr, dvmAsmInstructionStart + (34 * 64)
15158    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15159    cmp    r3, #0
15160    bxeq   lr                   @ nothing to do - jump to real handler
15161    EXPORT_PC()
15162    mov    r0, rPC              @ arg0
15163    mov    r1, rFP              @ arg1
15164    mov    r2, rSELF            @ arg2
15165    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15166
15167/* ------------------------------ */
15168    .balign 64
15169.L_ALT_OP_NEW_ARRAY: /* 0x23 */
15170/* File: armv5te/alt_stub.S */
15171/*
15172 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15173 * any interesting requests and then jump to the real instruction
15174 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15175 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15176 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15177 * bail to the real handler if breakFlags==0.
15178 */
15179    ldrb   r3, [rSELF, #offThread_breakFlags]
15180    adrl   lr, dvmAsmInstructionStart + (35 * 64)
15181    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15182    cmp    r3, #0
15183    bxeq   lr                   @ nothing to do - jump to real handler
15184    EXPORT_PC()
15185    mov    r0, rPC              @ arg0
15186    mov    r1, rFP              @ arg1
15187    mov    r2, rSELF            @ arg2
15188    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15189
15190/* ------------------------------ */
15191    .balign 64
15192.L_ALT_OP_FILLED_NEW_ARRAY: /* 0x24 */
15193/* File: armv5te/alt_stub.S */
15194/*
15195 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15196 * any interesting requests and then jump to the real instruction
15197 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15198 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15199 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15200 * bail to the real handler if breakFlags==0.
15201 */
15202    ldrb   r3, [rSELF, #offThread_breakFlags]
15203    adrl   lr, dvmAsmInstructionStart + (36 * 64)
15204    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15205    cmp    r3, #0
15206    bxeq   lr                   @ nothing to do - jump to real handler
15207    EXPORT_PC()
15208    mov    r0, rPC              @ arg0
15209    mov    r1, rFP              @ arg1
15210    mov    r2, rSELF            @ arg2
15211    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15212
15213/* ------------------------------ */
15214    .balign 64
15215.L_ALT_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
15216/* File: armv5te/alt_stub.S */
15217/*
15218 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15219 * any interesting requests and then jump to the real instruction
15220 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15221 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15222 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15223 * bail to the real handler if breakFlags==0.
15224 */
15225    ldrb   r3, [rSELF, #offThread_breakFlags]
15226    adrl   lr, dvmAsmInstructionStart + (37 * 64)
15227    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15228    cmp    r3, #0
15229    bxeq   lr                   @ nothing to do - jump to real handler
15230    EXPORT_PC()
15231    mov    r0, rPC              @ arg0
15232    mov    r1, rFP              @ arg1
15233    mov    r2, rSELF            @ arg2
15234    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15235
15236/* ------------------------------ */
15237    .balign 64
15238.L_ALT_OP_FILL_ARRAY_DATA: /* 0x26 */
15239/* File: armv5te/alt_stub.S */
15240/*
15241 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15242 * any interesting requests and then jump to the real instruction
15243 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15244 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15245 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15246 * bail to the real handler if breakFlags==0.
15247 */
15248    ldrb   r3, [rSELF, #offThread_breakFlags]
15249    adrl   lr, dvmAsmInstructionStart + (38 * 64)
15250    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15251    cmp    r3, #0
15252    bxeq   lr                   @ nothing to do - jump to real handler
15253    EXPORT_PC()
15254    mov    r0, rPC              @ arg0
15255    mov    r1, rFP              @ arg1
15256    mov    r2, rSELF            @ arg2
15257    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15258
15259/* ------------------------------ */
15260    .balign 64
15261.L_ALT_OP_THROW: /* 0x27 */
15262/* File: armv5te/alt_stub.S */
15263/*
15264 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15265 * any interesting requests and then jump to the real instruction
15266 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15267 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15268 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15269 * bail to the real handler if breakFlags==0.
15270 */
15271    ldrb   r3, [rSELF, #offThread_breakFlags]
15272    adrl   lr, dvmAsmInstructionStart + (39 * 64)
15273    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15274    cmp    r3, #0
15275    bxeq   lr                   @ nothing to do - jump to real handler
15276    EXPORT_PC()
15277    mov    r0, rPC              @ arg0
15278    mov    r1, rFP              @ arg1
15279    mov    r2, rSELF            @ arg2
15280    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15281
15282/* ------------------------------ */
15283    .balign 64
15284.L_ALT_OP_GOTO: /* 0x28 */
15285/* File: armv5te/alt_stub.S */
15286/*
15287 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15288 * any interesting requests and then jump to the real instruction
15289 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15290 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15291 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15292 * bail to the real handler if breakFlags==0.
15293 */
15294    ldrb   r3, [rSELF, #offThread_breakFlags]
15295    adrl   lr, dvmAsmInstructionStart + (40 * 64)
15296    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15297    cmp    r3, #0
15298    bxeq   lr                   @ nothing to do - jump to real handler
15299    EXPORT_PC()
15300    mov    r0, rPC              @ arg0
15301    mov    r1, rFP              @ arg1
15302    mov    r2, rSELF            @ arg2
15303    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15304
15305/* ------------------------------ */
15306    .balign 64
15307.L_ALT_OP_GOTO_16: /* 0x29 */
15308/* File: armv5te/alt_stub.S */
15309/*
15310 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15311 * any interesting requests and then jump to the real instruction
15312 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15313 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15314 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15315 * bail to the real handler if breakFlags==0.
15316 */
15317    ldrb   r3, [rSELF, #offThread_breakFlags]
15318    adrl   lr, dvmAsmInstructionStart + (41 * 64)
15319    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15320    cmp    r3, #0
15321    bxeq   lr                   @ nothing to do - jump to real handler
15322    EXPORT_PC()
15323    mov    r0, rPC              @ arg0
15324    mov    r1, rFP              @ arg1
15325    mov    r2, rSELF            @ arg2
15326    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15327
15328/* ------------------------------ */
15329    .balign 64
15330.L_ALT_OP_GOTO_32: /* 0x2a */
15331/* File: armv5te/alt_stub.S */
15332/*
15333 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15334 * any interesting requests and then jump to the real instruction
15335 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15336 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15337 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15338 * bail to the real handler if breakFlags==0.
15339 */
15340    ldrb   r3, [rSELF, #offThread_breakFlags]
15341    adrl   lr, dvmAsmInstructionStart + (42 * 64)
15342    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15343    cmp    r3, #0
15344    bxeq   lr                   @ nothing to do - jump to real handler
15345    EXPORT_PC()
15346    mov    r0, rPC              @ arg0
15347    mov    r1, rFP              @ arg1
15348    mov    r2, rSELF            @ arg2
15349    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15350
15351/* ------------------------------ */
15352    .balign 64
15353.L_ALT_OP_PACKED_SWITCH: /* 0x2b */
15354/* File: armv5te/alt_stub.S */
15355/*
15356 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15357 * any interesting requests and then jump to the real instruction
15358 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15359 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15360 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15361 * bail to the real handler if breakFlags==0.
15362 */
15363    ldrb   r3, [rSELF, #offThread_breakFlags]
15364    adrl   lr, dvmAsmInstructionStart + (43 * 64)
15365    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15366    cmp    r3, #0
15367    bxeq   lr                   @ nothing to do - jump to real handler
15368    EXPORT_PC()
15369    mov    r0, rPC              @ arg0
15370    mov    r1, rFP              @ arg1
15371    mov    r2, rSELF            @ arg2
15372    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15373
15374/* ------------------------------ */
15375    .balign 64
15376.L_ALT_OP_SPARSE_SWITCH: /* 0x2c */
15377/* File: armv5te/alt_stub.S */
15378/*
15379 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15380 * any interesting requests and then jump to the real instruction
15381 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15382 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15383 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15384 * bail to the real handler if breakFlags==0.
15385 */
15386    ldrb   r3, [rSELF, #offThread_breakFlags]
15387    adrl   lr, dvmAsmInstructionStart + (44 * 64)
15388    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15389    cmp    r3, #0
15390    bxeq   lr                   @ nothing to do - jump to real handler
15391    EXPORT_PC()
15392    mov    r0, rPC              @ arg0
15393    mov    r1, rFP              @ arg1
15394    mov    r2, rSELF            @ arg2
15395    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15396
15397/* ------------------------------ */
15398    .balign 64
15399.L_ALT_OP_CMPL_FLOAT: /* 0x2d */
15400/* File: armv5te/alt_stub.S */
15401/*
15402 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15403 * any interesting requests and then jump to the real instruction
15404 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15405 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15406 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15407 * bail to the real handler if breakFlags==0.
15408 */
15409    ldrb   r3, [rSELF, #offThread_breakFlags]
15410    adrl   lr, dvmAsmInstructionStart + (45 * 64)
15411    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15412    cmp    r3, #0
15413    bxeq   lr                   @ nothing to do - jump to real handler
15414    EXPORT_PC()
15415    mov    r0, rPC              @ arg0
15416    mov    r1, rFP              @ arg1
15417    mov    r2, rSELF            @ arg2
15418    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15419
15420/* ------------------------------ */
15421    .balign 64
15422.L_ALT_OP_CMPG_FLOAT: /* 0x2e */
15423/* File: armv5te/alt_stub.S */
15424/*
15425 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15426 * any interesting requests and then jump to the real instruction
15427 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15428 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15429 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15430 * bail to the real handler if breakFlags==0.
15431 */
15432    ldrb   r3, [rSELF, #offThread_breakFlags]
15433    adrl   lr, dvmAsmInstructionStart + (46 * 64)
15434    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15435    cmp    r3, #0
15436    bxeq   lr                   @ nothing to do - jump to real handler
15437    EXPORT_PC()
15438    mov    r0, rPC              @ arg0
15439    mov    r1, rFP              @ arg1
15440    mov    r2, rSELF            @ arg2
15441    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15442
15443/* ------------------------------ */
15444    .balign 64
15445.L_ALT_OP_CMPL_DOUBLE: /* 0x2f */
15446/* File: armv5te/alt_stub.S */
15447/*
15448 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15449 * any interesting requests and then jump to the real instruction
15450 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15451 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15452 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15453 * bail to the real handler if breakFlags==0.
15454 */
15455    ldrb   r3, [rSELF, #offThread_breakFlags]
15456    adrl   lr, dvmAsmInstructionStart + (47 * 64)
15457    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15458    cmp    r3, #0
15459    bxeq   lr                   @ nothing to do - jump to real handler
15460    EXPORT_PC()
15461    mov    r0, rPC              @ arg0
15462    mov    r1, rFP              @ arg1
15463    mov    r2, rSELF            @ arg2
15464    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15465
15466/* ------------------------------ */
15467    .balign 64
15468.L_ALT_OP_CMPG_DOUBLE: /* 0x30 */
15469/* File: armv5te/alt_stub.S */
15470/*
15471 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15472 * any interesting requests and then jump to the real instruction
15473 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15474 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15475 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15476 * bail to the real handler if breakFlags==0.
15477 */
15478    ldrb   r3, [rSELF, #offThread_breakFlags]
15479    adrl   lr, dvmAsmInstructionStart + (48 * 64)
15480    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15481    cmp    r3, #0
15482    bxeq   lr                   @ nothing to do - jump to real handler
15483    EXPORT_PC()
15484    mov    r0, rPC              @ arg0
15485    mov    r1, rFP              @ arg1
15486    mov    r2, rSELF            @ arg2
15487    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15488
15489/* ------------------------------ */
15490    .balign 64
15491.L_ALT_OP_CMP_LONG: /* 0x31 */
15492/* File: armv5te/alt_stub.S */
15493/*
15494 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15495 * any interesting requests and then jump to the real instruction
15496 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15497 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15498 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15499 * bail to the real handler if breakFlags==0.
15500 */
15501    ldrb   r3, [rSELF, #offThread_breakFlags]
15502    adrl   lr, dvmAsmInstructionStart + (49 * 64)
15503    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15504    cmp    r3, #0
15505    bxeq   lr                   @ nothing to do - jump to real handler
15506    EXPORT_PC()
15507    mov    r0, rPC              @ arg0
15508    mov    r1, rFP              @ arg1
15509    mov    r2, rSELF            @ arg2
15510    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15511
15512/* ------------------------------ */
15513    .balign 64
15514.L_ALT_OP_IF_EQ: /* 0x32 */
15515/* File: armv5te/alt_stub.S */
15516/*
15517 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15518 * any interesting requests and then jump to the real instruction
15519 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15520 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15521 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15522 * bail to the real handler if breakFlags==0.
15523 */
15524    ldrb   r3, [rSELF, #offThread_breakFlags]
15525    adrl   lr, dvmAsmInstructionStart + (50 * 64)
15526    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15527    cmp    r3, #0
15528    bxeq   lr                   @ nothing to do - jump to real handler
15529    EXPORT_PC()
15530    mov    r0, rPC              @ arg0
15531    mov    r1, rFP              @ arg1
15532    mov    r2, rSELF            @ arg2
15533    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15534
15535/* ------------------------------ */
15536    .balign 64
15537.L_ALT_OP_IF_NE: /* 0x33 */
15538/* File: armv5te/alt_stub.S */
15539/*
15540 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15541 * any interesting requests and then jump to the real instruction
15542 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15543 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15544 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15545 * bail to the real handler if breakFlags==0.
15546 */
15547    ldrb   r3, [rSELF, #offThread_breakFlags]
15548    adrl   lr, dvmAsmInstructionStart + (51 * 64)
15549    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15550    cmp    r3, #0
15551    bxeq   lr                   @ nothing to do - jump to real handler
15552    EXPORT_PC()
15553    mov    r0, rPC              @ arg0
15554    mov    r1, rFP              @ arg1
15555    mov    r2, rSELF            @ arg2
15556    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15557
15558/* ------------------------------ */
15559    .balign 64
15560.L_ALT_OP_IF_LT: /* 0x34 */
15561/* File: armv5te/alt_stub.S */
15562/*
15563 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15564 * any interesting requests and then jump to the real instruction
15565 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15566 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15567 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15568 * bail to the real handler if breakFlags==0.
15569 */
15570    ldrb   r3, [rSELF, #offThread_breakFlags]
15571    adrl   lr, dvmAsmInstructionStart + (52 * 64)
15572    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15573    cmp    r3, #0
15574    bxeq   lr                   @ nothing to do - jump to real handler
15575    EXPORT_PC()
15576    mov    r0, rPC              @ arg0
15577    mov    r1, rFP              @ arg1
15578    mov    r2, rSELF            @ arg2
15579    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15580
15581/* ------------------------------ */
15582    .balign 64
15583.L_ALT_OP_IF_GE: /* 0x35 */
15584/* File: armv5te/alt_stub.S */
15585/*
15586 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15587 * any interesting requests and then jump to the real instruction
15588 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15589 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15590 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15591 * bail to the real handler if breakFlags==0.
15592 */
15593    ldrb   r3, [rSELF, #offThread_breakFlags]
15594    adrl   lr, dvmAsmInstructionStart + (53 * 64)
15595    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15596    cmp    r3, #0
15597    bxeq   lr                   @ nothing to do - jump to real handler
15598    EXPORT_PC()
15599    mov    r0, rPC              @ arg0
15600    mov    r1, rFP              @ arg1
15601    mov    r2, rSELF            @ arg2
15602    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15603
15604/* ------------------------------ */
15605    .balign 64
15606.L_ALT_OP_IF_GT: /* 0x36 */
15607/* File: armv5te/alt_stub.S */
15608/*
15609 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15610 * any interesting requests and then jump to the real instruction
15611 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15612 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15613 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15614 * bail to the real handler if breakFlags==0.
15615 */
15616    ldrb   r3, [rSELF, #offThread_breakFlags]
15617    adrl   lr, dvmAsmInstructionStart + (54 * 64)
15618    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15619    cmp    r3, #0
15620    bxeq   lr                   @ nothing to do - jump to real handler
15621    EXPORT_PC()
15622    mov    r0, rPC              @ arg0
15623    mov    r1, rFP              @ arg1
15624    mov    r2, rSELF            @ arg2
15625    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15626
15627/* ------------------------------ */
15628    .balign 64
15629.L_ALT_OP_IF_LE: /* 0x37 */
15630/* File: armv5te/alt_stub.S */
15631/*
15632 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15633 * any interesting requests and then jump to the real instruction
15634 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15635 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15636 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15637 * bail to the real handler if breakFlags==0.
15638 */
15639    ldrb   r3, [rSELF, #offThread_breakFlags]
15640    adrl   lr, dvmAsmInstructionStart + (55 * 64)
15641    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15642    cmp    r3, #0
15643    bxeq   lr                   @ nothing to do - jump to real handler
15644    EXPORT_PC()
15645    mov    r0, rPC              @ arg0
15646    mov    r1, rFP              @ arg1
15647    mov    r2, rSELF            @ arg2
15648    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15649
15650/* ------------------------------ */
15651    .balign 64
15652.L_ALT_OP_IF_EQZ: /* 0x38 */
15653/* File: armv5te/alt_stub.S */
15654/*
15655 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15656 * any interesting requests and then jump to the real instruction
15657 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15658 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15659 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15660 * bail to the real handler if breakFlags==0.
15661 */
15662    ldrb   r3, [rSELF, #offThread_breakFlags]
15663    adrl   lr, dvmAsmInstructionStart + (56 * 64)
15664    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15665    cmp    r3, #0
15666    bxeq   lr                   @ nothing to do - jump to real handler
15667    EXPORT_PC()
15668    mov    r0, rPC              @ arg0
15669    mov    r1, rFP              @ arg1
15670    mov    r2, rSELF            @ arg2
15671    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15672
15673/* ------------------------------ */
15674    .balign 64
15675.L_ALT_OP_IF_NEZ: /* 0x39 */
15676/* File: armv5te/alt_stub.S */
15677/*
15678 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15679 * any interesting requests and then jump to the real instruction
15680 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15681 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15682 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15683 * bail to the real handler if breakFlags==0.
15684 */
15685    ldrb   r3, [rSELF, #offThread_breakFlags]
15686    adrl   lr, dvmAsmInstructionStart + (57 * 64)
15687    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15688    cmp    r3, #0
15689    bxeq   lr                   @ nothing to do - jump to real handler
15690    EXPORT_PC()
15691    mov    r0, rPC              @ arg0
15692    mov    r1, rFP              @ arg1
15693    mov    r2, rSELF            @ arg2
15694    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15695
15696/* ------------------------------ */
15697    .balign 64
15698.L_ALT_OP_IF_LTZ: /* 0x3a */
15699/* File: armv5te/alt_stub.S */
15700/*
15701 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15702 * any interesting requests and then jump to the real instruction
15703 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15704 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15705 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15706 * bail to the real handler if breakFlags==0.
15707 */
15708    ldrb   r3, [rSELF, #offThread_breakFlags]
15709    adrl   lr, dvmAsmInstructionStart + (58 * 64)
15710    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15711    cmp    r3, #0
15712    bxeq   lr                   @ nothing to do - jump to real handler
15713    EXPORT_PC()
15714    mov    r0, rPC              @ arg0
15715    mov    r1, rFP              @ arg1
15716    mov    r2, rSELF            @ arg2
15717    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15718
15719/* ------------------------------ */
15720    .balign 64
15721.L_ALT_OP_IF_GEZ: /* 0x3b */
15722/* File: armv5te/alt_stub.S */
15723/*
15724 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15725 * any interesting requests and then jump to the real instruction
15726 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15727 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15728 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15729 * bail to the real handler if breakFlags==0.
15730 */
15731    ldrb   r3, [rSELF, #offThread_breakFlags]
15732    adrl   lr, dvmAsmInstructionStart + (59 * 64)
15733    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15734    cmp    r3, #0
15735    bxeq   lr                   @ nothing to do - jump to real handler
15736    EXPORT_PC()
15737    mov    r0, rPC              @ arg0
15738    mov    r1, rFP              @ arg1
15739    mov    r2, rSELF            @ arg2
15740    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15741
15742/* ------------------------------ */
15743    .balign 64
15744.L_ALT_OP_IF_GTZ: /* 0x3c */
15745/* File: armv5te/alt_stub.S */
15746/*
15747 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15748 * any interesting requests and then jump to the real instruction
15749 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15750 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15751 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15752 * bail to the real handler if breakFlags==0.
15753 */
15754    ldrb   r3, [rSELF, #offThread_breakFlags]
15755    adrl   lr, dvmAsmInstructionStart + (60 * 64)
15756    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15757    cmp    r3, #0
15758    bxeq   lr                   @ nothing to do - jump to real handler
15759    EXPORT_PC()
15760    mov    r0, rPC              @ arg0
15761    mov    r1, rFP              @ arg1
15762    mov    r2, rSELF            @ arg2
15763    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15764
15765/* ------------------------------ */
15766    .balign 64
15767.L_ALT_OP_IF_LEZ: /* 0x3d */
15768/* File: armv5te/alt_stub.S */
15769/*
15770 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15771 * any interesting requests and then jump to the real instruction
15772 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15773 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15774 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15775 * bail to the real handler if breakFlags==0.
15776 */
15777    ldrb   r3, [rSELF, #offThread_breakFlags]
15778    adrl   lr, dvmAsmInstructionStart + (61 * 64)
15779    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15780    cmp    r3, #0
15781    bxeq   lr                   @ nothing to do - jump to real handler
15782    EXPORT_PC()
15783    mov    r0, rPC              @ arg0
15784    mov    r1, rFP              @ arg1
15785    mov    r2, rSELF            @ arg2
15786    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15787
15788/* ------------------------------ */
15789    .balign 64
15790.L_ALT_OP_UNUSED_3E: /* 0x3e */
15791/* File: armv5te/alt_stub.S */
15792/*
15793 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15794 * any interesting requests and then jump to the real instruction
15795 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15796 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15797 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15798 * bail to the real handler if breakFlags==0.
15799 */
15800    ldrb   r3, [rSELF, #offThread_breakFlags]
15801    adrl   lr, dvmAsmInstructionStart + (62 * 64)
15802    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15803    cmp    r3, #0
15804    bxeq   lr                   @ nothing to do - jump to real handler
15805    EXPORT_PC()
15806    mov    r0, rPC              @ arg0
15807    mov    r1, rFP              @ arg1
15808    mov    r2, rSELF            @ arg2
15809    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15810
15811/* ------------------------------ */
15812    .balign 64
15813.L_ALT_OP_UNUSED_3F: /* 0x3f */
15814/* File: armv5te/alt_stub.S */
15815/*
15816 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15817 * any interesting requests and then jump to the real instruction
15818 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15819 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15820 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15821 * bail to the real handler if breakFlags==0.
15822 */
15823    ldrb   r3, [rSELF, #offThread_breakFlags]
15824    adrl   lr, dvmAsmInstructionStart + (63 * 64)
15825    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15826    cmp    r3, #0
15827    bxeq   lr                   @ nothing to do - jump to real handler
15828    EXPORT_PC()
15829    mov    r0, rPC              @ arg0
15830    mov    r1, rFP              @ arg1
15831    mov    r2, rSELF            @ arg2
15832    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15833
15834/* ------------------------------ */
15835    .balign 64
15836.L_ALT_OP_UNUSED_40: /* 0x40 */
15837/* File: armv5te/alt_stub.S */
15838/*
15839 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15840 * any interesting requests and then jump to the real instruction
15841 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15842 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15843 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15844 * bail to the real handler if breakFlags==0.
15845 */
15846    ldrb   r3, [rSELF, #offThread_breakFlags]
15847    adrl   lr, dvmAsmInstructionStart + (64 * 64)
15848    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15849    cmp    r3, #0
15850    bxeq   lr                   @ nothing to do - jump to real handler
15851    EXPORT_PC()
15852    mov    r0, rPC              @ arg0
15853    mov    r1, rFP              @ arg1
15854    mov    r2, rSELF            @ arg2
15855    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15856
15857/* ------------------------------ */
15858    .balign 64
15859.L_ALT_OP_UNUSED_41: /* 0x41 */
15860/* File: armv5te/alt_stub.S */
15861/*
15862 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15863 * any interesting requests and then jump to the real instruction
15864 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15865 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15866 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15867 * bail to the real handler if breakFlags==0.
15868 */
15869    ldrb   r3, [rSELF, #offThread_breakFlags]
15870    adrl   lr, dvmAsmInstructionStart + (65 * 64)
15871    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15872    cmp    r3, #0
15873    bxeq   lr                   @ nothing to do - jump to real handler
15874    EXPORT_PC()
15875    mov    r0, rPC              @ arg0
15876    mov    r1, rFP              @ arg1
15877    mov    r2, rSELF            @ arg2
15878    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15879
15880/* ------------------------------ */
15881    .balign 64
15882.L_ALT_OP_UNUSED_42: /* 0x42 */
15883/* File: armv5te/alt_stub.S */
15884/*
15885 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15886 * any interesting requests and then jump to the real instruction
15887 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15888 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15889 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15890 * bail to the real handler if breakFlags==0.
15891 */
15892    ldrb   r3, [rSELF, #offThread_breakFlags]
15893    adrl   lr, dvmAsmInstructionStart + (66 * 64)
15894    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15895    cmp    r3, #0
15896    bxeq   lr                   @ nothing to do - jump to real handler
15897    EXPORT_PC()
15898    mov    r0, rPC              @ arg0
15899    mov    r1, rFP              @ arg1
15900    mov    r2, rSELF            @ arg2
15901    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15902
15903/* ------------------------------ */
15904    .balign 64
15905.L_ALT_OP_UNUSED_43: /* 0x43 */
15906/* File: armv5te/alt_stub.S */
15907/*
15908 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15909 * any interesting requests and then jump to the real instruction
15910 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15911 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15912 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15913 * bail to the real handler if breakFlags==0.
15914 */
15915    ldrb   r3, [rSELF, #offThread_breakFlags]
15916    adrl   lr, dvmAsmInstructionStart + (67 * 64)
15917    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15918    cmp    r3, #0
15919    bxeq   lr                   @ nothing to do - jump to real handler
15920    EXPORT_PC()
15921    mov    r0, rPC              @ arg0
15922    mov    r1, rFP              @ arg1
15923    mov    r2, rSELF            @ arg2
15924    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15925
15926/* ------------------------------ */
15927    .balign 64
15928.L_ALT_OP_AGET: /* 0x44 */
15929/* File: armv5te/alt_stub.S */
15930/*
15931 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15932 * any interesting requests and then jump to the real instruction
15933 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15934 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15935 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15936 * bail to the real handler if breakFlags==0.
15937 */
15938    ldrb   r3, [rSELF, #offThread_breakFlags]
15939    adrl   lr, dvmAsmInstructionStart + (68 * 64)
15940    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15941    cmp    r3, #0
15942    bxeq   lr                   @ nothing to do - jump to real handler
15943    EXPORT_PC()
15944    mov    r0, rPC              @ arg0
15945    mov    r1, rFP              @ arg1
15946    mov    r2, rSELF            @ arg2
15947    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15948
15949/* ------------------------------ */
15950    .balign 64
15951.L_ALT_OP_AGET_WIDE: /* 0x45 */
15952/* File: armv5te/alt_stub.S */
15953/*
15954 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15955 * any interesting requests and then jump to the real instruction
15956 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15957 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15958 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15959 * bail to the real handler if breakFlags==0.
15960 */
15961    ldrb   r3, [rSELF, #offThread_breakFlags]
15962    adrl   lr, dvmAsmInstructionStart + (69 * 64)
15963    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15964    cmp    r3, #0
15965    bxeq   lr                   @ nothing to do - jump to real handler
15966    EXPORT_PC()
15967    mov    r0, rPC              @ arg0
15968    mov    r1, rFP              @ arg1
15969    mov    r2, rSELF            @ arg2
15970    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15971
15972/* ------------------------------ */
15973    .balign 64
15974.L_ALT_OP_AGET_OBJECT: /* 0x46 */
15975/* File: armv5te/alt_stub.S */
15976/*
15977 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15978 * any interesting requests and then jump to the real instruction
15979 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15980 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15981 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15982 * bail to the real handler if breakFlags==0.
15983 */
15984    ldrb   r3, [rSELF, #offThread_breakFlags]
15985    adrl   lr, dvmAsmInstructionStart + (70 * 64)
15986    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15987    cmp    r3, #0
15988    bxeq   lr                   @ nothing to do - jump to real handler
15989    EXPORT_PC()
15990    mov    r0, rPC              @ arg0
15991    mov    r1, rFP              @ arg1
15992    mov    r2, rSELF            @ arg2
15993    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15994
15995/* ------------------------------ */
15996    .balign 64
15997.L_ALT_OP_AGET_BOOLEAN: /* 0x47 */
15998/* File: armv5te/alt_stub.S */
15999/*
16000 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16001 * any interesting requests and then jump to the real instruction
16002 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16003 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16004 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16005 * bail to the real handler if breakFlags==0.
16006 */
16007    ldrb   r3, [rSELF, #offThread_breakFlags]
16008    adrl   lr, dvmAsmInstructionStart + (71 * 64)
16009    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16010    cmp    r3, #0
16011    bxeq   lr                   @ nothing to do - jump to real handler
16012    EXPORT_PC()
16013    mov    r0, rPC              @ arg0
16014    mov    r1, rFP              @ arg1
16015    mov    r2, rSELF            @ arg2
16016    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16017
16018/* ------------------------------ */
16019    .balign 64
16020.L_ALT_OP_AGET_BYTE: /* 0x48 */
16021/* File: armv5te/alt_stub.S */
16022/*
16023 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16024 * any interesting requests and then jump to the real instruction
16025 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16026 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16027 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16028 * bail to the real handler if breakFlags==0.
16029 */
16030    ldrb   r3, [rSELF, #offThread_breakFlags]
16031    adrl   lr, dvmAsmInstructionStart + (72 * 64)
16032    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16033    cmp    r3, #0
16034    bxeq   lr                   @ nothing to do - jump to real handler
16035    EXPORT_PC()
16036    mov    r0, rPC              @ arg0
16037    mov    r1, rFP              @ arg1
16038    mov    r2, rSELF            @ arg2
16039    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16040
16041/* ------------------------------ */
16042    .balign 64
16043.L_ALT_OP_AGET_CHAR: /* 0x49 */
16044/* File: armv5te/alt_stub.S */
16045/*
16046 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16047 * any interesting requests and then jump to the real instruction
16048 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16049 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16050 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16051 * bail to the real handler if breakFlags==0.
16052 */
16053    ldrb   r3, [rSELF, #offThread_breakFlags]
16054    adrl   lr, dvmAsmInstructionStart + (73 * 64)
16055    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16056    cmp    r3, #0
16057    bxeq   lr                   @ nothing to do - jump to real handler
16058    EXPORT_PC()
16059    mov    r0, rPC              @ arg0
16060    mov    r1, rFP              @ arg1
16061    mov    r2, rSELF            @ arg2
16062    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16063
16064/* ------------------------------ */
16065    .balign 64
16066.L_ALT_OP_AGET_SHORT: /* 0x4a */
16067/* File: armv5te/alt_stub.S */
16068/*
16069 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16070 * any interesting requests and then jump to the real instruction
16071 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16072 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16073 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16074 * bail to the real handler if breakFlags==0.
16075 */
16076    ldrb   r3, [rSELF, #offThread_breakFlags]
16077    adrl   lr, dvmAsmInstructionStart + (74 * 64)
16078    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16079    cmp    r3, #0
16080    bxeq   lr                   @ nothing to do - jump to real handler
16081    EXPORT_PC()
16082    mov    r0, rPC              @ arg0
16083    mov    r1, rFP              @ arg1
16084    mov    r2, rSELF            @ arg2
16085    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16086
16087/* ------------------------------ */
16088    .balign 64
16089.L_ALT_OP_APUT: /* 0x4b */
16090/* File: armv5te/alt_stub.S */
16091/*
16092 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16093 * any interesting requests and then jump to the real instruction
16094 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16095 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16096 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16097 * bail to the real handler if breakFlags==0.
16098 */
16099    ldrb   r3, [rSELF, #offThread_breakFlags]
16100    adrl   lr, dvmAsmInstructionStart + (75 * 64)
16101    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16102    cmp    r3, #0
16103    bxeq   lr                   @ nothing to do - jump to real handler
16104    EXPORT_PC()
16105    mov    r0, rPC              @ arg0
16106    mov    r1, rFP              @ arg1
16107    mov    r2, rSELF            @ arg2
16108    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16109
16110/* ------------------------------ */
16111    .balign 64
16112.L_ALT_OP_APUT_WIDE: /* 0x4c */
16113/* File: armv5te/alt_stub.S */
16114/*
16115 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16116 * any interesting requests and then jump to the real instruction
16117 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16118 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16119 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16120 * bail to the real handler if breakFlags==0.
16121 */
16122    ldrb   r3, [rSELF, #offThread_breakFlags]
16123    adrl   lr, dvmAsmInstructionStart + (76 * 64)
16124    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16125    cmp    r3, #0
16126    bxeq   lr                   @ nothing to do - jump to real handler
16127    EXPORT_PC()
16128    mov    r0, rPC              @ arg0
16129    mov    r1, rFP              @ arg1
16130    mov    r2, rSELF            @ arg2
16131    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16132
16133/* ------------------------------ */
16134    .balign 64
16135.L_ALT_OP_APUT_OBJECT: /* 0x4d */
16136/* File: armv5te/alt_stub.S */
16137/*
16138 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16139 * any interesting requests and then jump to the real instruction
16140 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16141 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16142 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16143 * bail to the real handler if breakFlags==0.
16144 */
16145    ldrb   r3, [rSELF, #offThread_breakFlags]
16146    adrl   lr, dvmAsmInstructionStart + (77 * 64)
16147    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16148    cmp    r3, #0
16149    bxeq   lr                   @ nothing to do - jump to real handler
16150    EXPORT_PC()
16151    mov    r0, rPC              @ arg0
16152    mov    r1, rFP              @ arg1
16153    mov    r2, rSELF            @ arg2
16154    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16155
16156/* ------------------------------ */
16157    .balign 64
16158.L_ALT_OP_APUT_BOOLEAN: /* 0x4e */
16159/* File: armv5te/alt_stub.S */
16160/*
16161 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16162 * any interesting requests and then jump to the real instruction
16163 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16164 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16165 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16166 * bail to the real handler if breakFlags==0.
16167 */
16168    ldrb   r3, [rSELF, #offThread_breakFlags]
16169    adrl   lr, dvmAsmInstructionStart + (78 * 64)
16170    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16171    cmp    r3, #0
16172    bxeq   lr                   @ nothing to do - jump to real handler
16173    EXPORT_PC()
16174    mov    r0, rPC              @ arg0
16175    mov    r1, rFP              @ arg1
16176    mov    r2, rSELF            @ arg2
16177    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16178
16179/* ------------------------------ */
16180    .balign 64
16181.L_ALT_OP_APUT_BYTE: /* 0x4f */
16182/* File: armv5te/alt_stub.S */
16183/*
16184 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16185 * any interesting requests and then jump to the real instruction
16186 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16187 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16188 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16189 * bail to the real handler if breakFlags==0.
16190 */
16191    ldrb   r3, [rSELF, #offThread_breakFlags]
16192    adrl   lr, dvmAsmInstructionStart + (79 * 64)
16193    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16194    cmp    r3, #0
16195    bxeq   lr                   @ nothing to do - jump to real handler
16196    EXPORT_PC()
16197    mov    r0, rPC              @ arg0
16198    mov    r1, rFP              @ arg1
16199    mov    r2, rSELF            @ arg2
16200    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16201
16202/* ------------------------------ */
16203    .balign 64
16204.L_ALT_OP_APUT_CHAR: /* 0x50 */
16205/* File: armv5te/alt_stub.S */
16206/*
16207 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16208 * any interesting requests and then jump to the real instruction
16209 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16210 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16211 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16212 * bail to the real handler if breakFlags==0.
16213 */
16214    ldrb   r3, [rSELF, #offThread_breakFlags]
16215    adrl   lr, dvmAsmInstructionStart + (80 * 64)
16216    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16217    cmp    r3, #0
16218    bxeq   lr                   @ nothing to do - jump to real handler
16219    EXPORT_PC()
16220    mov    r0, rPC              @ arg0
16221    mov    r1, rFP              @ arg1
16222    mov    r2, rSELF            @ arg2
16223    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16224
16225/* ------------------------------ */
16226    .balign 64
16227.L_ALT_OP_APUT_SHORT: /* 0x51 */
16228/* File: armv5te/alt_stub.S */
16229/*
16230 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16231 * any interesting requests and then jump to the real instruction
16232 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16233 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16234 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16235 * bail to the real handler if breakFlags==0.
16236 */
16237    ldrb   r3, [rSELF, #offThread_breakFlags]
16238    adrl   lr, dvmAsmInstructionStart + (81 * 64)
16239    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16240    cmp    r3, #0
16241    bxeq   lr                   @ nothing to do - jump to real handler
16242    EXPORT_PC()
16243    mov    r0, rPC              @ arg0
16244    mov    r1, rFP              @ arg1
16245    mov    r2, rSELF            @ arg2
16246    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16247
16248/* ------------------------------ */
16249    .balign 64
16250.L_ALT_OP_IGET: /* 0x52 */
16251/* File: armv5te/alt_stub.S */
16252/*
16253 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16254 * any interesting requests and then jump to the real instruction
16255 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16256 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16257 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16258 * bail to the real handler if breakFlags==0.
16259 */
16260    ldrb   r3, [rSELF, #offThread_breakFlags]
16261    adrl   lr, dvmAsmInstructionStart + (82 * 64)
16262    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16263    cmp    r3, #0
16264    bxeq   lr                   @ nothing to do - jump to real handler
16265    EXPORT_PC()
16266    mov    r0, rPC              @ arg0
16267    mov    r1, rFP              @ arg1
16268    mov    r2, rSELF            @ arg2
16269    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16270
16271/* ------------------------------ */
16272    .balign 64
16273.L_ALT_OP_IGET_WIDE: /* 0x53 */
16274/* File: armv5te/alt_stub.S */
16275/*
16276 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16277 * any interesting requests and then jump to the real instruction
16278 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16279 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16280 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16281 * bail to the real handler if breakFlags==0.
16282 */
16283    ldrb   r3, [rSELF, #offThread_breakFlags]
16284    adrl   lr, dvmAsmInstructionStart + (83 * 64)
16285    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16286    cmp    r3, #0
16287    bxeq   lr                   @ nothing to do - jump to real handler
16288    EXPORT_PC()
16289    mov    r0, rPC              @ arg0
16290    mov    r1, rFP              @ arg1
16291    mov    r2, rSELF            @ arg2
16292    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16293
16294/* ------------------------------ */
16295    .balign 64
16296.L_ALT_OP_IGET_OBJECT: /* 0x54 */
16297/* File: armv5te/alt_stub.S */
16298/*
16299 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16300 * any interesting requests and then jump to the real instruction
16301 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16302 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16303 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16304 * bail to the real handler if breakFlags==0.
16305 */
16306    ldrb   r3, [rSELF, #offThread_breakFlags]
16307    adrl   lr, dvmAsmInstructionStart + (84 * 64)
16308    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16309    cmp    r3, #0
16310    bxeq   lr                   @ nothing to do - jump to real handler
16311    EXPORT_PC()
16312    mov    r0, rPC              @ arg0
16313    mov    r1, rFP              @ arg1
16314    mov    r2, rSELF            @ arg2
16315    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16316
16317/* ------------------------------ */
16318    .balign 64
16319.L_ALT_OP_IGET_BOOLEAN: /* 0x55 */
16320/* File: armv5te/alt_stub.S */
16321/*
16322 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16323 * any interesting requests and then jump to the real instruction
16324 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16325 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16326 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16327 * bail to the real handler if breakFlags==0.
16328 */
16329    ldrb   r3, [rSELF, #offThread_breakFlags]
16330    adrl   lr, dvmAsmInstructionStart + (85 * 64)
16331    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16332    cmp    r3, #0
16333    bxeq   lr                   @ nothing to do - jump to real handler
16334    EXPORT_PC()
16335    mov    r0, rPC              @ arg0
16336    mov    r1, rFP              @ arg1
16337    mov    r2, rSELF            @ arg2
16338    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16339
16340/* ------------------------------ */
16341    .balign 64
16342.L_ALT_OP_IGET_BYTE: /* 0x56 */
16343/* File: armv5te/alt_stub.S */
16344/*
16345 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16346 * any interesting requests and then jump to the real instruction
16347 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16348 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16349 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16350 * bail to the real handler if breakFlags==0.
16351 */
16352    ldrb   r3, [rSELF, #offThread_breakFlags]
16353    adrl   lr, dvmAsmInstructionStart + (86 * 64)
16354    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16355    cmp    r3, #0
16356    bxeq   lr                   @ nothing to do - jump to real handler
16357    EXPORT_PC()
16358    mov    r0, rPC              @ arg0
16359    mov    r1, rFP              @ arg1
16360    mov    r2, rSELF            @ arg2
16361    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16362
16363/* ------------------------------ */
16364    .balign 64
16365.L_ALT_OP_IGET_CHAR: /* 0x57 */
16366/* File: armv5te/alt_stub.S */
16367/*
16368 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16369 * any interesting requests and then jump to the real instruction
16370 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16371 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16372 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16373 * bail to the real handler if breakFlags==0.
16374 */
16375    ldrb   r3, [rSELF, #offThread_breakFlags]
16376    adrl   lr, dvmAsmInstructionStart + (87 * 64)
16377    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16378    cmp    r3, #0
16379    bxeq   lr                   @ nothing to do - jump to real handler
16380    EXPORT_PC()
16381    mov    r0, rPC              @ arg0
16382    mov    r1, rFP              @ arg1
16383    mov    r2, rSELF            @ arg2
16384    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16385
16386/* ------------------------------ */
16387    .balign 64
16388.L_ALT_OP_IGET_SHORT: /* 0x58 */
16389/* File: armv5te/alt_stub.S */
16390/*
16391 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16392 * any interesting requests and then jump to the real instruction
16393 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16394 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16395 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16396 * bail to the real handler if breakFlags==0.
16397 */
16398    ldrb   r3, [rSELF, #offThread_breakFlags]
16399    adrl   lr, dvmAsmInstructionStart + (88 * 64)
16400    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16401    cmp    r3, #0
16402    bxeq   lr                   @ nothing to do - jump to real handler
16403    EXPORT_PC()
16404    mov    r0, rPC              @ arg0
16405    mov    r1, rFP              @ arg1
16406    mov    r2, rSELF            @ arg2
16407    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16408
16409/* ------------------------------ */
16410    .balign 64
16411.L_ALT_OP_IPUT: /* 0x59 */
16412/* File: armv5te/alt_stub.S */
16413/*
16414 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16415 * any interesting requests and then jump to the real instruction
16416 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16417 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16418 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16419 * bail to the real handler if breakFlags==0.
16420 */
16421    ldrb   r3, [rSELF, #offThread_breakFlags]
16422    adrl   lr, dvmAsmInstructionStart + (89 * 64)
16423    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16424    cmp    r3, #0
16425    bxeq   lr                   @ nothing to do - jump to real handler
16426    EXPORT_PC()
16427    mov    r0, rPC              @ arg0
16428    mov    r1, rFP              @ arg1
16429    mov    r2, rSELF            @ arg2
16430    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16431
16432/* ------------------------------ */
16433    .balign 64
16434.L_ALT_OP_IPUT_WIDE: /* 0x5a */
16435/* File: armv5te/alt_stub.S */
16436/*
16437 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16438 * any interesting requests and then jump to the real instruction
16439 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16440 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16441 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16442 * bail to the real handler if breakFlags==0.
16443 */
16444    ldrb   r3, [rSELF, #offThread_breakFlags]
16445    adrl   lr, dvmAsmInstructionStart + (90 * 64)
16446    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16447    cmp    r3, #0
16448    bxeq   lr                   @ nothing to do - jump to real handler
16449    EXPORT_PC()
16450    mov    r0, rPC              @ arg0
16451    mov    r1, rFP              @ arg1
16452    mov    r2, rSELF            @ arg2
16453    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16454
16455/* ------------------------------ */
16456    .balign 64
16457.L_ALT_OP_IPUT_OBJECT: /* 0x5b */
16458/* File: armv5te/alt_stub.S */
16459/*
16460 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16461 * any interesting requests and then jump to the real instruction
16462 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16463 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16464 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16465 * bail to the real handler if breakFlags==0.
16466 */
16467    ldrb   r3, [rSELF, #offThread_breakFlags]
16468    adrl   lr, dvmAsmInstructionStart + (91 * 64)
16469    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16470    cmp    r3, #0
16471    bxeq   lr                   @ nothing to do - jump to real handler
16472    EXPORT_PC()
16473    mov    r0, rPC              @ arg0
16474    mov    r1, rFP              @ arg1
16475    mov    r2, rSELF            @ arg2
16476    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16477
16478/* ------------------------------ */
16479    .balign 64
16480.L_ALT_OP_IPUT_BOOLEAN: /* 0x5c */
16481/* File: armv5te/alt_stub.S */
16482/*
16483 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16484 * any interesting requests and then jump to the real instruction
16485 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16486 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16487 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16488 * bail to the real handler if breakFlags==0.
16489 */
16490    ldrb   r3, [rSELF, #offThread_breakFlags]
16491    adrl   lr, dvmAsmInstructionStart + (92 * 64)
16492    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16493    cmp    r3, #0
16494    bxeq   lr                   @ nothing to do - jump to real handler
16495    EXPORT_PC()
16496    mov    r0, rPC              @ arg0
16497    mov    r1, rFP              @ arg1
16498    mov    r2, rSELF            @ arg2
16499    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16500
16501/* ------------------------------ */
16502    .balign 64
16503.L_ALT_OP_IPUT_BYTE: /* 0x5d */
16504/* File: armv5te/alt_stub.S */
16505/*
16506 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16507 * any interesting requests and then jump to the real instruction
16508 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16509 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16510 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16511 * bail to the real handler if breakFlags==0.
16512 */
16513    ldrb   r3, [rSELF, #offThread_breakFlags]
16514    adrl   lr, dvmAsmInstructionStart + (93 * 64)
16515    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16516    cmp    r3, #0
16517    bxeq   lr                   @ nothing to do - jump to real handler
16518    EXPORT_PC()
16519    mov    r0, rPC              @ arg0
16520    mov    r1, rFP              @ arg1
16521    mov    r2, rSELF            @ arg2
16522    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16523
16524/* ------------------------------ */
16525    .balign 64
16526.L_ALT_OP_IPUT_CHAR: /* 0x5e */
16527/* File: armv5te/alt_stub.S */
16528/*
16529 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16530 * any interesting requests and then jump to the real instruction
16531 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16532 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16533 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16534 * bail to the real handler if breakFlags==0.
16535 */
16536    ldrb   r3, [rSELF, #offThread_breakFlags]
16537    adrl   lr, dvmAsmInstructionStart + (94 * 64)
16538    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16539    cmp    r3, #0
16540    bxeq   lr                   @ nothing to do - jump to real handler
16541    EXPORT_PC()
16542    mov    r0, rPC              @ arg0
16543    mov    r1, rFP              @ arg1
16544    mov    r2, rSELF            @ arg2
16545    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16546
16547/* ------------------------------ */
16548    .balign 64
16549.L_ALT_OP_IPUT_SHORT: /* 0x5f */
16550/* File: armv5te/alt_stub.S */
16551/*
16552 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16553 * any interesting requests and then jump to the real instruction
16554 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16555 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16556 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16557 * bail to the real handler if breakFlags==0.
16558 */
16559    ldrb   r3, [rSELF, #offThread_breakFlags]
16560    adrl   lr, dvmAsmInstructionStart + (95 * 64)
16561    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16562    cmp    r3, #0
16563    bxeq   lr                   @ nothing to do - jump to real handler
16564    EXPORT_PC()
16565    mov    r0, rPC              @ arg0
16566    mov    r1, rFP              @ arg1
16567    mov    r2, rSELF            @ arg2
16568    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16569
16570/* ------------------------------ */
16571    .balign 64
16572.L_ALT_OP_SGET: /* 0x60 */
16573/* File: armv5te/alt_stub.S */
16574/*
16575 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16576 * any interesting requests and then jump to the real instruction
16577 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16578 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16579 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16580 * bail to the real handler if breakFlags==0.
16581 */
16582    ldrb   r3, [rSELF, #offThread_breakFlags]
16583    adrl   lr, dvmAsmInstructionStart + (96 * 64)
16584    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16585    cmp    r3, #0
16586    bxeq   lr                   @ nothing to do - jump to real handler
16587    EXPORT_PC()
16588    mov    r0, rPC              @ arg0
16589    mov    r1, rFP              @ arg1
16590    mov    r2, rSELF            @ arg2
16591    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16592
16593/* ------------------------------ */
16594    .balign 64
16595.L_ALT_OP_SGET_WIDE: /* 0x61 */
16596/* File: armv5te/alt_stub.S */
16597/*
16598 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16599 * any interesting requests and then jump to the real instruction
16600 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16601 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16602 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16603 * bail to the real handler if breakFlags==0.
16604 */
16605    ldrb   r3, [rSELF, #offThread_breakFlags]
16606    adrl   lr, dvmAsmInstructionStart + (97 * 64)
16607    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16608    cmp    r3, #0
16609    bxeq   lr                   @ nothing to do - jump to real handler
16610    EXPORT_PC()
16611    mov    r0, rPC              @ arg0
16612    mov    r1, rFP              @ arg1
16613    mov    r2, rSELF            @ arg2
16614    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16615
16616/* ------------------------------ */
16617    .balign 64
16618.L_ALT_OP_SGET_OBJECT: /* 0x62 */
16619/* File: armv5te/alt_stub.S */
16620/*
16621 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16622 * any interesting requests and then jump to the real instruction
16623 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16624 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16625 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16626 * bail to the real handler if breakFlags==0.
16627 */
16628    ldrb   r3, [rSELF, #offThread_breakFlags]
16629    adrl   lr, dvmAsmInstructionStart + (98 * 64)
16630    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16631    cmp    r3, #0
16632    bxeq   lr                   @ nothing to do - jump to real handler
16633    EXPORT_PC()
16634    mov    r0, rPC              @ arg0
16635    mov    r1, rFP              @ arg1
16636    mov    r2, rSELF            @ arg2
16637    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16638
16639/* ------------------------------ */
16640    .balign 64
16641.L_ALT_OP_SGET_BOOLEAN: /* 0x63 */
16642/* File: armv5te/alt_stub.S */
16643/*
16644 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16645 * any interesting requests and then jump to the real instruction
16646 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16647 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16648 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16649 * bail to the real handler if breakFlags==0.
16650 */
16651    ldrb   r3, [rSELF, #offThread_breakFlags]
16652    adrl   lr, dvmAsmInstructionStart + (99 * 64)
16653    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16654    cmp    r3, #0
16655    bxeq   lr                   @ nothing to do - jump to real handler
16656    EXPORT_PC()
16657    mov    r0, rPC              @ arg0
16658    mov    r1, rFP              @ arg1
16659    mov    r2, rSELF            @ arg2
16660    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16661
16662/* ------------------------------ */
16663    .balign 64
16664.L_ALT_OP_SGET_BYTE: /* 0x64 */
16665/* File: armv5te/alt_stub.S */
16666/*
16667 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16668 * any interesting requests and then jump to the real instruction
16669 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16670 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16671 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16672 * bail to the real handler if breakFlags==0.
16673 */
16674    ldrb   r3, [rSELF, #offThread_breakFlags]
16675    adrl   lr, dvmAsmInstructionStart + (100 * 64)
16676    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16677    cmp    r3, #0
16678    bxeq   lr                   @ nothing to do - jump to real handler
16679    EXPORT_PC()
16680    mov    r0, rPC              @ arg0
16681    mov    r1, rFP              @ arg1
16682    mov    r2, rSELF            @ arg2
16683    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16684
16685/* ------------------------------ */
16686    .balign 64
16687.L_ALT_OP_SGET_CHAR: /* 0x65 */
16688/* File: armv5te/alt_stub.S */
16689/*
16690 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16691 * any interesting requests and then jump to the real instruction
16692 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16693 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16694 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16695 * bail to the real handler if breakFlags==0.
16696 */
16697    ldrb   r3, [rSELF, #offThread_breakFlags]
16698    adrl   lr, dvmAsmInstructionStart + (101 * 64)
16699    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16700    cmp    r3, #0
16701    bxeq   lr                   @ nothing to do - jump to real handler
16702    EXPORT_PC()
16703    mov    r0, rPC              @ arg0
16704    mov    r1, rFP              @ arg1
16705    mov    r2, rSELF            @ arg2
16706    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16707
16708/* ------------------------------ */
16709    .balign 64
16710.L_ALT_OP_SGET_SHORT: /* 0x66 */
16711/* File: armv5te/alt_stub.S */
16712/*
16713 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16714 * any interesting requests and then jump to the real instruction
16715 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16716 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16717 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16718 * bail to the real handler if breakFlags==0.
16719 */
16720    ldrb   r3, [rSELF, #offThread_breakFlags]
16721    adrl   lr, dvmAsmInstructionStart + (102 * 64)
16722    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16723    cmp    r3, #0
16724    bxeq   lr                   @ nothing to do - jump to real handler
16725    EXPORT_PC()
16726    mov    r0, rPC              @ arg0
16727    mov    r1, rFP              @ arg1
16728    mov    r2, rSELF            @ arg2
16729    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16730
16731/* ------------------------------ */
16732    .balign 64
16733.L_ALT_OP_SPUT: /* 0x67 */
16734/* File: armv5te/alt_stub.S */
16735/*
16736 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16737 * any interesting requests and then jump to the real instruction
16738 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16739 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16740 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16741 * bail to the real handler if breakFlags==0.
16742 */
16743    ldrb   r3, [rSELF, #offThread_breakFlags]
16744    adrl   lr, dvmAsmInstructionStart + (103 * 64)
16745    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16746    cmp    r3, #0
16747    bxeq   lr                   @ nothing to do - jump to real handler
16748    EXPORT_PC()
16749    mov    r0, rPC              @ arg0
16750    mov    r1, rFP              @ arg1
16751    mov    r2, rSELF            @ arg2
16752    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16753
16754/* ------------------------------ */
16755    .balign 64
16756.L_ALT_OP_SPUT_WIDE: /* 0x68 */
16757/* File: armv5te/alt_stub.S */
16758/*
16759 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16760 * any interesting requests and then jump to the real instruction
16761 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16762 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16763 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16764 * bail to the real handler if breakFlags==0.
16765 */
16766    ldrb   r3, [rSELF, #offThread_breakFlags]
16767    adrl   lr, dvmAsmInstructionStart + (104 * 64)
16768    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16769    cmp    r3, #0
16770    bxeq   lr                   @ nothing to do - jump to real handler
16771    EXPORT_PC()
16772    mov    r0, rPC              @ arg0
16773    mov    r1, rFP              @ arg1
16774    mov    r2, rSELF            @ arg2
16775    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16776
16777/* ------------------------------ */
16778    .balign 64
16779.L_ALT_OP_SPUT_OBJECT: /* 0x69 */
16780/* File: armv5te/alt_stub.S */
16781/*
16782 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16783 * any interesting requests and then jump to the real instruction
16784 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16785 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16786 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16787 * bail to the real handler if breakFlags==0.
16788 */
16789    ldrb   r3, [rSELF, #offThread_breakFlags]
16790    adrl   lr, dvmAsmInstructionStart + (105 * 64)
16791    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16792    cmp    r3, #0
16793    bxeq   lr                   @ nothing to do - jump to real handler
16794    EXPORT_PC()
16795    mov    r0, rPC              @ arg0
16796    mov    r1, rFP              @ arg1
16797    mov    r2, rSELF            @ arg2
16798    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16799
16800/* ------------------------------ */
16801    .balign 64
16802.L_ALT_OP_SPUT_BOOLEAN: /* 0x6a */
16803/* File: armv5te/alt_stub.S */
16804/*
16805 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16806 * any interesting requests and then jump to the real instruction
16807 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16808 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16809 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16810 * bail to the real handler if breakFlags==0.
16811 */
16812    ldrb   r3, [rSELF, #offThread_breakFlags]
16813    adrl   lr, dvmAsmInstructionStart + (106 * 64)
16814    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16815    cmp    r3, #0
16816    bxeq   lr                   @ nothing to do - jump to real handler
16817    EXPORT_PC()
16818    mov    r0, rPC              @ arg0
16819    mov    r1, rFP              @ arg1
16820    mov    r2, rSELF            @ arg2
16821    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16822
16823/* ------------------------------ */
16824    .balign 64
16825.L_ALT_OP_SPUT_BYTE: /* 0x6b */
16826/* File: armv5te/alt_stub.S */
16827/*
16828 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16829 * any interesting requests and then jump to the real instruction
16830 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16831 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16832 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16833 * bail to the real handler if breakFlags==0.
16834 */
16835    ldrb   r3, [rSELF, #offThread_breakFlags]
16836    adrl   lr, dvmAsmInstructionStart + (107 * 64)
16837    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16838    cmp    r3, #0
16839    bxeq   lr                   @ nothing to do - jump to real handler
16840    EXPORT_PC()
16841    mov    r0, rPC              @ arg0
16842    mov    r1, rFP              @ arg1
16843    mov    r2, rSELF            @ arg2
16844    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16845
16846/* ------------------------------ */
16847    .balign 64
16848.L_ALT_OP_SPUT_CHAR: /* 0x6c */
16849/* File: armv5te/alt_stub.S */
16850/*
16851 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16852 * any interesting requests and then jump to the real instruction
16853 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16854 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16855 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16856 * bail to the real handler if breakFlags==0.
16857 */
16858    ldrb   r3, [rSELF, #offThread_breakFlags]
16859    adrl   lr, dvmAsmInstructionStart + (108 * 64)
16860    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16861    cmp    r3, #0
16862    bxeq   lr                   @ nothing to do - jump to real handler
16863    EXPORT_PC()
16864    mov    r0, rPC              @ arg0
16865    mov    r1, rFP              @ arg1
16866    mov    r2, rSELF            @ arg2
16867    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16868
16869/* ------------------------------ */
16870    .balign 64
16871.L_ALT_OP_SPUT_SHORT: /* 0x6d */
16872/* File: armv5te/alt_stub.S */
16873/*
16874 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16875 * any interesting requests and then jump to the real instruction
16876 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16877 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16878 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16879 * bail to the real handler if breakFlags==0.
16880 */
16881    ldrb   r3, [rSELF, #offThread_breakFlags]
16882    adrl   lr, dvmAsmInstructionStart + (109 * 64)
16883    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16884    cmp    r3, #0
16885    bxeq   lr                   @ nothing to do - jump to real handler
16886    EXPORT_PC()
16887    mov    r0, rPC              @ arg0
16888    mov    r1, rFP              @ arg1
16889    mov    r2, rSELF            @ arg2
16890    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16891
16892/* ------------------------------ */
16893    .balign 64
16894.L_ALT_OP_INVOKE_VIRTUAL: /* 0x6e */
16895/* File: armv5te/alt_stub.S */
16896/*
16897 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16898 * any interesting requests and then jump to the real instruction
16899 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16900 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16901 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16902 * bail to the real handler if breakFlags==0.
16903 */
16904    ldrb   r3, [rSELF, #offThread_breakFlags]
16905    adrl   lr, dvmAsmInstructionStart + (110 * 64)
16906    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16907    cmp    r3, #0
16908    bxeq   lr                   @ nothing to do - jump to real handler
16909    EXPORT_PC()
16910    mov    r0, rPC              @ arg0
16911    mov    r1, rFP              @ arg1
16912    mov    r2, rSELF            @ arg2
16913    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16914
16915/* ------------------------------ */
16916    .balign 64
16917.L_ALT_OP_INVOKE_SUPER: /* 0x6f */
16918/* File: armv5te/alt_stub.S */
16919/*
16920 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16921 * any interesting requests and then jump to the real instruction
16922 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16923 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16924 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16925 * bail to the real handler if breakFlags==0.
16926 */
16927    ldrb   r3, [rSELF, #offThread_breakFlags]
16928    adrl   lr, dvmAsmInstructionStart + (111 * 64)
16929    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16930    cmp    r3, #0
16931    bxeq   lr                   @ nothing to do - jump to real handler
16932    EXPORT_PC()
16933    mov    r0, rPC              @ arg0
16934    mov    r1, rFP              @ arg1
16935    mov    r2, rSELF            @ arg2
16936    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16937
16938/* ------------------------------ */
16939    .balign 64
16940.L_ALT_OP_INVOKE_DIRECT: /* 0x70 */
16941/* File: armv5te/alt_stub.S */
16942/*
16943 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16944 * any interesting requests and then jump to the real instruction
16945 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16946 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16947 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16948 * bail to the real handler if breakFlags==0.
16949 */
16950    ldrb   r3, [rSELF, #offThread_breakFlags]
16951    adrl   lr, dvmAsmInstructionStart + (112 * 64)
16952    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16953    cmp    r3, #0
16954    bxeq   lr                   @ nothing to do - jump to real handler
16955    EXPORT_PC()
16956    mov    r0, rPC              @ arg0
16957    mov    r1, rFP              @ arg1
16958    mov    r2, rSELF            @ arg2
16959    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16960
16961/* ------------------------------ */
16962    .balign 64
16963.L_ALT_OP_INVOKE_STATIC: /* 0x71 */
16964/* File: armv5te/alt_stub.S */
16965/*
16966 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16967 * any interesting requests and then jump to the real instruction
16968 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16969 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16970 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16971 * bail to the real handler if breakFlags==0.
16972 */
16973    ldrb   r3, [rSELF, #offThread_breakFlags]
16974    adrl   lr, dvmAsmInstructionStart + (113 * 64)
16975    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16976    cmp    r3, #0
16977    bxeq   lr                   @ nothing to do - jump to real handler
16978    EXPORT_PC()
16979    mov    r0, rPC              @ arg0
16980    mov    r1, rFP              @ arg1
16981    mov    r2, rSELF            @ arg2
16982    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16983
16984/* ------------------------------ */
16985    .balign 64
16986.L_ALT_OP_INVOKE_INTERFACE: /* 0x72 */
16987/* File: armv5te/alt_stub.S */
16988/*
16989 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16990 * any interesting requests and then jump to the real instruction
16991 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16992 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16993 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16994 * bail to the real handler if breakFlags==0.
16995 */
16996    ldrb   r3, [rSELF, #offThread_breakFlags]
16997    adrl   lr, dvmAsmInstructionStart + (114 * 64)
16998    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16999    cmp    r3, #0
17000    bxeq   lr                   @ nothing to do - jump to real handler
17001    EXPORT_PC()
17002    mov    r0, rPC              @ arg0
17003    mov    r1, rFP              @ arg1
17004    mov    r2, rSELF            @ arg2
17005    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17006
17007/* ------------------------------ */
17008    .balign 64
17009.L_ALT_OP_UNUSED_73: /* 0x73 */
17010/* File: armv5te/alt_stub.S */
17011/*
17012 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17013 * any interesting requests and then jump to the real instruction
17014 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17015 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17016 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17017 * bail to the real handler if breakFlags==0.
17018 */
17019    ldrb   r3, [rSELF, #offThread_breakFlags]
17020    adrl   lr, dvmAsmInstructionStart + (115 * 64)
17021    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17022    cmp    r3, #0
17023    bxeq   lr                   @ nothing to do - jump to real handler
17024    EXPORT_PC()
17025    mov    r0, rPC              @ arg0
17026    mov    r1, rFP              @ arg1
17027    mov    r2, rSELF            @ arg2
17028    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17029
17030/* ------------------------------ */
17031    .balign 64
17032.L_ALT_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
17033/* File: armv5te/alt_stub.S */
17034/*
17035 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17036 * any interesting requests and then jump to the real instruction
17037 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17038 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17039 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17040 * bail to the real handler if breakFlags==0.
17041 */
17042    ldrb   r3, [rSELF, #offThread_breakFlags]
17043    adrl   lr, dvmAsmInstructionStart + (116 * 64)
17044    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17045    cmp    r3, #0
17046    bxeq   lr                   @ nothing to do - jump to real handler
17047    EXPORT_PC()
17048    mov    r0, rPC              @ arg0
17049    mov    r1, rFP              @ arg1
17050    mov    r2, rSELF            @ arg2
17051    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17052
17053/* ------------------------------ */
17054    .balign 64
17055.L_ALT_OP_INVOKE_SUPER_RANGE: /* 0x75 */
17056/* File: armv5te/alt_stub.S */
17057/*
17058 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17059 * any interesting requests and then jump to the real instruction
17060 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17061 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17062 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17063 * bail to the real handler if breakFlags==0.
17064 */
17065    ldrb   r3, [rSELF, #offThread_breakFlags]
17066    adrl   lr, dvmAsmInstructionStart + (117 * 64)
17067    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17068    cmp    r3, #0
17069    bxeq   lr                   @ nothing to do - jump to real handler
17070    EXPORT_PC()
17071    mov    r0, rPC              @ arg0
17072    mov    r1, rFP              @ arg1
17073    mov    r2, rSELF            @ arg2
17074    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17075
17076/* ------------------------------ */
17077    .balign 64
17078.L_ALT_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
17079/* File: armv5te/alt_stub.S */
17080/*
17081 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17082 * any interesting requests and then jump to the real instruction
17083 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17084 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17085 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17086 * bail to the real handler if breakFlags==0.
17087 */
17088    ldrb   r3, [rSELF, #offThread_breakFlags]
17089    adrl   lr, dvmAsmInstructionStart + (118 * 64)
17090    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17091    cmp    r3, #0
17092    bxeq   lr                   @ nothing to do - jump to real handler
17093    EXPORT_PC()
17094    mov    r0, rPC              @ arg0
17095    mov    r1, rFP              @ arg1
17096    mov    r2, rSELF            @ arg2
17097    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17098
17099/* ------------------------------ */
17100    .balign 64
17101.L_ALT_OP_INVOKE_STATIC_RANGE: /* 0x77 */
17102/* File: armv5te/alt_stub.S */
17103/*
17104 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17105 * any interesting requests and then jump to the real instruction
17106 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17107 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17108 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17109 * bail to the real handler if breakFlags==0.
17110 */
17111    ldrb   r3, [rSELF, #offThread_breakFlags]
17112    adrl   lr, dvmAsmInstructionStart + (119 * 64)
17113    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17114    cmp    r3, #0
17115    bxeq   lr                   @ nothing to do - jump to real handler
17116    EXPORT_PC()
17117    mov    r0, rPC              @ arg0
17118    mov    r1, rFP              @ arg1
17119    mov    r2, rSELF            @ arg2
17120    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17121
17122/* ------------------------------ */
17123    .balign 64
17124.L_ALT_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
17125/* File: armv5te/alt_stub.S */
17126/*
17127 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17128 * any interesting requests and then jump to the real instruction
17129 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17130 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17131 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17132 * bail to the real handler if breakFlags==0.
17133 */
17134    ldrb   r3, [rSELF, #offThread_breakFlags]
17135    adrl   lr, dvmAsmInstructionStart + (120 * 64)
17136    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17137    cmp    r3, #0
17138    bxeq   lr                   @ nothing to do - jump to real handler
17139    EXPORT_PC()
17140    mov    r0, rPC              @ arg0
17141    mov    r1, rFP              @ arg1
17142    mov    r2, rSELF            @ arg2
17143    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17144
17145/* ------------------------------ */
17146    .balign 64
17147.L_ALT_OP_UNUSED_79: /* 0x79 */
17148/* File: armv5te/alt_stub.S */
17149/*
17150 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17151 * any interesting requests and then jump to the real instruction
17152 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17153 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17154 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17155 * bail to the real handler if breakFlags==0.
17156 */
17157    ldrb   r3, [rSELF, #offThread_breakFlags]
17158    adrl   lr, dvmAsmInstructionStart + (121 * 64)
17159    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17160    cmp    r3, #0
17161    bxeq   lr                   @ nothing to do - jump to real handler
17162    EXPORT_PC()
17163    mov    r0, rPC              @ arg0
17164    mov    r1, rFP              @ arg1
17165    mov    r2, rSELF            @ arg2
17166    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17167
17168/* ------------------------------ */
17169    .balign 64
17170.L_ALT_OP_UNUSED_7A: /* 0x7a */
17171/* File: armv5te/alt_stub.S */
17172/*
17173 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17174 * any interesting requests and then jump to the real instruction
17175 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17176 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17177 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17178 * bail to the real handler if breakFlags==0.
17179 */
17180    ldrb   r3, [rSELF, #offThread_breakFlags]
17181    adrl   lr, dvmAsmInstructionStart + (122 * 64)
17182    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17183    cmp    r3, #0
17184    bxeq   lr                   @ nothing to do - jump to real handler
17185    EXPORT_PC()
17186    mov    r0, rPC              @ arg0
17187    mov    r1, rFP              @ arg1
17188    mov    r2, rSELF            @ arg2
17189    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17190
17191/* ------------------------------ */
17192    .balign 64
17193.L_ALT_OP_NEG_INT: /* 0x7b */
17194/* File: armv5te/alt_stub.S */
17195/*
17196 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17197 * any interesting requests and then jump to the real instruction
17198 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17199 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17200 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17201 * bail to the real handler if breakFlags==0.
17202 */
17203    ldrb   r3, [rSELF, #offThread_breakFlags]
17204    adrl   lr, dvmAsmInstructionStart + (123 * 64)
17205    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17206    cmp    r3, #0
17207    bxeq   lr                   @ nothing to do - jump to real handler
17208    EXPORT_PC()
17209    mov    r0, rPC              @ arg0
17210    mov    r1, rFP              @ arg1
17211    mov    r2, rSELF            @ arg2
17212    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17213
17214/* ------------------------------ */
17215    .balign 64
17216.L_ALT_OP_NOT_INT: /* 0x7c */
17217/* File: armv5te/alt_stub.S */
17218/*
17219 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17220 * any interesting requests and then jump to the real instruction
17221 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17222 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17223 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17224 * bail to the real handler if breakFlags==0.
17225 */
17226    ldrb   r3, [rSELF, #offThread_breakFlags]
17227    adrl   lr, dvmAsmInstructionStart + (124 * 64)
17228    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17229    cmp    r3, #0
17230    bxeq   lr                   @ nothing to do - jump to real handler
17231    EXPORT_PC()
17232    mov    r0, rPC              @ arg0
17233    mov    r1, rFP              @ arg1
17234    mov    r2, rSELF            @ arg2
17235    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17236
17237/* ------------------------------ */
17238    .balign 64
17239.L_ALT_OP_NEG_LONG: /* 0x7d */
17240/* File: armv5te/alt_stub.S */
17241/*
17242 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17243 * any interesting requests and then jump to the real instruction
17244 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17245 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17246 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17247 * bail to the real handler if breakFlags==0.
17248 */
17249    ldrb   r3, [rSELF, #offThread_breakFlags]
17250    adrl   lr, dvmAsmInstructionStart + (125 * 64)
17251    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17252    cmp    r3, #0
17253    bxeq   lr                   @ nothing to do - jump to real handler
17254    EXPORT_PC()
17255    mov    r0, rPC              @ arg0
17256    mov    r1, rFP              @ arg1
17257    mov    r2, rSELF            @ arg2
17258    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17259
17260/* ------------------------------ */
17261    .balign 64
17262.L_ALT_OP_NOT_LONG: /* 0x7e */
17263/* File: armv5te/alt_stub.S */
17264/*
17265 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17266 * any interesting requests and then jump to the real instruction
17267 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17268 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17269 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17270 * bail to the real handler if breakFlags==0.
17271 */
17272    ldrb   r3, [rSELF, #offThread_breakFlags]
17273    adrl   lr, dvmAsmInstructionStart + (126 * 64)
17274    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17275    cmp    r3, #0
17276    bxeq   lr                   @ nothing to do - jump to real handler
17277    EXPORT_PC()
17278    mov    r0, rPC              @ arg0
17279    mov    r1, rFP              @ arg1
17280    mov    r2, rSELF            @ arg2
17281    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17282
17283/* ------------------------------ */
17284    .balign 64
17285.L_ALT_OP_NEG_FLOAT: /* 0x7f */
17286/* File: armv5te/alt_stub.S */
17287/*
17288 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17289 * any interesting requests and then jump to the real instruction
17290 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17291 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17292 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17293 * bail to the real handler if breakFlags==0.
17294 */
17295    ldrb   r3, [rSELF, #offThread_breakFlags]
17296    adrl   lr, dvmAsmInstructionStart + (127 * 64)
17297    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17298    cmp    r3, #0
17299    bxeq   lr                   @ nothing to do - jump to real handler
17300    EXPORT_PC()
17301    mov    r0, rPC              @ arg0
17302    mov    r1, rFP              @ arg1
17303    mov    r2, rSELF            @ arg2
17304    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17305
17306/* ------------------------------ */
17307    .balign 64
17308.L_ALT_OP_NEG_DOUBLE: /* 0x80 */
17309/* File: armv5te/alt_stub.S */
17310/*
17311 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17312 * any interesting requests and then jump to the real instruction
17313 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17314 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17315 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17316 * bail to the real handler if breakFlags==0.
17317 */
17318    ldrb   r3, [rSELF, #offThread_breakFlags]
17319    adrl   lr, dvmAsmInstructionStart + (128 * 64)
17320    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17321    cmp    r3, #0
17322    bxeq   lr                   @ nothing to do - jump to real handler
17323    EXPORT_PC()
17324    mov    r0, rPC              @ arg0
17325    mov    r1, rFP              @ arg1
17326    mov    r2, rSELF            @ arg2
17327    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17328
17329/* ------------------------------ */
17330    .balign 64
17331.L_ALT_OP_INT_TO_LONG: /* 0x81 */
17332/* File: armv5te/alt_stub.S */
17333/*
17334 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17335 * any interesting requests and then jump to the real instruction
17336 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17337 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17338 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17339 * bail to the real handler if breakFlags==0.
17340 */
17341    ldrb   r3, [rSELF, #offThread_breakFlags]
17342    adrl   lr, dvmAsmInstructionStart + (129 * 64)
17343    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17344    cmp    r3, #0
17345    bxeq   lr                   @ nothing to do - jump to real handler
17346    EXPORT_PC()
17347    mov    r0, rPC              @ arg0
17348    mov    r1, rFP              @ arg1
17349    mov    r2, rSELF            @ arg2
17350    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17351
17352/* ------------------------------ */
17353    .balign 64
17354.L_ALT_OP_INT_TO_FLOAT: /* 0x82 */
17355/* File: armv5te/alt_stub.S */
17356/*
17357 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17358 * any interesting requests and then jump to the real instruction
17359 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17360 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17361 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17362 * bail to the real handler if breakFlags==0.
17363 */
17364    ldrb   r3, [rSELF, #offThread_breakFlags]
17365    adrl   lr, dvmAsmInstructionStart + (130 * 64)
17366    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17367    cmp    r3, #0
17368    bxeq   lr                   @ nothing to do - jump to real handler
17369    EXPORT_PC()
17370    mov    r0, rPC              @ arg0
17371    mov    r1, rFP              @ arg1
17372    mov    r2, rSELF            @ arg2
17373    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17374
17375/* ------------------------------ */
17376    .balign 64
17377.L_ALT_OP_INT_TO_DOUBLE: /* 0x83 */
17378/* File: armv5te/alt_stub.S */
17379/*
17380 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17381 * any interesting requests and then jump to the real instruction
17382 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17383 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17384 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17385 * bail to the real handler if breakFlags==0.
17386 */
17387    ldrb   r3, [rSELF, #offThread_breakFlags]
17388    adrl   lr, dvmAsmInstructionStart + (131 * 64)
17389    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17390    cmp    r3, #0
17391    bxeq   lr                   @ nothing to do - jump to real handler
17392    EXPORT_PC()
17393    mov    r0, rPC              @ arg0
17394    mov    r1, rFP              @ arg1
17395    mov    r2, rSELF            @ arg2
17396    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17397
17398/* ------------------------------ */
17399    .balign 64
17400.L_ALT_OP_LONG_TO_INT: /* 0x84 */
17401/* File: armv5te/alt_stub.S */
17402/*
17403 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17404 * any interesting requests and then jump to the real instruction
17405 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17406 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17407 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17408 * bail to the real handler if breakFlags==0.
17409 */
17410    ldrb   r3, [rSELF, #offThread_breakFlags]
17411    adrl   lr, dvmAsmInstructionStart + (132 * 64)
17412    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17413    cmp    r3, #0
17414    bxeq   lr                   @ nothing to do - jump to real handler
17415    EXPORT_PC()
17416    mov    r0, rPC              @ arg0
17417    mov    r1, rFP              @ arg1
17418    mov    r2, rSELF            @ arg2
17419    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17420
17421/* ------------------------------ */
17422    .balign 64
17423.L_ALT_OP_LONG_TO_FLOAT: /* 0x85 */
17424/* File: armv5te/alt_stub.S */
17425/*
17426 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17427 * any interesting requests and then jump to the real instruction
17428 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17429 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17430 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17431 * bail to the real handler if breakFlags==0.
17432 */
17433    ldrb   r3, [rSELF, #offThread_breakFlags]
17434    adrl   lr, dvmAsmInstructionStart + (133 * 64)
17435    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17436    cmp    r3, #0
17437    bxeq   lr                   @ nothing to do - jump to real handler
17438    EXPORT_PC()
17439    mov    r0, rPC              @ arg0
17440    mov    r1, rFP              @ arg1
17441    mov    r2, rSELF            @ arg2
17442    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17443
17444/* ------------------------------ */
17445    .balign 64
17446.L_ALT_OP_LONG_TO_DOUBLE: /* 0x86 */
17447/* File: armv5te/alt_stub.S */
17448/*
17449 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17450 * any interesting requests and then jump to the real instruction
17451 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17452 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17453 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17454 * bail to the real handler if breakFlags==0.
17455 */
17456    ldrb   r3, [rSELF, #offThread_breakFlags]
17457    adrl   lr, dvmAsmInstructionStart + (134 * 64)
17458    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17459    cmp    r3, #0
17460    bxeq   lr                   @ nothing to do - jump to real handler
17461    EXPORT_PC()
17462    mov    r0, rPC              @ arg0
17463    mov    r1, rFP              @ arg1
17464    mov    r2, rSELF            @ arg2
17465    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17466
17467/* ------------------------------ */
17468    .balign 64
17469.L_ALT_OP_FLOAT_TO_INT: /* 0x87 */
17470/* File: armv5te/alt_stub.S */
17471/*
17472 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17473 * any interesting requests and then jump to the real instruction
17474 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17475 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17476 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17477 * bail to the real handler if breakFlags==0.
17478 */
17479    ldrb   r3, [rSELF, #offThread_breakFlags]
17480    adrl   lr, dvmAsmInstructionStart + (135 * 64)
17481    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17482    cmp    r3, #0
17483    bxeq   lr                   @ nothing to do - jump to real handler
17484    EXPORT_PC()
17485    mov    r0, rPC              @ arg0
17486    mov    r1, rFP              @ arg1
17487    mov    r2, rSELF            @ arg2
17488    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17489
17490/* ------------------------------ */
17491    .balign 64
17492.L_ALT_OP_FLOAT_TO_LONG: /* 0x88 */
17493/* File: armv5te/alt_stub.S */
17494/*
17495 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17496 * any interesting requests and then jump to the real instruction
17497 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17498 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17499 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17500 * bail to the real handler if breakFlags==0.
17501 */
17502    ldrb   r3, [rSELF, #offThread_breakFlags]
17503    adrl   lr, dvmAsmInstructionStart + (136 * 64)
17504    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17505    cmp    r3, #0
17506    bxeq   lr                   @ nothing to do - jump to real handler
17507    EXPORT_PC()
17508    mov    r0, rPC              @ arg0
17509    mov    r1, rFP              @ arg1
17510    mov    r2, rSELF            @ arg2
17511    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17512
17513/* ------------------------------ */
17514    .balign 64
17515.L_ALT_OP_FLOAT_TO_DOUBLE: /* 0x89 */
17516/* File: armv5te/alt_stub.S */
17517/*
17518 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17519 * any interesting requests and then jump to the real instruction
17520 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17521 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17522 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17523 * bail to the real handler if breakFlags==0.
17524 */
17525    ldrb   r3, [rSELF, #offThread_breakFlags]
17526    adrl   lr, dvmAsmInstructionStart + (137 * 64)
17527    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17528    cmp    r3, #0
17529    bxeq   lr                   @ nothing to do - jump to real handler
17530    EXPORT_PC()
17531    mov    r0, rPC              @ arg0
17532    mov    r1, rFP              @ arg1
17533    mov    r2, rSELF            @ arg2
17534    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17535
17536/* ------------------------------ */
17537    .balign 64
17538.L_ALT_OP_DOUBLE_TO_INT: /* 0x8a */
17539/* File: armv5te/alt_stub.S */
17540/*
17541 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17542 * any interesting requests and then jump to the real instruction
17543 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17544 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17545 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17546 * bail to the real handler if breakFlags==0.
17547 */
17548    ldrb   r3, [rSELF, #offThread_breakFlags]
17549    adrl   lr, dvmAsmInstructionStart + (138 * 64)
17550    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17551    cmp    r3, #0
17552    bxeq   lr                   @ nothing to do - jump to real handler
17553    EXPORT_PC()
17554    mov    r0, rPC              @ arg0
17555    mov    r1, rFP              @ arg1
17556    mov    r2, rSELF            @ arg2
17557    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17558
17559/* ------------------------------ */
17560    .balign 64
17561.L_ALT_OP_DOUBLE_TO_LONG: /* 0x8b */
17562/* File: armv5te/alt_stub.S */
17563/*
17564 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17565 * any interesting requests and then jump to the real instruction
17566 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17567 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17568 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17569 * bail to the real handler if breakFlags==0.
17570 */
17571    ldrb   r3, [rSELF, #offThread_breakFlags]
17572    adrl   lr, dvmAsmInstructionStart + (139 * 64)
17573    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17574    cmp    r3, #0
17575    bxeq   lr                   @ nothing to do - jump to real handler
17576    EXPORT_PC()
17577    mov    r0, rPC              @ arg0
17578    mov    r1, rFP              @ arg1
17579    mov    r2, rSELF            @ arg2
17580    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17581
17582/* ------------------------------ */
17583    .balign 64
17584.L_ALT_OP_DOUBLE_TO_FLOAT: /* 0x8c */
17585/* File: armv5te/alt_stub.S */
17586/*
17587 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17588 * any interesting requests and then jump to the real instruction
17589 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17590 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17591 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17592 * bail to the real handler if breakFlags==0.
17593 */
17594    ldrb   r3, [rSELF, #offThread_breakFlags]
17595    adrl   lr, dvmAsmInstructionStart + (140 * 64)
17596    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17597    cmp    r3, #0
17598    bxeq   lr                   @ nothing to do - jump to real handler
17599    EXPORT_PC()
17600    mov    r0, rPC              @ arg0
17601    mov    r1, rFP              @ arg1
17602    mov    r2, rSELF            @ arg2
17603    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17604
17605/* ------------------------------ */
17606    .balign 64
17607.L_ALT_OP_INT_TO_BYTE: /* 0x8d */
17608/* File: armv5te/alt_stub.S */
17609/*
17610 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17611 * any interesting requests and then jump to the real instruction
17612 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17613 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17614 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17615 * bail to the real handler if breakFlags==0.
17616 */
17617    ldrb   r3, [rSELF, #offThread_breakFlags]
17618    adrl   lr, dvmAsmInstructionStart + (141 * 64)
17619    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17620    cmp    r3, #0
17621    bxeq   lr                   @ nothing to do - jump to real handler
17622    EXPORT_PC()
17623    mov    r0, rPC              @ arg0
17624    mov    r1, rFP              @ arg1
17625    mov    r2, rSELF            @ arg2
17626    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17627
17628/* ------------------------------ */
17629    .balign 64
17630.L_ALT_OP_INT_TO_CHAR: /* 0x8e */
17631/* File: armv5te/alt_stub.S */
17632/*
17633 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17634 * any interesting requests and then jump to the real instruction
17635 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17636 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17637 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17638 * bail to the real handler if breakFlags==0.
17639 */
17640    ldrb   r3, [rSELF, #offThread_breakFlags]
17641    adrl   lr, dvmAsmInstructionStart + (142 * 64)
17642    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17643    cmp    r3, #0
17644    bxeq   lr                   @ nothing to do - jump to real handler
17645    EXPORT_PC()
17646    mov    r0, rPC              @ arg0
17647    mov    r1, rFP              @ arg1
17648    mov    r2, rSELF            @ arg2
17649    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17650
17651/* ------------------------------ */
17652    .balign 64
17653.L_ALT_OP_INT_TO_SHORT: /* 0x8f */
17654/* File: armv5te/alt_stub.S */
17655/*
17656 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17657 * any interesting requests and then jump to the real instruction
17658 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17659 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17660 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17661 * bail to the real handler if breakFlags==0.
17662 */
17663    ldrb   r3, [rSELF, #offThread_breakFlags]
17664    adrl   lr, dvmAsmInstructionStart + (143 * 64)
17665    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17666    cmp    r3, #0
17667    bxeq   lr                   @ nothing to do - jump to real handler
17668    EXPORT_PC()
17669    mov    r0, rPC              @ arg0
17670    mov    r1, rFP              @ arg1
17671    mov    r2, rSELF            @ arg2
17672    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17673
17674/* ------------------------------ */
17675    .balign 64
17676.L_ALT_OP_ADD_INT: /* 0x90 */
17677/* File: armv5te/alt_stub.S */
17678/*
17679 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17680 * any interesting requests and then jump to the real instruction
17681 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17682 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17683 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17684 * bail to the real handler if breakFlags==0.
17685 */
17686    ldrb   r3, [rSELF, #offThread_breakFlags]
17687    adrl   lr, dvmAsmInstructionStart + (144 * 64)
17688    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17689    cmp    r3, #0
17690    bxeq   lr                   @ nothing to do - jump to real handler
17691    EXPORT_PC()
17692    mov    r0, rPC              @ arg0
17693    mov    r1, rFP              @ arg1
17694    mov    r2, rSELF            @ arg2
17695    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17696
17697/* ------------------------------ */
17698    .balign 64
17699.L_ALT_OP_SUB_INT: /* 0x91 */
17700/* File: armv5te/alt_stub.S */
17701/*
17702 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17703 * any interesting requests and then jump to the real instruction
17704 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17705 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17706 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17707 * bail to the real handler if breakFlags==0.
17708 */
17709    ldrb   r3, [rSELF, #offThread_breakFlags]
17710    adrl   lr, dvmAsmInstructionStart + (145 * 64)
17711    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17712    cmp    r3, #0
17713    bxeq   lr                   @ nothing to do - jump to real handler
17714    EXPORT_PC()
17715    mov    r0, rPC              @ arg0
17716    mov    r1, rFP              @ arg1
17717    mov    r2, rSELF            @ arg2
17718    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17719
17720/* ------------------------------ */
17721    .balign 64
17722.L_ALT_OP_MUL_INT: /* 0x92 */
17723/* File: armv5te/alt_stub.S */
17724/*
17725 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17726 * any interesting requests and then jump to the real instruction
17727 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17728 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17729 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17730 * bail to the real handler if breakFlags==0.
17731 */
17732    ldrb   r3, [rSELF, #offThread_breakFlags]
17733    adrl   lr, dvmAsmInstructionStart + (146 * 64)
17734    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17735    cmp    r3, #0
17736    bxeq   lr                   @ nothing to do - jump to real handler
17737    EXPORT_PC()
17738    mov    r0, rPC              @ arg0
17739    mov    r1, rFP              @ arg1
17740    mov    r2, rSELF            @ arg2
17741    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17742
17743/* ------------------------------ */
17744    .balign 64
17745.L_ALT_OP_DIV_INT: /* 0x93 */
17746/* File: armv5te/alt_stub.S */
17747/*
17748 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17749 * any interesting requests and then jump to the real instruction
17750 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17751 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17752 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17753 * bail to the real handler if breakFlags==0.
17754 */
17755    ldrb   r3, [rSELF, #offThread_breakFlags]
17756    adrl   lr, dvmAsmInstructionStart + (147 * 64)
17757    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17758    cmp    r3, #0
17759    bxeq   lr                   @ nothing to do - jump to real handler
17760    EXPORT_PC()
17761    mov    r0, rPC              @ arg0
17762    mov    r1, rFP              @ arg1
17763    mov    r2, rSELF            @ arg2
17764    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17765
17766/* ------------------------------ */
17767    .balign 64
17768.L_ALT_OP_REM_INT: /* 0x94 */
17769/* File: armv5te/alt_stub.S */
17770/*
17771 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17772 * any interesting requests and then jump to the real instruction
17773 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17774 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17775 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17776 * bail to the real handler if breakFlags==0.
17777 */
17778    ldrb   r3, [rSELF, #offThread_breakFlags]
17779    adrl   lr, dvmAsmInstructionStart + (148 * 64)
17780    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17781    cmp    r3, #0
17782    bxeq   lr                   @ nothing to do - jump to real handler
17783    EXPORT_PC()
17784    mov    r0, rPC              @ arg0
17785    mov    r1, rFP              @ arg1
17786    mov    r2, rSELF            @ arg2
17787    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17788
17789/* ------------------------------ */
17790    .balign 64
17791.L_ALT_OP_AND_INT: /* 0x95 */
17792/* File: armv5te/alt_stub.S */
17793/*
17794 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17795 * any interesting requests and then jump to the real instruction
17796 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17797 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17798 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17799 * bail to the real handler if breakFlags==0.
17800 */
17801    ldrb   r3, [rSELF, #offThread_breakFlags]
17802    adrl   lr, dvmAsmInstructionStart + (149 * 64)
17803    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17804    cmp    r3, #0
17805    bxeq   lr                   @ nothing to do - jump to real handler
17806    EXPORT_PC()
17807    mov    r0, rPC              @ arg0
17808    mov    r1, rFP              @ arg1
17809    mov    r2, rSELF            @ arg2
17810    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17811
17812/* ------------------------------ */
17813    .balign 64
17814.L_ALT_OP_OR_INT: /* 0x96 */
17815/* File: armv5te/alt_stub.S */
17816/*
17817 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17818 * any interesting requests and then jump to the real instruction
17819 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17820 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17821 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17822 * bail to the real handler if breakFlags==0.
17823 */
17824    ldrb   r3, [rSELF, #offThread_breakFlags]
17825    adrl   lr, dvmAsmInstructionStart + (150 * 64)
17826    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17827    cmp    r3, #0
17828    bxeq   lr                   @ nothing to do - jump to real handler
17829    EXPORT_PC()
17830    mov    r0, rPC              @ arg0
17831    mov    r1, rFP              @ arg1
17832    mov    r2, rSELF            @ arg2
17833    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17834
17835/* ------------------------------ */
17836    .balign 64
17837.L_ALT_OP_XOR_INT: /* 0x97 */
17838/* File: armv5te/alt_stub.S */
17839/*
17840 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17841 * any interesting requests and then jump to the real instruction
17842 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17843 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17844 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17845 * bail to the real handler if breakFlags==0.
17846 */
17847    ldrb   r3, [rSELF, #offThread_breakFlags]
17848    adrl   lr, dvmAsmInstructionStart + (151 * 64)
17849    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17850    cmp    r3, #0
17851    bxeq   lr                   @ nothing to do - jump to real handler
17852    EXPORT_PC()
17853    mov    r0, rPC              @ arg0
17854    mov    r1, rFP              @ arg1
17855    mov    r2, rSELF            @ arg2
17856    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17857
17858/* ------------------------------ */
17859    .balign 64
17860.L_ALT_OP_SHL_INT: /* 0x98 */
17861/* File: armv5te/alt_stub.S */
17862/*
17863 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17864 * any interesting requests and then jump to the real instruction
17865 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17866 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17867 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17868 * bail to the real handler if breakFlags==0.
17869 */
17870    ldrb   r3, [rSELF, #offThread_breakFlags]
17871    adrl   lr, dvmAsmInstructionStart + (152 * 64)
17872    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17873    cmp    r3, #0
17874    bxeq   lr                   @ nothing to do - jump to real handler
17875    EXPORT_PC()
17876    mov    r0, rPC              @ arg0
17877    mov    r1, rFP              @ arg1
17878    mov    r2, rSELF            @ arg2
17879    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17880
17881/* ------------------------------ */
17882    .balign 64
17883.L_ALT_OP_SHR_INT: /* 0x99 */
17884/* File: armv5te/alt_stub.S */
17885/*
17886 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17887 * any interesting requests and then jump to the real instruction
17888 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17889 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17890 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17891 * bail to the real handler if breakFlags==0.
17892 */
17893    ldrb   r3, [rSELF, #offThread_breakFlags]
17894    adrl   lr, dvmAsmInstructionStart + (153 * 64)
17895    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17896    cmp    r3, #0
17897    bxeq   lr                   @ nothing to do - jump to real handler
17898    EXPORT_PC()
17899    mov    r0, rPC              @ arg0
17900    mov    r1, rFP              @ arg1
17901    mov    r2, rSELF            @ arg2
17902    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17903
17904/* ------------------------------ */
17905    .balign 64
17906.L_ALT_OP_USHR_INT: /* 0x9a */
17907/* File: armv5te/alt_stub.S */
17908/*
17909 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17910 * any interesting requests and then jump to the real instruction
17911 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17912 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17913 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17914 * bail to the real handler if breakFlags==0.
17915 */
17916    ldrb   r3, [rSELF, #offThread_breakFlags]
17917    adrl   lr, dvmAsmInstructionStart + (154 * 64)
17918    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17919    cmp    r3, #0
17920    bxeq   lr                   @ nothing to do - jump to real handler
17921    EXPORT_PC()
17922    mov    r0, rPC              @ arg0
17923    mov    r1, rFP              @ arg1
17924    mov    r2, rSELF            @ arg2
17925    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17926
17927/* ------------------------------ */
17928    .balign 64
17929.L_ALT_OP_ADD_LONG: /* 0x9b */
17930/* File: armv5te/alt_stub.S */
17931/*
17932 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17933 * any interesting requests and then jump to the real instruction
17934 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17935 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17936 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17937 * bail to the real handler if breakFlags==0.
17938 */
17939    ldrb   r3, [rSELF, #offThread_breakFlags]
17940    adrl   lr, dvmAsmInstructionStart + (155 * 64)
17941    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17942    cmp    r3, #0
17943    bxeq   lr                   @ nothing to do - jump to real handler
17944    EXPORT_PC()
17945    mov    r0, rPC              @ arg0
17946    mov    r1, rFP              @ arg1
17947    mov    r2, rSELF            @ arg2
17948    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17949
17950/* ------------------------------ */
17951    .balign 64
17952.L_ALT_OP_SUB_LONG: /* 0x9c */
17953/* File: armv5te/alt_stub.S */
17954/*
17955 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17956 * any interesting requests and then jump to the real instruction
17957 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17958 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17959 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17960 * bail to the real handler if breakFlags==0.
17961 */
17962    ldrb   r3, [rSELF, #offThread_breakFlags]
17963    adrl   lr, dvmAsmInstructionStart + (156 * 64)
17964    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17965    cmp    r3, #0
17966    bxeq   lr                   @ nothing to do - jump to real handler
17967    EXPORT_PC()
17968    mov    r0, rPC              @ arg0
17969    mov    r1, rFP              @ arg1
17970    mov    r2, rSELF            @ arg2
17971    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17972
17973/* ------------------------------ */
17974    .balign 64
17975.L_ALT_OP_MUL_LONG: /* 0x9d */
17976/* File: armv5te/alt_stub.S */
17977/*
17978 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17979 * any interesting requests and then jump to the real instruction
17980 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17981 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17982 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17983 * bail to the real handler if breakFlags==0.
17984 */
17985    ldrb   r3, [rSELF, #offThread_breakFlags]
17986    adrl   lr, dvmAsmInstructionStart + (157 * 64)
17987    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17988    cmp    r3, #0
17989    bxeq   lr                   @ nothing to do - jump to real handler
17990    EXPORT_PC()
17991    mov    r0, rPC              @ arg0
17992    mov    r1, rFP              @ arg1
17993    mov    r2, rSELF            @ arg2
17994    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17995
17996/* ------------------------------ */
17997    .balign 64
17998.L_ALT_OP_DIV_LONG: /* 0x9e */
17999/* File: armv5te/alt_stub.S */
18000/*
18001 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18002 * any interesting requests and then jump to the real instruction
18003 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18004 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18005 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18006 * bail to the real handler if breakFlags==0.
18007 */
18008    ldrb   r3, [rSELF, #offThread_breakFlags]
18009    adrl   lr, dvmAsmInstructionStart + (158 * 64)
18010    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18011    cmp    r3, #0
18012    bxeq   lr                   @ nothing to do - jump to real handler
18013    EXPORT_PC()
18014    mov    r0, rPC              @ arg0
18015    mov    r1, rFP              @ arg1
18016    mov    r2, rSELF            @ arg2
18017    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18018
18019/* ------------------------------ */
18020    .balign 64
18021.L_ALT_OP_REM_LONG: /* 0x9f */
18022/* File: armv5te/alt_stub.S */
18023/*
18024 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18025 * any interesting requests and then jump to the real instruction
18026 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18027 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18028 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18029 * bail to the real handler if breakFlags==0.
18030 */
18031    ldrb   r3, [rSELF, #offThread_breakFlags]
18032    adrl   lr, dvmAsmInstructionStart + (159 * 64)
18033    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18034    cmp    r3, #0
18035    bxeq   lr                   @ nothing to do - jump to real handler
18036    EXPORT_PC()
18037    mov    r0, rPC              @ arg0
18038    mov    r1, rFP              @ arg1
18039    mov    r2, rSELF            @ arg2
18040    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18041
18042/* ------------------------------ */
18043    .balign 64
18044.L_ALT_OP_AND_LONG: /* 0xa0 */
18045/* File: armv5te/alt_stub.S */
18046/*
18047 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18048 * any interesting requests and then jump to the real instruction
18049 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18050 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18051 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18052 * bail to the real handler if breakFlags==0.
18053 */
18054    ldrb   r3, [rSELF, #offThread_breakFlags]
18055    adrl   lr, dvmAsmInstructionStart + (160 * 64)
18056    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18057    cmp    r3, #0
18058    bxeq   lr                   @ nothing to do - jump to real handler
18059    EXPORT_PC()
18060    mov    r0, rPC              @ arg0
18061    mov    r1, rFP              @ arg1
18062    mov    r2, rSELF            @ arg2
18063    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18064
18065/* ------------------------------ */
18066    .balign 64
18067.L_ALT_OP_OR_LONG: /* 0xa1 */
18068/* File: armv5te/alt_stub.S */
18069/*
18070 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18071 * any interesting requests and then jump to the real instruction
18072 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18073 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18074 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18075 * bail to the real handler if breakFlags==0.
18076 */
18077    ldrb   r3, [rSELF, #offThread_breakFlags]
18078    adrl   lr, dvmAsmInstructionStart + (161 * 64)
18079    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18080    cmp    r3, #0
18081    bxeq   lr                   @ nothing to do - jump to real handler
18082    EXPORT_PC()
18083    mov    r0, rPC              @ arg0
18084    mov    r1, rFP              @ arg1
18085    mov    r2, rSELF            @ arg2
18086    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18087
18088/* ------------------------------ */
18089    .balign 64
18090.L_ALT_OP_XOR_LONG: /* 0xa2 */
18091/* File: armv5te/alt_stub.S */
18092/*
18093 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18094 * any interesting requests and then jump to the real instruction
18095 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18096 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18097 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18098 * bail to the real handler if breakFlags==0.
18099 */
18100    ldrb   r3, [rSELF, #offThread_breakFlags]
18101    adrl   lr, dvmAsmInstructionStart + (162 * 64)
18102    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18103    cmp    r3, #0
18104    bxeq   lr                   @ nothing to do - jump to real handler
18105    EXPORT_PC()
18106    mov    r0, rPC              @ arg0
18107    mov    r1, rFP              @ arg1
18108    mov    r2, rSELF            @ arg2
18109    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18110
18111/* ------------------------------ */
18112    .balign 64
18113.L_ALT_OP_SHL_LONG: /* 0xa3 */
18114/* File: armv5te/alt_stub.S */
18115/*
18116 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18117 * any interesting requests and then jump to the real instruction
18118 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18119 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18120 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18121 * bail to the real handler if breakFlags==0.
18122 */
18123    ldrb   r3, [rSELF, #offThread_breakFlags]
18124    adrl   lr, dvmAsmInstructionStart + (163 * 64)
18125    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18126    cmp    r3, #0
18127    bxeq   lr                   @ nothing to do - jump to real handler
18128    EXPORT_PC()
18129    mov    r0, rPC              @ arg0
18130    mov    r1, rFP              @ arg1
18131    mov    r2, rSELF            @ arg2
18132    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18133
18134/* ------------------------------ */
18135    .balign 64
18136.L_ALT_OP_SHR_LONG: /* 0xa4 */
18137/* File: armv5te/alt_stub.S */
18138/*
18139 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18140 * any interesting requests and then jump to the real instruction
18141 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18142 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18143 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18144 * bail to the real handler if breakFlags==0.
18145 */
18146    ldrb   r3, [rSELF, #offThread_breakFlags]
18147    adrl   lr, dvmAsmInstructionStart + (164 * 64)
18148    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18149    cmp    r3, #0
18150    bxeq   lr                   @ nothing to do - jump to real handler
18151    EXPORT_PC()
18152    mov    r0, rPC              @ arg0
18153    mov    r1, rFP              @ arg1
18154    mov    r2, rSELF            @ arg2
18155    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18156
18157/* ------------------------------ */
18158    .balign 64
18159.L_ALT_OP_USHR_LONG: /* 0xa5 */
18160/* File: armv5te/alt_stub.S */
18161/*
18162 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18163 * any interesting requests and then jump to the real instruction
18164 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18165 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18166 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18167 * bail to the real handler if breakFlags==0.
18168 */
18169    ldrb   r3, [rSELF, #offThread_breakFlags]
18170    adrl   lr, dvmAsmInstructionStart + (165 * 64)
18171    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18172    cmp    r3, #0
18173    bxeq   lr                   @ nothing to do - jump to real handler
18174    EXPORT_PC()
18175    mov    r0, rPC              @ arg0
18176    mov    r1, rFP              @ arg1
18177    mov    r2, rSELF            @ arg2
18178    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18179
18180/* ------------------------------ */
18181    .balign 64
18182.L_ALT_OP_ADD_FLOAT: /* 0xa6 */
18183/* File: armv5te/alt_stub.S */
18184/*
18185 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18186 * any interesting requests and then jump to the real instruction
18187 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18188 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18189 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18190 * bail to the real handler if breakFlags==0.
18191 */
18192    ldrb   r3, [rSELF, #offThread_breakFlags]
18193    adrl   lr, dvmAsmInstructionStart + (166 * 64)
18194    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18195    cmp    r3, #0
18196    bxeq   lr                   @ nothing to do - jump to real handler
18197    EXPORT_PC()
18198    mov    r0, rPC              @ arg0
18199    mov    r1, rFP              @ arg1
18200    mov    r2, rSELF            @ arg2
18201    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18202
18203/* ------------------------------ */
18204    .balign 64
18205.L_ALT_OP_SUB_FLOAT: /* 0xa7 */
18206/* File: armv5te/alt_stub.S */
18207/*
18208 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18209 * any interesting requests and then jump to the real instruction
18210 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18211 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18212 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18213 * bail to the real handler if breakFlags==0.
18214 */
18215    ldrb   r3, [rSELF, #offThread_breakFlags]
18216    adrl   lr, dvmAsmInstructionStart + (167 * 64)
18217    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18218    cmp    r3, #0
18219    bxeq   lr                   @ nothing to do - jump to real handler
18220    EXPORT_PC()
18221    mov    r0, rPC              @ arg0
18222    mov    r1, rFP              @ arg1
18223    mov    r2, rSELF            @ arg2
18224    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18225
18226/* ------------------------------ */
18227    .balign 64
18228.L_ALT_OP_MUL_FLOAT: /* 0xa8 */
18229/* File: armv5te/alt_stub.S */
18230/*
18231 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18232 * any interesting requests and then jump to the real instruction
18233 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18234 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18235 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18236 * bail to the real handler if breakFlags==0.
18237 */
18238    ldrb   r3, [rSELF, #offThread_breakFlags]
18239    adrl   lr, dvmAsmInstructionStart + (168 * 64)
18240    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18241    cmp    r3, #0
18242    bxeq   lr                   @ nothing to do - jump to real handler
18243    EXPORT_PC()
18244    mov    r0, rPC              @ arg0
18245    mov    r1, rFP              @ arg1
18246    mov    r2, rSELF            @ arg2
18247    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18248
18249/* ------------------------------ */
18250    .balign 64
18251.L_ALT_OP_DIV_FLOAT: /* 0xa9 */
18252/* File: armv5te/alt_stub.S */
18253/*
18254 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18255 * any interesting requests and then jump to the real instruction
18256 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18257 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18258 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18259 * bail to the real handler if breakFlags==0.
18260 */
18261    ldrb   r3, [rSELF, #offThread_breakFlags]
18262    adrl   lr, dvmAsmInstructionStart + (169 * 64)
18263    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18264    cmp    r3, #0
18265    bxeq   lr                   @ nothing to do - jump to real handler
18266    EXPORT_PC()
18267    mov    r0, rPC              @ arg0
18268    mov    r1, rFP              @ arg1
18269    mov    r2, rSELF            @ arg2
18270    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18271
18272/* ------------------------------ */
18273    .balign 64
18274.L_ALT_OP_REM_FLOAT: /* 0xaa */
18275/* File: armv5te/alt_stub.S */
18276/*
18277 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18278 * any interesting requests and then jump to the real instruction
18279 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18280 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18281 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18282 * bail to the real handler if breakFlags==0.
18283 */
18284    ldrb   r3, [rSELF, #offThread_breakFlags]
18285    adrl   lr, dvmAsmInstructionStart + (170 * 64)
18286    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18287    cmp    r3, #0
18288    bxeq   lr                   @ nothing to do - jump to real handler
18289    EXPORT_PC()
18290    mov    r0, rPC              @ arg0
18291    mov    r1, rFP              @ arg1
18292    mov    r2, rSELF            @ arg2
18293    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18294
18295/* ------------------------------ */
18296    .balign 64
18297.L_ALT_OP_ADD_DOUBLE: /* 0xab */
18298/* File: armv5te/alt_stub.S */
18299/*
18300 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18301 * any interesting requests and then jump to the real instruction
18302 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18303 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18304 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18305 * bail to the real handler if breakFlags==0.
18306 */
18307    ldrb   r3, [rSELF, #offThread_breakFlags]
18308    adrl   lr, dvmAsmInstructionStart + (171 * 64)
18309    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18310    cmp    r3, #0
18311    bxeq   lr                   @ nothing to do - jump to real handler
18312    EXPORT_PC()
18313    mov    r0, rPC              @ arg0
18314    mov    r1, rFP              @ arg1
18315    mov    r2, rSELF            @ arg2
18316    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18317
18318/* ------------------------------ */
18319    .balign 64
18320.L_ALT_OP_SUB_DOUBLE: /* 0xac */
18321/* File: armv5te/alt_stub.S */
18322/*
18323 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18324 * any interesting requests and then jump to the real instruction
18325 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18326 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18327 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18328 * bail to the real handler if breakFlags==0.
18329 */
18330    ldrb   r3, [rSELF, #offThread_breakFlags]
18331    adrl   lr, dvmAsmInstructionStart + (172 * 64)
18332    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18333    cmp    r3, #0
18334    bxeq   lr                   @ nothing to do - jump to real handler
18335    EXPORT_PC()
18336    mov    r0, rPC              @ arg0
18337    mov    r1, rFP              @ arg1
18338    mov    r2, rSELF            @ arg2
18339    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18340
18341/* ------------------------------ */
18342    .balign 64
18343.L_ALT_OP_MUL_DOUBLE: /* 0xad */
18344/* File: armv5te/alt_stub.S */
18345/*
18346 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18347 * any interesting requests and then jump to the real instruction
18348 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18349 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18350 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18351 * bail to the real handler if breakFlags==0.
18352 */
18353    ldrb   r3, [rSELF, #offThread_breakFlags]
18354    adrl   lr, dvmAsmInstructionStart + (173 * 64)
18355    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18356    cmp    r3, #0
18357    bxeq   lr                   @ nothing to do - jump to real handler
18358    EXPORT_PC()
18359    mov    r0, rPC              @ arg0
18360    mov    r1, rFP              @ arg1
18361    mov    r2, rSELF            @ arg2
18362    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18363
18364/* ------------------------------ */
18365    .balign 64
18366.L_ALT_OP_DIV_DOUBLE: /* 0xae */
18367/* File: armv5te/alt_stub.S */
18368/*
18369 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18370 * any interesting requests and then jump to the real instruction
18371 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18372 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18373 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18374 * bail to the real handler if breakFlags==0.
18375 */
18376    ldrb   r3, [rSELF, #offThread_breakFlags]
18377    adrl   lr, dvmAsmInstructionStart + (174 * 64)
18378    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18379    cmp    r3, #0
18380    bxeq   lr                   @ nothing to do - jump to real handler
18381    EXPORT_PC()
18382    mov    r0, rPC              @ arg0
18383    mov    r1, rFP              @ arg1
18384    mov    r2, rSELF            @ arg2
18385    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18386
18387/* ------------------------------ */
18388    .balign 64
18389.L_ALT_OP_REM_DOUBLE: /* 0xaf */
18390/* File: armv5te/alt_stub.S */
18391/*
18392 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18393 * any interesting requests and then jump to the real instruction
18394 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18395 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18396 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18397 * bail to the real handler if breakFlags==0.
18398 */
18399    ldrb   r3, [rSELF, #offThread_breakFlags]
18400    adrl   lr, dvmAsmInstructionStart + (175 * 64)
18401    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18402    cmp    r3, #0
18403    bxeq   lr                   @ nothing to do - jump to real handler
18404    EXPORT_PC()
18405    mov    r0, rPC              @ arg0
18406    mov    r1, rFP              @ arg1
18407    mov    r2, rSELF            @ arg2
18408    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18409
18410/* ------------------------------ */
18411    .balign 64
18412.L_ALT_OP_ADD_INT_2ADDR: /* 0xb0 */
18413/* File: armv5te/alt_stub.S */
18414/*
18415 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18416 * any interesting requests and then jump to the real instruction
18417 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18418 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18419 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18420 * bail to the real handler if breakFlags==0.
18421 */
18422    ldrb   r3, [rSELF, #offThread_breakFlags]
18423    adrl   lr, dvmAsmInstructionStart + (176 * 64)
18424    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18425    cmp    r3, #0
18426    bxeq   lr                   @ nothing to do - jump to real handler
18427    EXPORT_PC()
18428    mov    r0, rPC              @ arg0
18429    mov    r1, rFP              @ arg1
18430    mov    r2, rSELF            @ arg2
18431    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18432
18433/* ------------------------------ */
18434    .balign 64
18435.L_ALT_OP_SUB_INT_2ADDR: /* 0xb1 */
18436/* File: armv5te/alt_stub.S */
18437/*
18438 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18439 * any interesting requests and then jump to the real instruction
18440 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18441 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18442 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18443 * bail to the real handler if breakFlags==0.
18444 */
18445    ldrb   r3, [rSELF, #offThread_breakFlags]
18446    adrl   lr, dvmAsmInstructionStart + (177 * 64)
18447    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18448    cmp    r3, #0
18449    bxeq   lr                   @ nothing to do - jump to real handler
18450    EXPORT_PC()
18451    mov    r0, rPC              @ arg0
18452    mov    r1, rFP              @ arg1
18453    mov    r2, rSELF            @ arg2
18454    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18455
18456/* ------------------------------ */
18457    .balign 64
18458.L_ALT_OP_MUL_INT_2ADDR: /* 0xb2 */
18459/* File: armv5te/alt_stub.S */
18460/*
18461 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18462 * any interesting requests and then jump to the real instruction
18463 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18464 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18465 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18466 * bail to the real handler if breakFlags==0.
18467 */
18468    ldrb   r3, [rSELF, #offThread_breakFlags]
18469    adrl   lr, dvmAsmInstructionStart + (178 * 64)
18470    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18471    cmp    r3, #0
18472    bxeq   lr                   @ nothing to do - jump to real handler
18473    EXPORT_PC()
18474    mov    r0, rPC              @ arg0
18475    mov    r1, rFP              @ arg1
18476    mov    r2, rSELF            @ arg2
18477    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18478
18479/* ------------------------------ */
18480    .balign 64
18481.L_ALT_OP_DIV_INT_2ADDR: /* 0xb3 */
18482/* File: armv5te/alt_stub.S */
18483/*
18484 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18485 * any interesting requests and then jump to the real instruction
18486 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18487 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18488 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18489 * bail to the real handler if breakFlags==0.
18490 */
18491    ldrb   r3, [rSELF, #offThread_breakFlags]
18492    adrl   lr, dvmAsmInstructionStart + (179 * 64)
18493    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18494    cmp    r3, #0
18495    bxeq   lr                   @ nothing to do - jump to real handler
18496    EXPORT_PC()
18497    mov    r0, rPC              @ arg0
18498    mov    r1, rFP              @ arg1
18499    mov    r2, rSELF            @ arg2
18500    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18501
18502/* ------------------------------ */
18503    .balign 64
18504.L_ALT_OP_REM_INT_2ADDR: /* 0xb4 */
18505/* File: armv5te/alt_stub.S */
18506/*
18507 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18508 * any interesting requests and then jump to the real instruction
18509 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18510 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18511 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18512 * bail to the real handler if breakFlags==0.
18513 */
18514    ldrb   r3, [rSELF, #offThread_breakFlags]
18515    adrl   lr, dvmAsmInstructionStart + (180 * 64)
18516    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18517    cmp    r3, #0
18518    bxeq   lr                   @ nothing to do - jump to real handler
18519    EXPORT_PC()
18520    mov    r0, rPC              @ arg0
18521    mov    r1, rFP              @ arg1
18522    mov    r2, rSELF            @ arg2
18523    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18524
18525/* ------------------------------ */
18526    .balign 64
18527.L_ALT_OP_AND_INT_2ADDR: /* 0xb5 */
18528/* File: armv5te/alt_stub.S */
18529/*
18530 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18531 * any interesting requests and then jump to the real instruction
18532 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18533 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18534 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18535 * bail to the real handler if breakFlags==0.
18536 */
18537    ldrb   r3, [rSELF, #offThread_breakFlags]
18538    adrl   lr, dvmAsmInstructionStart + (181 * 64)
18539    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18540    cmp    r3, #0
18541    bxeq   lr                   @ nothing to do - jump to real handler
18542    EXPORT_PC()
18543    mov    r0, rPC              @ arg0
18544    mov    r1, rFP              @ arg1
18545    mov    r2, rSELF            @ arg2
18546    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18547
18548/* ------------------------------ */
18549    .balign 64
18550.L_ALT_OP_OR_INT_2ADDR: /* 0xb6 */
18551/* File: armv5te/alt_stub.S */
18552/*
18553 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18554 * any interesting requests and then jump to the real instruction
18555 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18556 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18557 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18558 * bail to the real handler if breakFlags==0.
18559 */
18560    ldrb   r3, [rSELF, #offThread_breakFlags]
18561    adrl   lr, dvmAsmInstructionStart + (182 * 64)
18562    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18563    cmp    r3, #0
18564    bxeq   lr                   @ nothing to do - jump to real handler
18565    EXPORT_PC()
18566    mov    r0, rPC              @ arg0
18567    mov    r1, rFP              @ arg1
18568    mov    r2, rSELF            @ arg2
18569    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18570
18571/* ------------------------------ */
18572    .balign 64
18573.L_ALT_OP_XOR_INT_2ADDR: /* 0xb7 */
18574/* File: armv5te/alt_stub.S */
18575/*
18576 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18577 * any interesting requests and then jump to the real instruction
18578 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18579 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18580 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18581 * bail to the real handler if breakFlags==0.
18582 */
18583    ldrb   r3, [rSELF, #offThread_breakFlags]
18584    adrl   lr, dvmAsmInstructionStart + (183 * 64)
18585    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18586    cmp    r3, #0
18587    bxeq   lr                   @ nothing to do - jump to real handler
18588    EXPORT_PC()
18589    mov    r0, rPC              @ arg0
18590    mov    r1, rFP              @ arg1
18591    mov    r2, rSELF            @ arg2
18592    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18593
18594/* ------------------------------ */
18595    .balign 64
18596.L_ALT_OP_SHL_INT_2ADDR: /* 0xb8 */
18597/* File: armv5te/alt_stub.S */
18598/*
18599 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18600 * any interesting requests and then jump to the real instruction
18601 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18602 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18603 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18604 * bail to the real handler if breakFlags==0.
18605 */
18606    ldrb   r3, [rSELF, #offThread_breakFlags]
18607    adrl   lr, dvmAsmInstructionStart + (184 * 64)
18608    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18609    cmp    r3, #0
18610    bxeq   lr                   @ nothing to do - jump to real handler
18611    EXPORT_PC()
18612    mov    r0, rPC              @ arg0
18613    mov    r1, rFP              @ arg1
18614    mov    r2, rSELF            @ arg2
18615    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18616
18617/* ------------------------------ */
18618    .balign 64
18619.L_ALT_OP_SHR_INT_2ADDR: /* 0xb9 */
18620/* File: armv5te/alt_stub.S */
18621/*
18622 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18623 * any interesting requests and then jump to the real instruction
18624 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18625 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18626 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18627 * bail to the real handler if breakFlags==0.
18628 */
18629    ldrb   r3, [rSELF, #offThread_breakFlags]
18630    adrl   lr, dvmAsmInstructionStart + (185 * 64)
18631    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18632    cmp    r3, #0
18633    bxeq   lr                   @ nothing to do - jump to real handler
18634    EXPORT_PC()
18635    mov    r0, rPC              @ arg0
18636    mov    r1, rFP              @ arg1
18637    mov    r2, rSELF            @ arg2
18638    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18639
18640/* ------------------------------ */
18641    .balign 64
18642.L_ALT_OP_USHR_INT_2ADDR: /* 0xba */
18643/* File: armv5te/alt_stub.S */
18644/*
18645 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18646 * any interesting requests and then jump to the real instruction
18647 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18648 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18649 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18650 * bail to the real handler if breakFlags==0.
18651 */
18652    ldrb   r3, [rSELF, #offThread_breakFlags]
18653    adrl   lr, dvmAsmInstructionStart + (186 * 64)
18654    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18655    cmp    r3, #0
18656    bxeq   lr                   @ nothing to do - jump to real handler
18657    EXPORT_PC()
18658    mov    r0, rPC              @ arg0
18659    mov    r1, rFP              @ arg1
18660    mov    r2, rSELF            @ arg2
18661    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18662
18663/* ------------------------------ */
18664    .balign 64
18665.L_ALT_OP_ADD_LONG_2ADDR: /* 0xbb */
18666/* File: armv5te/alt_stub.S */
18667/*
18668 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18669 * any interesting requests and then jump to the real instruction
18670 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18671 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18672 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18673 * bail to the real handler if breakFlags==0.
18674 */
18675    ldrb   r3, [rSELF, #offThread_breakFlags]
18676    adrl   lr, dvmAsmInstructionStart + (187 * 64)
18677    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18678    cmp    r3, #0
18679    bxeq   lr                   @ nothing to do - jump to real handler
18680    EXPORT_PC()
18681    mov    r0, rPC              @ arg0
18682    mov    r1, rFP              @ arg1
18683    mov    r2, rSELF            @ arg2
18684    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18685
18686/* ------------------------------ */
18687    .balign 64
18688.L_ALT_OP_SUB_LONG_2ADDR: /* 0xbc */
18689/* File: armv5te/alt_stub.S */
18690/*
18691 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18692 * any interesting requests and then jump to the real instruction
18693 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18694 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18695 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18696 * bail to the real handler if breakFlags==0.
18697 */
18698    ldrb   r3, [rSELF, #offThread_breakFlags]
18699    adrl   lr, dvmAsmInstructionStart + (188 * 64)
18700    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18701    cmp    r3, #0
18702    bxeq   lr                   @ nothing to do - jump to real handler
18703    EXPORT_PC()
18704    mov    r0, rPC              @ arg0
18705    mov    r1, rFP              @ arg1
18706    mov    r2, rSELF            @ arg2
18707    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18708
18709/* ------------------------------ */
18710    .balign 64
18711.L_ALT_OP_MUL_LONG_2ADDR: /* 0xbd */
18712/* File: armv5te/alt_stub.S */
18713/*
18714 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18715 * any interesting requests and then jump to the real instruction
18716 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18717 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18718 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18719 * bail to the real handler if breakFlags==0.
18720 */
18721    ldrb   r3, [rSELF, #offThread_breakFlags]
18722    adrl   lr, dvmAsmInstructionStart + (189 * 64)
18723    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18724    cmp    r3, #0
18725    bxeq   lr                   @ nothing to do - jump to real handler
18726    EXPORT_PC()
18727    mov    r0, rPC              @ arg0
18728    mov    r1, rFP              @ arg1
18729    mov    r2, rSELF            @ arg2
18730    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18731
18732/* ------------------------------ */
18733    .balign 64
18734.L_ALT_OP_DIV_LONG_2ADDR: /* 0xbe */
18735/* File: armv5te/alt_stub.S */
18736/*
18737 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18738 * any interesting requests and then jump to the real instruction
18739 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18740 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18741 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18742 * bail to the real handler if breakFlags==0.
18743 */
18744    ldrb   r3, [rSELF, #offThread_breakFlags]
18745    adrl   lr, dvmAsmInstructionStart + (190 * 64)
18746    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18747    cmp    r3, #0
18748    bxeq   lr                   @ nothing to do - jump to real handler
18749    EXPORT_PC()
18750    mov    r0, rPC              @ arg0
18751    mov    r1, rFP              @ arg1
18752    mov    r2, rSELF            @ arg2
18753    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18754
18755/* ------------------------------ */
18756    .balign 64
18757.L_ALT_OP_REM_LONG_2ADDR: /* 0xbf */
18758/* File: armv5te/alt_stub.S */
18759/*
18760 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18761 * any interesting requests and then jump to the real instruction
18762 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18763 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18764 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18765 * bail to the real handler if breakFlags==0.
18766 */
18767    ldrb   r3, [rSELF, #offThread_breakFlags]
18768    adrl   lr, dvmAsmInstructionStart + (191 * 64)
18769    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18770    cmp    r3, #0
18771    bxeq   lr                   @ nothing to do - jump to real handler
18772    EXPORT_PC()
18773    mov    r0, rPC              @ arg0
18774    mov    r1, rFP              @ arg1
18775    mov    r2, rSELF            @ arg2
18776    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18777
18778/* ------------------------------ */
18779    .balign 64
18780.L_ALT_OP_AND_LONG_2ADDR: /* 0xc0 */
18781/* File: armv5te/alt_stub.S */
18782/*
18783 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18784 * any interesting requests and then jump to the real instruction
18785 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18786 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18787 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18788 * bail to the real handler if breakFlags==0.
18789 */
18790    ldrb   r3, [rSELF, #offThread_breakFlags]
18791    adrl   lr, dvmAsmInstructionStart + (192 * 64)
18792    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18793    cmp    r3, #0
18794    bxeq   lr                   @ nothing to do - jump to real handler
18795    EXPORT_PC()
18796    mov    r0, rPC              @ arg0
18797    mov    r1, rFP              @ arg1
18798    mov    r2, rSELF            @ arg2
18799    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18800
18801/* ------------------------------ */
18802    .balign 64
18803.L_ALT_OP_OR_LONG_2ADDR: /* 0xc1 */
18804/* File: armv5te/alt_stub.S */
18805/*
18806 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18807 * any interesting requests and then jump to the real instruction
18808 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18809 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18810 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18811 * bail to the real handler if breakFlags==0.
18812 */
18813    ldrb   r3, [rSELF, #offThread_breakFlags]
18814    adrl   lr, dvmAsmInstructionStart + (193 * 64)
18815    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18816    cmp    r3, #0
18817    bxeq   lr                   @ nothing to do - jump to real handler
18818    EXPORT_PC()
18819    mov    r0, rPC              @ arg0
18820    mov    r1, rFP              @ arg1
18821    mov    r2, rSELF            @ arg2
18822    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18823
18824/* ------------------------------ */
18825    .balign 64
18826.L_ALT_OP_XOR_LONG_2ADDR: /* 0xc2 */
18827/* File: armv5te/alt_stub.S */
18828/*
18829 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18830 * any interesting requests and then jump to the real instruction
18831 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18832 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18833 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18834 * bail to the real handler if breakFlags==0.
18835 */
18836    ldrb   r3, [rSELF, #offThread_breakFlags]
18837    adrl   lr, dvmAsmInstructionStart + (194 * 64)
18838    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18839    cmp    r3, #0
18840    bxeq   lr                   @ nothing to do - jump to real handler
18841    EXPORT_PC()
18842    mov    r0, rPC              @ arg0
18843    mov    r1, rFP              @ arg1
18844    mov    r2, rSELF            @ arg2
18845    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18846
18847/* ------------------------------ */
18848    .balign 64
18849.L_ALT_OP_SHL_LONG_2ADDR: /* 0xc3 */
18850/* File: armv5te/alt_stub.S */
18851/*
18852 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18853 * any interesting requests and then jump to the real instruction
18854 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18855 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18856 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18857 * bail to the real handler if breakFlags==0.
18858 */
18859    ldrb   r3, [rSELF, #offThread_breakFlags]
18860    adrl   lr, dvmAsmInstructionStart + (195 * 64)
18861    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18862    cmp    r3, #0
18863    bxeq   lr                   @ nothing to do - jump to real handler
18864    EXPORT_PC()
18865    mov    r0, rPC              @ arg0
18866    mov    r1, rFP              @ arg1
18867    mov    r2, rSELF            @ arg2
18868    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18869
18870/* ------------------------------ */
18871    .balign 64
18872.L_ALT_OP_SHR_LONG_2ADDR: /* 0xc4 */
18873/* File: armv5te/alt_stub.S */
18874/*
18875 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18876 * any interesting requests and then jump to the real instruction
18877 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18878 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18879 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18880 * bail to the real handler if breakFlags==0.
18881 */
18882    ldrb   r3, [rSELF, #offThread_breakFlags]
18883    adrl   lr, dvmAsmInstructionStart + (196 * 64)
18884    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18885    cmp    r3, #0
18886    bxeq   lr                   @ nothing to do - jump to real handler
18887    EXPORT_PC()
18888    mov    r0, rPC              @ arg0
18889    mov    r1, rFP              @ arg1
18890    mov    r2, rSELF            @ arg2
18891    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18892
18893/* ------------------------------ */
18894    .balign 64
18895.L_ALT_OP_USHR_LONG_2ADDR: /* 0xc5 */
18896/* File: armv5te/alt_stub.S */
18897/*
18898 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18899 * any interesting requests and then jump to the real instruction
18900 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18901 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18902 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18903 * bail to the real handler if breakFlags==0.
18904 */
18905    ldrb   r3, [rSELF, #offThread_breakFlags]
18906    adrl   lr, dvmAsmInstructionStart + (197 * 64)
18907    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18908    cmp    r3, #0
18909    bxeq   lr                   @ nothing to do - jump to real handler
18910    EXPORT_PC()
18911    mov    r0, rPC              @ arg0
18912    mov    r1, rFP              @ arg1
18913    mov    r2, rSELF            @ arg2
18914    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18915
18916/* ------------------------------ */
18917    .balign 64
18918.L_ALT_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
18919/* File: armv5te/alt_stub.S */
18920/*
18921 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18922 * any interesting requests and then jump to the real instruction
18923 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18924 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18925 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18926 * bail to the real handler if breakFlags==0.
18927 */
18928    ldrb   r3, [rSELF, #offThread_breakFlags]
18929    adrl   lr, dvmAsmInstructionStart + (198 * 64)
18930    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18931    cmp    r3, #0
18932    bxeq   lr                   @ nothing to do - jump to real handler
18933    EXPORT_PC()
18934    mov    r0, rPC              @ arg0
18935    mov    r1, rFP              @ arg1
18936    mov    r2, rSELF            @ arg2
18937    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18938
18939/* ------------------------------ */
18940    .balign 64
18941.L_ALT_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
18942/* File: armv5te/alt_stub.S */
18943/*
18944 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18945 * any interesting requests and then jump to the real instruction
18946 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18947 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18948 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18949 * bail to the real handler if breakFlags==0.
18950 */
18951    ldrb   r3, [rSELF, #offThread_breakFlags]
18952    adrl   lr, dvmAsmInstructionStart + (199 * 64)
18953    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18954    cmp    r3, #0
18955    bxeq   lr                   @ nothing to do - jump to real handler
18956    EXPORT_PC()
18957    mov    r0, rPC              @ arg0
18958    mov    r1, rFP              @ arg1
18959    mov    r2, rSELF            @ arg2
18960    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18961
18962/* ------------------------------ */
18963    .balign 64
18964.L_ALT_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
18965/* File: armv5te/alt_stub.S */
18966/*
18967 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18968 * any interesting requests and then jump to the real instruction
18969 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18970 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18971 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18972 * bail to the real handler if breakFlags==0.
18973 */
18974    ldrb   r3, [rSELF, #offThread_breakFlags]
18975    adrl   lr, dvmAsmInstructionStart + (200 * 64)
18976    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18977    cmp    r3, #0
18978    bxeq   lr                   @ nothing to do - jump to real handler
18979    EXPORT_PC()
18980    mov    r0, rPC              @ arg0
18981    mov    r1, rFP              @ arg1
18982    mov    r2, rSELF            @ arg2
18983    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18984
18985/* ------------------------------ */
18986    .balign 64
18987.L_ALT_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
18988/* File: armv5te/alt_stub.S */
18989/*
18990 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18991 * any interesting requests and then jump to the real instruction
18992 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18993 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18994 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18995 * bail to the real handler if breakFlags==0.
18996 */
18997    ldrb   r3, [rSELF, #offThread_breakFlags]
18998    adrl   lr, dvmAsmInstructionStart + (201 * 64)
18999    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19000    cmp    r3, #0
19001    bxeq   lr                   @ nothing to do - jump to real handler
19002    EXPORT_PC()
19003    mov    r0, rPC              @ arg0
19004    mov    r1, rFP              @ arg1
19005    mov    r2, rSELF            @ arg2
19006    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19007
19008/* ------------------------------ */
19009    .balign 64
19010.L_ALT_OP_REM_FLOAT_2ADDR: /* 0xca */
19011/* File: armv5te/alt_stub.S */
19012/*
19013 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19014 * any interesting requests and then jump to the real instruction
19015 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19016 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19017 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19018 * bail to the real handler if breakFlags==0.
19019 */
19020    ldrb   r3, [rSELF, #offThread_breakFlags]
19021    adrl   lr, dvmAsmInstructionStart + (202 * 64)
19022    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19023    cmp    r3, #0
19024    bxeq   lr                   @ nothing to do - jump to real handler
19025    EXPORT_PC()
19026    mov    r0, rPC              @ arg0
19027    mov    r1, rFP              @ arg1
19028    mov    r2, rSELF            @ arg2
19029    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19030
19031/* ------------------------------ */
19032    .balign 64
19033.L_ALT_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
19034/* File: armv5te/alt_stub.S */
19035/*
19036 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19037 * any interesting requests and then jump to the real instruction
19038 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19039 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19040 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19041 * bail to the real handler if breakFlags==0.
19042 */
19043    ldrb   r3, [rSELF, #offThread_breakFlags]
19044    adrl   lr, dvmAsmInstructionStart + (203 * 64)
19045    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19046    cmp    r3, #0
19047    bxeq   lr                   @ nothing to do - jump to real handler
19048    EXPORT_PC()
19049    mov    r0, rPC              @ arg0
19050    mov    r1, rFP              @ arg1
19051    mov    r2, rSELF            @ arg2
19052    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19053
19054/* ------------------------------ */
19055    .balign 64
19056.L_ALT_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
19057/* File: armv5te/alt_stub.S */
19058/*
19059 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19060 * any interesting requests and then jump to the real instruction
19061 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19062 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19063 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19064 * bail to the real handler if breakFlags==0.
19065 */
19066    ldrb   r3, [rSELF, #offThread_breakFlags]
19067    adrl   lr, dvmAsmInstructionStart + (204 * 64)
19068    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19069    cmp    r3, #0
19070    bxeq   lr                   @ nothing to do - jump to real handler
19071    EXPORT_PC()
19072    mov    r0, rPC              @ arg0
19073    mov    r1, rFP              @ arg1
19074    mov    r2, rSELF            @ arg2
19075    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19076
19077/* ------------------------------ */
19078    .balign 64
19079.L_ALT_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
19080/* File: armv5te/alt_stub.S */
19081/*
19082 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19083 * any interesting requests and then jump to the real instruction
19084 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19085 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19086 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19087 * bail to the real handler if breakFlags==0.
19088 */
19089    ldrb   r3, [rSELF, #offThread_breakFlags]
19090    adrl   lr, dvmAsmInstructionStart + (205 * 64)
19091    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19092    cmp    r3, #0
19093    bxeq   lr                   @ nothing to do - jump to real handler
19094    EXPORT_PC()
19095    mov    r0, rPC              @ arg0
19096    mov    r1, rFP              @ arg1
19097    mov    r2, rSELF            @ arg2
19098    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19099
19100/* ------------------------------ */
19101    .balign 64
19102.L_ALT_OP_DIV_DOUBLE_2ADDR: /* 0xce */
19103/* File: armv5te/alt_stub.S */
19104/*
19105 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19106 * any interesting requests and then jump to the real instruction
19107 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19108 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19109 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19110 * bail to the real handler if breakFlags==0.
19111 */
19112    ldrb   r3, [rSELF, #offThread_breakFlags]
19113    adrl   lr, dvmAsmInstructionStart + (206 * 64)
19114    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19115    cmp    r3, #0
19116    bxeq   lr                   @ nothing to do - jump to real handler
19117    EXPORT_PC()
19118    mov    r0, rPC              @ arg0
19119    mov    r1, rFP              @ arg1
19120    mov    r2, rSELF            @ arg2
19121    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19122
19123/* ------------------------------ */
19124    .balign 64
19125.L_ALT_OP_REM_DOUBLE_2ADDR: /* 0xcf */
19126/* File: armv5te/alt_stub.S */
19127/*
19128 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19129 * any interesting requests and then jump to the real instruction
19130 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19131 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19132 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19133 * bail to the real handler if breakFlags==0.
19134 */
19135    ldrb   r3, [rSELF, #offThread_breakFlags]
19136    adrl   lr, dvmAsmInstructionStart + (207 * 64)
19137    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19138    cmp    r3, #0
19139    bxeq   lr                   @ nothing to do - jump to real handler
19140    EXPORT_PC()
19141    mov    r0, rPC              @ arg0
19142    mov    r1, rFP              @ arg1
19143    mov    r2, rSELF            @ arg2
19144    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19145
19146/* ------------------------------ */
19147    .balign 64
19148.L_ALT_OP_ADD_INT_LIT16: /* 0xd0 */
19149/* File: armv5te/alt_stub.S */
19150/*
19151 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19152 * any interesting requests and then jump to the real instruction
19153 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19154 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19155 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19156 * bail to the real handler if breakFlags==0.
19157 */
19158    ldrb   r3, [rSELF, #offThread_breakFlags]
19159    adrl   lr, dvmAsmInstructionStart + (208 * 64)
19160    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19161    cmp    r3, #0
19162    bxeq   lr                   @ nothing to do - jump to real handler
19163    EXPORT_PC()
19164    mov    r0, rPC              @ arg0
19165    mov    r1, rFP              @ arg1
19166    mov    r2, rSELF            @ arg2
19167    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19168
19169/* ------------------------------ */
19170    .balign 64
19171.L_ALT_OP_RSUB_INT: /* 0xd1 */
19172/* File: armv5te/alt_stub.S */
19173/*
19174 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19175 * any interesting requests and then jump to the real instruction
19176 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19177 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19178 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19179 * bail to the real handler if breakFlags==0.
19180 */
19181    ldrb   r3, [rSELF, #offThread_breakFlags]
19182    adrl   lr, dvmAsmInstructionStart + (209 * 64)
19183    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19184    cmp    r3, #0
19185    bxeq   lr                   @ nothing to do - jump to real handler
19186    EXPORT_PC()
19187    mov    r0, rPC              @ arg0
19188    mov    r1, rFP              @ arg1
19189    mov    r2, rSELF            @ arg2
19190    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19191
19192/* ------------------------------ */
19193    .balign 64
19194.L_ALT_OP_MUL_INT_LIT16: /* 0xd2 */
19195/* File: armv5te/alt_stub.S */
19196/*
19197 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19198 * any interesting requests and then jump to the real instruction
19199 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19200 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19201 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19202 * bail to the real handler if breakFlags==0.
19203 */
19204    ldrb   r3, [rSELF, #offThread_breakFlags]
19205    adrl   lr, dvmAsmInstructionStart + (210 * 64)
19206    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19207    cmp    r3, #0
19208    bxeq   lr                   @ nothing to do - jump to real handler
19209    EXPORT_PC()
19210    mov    r0, rPC              @ arg0
19211    mov    r1, rFP              @ arg1
19212    mov    r2, rSELF            @ arg2
19213    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19214
19215/* ------------------------------ */
19216    .balign 64
19217.L_ALT_OP_DIV_INT_LIT16: /* 0xd3 */
19218/* File: armv5te/alt_stub.S */
19219/*
19220 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19221 * any interesting requests and then jump to the real instruction
19222 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19223 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19224 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19225 * bail to the real handler if breakFlags==0.
19226 */
19227    ldrb   r3, [rSELF, #offThread_breakFlags]
19228    adrl   lr, dvmAsmInstructionStart + (211 * 64)
19229    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19230    cmp    r3, #0
19231    bxeq   lr                   @ nothing to do - jump to real handler
19232    EXPORT_PC()
19233    mov    r0, rPC              @ arg0
19234    mov    r1, rFP              @ arg1
19235    mov    r2, rSELF            @ arg2
19236    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19237
19238/* ------------------------------ */
19239    .balign 64
19240.L_ALT_OP_REM_INT_LIT16: /* 0xd4 */
19241/* File: armv5te/alt_stub.S */
19242/*
19243 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19244 * any interesting requests and then jump to the real instruction
19245 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19246 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19247 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19248 * bail to the real handler if breakFlags==0.
19249 */
19250    ldrb   r3, [rSELF, #offThread_breakFlags]
19251    adrl   lr, dvmAsmInstructionStart + (212 * 64)
19252    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19253    cmp    r3, #0
19254    bxeq   lr                   @ nothing to do - jump to real handler
19255    EXPORT_PC()
19256    mov    r0, rPC              @ arg0
19257    mov    r1, rFP              @ arg1
19258    mov    r2, rSELF            @ arg2
19259    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19260
19261/* ------------------------------ */
19262    .balign 64
19263.L_ALT_OP_AND_INT_LIT16: /* 0xd5 */
19264/* File: armv5te/alt_stub.S */
19265/*
19266 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19267 * any interesting requests and then jump to the real instruction
19268 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19269 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19270 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19271 * bail to the real handler if breakFlags==0.
19272 */
19273    ldrb   r3, [rSELF, #offThread_breakFlags]
19274    adrl   lr, dvmAsmInstructionStart + (213 * 64)
19275    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19276    cmp    r3, #0
19277    bxeq   lr                   @ nothing to do - jump to real handler
19278    EXPORT_PC()
19279    mov    r0, rPC              @ arg0
19280    mov    r1, rFP              @ arg1
19281    mov    r2, rSELF            @ arg2
19282    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19283
19284/* ------------------------------ */
19285    .balign 64
19286.L_ALT_OP_OR_INT_LIT16: /* 0xd6 */
19287/* File: armv5te/alt_stub.S */
19288/*
19289 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19290 * any interesting requests and then jump to the real instruction
19291 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19292 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19293 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19294 * bail to the real handler if breakFlags==0.
19295 */
19296    ldrb   r3, [rSELF, #offThread_breakFlags]
19297    adrl   lr, dvmAsmInstructionStart + (214 * 64)
19298    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19299    cmp    r3, #0
19300    bxeq   lr                   @ nothing to do - jump to real handler
19301    EXPORT_PC()
19302    mov    r0, rPC              @ arg0
19303    mov    r1, rFP              @ arg1
19304    mov    r2, rSELF            @ arg2
19305    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19306
19307/* ------------------------------ */
19308    .balign 64
19309.L_ALT_OP_XOR_INT_LIT16: /* 0xd7 */
19310/* File: armv5te/alt_stub.S */
19311/*
19312 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19313 * any interesting requests and then jump to the real instruction
19314 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19315 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19316 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19317 * bail to the real handler if breakFlags==0.
19318 */
19319    ldrb   r3, [rSELF, #offThread_breakFlags]
19320    adrl   lr, dvmAsmInstructionStart + (215 * 64)
19321    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19322    cmp    r3, #0
19323    bxeq   lr                   @ nothing to do - jump to real handler
19324    EXPORT_PC()
19325    mov    r0, rPC              @ arg0
19326    mov    r1, rFP              @ arg1
19327    mov    r2, rSELF            @ arg2
19328    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19329
19330/* ------------------------------ */
19331    .balign 64
19332.L_ALT_OP_ADD_INT_LIT8: /* 0xd8 */
19333/* File: armv5te/alt_stub.S */
19334/*
19335 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19336 * any interesting requests and then jump to the real instruction
19337 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19338 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19339 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19340 * bail to the real handler if breakFlags==0.
19341 */
19342    ldrb   r3, [rSELF, #offThread_breakFlags]
19343    adrl   lr, dvmAsmInstructionStart + (216 * 64)
19344    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19345    cmp    r3, #0
19346    bxeq   lr                   @ nothing to do - jump to real handler
19347    EXPORT_PC()
19348    mov    r0, rPC              @ arg0
19349    mov    r1, rFP              @ arg1
19350    mov    r2, rSELF            @ arg2
19351    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19352
19353/* ------------------------------ */
19354    .balign 64
19355.L_ALT_OP_RSUB_INT_LIT8: /* 0xd9 */
19356/* File: armv5te/alt_stub.S */
19357/*
19358 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19359 * any interesting requests and then jump to the real instruction
19360 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19361 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19362 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19363 * bail to the real handler if breakFlags==0.
19364 */
19365    ldrb   r3, [rSELF, #offThread_breakFlags]
19366    adrl   lr, dvmAsmInstructionStart + (217 * 64)
19367    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19368    cmp    r3, #0
19369    bxeq   lr                   @ nothing to do - jump to real handler
19370    EXPORT_PC()
19371    mov    r0, rPC              @ arg0
19372    mov    r1, rFP              @ arg1
19373    mov    r2, rSELF            @ arg2
19374    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19375
19376/* ------------------------------ */
19377    .balign 64
19378.L_ALT_OP_MUL_INT_LIT8: /* 0xda */
19379/* File: armv5te/alt_stub.S */
19380/*
19381 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19382 * any interesting requests and then jump to the real instruction
19383 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19384 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19385 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19386 * bail to the real handler if breakFlags==0.
19387 */
19388    ldrb   r3, [rSELF, #offThread_breakFlags]
19389    adrl   lr, dvmAsmInstructionStart + (218 * 64)
19390    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19391    cmp    r3, #0
19392    bxeq   lr                   @ nothing to do - jump to real handler
19393    EXPORT_PC()
19394    mov    r0, rPC              @ arg0
19395    mov    r1, rFP              @ arg1
19396    mov    r2, rSELF            @ arg2
19397    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19398
19399/* ------------------------------ */
19400    .balign 64
19401.L_ALT_OP_DIV_INT_LIT8: /* 0xdb */
19402/* File: armv5te/alt_stub.S */
19403/*
19404 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19405 * any interesting requests and then jump to the real instruction
19406 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19407 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19408 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19409 * bail to the real handler if breakFlags==0.
19410 */
19411    ldrb   r3, [rSELF, #offThread_breakFlags]
19412    adrl   lr, dvmAsmInstructionStart + (219 * 64)
19413    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19414    cmp    r3, #0
19415    bxeq   lr                   @ nothing to do - jump to real handler
19416    EXPORT_PC()
19417    mov    r0, rPC              @ arg0
19418    mov    r1, rFP              @ arg1
19419    mov    r2, rSELF            @ arg2
19420    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19421
19422/* ------------------------------ */
19423    .balign 64
19424.L_ALT_OP_REM_INT_LIT8: /* 0xdc */
19425/* File: armv5te/alt_stub.S */
19426/*
19427 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19428 * any interesting requests and then jump to the real instruction
19429 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19430 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19431 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19432 * bail to the real handler if breakFlags==0.
19433 */
19434    ldrb   r3, [rSELF, #offThread_breakFlags]
19435    adrl   lr, dvmAsmInstructionStart + (220 * 64)
19436    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19437    cmp    r3, #0
19438    bxeq   lr                   @ nothing to do - jump to real handler
19439    EXPORT_PC()
19440    mov    r0, rPC              @ arg0
19441    mov    r1, rFP              @ arg1
19442    mov    r2, rSELF            @ arg2
19443    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19444
19445/* ------------------------------ */
19446    .balign 64
19447.L_ALT_OP_AND_INT_LIT8: /* 0xdd */
19448/* File: armv5te/alt_stub.S */
19449/*
19450 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19451 * any interesting requests and then jump to the real instruction
19452 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19453 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19454 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19455 * bail to the real handler if breakFlags==0.
19456 */
19457    ldrb   r3, [rSELF, #offThread_breakFlags]
19458    adrl   lr, dvmAsmInstructionStart + (221 * 64)
19459    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19460    cmp    r3, #0
19461    bxeq   lr                   @ nothing to do - jump to real handler
19462    EXPORT_PC()
19463    mov    r0, rPC              @ arg0
19464    mov    r1, rFP              @ arg1
19465    mov    r2, rSELF            @ arg2
19466    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19467
19468/* ------------------------------ */
19469    .balign 64
19470.L_ALT_OP_OR_INT_LIT8: /* 0xde */
19471/* File: armv5te/alt_stub.S */
19472/*
19473 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19474 * any interesting requests and then jump to the real instruction
19475 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19476 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19477 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19478 * bail to the real handler if breakFlags==0.
19479 */
19480    ldrb   r3, [rSELF, #offThread_breakFlags]
19481    adrl   lr, dvmAsmInstructionStart + (222 * 64)
19482    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19483    cmp    r3, #0
19484    bxeq   lr                   @ nothing to do - jump to real handler
19485    EXPORT_PC()
19486    mov    r0, rPC              @ arg0
19487    mov    r1, rFP              @ arg1
19488    mov    r2, rSELF            @ arg2
19489    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19490
19491/* ------------------------------ */
19492    .balign 64
19493.L_ALT_OP_XOR_INT_LIT8: /* 0xdf */
19494/* File: armv5te/alt_stub.S */
19495/*
19496 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19497 * any interesting requests and then jump to the real instruction
19498 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19499 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19500 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19501 * bail to the real handler if breakFlags==0.
19502 */
19503    ldrb   r3, [rSELF, #offThread_breakFlags]
19504    adrl   lr, dvmAsmInstructionStart + (223 * 64)
19505    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19506    cmp    r3, #0
19507    bxeq   lr                   @ nothing to do - jump to real handler
19508    EXPORT_PC()
19509    mov    r0, rPC              @ arg0
19510    mov    r1, rFP              @ arg1
19511    mov    r2, rSELF            @ arg2
19512    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19513
19514/* ------------------------------ */
19515    .balign 64
19516.L_ALT_OP_SHL_INT_LIT8: /* 0xe0 */
19517/* File: armv5te/alt_stub.S */
19518/*
19519 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19520 * any interesting requests and then jump to the real instruction
19521 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19522 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19523 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19524 * bail to the real handler if breakFlags==0.
19525 */
19526    ldrb   r3, [rSELF, #offThread_breakFlags]
19527    adrl   lr, dvmAsmInstructionStart + (224 * 64)
19528    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19529    cmp    r3, #0
19530    bxeq   lr                   @ nothing to do - jump to real handler
19531    EXPORT_PC()
19532    mov    r0, rPC              @ arg0
19533    mov    r1, rFP              @ arg1
19534    mov    r2, rSELF            @ arg2
19535    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19536
19537/* ------------------------------ */
19538    .balign 64
19539.L_ALT_OP_SHR_INT_LIT8: /* 0xe1 */
19540/* File: armv5te/alt_stub.S */
19541/*
19542 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19543 * any interesting requests and then jump to the real instruction
19544 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19545 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19546 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19547 * bail to the real handler if breakFlags==0.
19548 */
19549    ldrb   r3, [rSELF, #offThread_breakFlags]
19550    adrl   lr, dvmAsmInstructionStart + (225 * 64)
19551    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19552    cmp    r3, #0
19553    bxeq   lr                   @ nothing to do - jump to real handler
19554    EXPORT_PC()
19555    mov    r0, rPC              @ arg0
19556    mov    r1, rFP              @ arg1
19557    mov    r2, rSELF            @ arg2
19558    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19559
19560/* ------------------------------ */
19561    .balign 64
19562.L_ALT_OP_USHR_INT_LIT8: /* 0xe2 */
19563/* File: armv5te/alt_stub.S */
19564/*
19565 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19566 * any interesting requests and then jump to the real instruction
19567 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19568 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19569 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19570 * bail to the real handler if breakFlags==0.
19571 */
19572    ldrb   r3, [rSELF, #offThread_breakFlags]
19573    adrl   lr, dvmAsmInstructionStart + (226 * 64)
19574    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19575    cmp    r3, #0
19576    bxeq   lr                   @ nothing to do - jump to real handler
19577    EXPORT_PC()
19578    mov    r0, rPC              @ arg0
19579    mov    r1, rFP              @ arg1
19580    mov    r2, rSELF            @ arg2
19581    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19582
19583/* ------------------------------ */
19584    .balign 64
19585.L_ALT_OP_IGET_VOLATILE: /* 0xe3 */
19586/* File: armv5te/alt_stub.S */
19587/*
19588 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19589 * any interesting requests and then jump to the real instruction
19590 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19591 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19592 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19593 * bail to the real handler if breakFlags==0.
19594 */
19595    ldrb   r3, [rSELF, #offThread_breakFlags]
19596    adrl   lr, dvmAsmInstructionStart + (227 * 64)
19597    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19598    cmp    r3, #0
19599    bxeq   lr                   @ nothing to do - jump to real handler
19600    EXPORT_PC()
19601    mov    r0, rPC              @ arg0
19602    mov    r1, rFP              @ arg1
19603    mov    r2, rSELF            @ arg2
19604    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19605
19606/* ------------------------------ */
19607    .balign 64
19608.L_ALT_OP_IPUT_VOLATILE: /* 0xe4 */
19609/* File: armv5te/alt_stub.S */
19610/*
19611 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19612 * any interesting requests and then jump to the real instruction
19613 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19614 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19615 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19616 * bail to the real handler if breakFlags==0.
19617 */
19618    ldrb   r3, [rSELF, #offThread_breakFlags]
19619    adrl   lr, dvmAsmInstructionStart + (228 * 64)
19620    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19621    cmp    r3, #0
19622    bxeq   lr                   @ nothing to do - jump to real handler
19623    EXPORT_PC()
19624    mov    r0, rPC              @ arg0
19625    mov    r1, rFP              @ arg1
19626    mov    r2, rSELF            @ arg2
19627    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19628
19629/* ------------------------------ */
19630    .balign 64
19631.L_ALT_OP_SGET_VOLATILE: /* 0xe5 */
19632/* File: armv5te/alt_stub.S */
19633/*
19634 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19635 * any interesting requests and then jump to the real instruction
19636 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19637 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19638 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19639 * bail to the real handler if breakFlags==0.
19640 */
19641    ldrb   r3, [rSELF, #offThread_breakFlags]
19642    adrl   lr, dvmAsmInstructionStart + (229 * 64)
19643    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19644    cmp    r3, #0
19645    bxeq   lr                   @ nothing to do - jump to real handler
19646    EXPORT_PC()
19647    mov    r0, rPC              @ arg0
19648    mov    r1, rFP              @ arg1
19649    mov    r2, rSELF            @ arg2
19650    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19651
19652/* ------------------------------ */
19653    .balign 64
19654.L_ALT_OP_SPUT_VOLATILE: /* 0xe6 */
19655/* File: armv5te/alt_stub.S */
19656/*
19657 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19658 * any interesting requests and then jump to the real instruction
19659 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19660 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19661 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19662 * bail to the real handler if breakFlags==0.
19663 */
19664    ldrb   r3, [rSELF, #offThread_breakFlags]
19665    adrl   lr, dvmAsmInstructionStart + (230 * 64)
19666    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19667    cmp    r3, #0
19668    bxeq   lr                   @ nothing to do - jump to real handler
19669    EXPORT_PC()
19670    mov    r0, rPC              @ arg0
19671    mov    r1, rFP              @ arg1
19672    mov    r2, rSELF            @ arg2
19673    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19674
19675/* ------------------------------ */
19676    .balign 64
19677.L_ALT_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
19678/* File: armv5te/alt_stub.S */
19679/*
19680 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19681 * any interesting requests and then jump to the real instruction
19682 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19683 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19684 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19685 * bail to the real handler if breakFlags==0.
19686 */
19687    ldrb   r3, [rSELF, #offThread_breakFlags]
19688    adrl   lr, dvmAsmInstructionStart + (231 * 64)
19689    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19690    cmp    r3, #0
19691    bxeq   lr                   @ nothing to do - jump to real handler
19692    EXPORT_PC()
19693    mov    r0, rPC              @ arg0
19694    mov    r1, rFP              @ arg1
19695    mov    r2, rSELF            @ arg2
19696    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19697
19698/* ------------------------------ */
19699    .balign 64
19700.L_ALT_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
19701/* File: armv5te/alt_stub.S */
19702/*
19703 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19704 * any interesting requests and then jump to the real instruction
19705 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19706 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19707 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19708 * bail to the real handler if breakFlags==0.
19709 */
19710    ldrb   r3, [rSELF, #offThread_breakFlags]
19711    adrl   lr, dvmAsmInstructionStart + (232 * 64)
19712    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19713    cmp    r3, #0
19714    bxeq   lr                   @ nothing to do - jump to real handler
19715    EXPORT_PC()
19716    mov    r0, rPC              @ arg0
19717    mov    r1, rFP              @ arg1
19718    mov    r2, rSELF            @ arg2
19719    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19720
19721/* ------------------------------ */
19722    .balign 64
19723.L_ALT_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
19724/* File: armv5te/alt_stub.S */
19725/*
19726 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19727 * any interesting requests and then jump to the real instruction
19728 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19729 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19730 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19731 * bail to the real handler if breakFlags==0.
19732 */
19733    ldrb   r3, [rSELF, #offThread_breakFlags]
19734    adrl   lr, dvmAsmInstructionStart + (233 * 64)
19735    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19736    cmp    r3, #0
19737    bxeq   lr                   @ nothing to do - jump to real handler
19738    EXPORT_PC()
19739    mov    r0, rPC              @ arg0
19740    mov    r1, rFP              @ arg1
19741    mov    r2, rSELF            @ arg2
19742    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19743
19744/* ------------------------------ */
19745    .balign 64
19746.L_ALT_OP_SGET_WIDE_VOLATILE: /* 0xea */
19747/* File: armv5te/alt_stub.S */
19748/*
19749 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19750 * any interesting requests and then jump to the real instruction
19751 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19752 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19753 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19754 * bail to the real handler if breakFlags==0.
19755 */
19756    ldrb   r3, [rSELF, #offThread_breakFlags]
19757    adrl   lr, dvmAsmInstructionStart + (234 * 64)
19758    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19759    cmp    r3, #0
19760    bxeq   lr                   @ nothing to do - jump to real handler
19761    EXPORT_PC()
19762    mov    r0, rPC              @ arg0
19763    mov    r1, rFP              @ arg1
19764    mov    r2, rSELF            @ arg2
19765    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19766
19767/* ------------------------------ */
19768    .balign 64
19769.L_ALT_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
19770/* File: armv5te/alt_stub.S */
19771/*
19772 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19773 * any interesting requests and then jump to the real instruction
19774 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19775 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19776 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19777 * bail to the real handler if breakFlags==0.
19778 */
19779    ldrb   r3, [rSELF, #offThread_breakFlags]
19780    adrl   lr, dvmAsmInstructionStart + (235 * 64)
19781    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19782    cmp    r3, #0
19783    bxeq   lr                   @ nothing to do - jump to real handler
19784    EXPORT_PC()
19785    mov    r0, rPC              @ arg0
19786    mov    r1, rFP              @ arg1
19787    mov    r2, rSELF            @ arg2
19788    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19789
19790/* ------------------------------ */
19791    .balign 64
19792.L_ALT_OP_BREAKPOINT: /* 0xec */
19793/* File: armv5te/alt_stub.S */
19794/*
19795 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19796 * any interesting requests and then jump to the real instruction
19797 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19798 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19799 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19800 * bail to the real handler if breakFlags==0.
19801 */
19802    ldrb   r3, [rSELF, #offThread_breakFlags]
19803    adrl   lr, dvmAsmInstructionStart + (236 * 64)
19804    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19805    cmp    r3, #0
19806    bxeq   lr                   @ nothing to do - jump to real handler
19807    EXPORT_PC()
19808    mov    r0, rPC              @ arg0
19809    mov    r1, rFP              @ arg1
19810    mov    r2, rSELF            @ arg2
19811    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19812
19813/* ------------------------------ */
19814    .balign 64
19815.L_ALT_OP_THROW_VERIFICATION_ERROR: /* 0xed */
19816/* File: armv5te/alt_stub.S */
19817/*
19818 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19819 * any interesting requests and then jump to the real instruction
19820 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19821 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19822 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19823 * bail to the real handler if breakFlags==0.
19824 */
19825    ldrb   r3, [rSELF, #offThread_breakFlags]
19826    adrl   lr, dvmAsmInstructionStart + (237 * 64)
19827    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19828    cmp    r3, #0
19829    bxeq   lr                   @ nothing to do - jump to real handler
19830    EXPORT_PC()
19831    mov    r0, rPC              @ arg0
19832    mov    r1, rFP              @ arg1
19833    mov    r2, rSELF            @ arg2
19834    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19835
19836/* ------------------------------ */
19837    .balign 64
19838.L_ALT_OP_EXECUTE_INLINE: /* 0xee */
19839/* File: armv5te/alt_stub.S */
19840/*
19841 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19842 * any interesting requests and then jump to the real instruction
19843 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19844 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19845 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19846 * bail to the real handler if breakFlags==0.
19847 */
19848    ldrb   r3, [rSELF, #offThread_breakFlags]
19849    adrl   lr, dvmAsmInstructionStart + (238 * 64)
19850    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19851    cmp    r3, #0
19852    bxeq   lr                   @ nothing to do - jump to real handler
19853    EXPORT_PC()
19854    mov    r0, rPC              @ arg0
19855    mov    r1, rFP              @ arg1
19856    mov    r2, rSELF            @ arg2
19857    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19858
19859/* ------------------------------ */
19860    .balign 64
19861.L_ALT_OP_EXECUTE_INLINE_RANGE: /* 0xef */
19862/* File: armv5te/alt_stub.S */
19863/*
19864 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19865 * any interesting requests and then jump to the real instruction
19866 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19867 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19868 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19869 * bail to the real handler if breakFlags==0.
19870 */
19871    ldrb   r3, [rSELF, #offThread_breakFlags]
19872    adrl   lr, dvmAsmInstructionStart + (239 * 64)
19873    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19874    cmp    r3, #0
19875    bxeq   lr                   @ nothing to do - jump to real handler
19876    EXPORT_PC()
19877    mov    r0, rPC              @ arg0
19878    mov    r1, rFP              @ arg1
19879    mov    r2, rSELF            @ arg2
19880    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19881
19882/* ------------------------------ */
19883    .balign 64
19884.L_ALT_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
19885/* File: armv5te/alt_stub.S */
19886/*
19887 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19888 * any interesting requests and then jump to the real instruction
19889 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19890 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19891 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19892 * bail to the real handler if breakFlags==0.
19893 */
19894    ldrb   r3, [rSELF, #offThread_breakFlags]
19895    adrl   lr, dvmAsmInstructionStart + (240 * 64)
19896    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19897    cmp    r3, #0
19898    bxeq   lr                   @ nothing to do - jump to real handler
19899    EXPORT_PC()
19900    mov    r0, rPC              @ arg0
19901    mov    r1, rFP              @ arg1
19902    mov    r2, rSELF            @ arg2
19903    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19904
19905/* ------------------------------ */
19906    .balign 64
19907.L_ALT_OP_RETURN_VOID_BARRIER: /* 0xf1 */
19908/* File: armv5te/alt_stub.S */
19909/*
19910 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19911 * any interesting requests and then jump to the real instruction
19912 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19913 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19914 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19915 * bail to the real handler if breakFlags==0.
19916 */
19917    ldrb   r3, [rSELF, #offThread_breakFlags]
19918    adrl   lr, dvmAsmInstructionStart + (241 * 64)
19919    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19920    cmp    r3, #0
19921    bxeq   lr                   @ nothing to do - jump to real handler
19922    EXPORT_PC()
19923    mov    r0, rPC              @ arg0
19924    mov    r1, rFP              @ arg1
19925    mov    r2, rSELF            @ arg2
19926    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19927
19928/* ------------------------------ */
19929    .balign 64
19930.L_ALT_OP_IGET_QUICK: /* 0xf2 */
19931/* File: armv5te/alt_stub.S */
19932/*
19933 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19934 * any interesting requests and then jump to the real instruction
19935 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19936 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19937 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19938 * bail to the real handler if breakFlags==0.
19939 */
19940    ldrb   r3, [rSELF, #offThread_breakFlags]
19941    adrl   lr, dvmAsmInstructionStart + (242 * 64)
19942    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19943    cmp    r3, #0
19944    bxeq   lr                   @ nothing to do - jump to real handler
19945    EXPORT_PC()
19946    mov    r0, rPC              @ arg0
19947    mov    r1, rFP              @ arg1
19948    mov    r2, rSELF            @ arg2
19949    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19950
19951/* ------------------------------ */
19952    .balign 64
19953.L_ALT_OP_IGET_WIDE_QUICK: /* 0xf3 */
19954/* File: armv5te/alt_stub.S */
19955/*
19956 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19957 * any interesting requests and then jump to the real instruction
19958 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19959 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19960 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19961 * bail to the real handler if breakFlags==0.
19962 */
19963    ldrb   r3, [rSELF, #offThread_breakFlags]
19964    adrl   lr, dvmAsmInstructionStart + (243 * 64)
19965    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19966    cmp    r3, #0
19967    bxeq   lr                   @ nothing to do - jump to real handler
19968    EXPORT_PC()
19969    mov    r0, rPC              @ arg0
19970    mov    r1, rFP              @ arg1
19971    mov    r2, rSELF            @ arg2
19972    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19973
19974/* ------------------------------ */
19975    .balign 64
19976.L_ALT_OP_IGET_OBJECT_QUICK: /* 0xf4 */
19977/* File: armv5te/alt_stub.S */
19978/*
19979 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19980 * any interesting requests and then jump to the real instruction
19981 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19982 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19983 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19984 * bail to the real handler if breakFlags==0.
19985 */
19986    ldrb   r3, [rSELF, #offThread_breakFlags]
19987    adrl   lr, dvmAsmInstructionStart + (244 * 64)
19988    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19989    cmp    r3, #0
19990    bxeq   lr                   @ nothing to do - jump to real handler
19991    EXPORT_PC()
19992    mov    r0, rPC              @ arg0
19993    mov    r1, rFP              @ arg1
19994    mov    r2, rSELF            @ arg2
19995    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19996
19997/* ------------------------------ */
19998    .balign 64
19999.L_ALT_OP_IPUT_QUICK: /* 0xf5 */
20000/* File: armv5te/alt_stub.S */
20001/*
20002 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20003 * any interesting requests and then jump to the real instruction
20004 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20005 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20006 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20007 * bail to the real handler if breakFlags==0.
20008 */
20009    ldrb   r3, [rSELF, #offThread_breakFlags]
20010    adrl   lr, dvmAsmInstructionStart + (245 * 64)
20011    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20012    cmp    r3, #0
20013    bxeq   lr                   @ nothing to do - jump to real handler
20014    EXPORT_PC()
20015    mov    r0, rPC              @ arg0
20016    mov    r1, rFP              @ arg1
20017    mov    r2, rSELF            @ arg2
20018    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20019
20020/* ------------------------------ */
20021    .balign 64
20022.L_ALT_OP_IPUT_WIDE_QUICK: /* 0xf6 */
20023/* File: armv5te/alt_stub.S */
20024/*
20025 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20026 * any interesting requests and then jump to the real instruction
20027 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20028 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20029 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20030 * bail to the real handler if breakFlags==0.
20031 */
20032    ldrb   r3, [rSELF, #offThread_breakFlags]
20033    adrl   lr, dvmAsmInstructionStart + (246 * 64)
20034    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20035    cmp    r3, #0
20036    bxeq   lr                   @ nothing to do - jump to real handler
20037    EXPORT_PC()
20038    mov    r0, rPC              @ arg0
20039    mov    r1, rFP              @ arg1
20040    mov    r2, rSELF            @ arg2
20041    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20042
20043/* ------------------------------ */
20044    .balign 64
20045.L_ALT_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
20046/* File: armv5te/alt_stub.S */
20047/*
20048 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20049 * any interesting requests and then jump to the real instruction
20050 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20051 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20052 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20053 * bail to the real handler if breakFlags==0.
20054 */
20055    ldrb   r3, [rSELF, #offThread_breakFlags]
20056    adrl   lr, dvmAsmInstructionStart + (247 * 64)
20057    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20058    cmp    r3, #0
20059    bxeq   lr                   @ nothing to do - jump to real handler
20060    EXPORT_PC()
20061    mov    r0, rPC              @ arg0
20062    mov    r1, rFP              @ arg1
20063    mov    r2, rSELF            @ arg2
20064    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20065
20066/* ------------------------------ */
20067    .balign 64
20068.L_ALT_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
20069/* File: armv5te/alt_stub.S */
20070/*
20071 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20072 * any interesting requests and then jump to the real instruction
20073 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20074 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20075 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20076 * bail to the real handler if breakFlags==0.
20077 */
20078    ldrb   r3, [rSELF, #offThread_breakFlags]
20079    adrl   lr, dvmAsmInstructionStart + (248 * 64)
20080    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20081    cmp    r3, #0
20082    bxeq   lr                   @ nothing to do - jump to real handler
20083    EXPORT_PC()
20084    mov    r0, rPC              @ arg0
20085    mov    r1, rFP              @ arg1
20086    mov    r2, rSELF            @ arg2
20087    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20088
20089/* ------------------------------ */
20090    .balign 64
20091.L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
20092/* File: armv5te/alt_stub.S */
20093/*
20094 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20095 * any interesting requests and then jump to the real instruction
20096 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20097 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20098 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20099 * bail to the real handler if breakFlags==0.
20100 */
20101    ldrb   r3, [rSELF, #offThread_breakFlags]
20102    adrl   lr, dvmAsmInstructionStart + (249 * 64)
20103    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20104    cmp    r3, #0
20105    bxeq   lr                   @ nothing to do - jump to real handler
20106    EXPORT_PC()
20107    mov    r0, rPC              @ arg0
20108    mov    r1, rFP              @ arg1
20109    mov    r2, rSELF            @ arg2
20110    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20111
20112/* ------------------------------ */
20113    .balign 64
20114.L_ALT_OP_INVOKE_SUPER_QUICK: /* 0xfa */
20115/* File: armv5te/alt_stub.S */
20116/*
20117 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20118 * any interesting requests and then jump to the real instruction
20119 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20120 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20121 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20122 * bail to the real handler if breakFlags==0.
20123 */
20124    ldrb   r3, [rSELF, #offThread_breakFlags]
20125    adrl   lr, dvmAsmInstructionStart + (250 * 64)
20126    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20127    cmp    r3, #0
20128    bxeq   lr                   @ nothing to do - jump to real handler
20129    EXPORT_PC()
20130    mov    r0, rPC              @ arg0
20131    mov    r1, rFP              @ arg1
20132    mov    r2, rSELF            @ arg2
20133    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20134
20135/* ------------------------------ */
20136    .balign 64
20137.L_ALT_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
20138/* File: armv5te/alt_stub.S */
20139/*
20140 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20141 * any interesting requests and then jump to the real instruction
20142 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20143 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20144 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20145 * bail to the real handler if breakFlags==0.
20146 */
20147    ldrb   r3, [rSELF, #offThread_breakFlags]
20148    adrl   lr, dvmAsmInstructionStart + (251 * 64)
20149    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20150    cmp    r3, #0
20151    bxeq   lr                   @ nothing to do - jump to real handler
20152    EXPORT_PC()
20153    mov    r0, rPC              @ arg0
20154    mov    r1, rFP              @ arg1
20155    mov    r2, rSELF            @ arg2
20156    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20157
20158/* ------------------------------ */
20159    .balign 64
20160.L_ALT_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
20161/* File: armv5te/alt_stub.S */
20162/*
20163 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20164 * any interesting requests and then jump to the real instruction
20165 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20166 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20167 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20168 * bail to the real handler if breakFlags==0.
20169 */
20170    ldrb   r3, [rSELF, #offThread_breakFlags]
20171    adrl   lr, dvmAsmInstructionStart + (252 * 64)
20172    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20173    cmp    r3, #0
20174    bxeq   lr                   @ nothing to do - jump to real handler
20175    EXPORT_PC()
20176    mov    r0, rPC              @ arg0
20177    mov    r1, rFP              @ arg1
20178    mov    r2, rSELF            @ arg2
20179    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20180
20181/* ------------------------------ */
20182    .balign 64
20183.L_ALT_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
20184/* File: armv5te/alt_stub.S */
20185/*
20186 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20187 * any interesting requests and then jump to the real instruction
20188 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20189 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20190 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20191 * bail to the real handler if breakFlags==0.
20192 */
20193    ldrb   r3, [rSELF, #offThread_breakFlags]
20194    adrl   lr, dvmAsmInstructionStart + (253 * 64)
20195    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20196    cmp    r3, #0
20197    bxeq   lr                   @ nothing to do - jump to real handler
20198    EXPORT_PC()
20199    mov    r0, rPC              @ arg0
20200    mov    r1, rFP              @ arg1
20201    mov    r2, rSELF            @ arg2
20202    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20203
20204/* ------------------------------ */
20205    .balign 64
20206.L_ALT_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
20207/* File: armv5te/alt_stub.S */
20208/*
20209 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20210 * any interesting requests and then jump to the real instruction
20211 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20212 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20213 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20214 * bail to the real handler if breakFlags==0.
20215 */
20216    ldrb   r3, [rSELF, #offThread_breakFlags]
20217    adrl   lr, dvmAsmInstructionStart + (254 * 64)
20218    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20219    cmp    r3, #0
20220    bxeq   lr                   @ nothing to do - jump to real handler
20221    EXPORT_PC()
20222    mov    r0, rPC              @ arg0
20223    mov    r1, rFP              @ arg1
20224    mov    r2, rSELF            @ arg2
20225    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20226
20227/* ------------------------------ */
20228    .balign 64
20229.L_ALT_OP_DISPATCH_FF: /* 0xff */
20230/* File: armv5te/alt_stub.S */
20231/*
20232 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20233 * any interesting requests and then jump to the real instruction
20234 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20235 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20236 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20237 * bail to the real handler if breakFlags==0.
20238 */
20239    ldrb   r3, [rSELF, #offThread_breakFlags]
20240    adrl   lr, dvmAsmInstructionStart + (255 * 64)
20241    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20242    cmp    r3, #0
20243    bxeq   lr                   @ nothing to do - jump to real handler
20244    EXPORT_PC()
20245    mov    r0, rPC              @ arg0
20246    mov    r1, rFP              @ arg1
20247    mov    r2, rSELF            @ arg2
20248    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20249
20250/* ------------------------------ */
20251    .balign 64
20252.L_ALT_OP_CONST_CLASS_JUMBO: /* 0x100 */
20253/* File: armv5te/alt_stub.S */
20254/*
20255 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20256 * any interesting requests and then jump to the real instruction
20257 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20258 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20259 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20260 * bail to the real handler if breakFlags==0.
20261 */
20262    ldrb   r3, [rSELF, #offThread_breakFlags]
20263    adrl   lr, dvmAsmInstructionStart + (256 * 64)
20264    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20265    cmp    r3, #0
20266    bxeq   lr                   @ nothing to do - jump to real handler
20267    EXPORT_PC()
20268    mov    r0, rPC              @ arg0
20269    mov    r1, rFP              @ arg1
20270    mov    r2, rSELF            @ arg2
20271    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20272
20273/* ------------------------------ */
20274    .balign 64
20275.L_ALT_OP_CHECK_CAST_JUMBO: /* 0x101 */
20276/* File: armv5te/alt_stub.S */
20277/*
20278 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20279 * any interesting requests and then jump to the real instruction
20280 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20281 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20282 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20283 * bail to the real handler if breakFlags==0.
20284 */
20285    ldrb   r3, [rSELF, #offThread_breakFlags]
20286    adrl   lr, dvmAsmInstructionStart + (257 * 64)
20287    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20288    cmp    r3, #0
20289    bxeq   lr                   @ nothing to do - jump to real handler
20290    EXPORT_PC()
20291    mov    r0, rPC              @ arg0
20292    mov    r1, rFP              @ arg1
20293    mov    r2, rSELF            @ arg2
20294    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20295
20296/* ------------------------------ */
20297    .balign 64
20298.L_ALT_OP_INSTANCE_OF_JUMBO: /* 0x102 */
20299/* File: armv5te/alt_stub.S */
20300/*
20301 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20302 * any interesting requests and then jump to the real instruction
20303 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20304 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20305 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20306 * bail to the real handler if breakFlags==0.
20307 */
20308    ldrb   r3, [rSELF, #offThread_breakFlags]
20309    adrl   lr, dvmAsmInstructionStart + (258 * 64)
20310    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20311    cmp    r3, #0
20312    bxeq   lr                   @ nothing to do - jump to real handler
20313    EXPORT_PC()
20314    mov    r0, rPC              @ arg0
20315    mov    r1, rFP              @ arg1
20316    mov    r2, rSELF            @ arg2
20317    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20318
20319/* ------------------------------ */
20320    .balign 64
20321.L_ALT_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
20322/* File: armv5te/alt_stub.S */
20323/*
20324 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20325 * any interesting requests and then jump to the real instruction
20326 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20327 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20328 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20329 * bail to the real handler if breakFlags==0.
20330 */
20331    ldrb   r3, [rSELF, #offThread_breakFlags]
20332    adrl   lr, dvmAsmInstructionStart + (259 * 64)
20333    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20334    cmp    r3, #0
20335    bxeq   lr                   @ nothing to do - jump to real handler
20336    EXPORT_PC()
20337    mov    r0, rPC              @ arg0
20338    mov    r1, rFP              @ arg1
20339    mov    r2, rSELF            @ arg2
20340    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20341
20342/* ------------------------------ */
20343    .balign 64
20344.L_ALT_OP_NEW_ARRAY_JUMBO: /* 0x104 */
20345/* File: armv5te/alt_stub.S */
20346/*
20347 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20348 * any interesting requests and then jump to the real instruction
20349 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20350 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20351 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20352 * bail to the real handler if breakFlags==0.
20353 */
20354    ldrb   r3, [rSELF, #offThread_breakFlags]
20355    adrl   lr, dvmAsmInstructionStart + (260 * 64)
20356    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20357    cmp    r3, #0
20358    bxeq   lr                   @ nothing to do - jump to real handler
20359    EXPORT_PC()
20360    mov    r0, rPC              @ arg0
20361    mov    r1, rFP              @ arg1
20362    mov    r2, rSELF            @ arg2
20363    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20364
20365/* ------------------------------ */
20366    .balign 64
20367.L_ALT_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
20368/* File: armv5te/alt_stub.S */
20369/*
20370 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20371 * any interesting requests and then jump to the real instruction
20372 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20373 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20374 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20375 * bail to the real handler if breakFlags==0.
20376 */
20377    ldrb   r3, [rSELF, #offThread_breakFlags]
20378    adrl   lr, dvmAsmInstructionStart + (261 * 64)
20379    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20380    cmp    r3, #0
20381    bxeq   lr                   @ nothing to do - jump to real handler
20382    EXPORT_PC()
20383    mov    r0, rPC              @ arg0
20384    mov    r1, rFP              @ arg1
20385    mov    r2, rSELF            @ arg2
20386    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20387
20388/* ------------------------------ */
20389    .balign 64
20390.L_ALT_OP_IGET_JUMBO: /* 0x106 */
20391/* File: armv5te/alt_stub.S */
20392/*
20393 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20394 * any interesting requests and then jump to the real instruction
20395 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20396 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20397 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20398 * bail to the real handler if breakFlags==0.
20399 */
20400    ldrb   r3, [rSELF, #offThread_breakFlags]
20401    adrl   lr, dvmAsmInstructionStart + (262 * 64)
20402    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20403    cmp    r3, #0
20404    bxeq   lr                   @ nothing to do - jump to real handler
20405    EXPORT_PC()
20406    mov    r0, rPC              @ arg0
20407    mov    r1, rFP              @ arg1
20408    mov    r2, rSELF            @ arg2
20409    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20410
20411/* ------------------------------ */
20412    .balign 64
20413.L_ALT_OP_IGET_WIDE_JUMBO: /* 0x107 */
20414/* File: armv5te/alt_stub.S */
20415/*
20416 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20417 * any interesting requests and then jump to the real instruction
20418 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20419 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20420 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20421 * bail to the real handler if breakFlags==0.
20422 */
20423    ldrb   r3, [rSELF, #offThread_breakFlags]
20424    adrl   lr, dvmAsmInstructionStart + (263 * 64)
20425    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20426    cmp    r3, #0
20427    bxeq   lr                   @ nothing to do - jump to real handler
20428    EXPORT_PC()
20429    mov    r0, rPC              @ arg0
20430    mov    r1, rFP              @ arg1
20431    mov    r2, rSELF            @ arg2
20432    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20433
20434/* ------------------------------ */
20435    .balign 64
20436.L_ALT_OP_IGET_OBJECT_JUMBO: /* 0x108 */
20437/* File: armv5te/alt_stub.S */
20438/*
20439 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20440 * any interesting requests and then jump to the real instruction
20441 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20442 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20443 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20444 * bail to the real handler if breakFlags==0.
20445 */
20446    ldrb   r3, [rSELF, #offThread_breakFlags]
20447    adrl   lr, dvmAsmInstructionStart + (264 * 64)
20448    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20449    cmp    r3, #0
20450    bxeq   lr                   @ nothing to do - jump to real handler
20451    EXPORT_PC()
20452    mov    r0, rPC              @ arg0
20453    mov    r1, rFP              @ arg1
20454    mov    r2, rSELF            @ arg2
20455    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20456
20457/* ------------------------------ */
20458    .balign 64
20459.L_ALT_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
20460/* File: armv5te/alt_stub.S */
20461/*
20462 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20463 * any interesting requests and then jump to the real instruction
20464 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20465 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20466 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20467 * bail to the real handler if breakFlags==0.
20468 */
20469    ldrb   r3, [rSELF, #offThread_breakFlags]
20470    adrl   lr, dvmAsmInstructionStart + (265 * 64)
20471    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20472    cmp    r3, #0
20473    bxeq   lr                   @ nothing to do - jump to real handler
20474    EXPORT_PC()
20475    mov    r0, rPC              @ arg0
20476    mov    r1, rFP              @ arg1
20477    mov    r2, rSELF            @ arg2
20478    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20479
20480/* ------------------------------ */
20481    .balign 64
20482.L_ALT_OP_IGET_BYTE_JUMBO: /* 0x10a */
20483/* File: armv5te/alt_stub.S */
20484/*
20485 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20486 * any interesting requests and then jump to the real instruction
20487 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20488 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20489 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20490 * bail to the real handler if breakFlags==0.
20491 */
20492    ldrb   r3, [rSELF, #offThread_breakFlags]
20493    adrl   lr, dvmAsmInstructionStart + (266 * 64)
20494    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20495    cmp    r3, #0
20496    bxeq   lr                   @ nothing to do - jump to real handler
20497    EXPORT_PC()
20498    mov    r0, rPC              @ arg0
20499    mov    r1, rFP              @ arg1
20500    mov    r2, rSELF            @ arg2
20501    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20502
20503/* ------------------------------ */
20504    .balign 64
20505.L_ALT_OP_IGET_CHAR_JUMBO: /* 0x10b */
20506/* File: armv5te/alt_stub.S */
20507/*
20508 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20509 * any interesting requests and then jump to the real instruction
20510 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20511 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20512 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20513 * bail to the real handler if breakFlags==0.
20514 */
20515    ldrb   r3, [rSELF, #offThread_breakFlags]
20516    adrl   lr, dvmAsmInstructionStart + (267 * 64)
20517    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20518    cmp    r3, #0
20519    bxeq   lr                   @ nothing to do - jump to real handler
20520    EXPORT_PC()
20521    mov    r0, rPC              @ arg0
20522    mov    r1, rFP              @ arg1
20523    mov    r2, rSELF            @ arg2
20524    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20525
20526/* ------------------------------ */
20527    .balign 64
20528.L_ALT_OP_IGET_SHORT_JUMBO: /* 0x10c */
20529/* File: armv5te/alt_stub.S */
20530/*
20531 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20532 * any interesting requests and then jump to the real instruction
20533 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20534 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20535 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20536 * bail to the real handler if breakFlags==0.
20537 */
20538    ldrb   r3, [rSELF, #offThread_breakFlags]
20539    adrl   lr, dvmAsmInstructionStart + (268 * 64)
20540    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20541    cmp    r3, #0
20542    bxeq   lr                   @ nothing to do - jump to real handler
20543    EXPORT_PC()
20544    mov    r0, rPC              @ arg0
20545    mov    r1, rFP              @ arg1
20546    mov    r2, rSELF            @ arg2
20547    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20548
20549/* ------------------------------ */
20550    .balign 64
20551.L_ALT_OP_IPUT_JUMBO: /* 0x10d */
20552/* File: armv5te/alt_stub.S */
20553/*
20554 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20555 * any interesting requests and then jump to the real instruction
20556 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20557 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20558 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20559 * bail to the real handler if breakFlags==0.
20560 */
20561    ldrb   r3, [rSELF, #offThread_breakFlags]
20562    adrl   lr, dvmAsmInstructionStart + (269 * 64)
20563    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20564    cmp    r3, #0
20565    bxeq   lr                   @ nothing to do - jump to real handler
20566    EXPORT_PC()
20567    mov    r0, rPC              @ arg0
20568    mov    r1, rFP              @ arg1
20569    mov    r2, rSELF            @ arg2
20570    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20571
20572/* ------------------------------ */
20573    .balign 64
20574.L_ALT_OP_IPUT_WIDE_JUMBO: /* 0x10e */
20575/* File: armv5te/alt_stub.S */
20576/*
20577 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20578 * any interesting requests and then jump to the real instruction
20579 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20580 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20581 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20582 * bail to the real handler if breakFlags==0.
20583 */
20584    ldrb   r3, [rSELF, #offThread_breakFlags]
20585    adrl   lr, dvmAsmInstructionStart + (270 * 64)
20586    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20587    cmp    r3, #0
20588    bxeq   lr                   @ nothing to do - jump to real handler
20589    EXPORT_PC()
20590    mov    r0, rPC              @ arg0
20591    mov    r1, rFP              @ arg1
20592    mov    r2, rSELF            @ arg2
20593    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20594
20595/* ------------------------------ */
20596    .balign 64
20597.L_ALT_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
20598/* File: armv5te/alt_stub.S */
20599/*
20600 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20601 * any interesting requests and then jump to the real instruction
20602 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20603 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20604 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20605 * bail to the real handler if breakFlags==0.
20606 */
20607    ldrb   r3, [rSELF, #offThread_breakFlags]
20608    adrl   lr, dvmAsmInstructionStart + (271 * 64)
20609    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20610    cmp    r3, #0
20611    bxeq   lr                   @ nothing to do - jump to real handler
20612    EXPORT_PC()
20613    mov    r0, rPC              @ arg0
20614    mov    r1, rFP              @ arg1
20615    mov    r2, rSELF            @ arg2
20616    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20617
20618/* ------------------------------ */
20619    .balign 64
20620.L_ALT_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
20621/* File: armv5te/alt_stub.S */
20622/*
20623 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20624 * any interesting requests and then jump to the real instruction
20625 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20626 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20627 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20628 * bail to the real handler if breakFlags==0.
20629 */
20630    ldrb   r3, [rSELF, #offThread_breakFlags]
20631    adrl   lr, dvmAsmInstructionStart + (272 * 64)
20632    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20633    cmp    r3, #0
20634    bxeq   lr                   @ nothing to do - jump to real handler
20635    EXPORT_PC()
20636    mov    r0, rPC              @ arg0
20637    mov    r1, rFP              @ arg1
20638    mov    r2, rSELF            @ arg2
20639    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20640
20641/* ------------------------------ */
20642    .balign 64
20643.L_ALT_OP_IPUT_BYTE_JUMBO: /* 0x111 */
20644/* File: armv5te/alt_stub.S */
20645/*
20646 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20647 * any interesting requests and then jump to the real instruction
20648 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20649 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20650 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20651 * bail to the real handler if breakFlags==0.
20652 */
20653    ldrb   r3, [rSELF, #offThread_breakFlags]
20654    adrl   lr, dvmAsmInstructionStart + (273 * 64)
20655    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20656    cmp    r3, #0
20657    bxeq   lr                   @ nothing to do - jump to real handler
20658    EXPORT_PC()
20659    mov    r0, rPC              @ arg0
20660    mov    r1, rFP              @ arg1
20661    mov    r2, rSELF            @ arg2
20662    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20663
20664/* ------------------------------ */
20665    .balign 64
20666.L_ALT_OP_IPUT_CHAR_JUMBO: /* 0x112 */
20667/* File: armv5te/alt_stub.S */
20668/*
20669 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20670 * any interesting requests and then jump to the real instruction
20671 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20672 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20673 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20674 * bail to the real handler if breakFlags==0.
20675 */
20676    ldrb   r3, [rSELF, #offThread_breakFlags]
20677    adrl   lr, dvmAsmInstructionStart + (274 * 64)
20678    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20679    cmp    r3, #0
20680    bxeq   lr                   @ nothing to do - jump to real handler
20681    EXPORT_PC()
20682    mov    r0, rPC              @ arg0
20683    mov    r1, rFP              @ arg1
20684    mov    r2, rSELF            @ arg2
20685    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20686
20687/* ------------------------------ */
20688    .balign 64
20689.L_ALT_OP_IPUT_SHORT_JUMBO: /* 0x113 */
20690/* File: armv5te/alt_stub.S */
20691/*
20692 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20693 * any interesting requests and then jump to the real instruction
20694 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20695 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20696 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20697 * bail to the real handler if breakFlags==0.
20698 */
20699    ldrb   r3, [rSELF, #offThread_breakFlags]
20700    adrl   lr, dvmAsmInstructionStart + (275 * 64)
20701    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20702    cmp    r3, #0
20703    bxeq   lr                   @ nothing to do - jump to real handler
20704    EXPORT_PC()
20705    mov    r0, rPC              @ arg0
20706    mov    r1, rFP              @ arg1
20707    mov    r2, rSELF            @ arg2
20708    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20709
20710/* ------------------------------ */
20711    .balign 64
20712.L_ALT_OP_SGET_JUMBO: /* 0x114 */
20713/* File: armv5te/alt_stub.S */
20714/*
20715 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20716 * any interesting requests and then jump to the real instruction
20717 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20718 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20719 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20720 * bail to the real handler if breakFlags==0.
20721 */
20722    ldrb   r3, [rSELF, #offThread_breakFlags]
20723    adrl   lr, dvmAsmInstructionStart + (276 * 64)
20724    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20725    cmp    r3, #0
20726    bxeq   lr                   @ nothing to do - jump to real handler
20727    EXPORT_PC()
20728    mov    r0, rPC              @ arg0
20729    mov    r1, rFP              @ arg1
20730    mov    r2, rSELF            @ arg2
20731    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20732
20733/* ------------------------------ */
20734    .balign 64
20735.L_ALT_OP_SGET_WIDE_JUMBO: /* 0x115 */
20736/* File: armv5te/alt_stub.S */
20737/*
20738 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20739 * any interesting requests and then jump to the real instruction
20740 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20741 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20742 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20743 * bail to the real handler if breakFlags==0.
20744 */
20745    ldrb   r3, [rSELF, #offThread_breakFlags]
20746    adrl   lr, dvmAsmInstructionStart + (277 * 64)
20747    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20748    cmp    r3, #0
20749    bxeq   lr                   @ nothing to do - jump to real handler
20750    EXPORT_PC()
20751    mov    r0, rPC              @ arg0
20752    mov    r1, rFP              @ arg1
20753    mov    r2, rSELF            @ arg2
20754    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20755
20756/* ------------------------------ */
20757    .balign 64
20758.L_ALT_OP_SGET_OBJECT_JUMBO: /* 0x116 */
20759/* File: armv5te/alt_stub.S */
20760/*
20761 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20762 * any interesting requests and then jump to the real instruction
20763 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20764 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20765 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20766 * bail to the real handler if breakFlags==0.
20767 */
20768    ldrb   r3, [rSELF, #offThread_breakFlags]
20769    adrl   lr, dvmAsmInstructionStart + (278 * 64)
20770    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20771    cmp    r3, #0
20772    bxeq   lr                   @ nothing to do - jump to real handler
20773    EXPORT_PC()
20774    mov    r0, rPC              @ arg0
20775    mov    r1, rFP              @ arg1
20776    mov    r2, rSELF            @ arg2
20777    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20778
20779/* ------------------------------ */
20780    .balign 64
20781.L_ALT_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
20782/* File: armv5te/alt_stub.S */
20783/*
20784 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20785 * any interesting requests and then jump to the real instruction
20786 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20787 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20788 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20789 * bail to the real handler if breakFlags==0.
20790 */
20791    ldrb   r3, [rSELF, #offThread_breakFlags]
20792    adrl   lr, dvmAsmInstructionStart + (279 * 64)
20793    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20794    cmp    r3, #0
20795    bxeq   lr                   @ nothing to do - jump to real handler
20796    EXPORT_PC()
20797    mov    r0, rPC              @ arg0
20798    mov    r1, rFP              @ arg1
20799    mov    r2, rSELF            @ arg2
20800    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20801
20802/* ------------------------------ */
20803    .balign 64
20804.L_ALT_OP_SGET_BYTE_JUMBO: /* 0x118 */
20805/* File: armv5te/alt_stub.S */
20806/*
20807 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20808 * any interesting requests and then jump to the real instruction
20809 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20810 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20811 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20812 * bail to the real handler if breakFlags==0.
20813 */
20814    ldrb   r3, [rSELF, #offThread_breakFlags]
20815    adrl   lr, dvmAsmInstructionStart + (280 * 64)
20816    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20817    cmp    r3, #0
20818    bxeq   lr                   @ nothing to do - jump to real handler
20819    EXPORT_PC()
20820    mov    r0, rPC              @ arg0
20821    mov    r1, rFP              @ arg1
20822    mov    r2, rSELF            @ arg2
20823    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20824
20825/* ------------------------------ */
20826    .balign 64
20827.L_ALT_OP_SGET_CHAR_JUMBO: /* 0x119 */
20828/* File: armv5te/alt_stub.S */
20829/*
20830 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20831 * any interesting requests and then jump to the real instruction
20832 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20833 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20834 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20835 * bail to the real handler if breakFlags==0.
20836 */
20837    ldrb   r3, [rSELF, #offThread_breakFlags]
20838    adrl   lr, dvmAsmInstructionStart + (281 * 64)
20839    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20840    cmp    r3, #0
20841    bxeq   lr                   @ nothing to do - jump to real handler
20842    EXPORT_PC()
20843    mov    r0, rPC              @ arg0
20844    mov    r1, rFP              @ arg1
20845    mov    r2, rSELF            @ arg2
20846    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20847
20848/* ------------------------------ */
20849    .balign 64
20850.L_ALT_OP_SGET_SHORT_JUMBO: /* 0x11a */
20851/* File: armv5te/alt_stub.S */
20852/*
20853 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20854 * any interesting requests and then jump to the real instruction
20855 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20856 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20857 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20858 * bail to the real handler if breakFlags==0.
20859 */
20860    ldrb   r3, [rSELF, #offThread_breakFlags]
20861    adrl   lr, dvmAsmInstructionStart + (282 * 64)
20862    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20863    cmp    r3, #0
20864    bxeq   lr                   @ nothing to do - jump to real handler
20865    EXPORT_PC()
20866    mov    r0, rPC              @ arg0
20867    mov    r1, rFP              @ arg1
20868    mov    r2, rSELF            @ arg2
20869    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20870
20871/* ------------------------------ */
20872    .balign 64
20873.L_ALT_OP_SPUT_JUMBO: /* 0x11b */
20874/* File: armv5te/alt_stub.S */
20875/*
20876 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20877 * any interesting requests and then jump to the real instruction
20878 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20879 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20880 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20881 * bail to the real handler if breakFlags==0.
20882 */
20883    ldrb   r3, [rSELF, #offThread_breakFlags]
20884    adrl   lr, dvmAsmInstructionStart + (283 * 64)
20885    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20886    cmp    r3, #0
20887    bxeq   lr                   @ nothing to do - jump to real handler
20888    EXPORT_PC()
20889    mov    r0, rPC              @ arg0
20890    mov    r1, rFP              @ arg1
20891    mov    r2, rSELF            @ arg2
20892    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20893
20894/* ------------------------------ */
20895    .balign 64
20896.L_ALT_OP_SPUT_WIDE_JUMBO: /* 0x11c */
20897/* File: armv5te/alt_stub.S */
20898/*
20899 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20900 * any interesting requests and then jump to the real instruction
20901 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20902 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20903 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20904 * bail to the real handler if breakFlags==0.
20905 */
20906    ldrb   r3, [rSELF, #offThread_breakFlags]
20907    adrl   lr, dvmAsmInstructionStart + (284 * 64)
20908    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20909    cmp    r3, #0
20910    bxeq   lr                   @ nothing to do - jump to real handler
20911    EXPORT_PC()
20912    mov    r0, rPC              @ arg0
20913    mov    r1, rFP              @ arg1
20914    mov    r2, rSELF            @ arg2
20915    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20916
20917/* ------------------------------ */
20918    .balign 64
20919.L_ALT_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
20920/* File: armv5te/alt_stub.S */
20921/*
20922 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20923 * any interesting requests and then jump to the real instruction
20924 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20925 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20926 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20927 * bail to the real handler if breakFlags==0.
20928 */
20929    ldrb   r3, [rSELF, #offThread_breakFlags]
20930    adrl   lr, dvmAsmInstructionStart + (285 * 64)
20931    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20932    cmp    r3, #0
20933    bxeq   lr                   @ nothing to do - jump to real handler
20934    EXPORT_PC()
20935    mov    r0, rPC              @ arg0
20936    mov    r1, rFP              @ arg1
20937    mov    r2, rSELF            @ arg2
20938    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20939
20940/* ------------------------------ */
20941    .balign 64
20942.L_ALT_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
20943/* File: armv5te/alt_stub.S */
20944/*
20945 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20946 * any interesting requests and then jump to the real instruction
20947 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20948 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20949 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20950 * bail to the real handler if breakFlags==0.
20951 */
20952    ldrb   r3, [rSELF, #offThread_breakFlags]
20953    adrl   lr, dvmAsmInstructionStart + (286 * 64)
20954    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20955    cmp    r3, #0
20956    bxeq   lr                   @ nothing to do - jump to real handler
20957    EXPORT_PC()
20958    mov    r0, rPC              @ arg0
20959    mov    r1, rFP              @ arg1
20960    mov    r2, rSELF            @ arg2
20961    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20962
20963/* ------------------------------ */
20964    .balign 64
20965.L_ALT_OP_SPUT_BYTE_JUMBO: /* 0x11f */
20966/* File: armv5te/alt_stub.S */
20967/*
20968 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20969 * any interesting requests and then jump to the real instruction
20970 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20971 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20972 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20973 * bail to the real handler if breakFlags==0.
20974 */
20975    ldrb   r3, [rSELF, #offThread_breakFlags]
20976    adrl   lr, dvmAsmInstructionStart + (287 * 64)
20977    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20978    cmp    r3, #0
20979    bxeq   lr                   @ nothing to do - jump to real handler
20980    EXPORT_PC()
20981    mov    r0, rPC              @ arg0
20982    mov    r1, rFP              @ arg1
20983    mov    r2, rSELF            @ arg2
20984    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20985
20986/* ------------------------------ */
20987    .balign 64
20988.L_ALT_OP_SPUT_CHAR_JUMBO: /* 0x120 */
20989/* File: armv5te/alt_stub.S */
20990/*
20991 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20992 * any interesting requests and then jump to the real instruction
20993 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20994 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20995 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20996 * bail to the real handler if breakFlags==0.
20997 */
20998    ldrb   r3, [rSELF, #offThread_breakFlags]
20999    adrl   lr, dvmAsmInstructionStart + (288 * 64)
21000    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21001    cmp    r3, #0
21002    bxeq   lr                   @ nothing to do - jump to real handler
21003    EXPORT_PC()
21004    mov    r0, rPC              @ arg0
21005    mov    r1, rFP              @ arg1
21006    mov    r2, rSELF            @ arg2
21007    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21008
21009/* ------------------------------ */
21010    .balign 64
21011.L_ALT_OP_SPUT_SHORT_JUMBO: /* 0x121 */
21012/* File: armv5te/alt_stub.S */
21013/*
21014 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21015 * any interesting requests and then jump to the real instruction
21016 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21017 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21018 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21019 * bail to the real handler if breakFlags==0.
21020 */
21021    ldrb   r3, [rSELF, #offThread_breakFlags]
21022    adrl   lr, dvmAsmInstructionStart + (289 * 64)
21023    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21024    cmp    r3, #0
21025    bxeq   lr                   @ nothing to do - jump to real handler
21026    EXPORT_PC()
21027    mov    r0, rPC              @ arg0
21028    mov    r1, rFP              @ arg1
21029    mov    r2, rSELF            @ arg2
21030    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21031
21032/* ------------------------------ */
21033    .balign 64
21034.L_ALT_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
21035/* File: armv5te/alt_stub.S */
21036/*
21037 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21038 * any interesting requests and then jump to the real instruction
21039 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21040 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21041 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21042 * bail to the real handler if breakFlags==0.
21043 */
21044    ldrb   r3, [rSELF, #offThread_breakFlags]
21045    adrl   lr, dvmAsmInstructionStart + (290 * 64)
21046    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21047    cmp    r3, #0
21048    bxeq   lr                   @ nothing to do - jump to real handler
21049    EXPORT_PC()
21050    mov    r0, rPC              @ arg0
21051    mov    r1, rFP              @ arg1
21052    mov    r2, rSELF            @ arg2
21053    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21054
21055/* ------------------------------ */
21056    .balign 64
21057.L_ALT_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
21058/* File: armv5te/alt_stub.S */
21059/*
21060 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21061 * any interesting requests and then jump to the real instruction
21062 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21063 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21064 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21065 * bail to the real handler if breakFlags==0.
21066 */
21067    ldrb   r3, [rSELF, #offThread_breakFlags]
21068    adrl   lr, dvmAsmInstructionStart + (291 * 64)
21069    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21070    cmp    r3, #0
21071    bxeq   lr                   @ nothing to do - jump to real handler
21072    EXPORT_PC()
21073    mov    r0, rPC              @ arg0
21074    mov    r1, rFP              @ arg1
21075    mov    r2, rSELF            @ arg2
21076    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21077
21078/* ------------------------------ */
21079    .balign 64
21080.L_ALT_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
21081/* File: armv5te/alt_stub.S */
21082/*
21083 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21084 * any interesting requests and then jump to the real instruction
21085 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21086 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21087 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21088 * bail to the real handler if breakFlags==0.
21089 */
21090    ldrb   r3, [rSELF, #offThread_breakFlags]
21091    adrl   lr, dvmAsmInstructionStart + (292 * 64)
21092    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21093    cmp    r3, #0
21094    bxeq   lr                   @ nothing to do - jump to real handler
21095    EXPORT_PC()
21096    mov    r0, rPC              @ arg0
21097    mov    r1, rFP              @ arg1
21098    mov    r2, rSELF            @ arg2
21099    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21100
21101/* ------------------------------ */
21102    .balign 64
21103.L_ALT_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
21104/* File: armv5te/alt_stub.S */
21105/*
21106 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21107 * any interesting requests and then jump to the real instruction
21108 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21109 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21110 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21111 * bail to the real handler if breakFlags==0.
21112 */
21113    ldrb   r3, [rSELF, #offThread_breakFlags]
21114    adrl   lr, dvmAsmInstructionStart + (293 * 64)
21115    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21116    cmp    r3, #0
21117    bxeq   lr                   @ nothing to do - jump to real handler
21118    EXPORT_PC()
21119    mov    r0, rPC              @ arg0
21120    mov    r1, rFP              @ arg1
21121    mov    r2, rSELF            @ arg2
21122    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21123
21124/* ------------------------------ */
21125    .balign 64
21126.L_ALT_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
21127/* File: armv5te/alt_stub.S */
21128/*
21129 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21130 * any interesting requests and then jump to the real instruction
21131 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21132 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21133 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21134 * bail to the real handler if breakFlags==0.
21135 */
21136    ldrb   r3, [rSELF, #offThread_breakFlags]
21137    adrl   lr, dvmAsmInstructionStart + (294 * 64)
21138    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21139    cmp    r3, #0
21140    bxeq   lr                   @ nothing to do - jump to real handler
21141    EXPORT_PC()
21142    mov    r0, rPC              @ arg0
21143    mov    r1, rFP              @ arg1
21144    mov    r2, rSELF            @ arg2
21145    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21146
21147/* ------------------------------ */
21148    .balign 64
21149.L_ALT_OP_UNUSED_27FF: /* 0x127 */
21150/* File: armv5te/alt_stub.S */
21151/*
21152 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21153 * any interesting requests and then jump to the real instruction
21154 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21155 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21156 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21157 * bail to the real handler if breakFlags==0.
21158 */
21159    ldrb   r3, [rSELF, #offThread_breakFlags]
21160    adrl   lr, dvmAsmInstructionStart + (295 * 64)
21161    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21162    cmp    r3, #0
21163    bxeq   lr                   @ nothing to do - jump to real handler
21164    EXPORT_PC()
21165    mov    r0, rPC              @ arg0
21166    mov    r1, rFP              @ arg1
21167    mov    r2, rSELF            @ arg2
21168    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21169
21170/* ------------------------------ */
21171    .balign 64
21172.L_ALT_OP_UNUSED_28FF: /* 0x128 */
21173/* File: armv5te/alt_stub.S */
21174/*
21175 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21176 * any interesting requests and then jump to the real instruction
21177 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21178 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21179 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21180 * bail to the real handler if breakFlags==0.
21181 */
21182    ldrb   r3, [rSELF, #offThread_breakFlags]
21183    adrl   lr, dvmAsmInstructionStart + (296 * 64)
21184    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21185    cmp    r3, #0
21186    bxeq   lr                   @ nothing to do - jump to real handler
21187    EXPORT_PC()
21188    mov    r0, rPC              @ arg0
21189    mov    r1, rFP              @ arg1
21190    mov    r2, rSELF            @ arg2
21191    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21192
21193/* ------------------------------ */
21194    .balign 64
21195.L_ALT_OP_UNUSED_29FF: /* 0x129 */
21196/* File: armv5te/alt_stub.S */
21197/*
21198 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21199 * any interesting requests and then jump to the real instruction
21200 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21201 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21202 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21203 * bail to the real handler if breakFlags==0.
21204 */
21205    ldrb   r3, [rSELF, #offThread_breakFlags]
21206    adrl   lr, dvmAsmInstructionStart + (297 * 64)
21207    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21208    cmp    r3, #0
21209    bxeq   lr                   @ nothing to do - jump to real handler
21210    EXPORT_PC()
21211    mov    r0, rPC              @ arg0
21212    mov    r1, rFP              @ arg1
21213    mov    r2, rSELF            @ arg2
21214    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21215
21216/* ------------------------------ */
21217    .balign 64
21218.L_ALT_OP_UNUSED_2AFF: /* 0x12a */
21219/* File: armv5te/alt_stub.S */
21220/*
21221 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21222 * any interesting requests and then jump to the real instruction
21223 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21224 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21225 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21226 * bail to the real handler if breakFlags==0.
21227 */
21228    ldrb   r3, [rSELF, #offThread_breakFlags]
21229    adrl   lr, dvmAsmInstructionStart + (298 * 64)
21230    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21231    cmp    r3, #0
21232    bxeq   lr                   @ nothing to do - jump to real handler
21233    EXPORT_PC()
21234    mov    r0, rPC              @ arg0
21235    mov    r1, rFP              @ arg1
21236    mov    r2, rSELF            @ arg2
21237    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21238
21239/* ------------------------------ */
21240    .balign 64
21241.L_ALT_OP_UNUSED_2BFF: /* 0x12b */
21242/* File: armv5te/alt_stub.S */
21243/*
21244 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21245 * any interesting requests and then jump to the real instruction
21246 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21247 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21248 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21249 * bail to the real handler if breakFlags==0.
21250 */
21251    ldrb   r3, [rSELF, #offThread_breakFlags]
21252    adrl   lr, dvmAsmInstructionStart + (299 * 64)
21253    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21254    cmp    r3, #0
21255    bxeq   lr                   @ nothing to do - jump to real handler
21256    EXPORT_PC()
21257    mov    r0, rPC              @ arg0
21258    mov    r1, rFP              @ arg1
21259    mov    r2, rSELF            @ arg2
21260    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21261
21262/* ------------------------------ */
21263    .balign 64
21264.L_ALT_OP_UNUSED_2CFF: /* 0x12c */
21265/* File: armv5te/alt_stub.S */
21266/*
21267 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21268 * any interesting requests and then jump to the real instruction
21269 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21270 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21271 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21272 * bail to the real handler if breakFlags==0.
21273 */
21274    ldrb   r3, [rSELF, #offThread_breakFlags]
21275    adrl   lr, dvmAsmInstructionStart + (300 * 64)
21276    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21277    cmp    r3, #0
21278    bxeq   lr                   @ nothing to do - jump to real handler
21279    EXPORT_PC()
21280    mov    r0, rPC              @ arg0
21281    mov    r1, rFP              @ arg1
21282    mov    r2, rSELF            @ arg2
21283    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21284
21285/* ------------------------------ */
21286    .balign 64
21287.L_ALT_OP_UNUSED_2DFF: /* 0x12d */
21288/* File: armv5te/alt_stub.S */
21289/*
21290 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21291 * any interesting requests and then jump to the real instruction
21292 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21293 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21294 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21295 * bail to the real handler if breakFlags==0.
21296 */
21297    ldrb   r3, [rSELF, #offThread_breakFlags]
21298    adrl   lr, dvmAsmInstructionStart + (301 * 64)
21299    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21300    cmp    r3, #0
21301    bxeq   lr                   @ nothing to do - jump to real handler
21302    EXPORT_PC()
21303    mov    r0, rPC              @ arg0
21304    mov    r1, rFP              @ arg1
21305    mov    r2, rSELF            @ arg2
21306    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21307
21308/* ------------------------------ */
21309    .balign 64
21310.L_ALT_OP_UNUSED_2EFF: /* 0x12e */
21311/* File: armv5te/alt_stub.S */
21312/*
21313 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21314 * any interesting requests and then jump to the real instruction
21315 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21316 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21317 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21318 * bail to the real handler if breakFlags==0.
21319 */
21320    ldrb   r3, [rSELF, #offThread_breakFlags]
21321    adrl   lr, dvmAsmInstructionStart + (302 * 64)
21322    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21323    cmp    r3, #0
21324    bxeq   lr                   @ nothing to do - jump to real handler
21325    EXPORT_PC()
21326    mov    r0, rPC              @ arg0
21327    mov    r1, rFP              @ arg1
21328    mov    r2, rSELF            @ arg2
21329    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21330
21331/* ------------------------------ */
21332    .balign 64
21333.L_ALT_OP_UNUSED_2FFF: /* 0x12f */
21334/* File: armv5te/alt_stub.S */
21335/*
21336 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21337 * any interesting requests and then jump to the real instruction
21338 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21339 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21340 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21341 * bail to the real handler if breakFlags==0.
21342 */
21343    ldrb   r3, [rSELF, #offThread_breakFlags]
21344    adrl   lr, dvmAsmInstructionStart + (303 * 64)
21345    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21346    cmp    r3, #0
21347    bxeq   lr                   @ nothing to do - jump to real handler
21348    EXPORT_PC()
21349    mov    r0, rPC              @ arg0
21350    mov    r1, rFP              @ arg1
21351    mov    r2, rSELF            @ arg2
21352    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21353
21354/* ------------------------------ */
21355    .balign 64
21356.L_ALT_OP_UNUSED_30FF: /* 0x130 */
21357/* File: armv5te/alt_stub.S */
21358/*
21359 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21360 * any interesting requests and then jump to the real instruction
21361 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21362 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21363 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21364 * bail to the real handler if breakFlags==0.
21365 */
21366    ldrb   r3, [rSELF, #offThread_breakFlags]
21367    adrl   lr, dvmAsmInstructionStart + (304 * 64)
21368    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21369    cmp    r3, #0
21370    bxeq   lr                   @ nothing to do - jump to real handler
21371    EXPORT_PC()
21372    mov    r0, rPC              @ arg0
21373    mov    r1, rFP              @ arg1
21374    mov    r2, rSELF            @ arg2
21375    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21376
21377/* ------------------------------ */
21378    .balign 64
21379.L_ALT_OP_UNUSED_31FF: /* 0x131 */
21380/* File: armv5te/alt_stub.S */
21381/*
21382 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21383 * any interesting requests and then jump to the real instruction
21384 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21385 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21386 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21387 * bail to the real handler if breakFlags==0.
21388 */
21389    ldrb   r3, [rSELF, #offThread_breakFlags]
21390    adrl   lr, dvmAsmInstructionStart + (305 * 64)
21391    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21392    cmp    r3, #0
21393    bxeq   lr                   @ nothing to do - jump to real handler
21394    EXPORT_PC()
21395    mov    r0, rPC              @ arg0
21396    mov    r1, rFP              @ arg1
21397    mov    r2, rSELF            @ arg2
21398    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21399
21400/* ------------------------------ */
21401    .balign 64
21402.L_ALT_OP_UNUSED_32FF: /* 0x132 */
21403/* File: armv5te/alt_stub.S */
21404/*
21405 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21406 * any interesting requests and then jump to the real instruction
21407 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21408 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21409 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21410 * bail to the real handler if breakFlags==0.
21411 */
21412    ldrb   r3, [rSELF, #offThread_breakFlags]
21413    adrl   lr, dvmAsmInstructionStart + (306 * 64)
21414    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21415    cmp    r3, #0
21416    bxeq   lr                   @ nothing to do - jump to real handler
21417    EXPORT_PC()
21418    mov    r0, rPC              @ arg0
21419    mov    r1, rFP              @ arg1
21420    mov    r2, rSELF            @ arg2
21421    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21422
21423/* ------------------------------ */
21424    .balign 64
21425.L_ALT_OP_UNUSED_33FF: /* 0x133 */
21426/* File: armv5te/alt_stub.S */
21427/*
21428 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21429 * any interesting requests and then jump to the real instruction
21430 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21431 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21432 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21433 * bail to the real handler if breakFlags==0.
21434 */
21435    ldrb   r3, [rSELF, #offThread_breakFlags]
21436    adrl   lr, dvmAsmInstructionStart + (307 * 64)
21437    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21438    cmp    r3, #0
21439    bxeq   lr                   @ nothing to do - jump to real handler
21440    EXPORT_PC()
21441    mov    r0, rPC              @ arg0
21442    mov    r1, rFP              @ arg1
21443    mov    r2, rSELF            @ arg2
21444    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21445
21446/* ------------------------------ */
21447    .balign 64
21448.L_ALT_OP_UNUSED_34FF: /* 0x134 */
21449/* File: armv5te/alt_stub.S */
21450/*
21451 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21452 * any interesting requests and then jump to the real instruction
21453 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21454 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21455 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21456 * bail to the real handler if breakFlags==0.
21457 */
21458    ldrb   r3, [rSELF, #offThread_breakFlags]
21459    adrl   lr, dvmAsmInstructionStart + (308 * 64)
21460    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21461    cmp    r3, #0
21462    bxeq   lr                   @ nothing to do - jump to real handler
21463    EXPORT_PC()
21464    mov    r0, rPC              @ arg0
21465    mov    r1, rFP              @ arg1
21466    mov    r2, rSELF            @ arg2
21467    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21468
21469/* ------------------------------ */
21470    .balign 64
21471.L_ALT_OP_UNUSED_35FF: /* 0x135 */
21472/* File: armv5te/alt_stub.S */
21473/*
21474 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21475 * any interesting requests and then jump to the real instruction
21476 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21477 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21478 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21479 * bail to the real handler if breakFlags==0.
21480 */
21481    ldrb   r3, [rSELF, #offThread_breakFlags]
21482    adrl   lr, dvmAsmInstructionStart + (309 * 64)
21483    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21484    cmp    r3, #0
21485    bxeq   lr                   @ nothing to do - jump to real handler
21486    EXPORT_PC()
21487    mov    r0, rPC              @ arg0
21488    mov    r1, rFP              @ arg1
21489    mov    r2, rSELF            @ arg2
21490    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21491
21492/* ------------------------------ */
21493    .balign 64
21494.L_ALT_OP_UNUSED_36FF: /* 0x136 */
21495/* File: armv5te/alt_stub.S */
21496/*
21497 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21498 * any interesting requests and then jump to the real instruction
21499 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21500 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21501 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21502 * bail to the real handler if breakFlags==0.
21503 */
21504    ldrb   r3, [rSELF, #offThread_breakFlags]
21505    adrl   lr, dvmAsmInstructionStart + (310 * 64)
21506    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21507    cmp    r3, #0
21508    bxeq   lr                   @ nothing to do - jump to real handler
21509    EXPORT_PC()
21510    mov    r0, rPC              @ arg0
21511    mov    r1, rFP              @ arg1
21512    mov    r2, rSELF            @ arg2
21513    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21514
21515/* ------------------------------ */
21516    .balign 64
21517.L_ALT_OP_UNUSED_37FF: /* 0x137 */
21518/* File: armv5te/alt_stub.S */
21519/*
21520 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21521 * any interesting requests and then jump to the real instruction
21522 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21523 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21524 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21525 * bail to the real handler if breakFlags==0.
21526 */
21527    ldrb   r3, [rSELF, #offThread_breakFlags]
21528    adrl   lr, dvmAsmInstructionStart + (311 * 64)
21529    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21530    cmp    r3, #0
21531    bxeq   lr                   @ nothing to do - jump to real handler
21532    EXPORT_PC()
21533    mov    r0, rPC              @ arg0
21534    mov    r1, rFP              @ arg1
21535    mov    r2, rSELF            @ arg2
21536    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21537
21538/* ------------------------------ */
21539    .balign 64
21540.L_ALT_OP_UNUSED_38FF: /* 0x138 */
21541/* File: armv5te/alt_stub.S */
21542/*
21543 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21544 * any interesting requests and then jump to the real instruction
21545 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21546 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21547 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21548 * bail to the real handler if breakFlags==0.
21549 */
21550    ldrb   r3, [rSELF, #offThread_breakFlags]
21551    adrl   lr, dvmAsmInstructionStart + (312 * 64)
21552    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21553    cmp    r3, #0
21554    bxeq   lr                   @ nothing to do - jump to real handler
21555    EXPORT_PC()
21556    mov    r0, rPC              @ arg0
21557    mov    r1, rFP              @ arg1
21558    mov    r2, rSELF            @ arg2
21559    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21560
21561/* ------------------------------ */
21562    .balign 64
21563.L_ALT_OP_UNUSED_39FF: /* 0x139 */
21564/* File: armv5te/alt_stub.S */
21565/*
21566 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21567 * any interesting requests and then jump to the real instruction
21568 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21569 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21570 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21571 * bail to the real handler if breakFlags==0.
21572 */
21573    ldrb   r3, [rSELF, #offThread_breakFlags]
21574    adrl   lr, dvmAsmInstructionStart + (313 * 64)
21575    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21576    cmp    r3, #0
21577    bxeq   lr                   @ nothing to do - jump to real handler
21578    EXPORT_PC()
21579    mov    r0, rPC              @ arg0
21580    mov    r1, rFP              @ arg1
21581    mov    r2, rSELF            @ arg2
21582    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21583
21584/* ------------------------------ */
21585    .balign 64
21586.L_ALT_OP_UNUSED_3AFF: /* 0x13a */
21587/* File: armv5te/alt_stub.S */
21588/*
21589 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21590 * any interesting requests and then jump to the real instruction
21591 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21592 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21593 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21594 * bail to the real handler if breakFlags==0.
21595 */
21596    ldrb   r3, [rSELF, #offThread_breakFlags]
21597    adrl   lr, dvmAsmInstructionStart + (314 * 64)
21598    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21599    cmp    r3, #0
21600    bxeq   lr                   @ nothing to do - jump to real handler
21601    EXPORT_PC()
21602    mov    r0, rPC              @ arg0
21603    mov    r1, rFP              @ arg1
21604    mov    r2, rSELF            @ arg2
21605    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21606
21607/* ------------------------------ */
21608    .balign 64
21609.L_ALT_OP_UNUSED_3BFF: /* 0x13b */
21610/* File: armv5te/alt_stub.S */
21611/*
21612 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21613 * any interesting requests and then jump to the real instruction
21614 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21615 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21616 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21617 * bail to the real handler if breakFlags==0.
21618 */
21619    ldrb   r3, [rSELF, #offThread_breakFlags]
21620    adrl   lr, dvmAsmInstructionStart + (315 * 64)
21621    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21622    cmp    r3, #0
21623    bxeq   lr                   @ nothing to do - jump to real handler
21624    EXPORT_PC()
21625    mov    r0, rPC              @ arg0
21626    mov    r1, rFP              @ arg1
21627    mov    r2, rSELF            @ arg2
21628    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21629
21630/* ------------------------------ */
21631    .balign 64
21632.L_ALT_OP_UNUSED_3CFF: /* 0x13c */
21633/* File: armv5te/alt_stub.S */
21634/*
21635 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21636 * any interesting requests and then jump to the real instruction
21637 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21638 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21639 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21640 * bail to the real handler if breakFlags==0.
21641 */
21642    ldrb   r3, [rSELF, #offThread_breakFlags]
21643    adrl   lr, dvmAsmInstructionStart + (316 * 64)
21644    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21645    cmp    r3, #0
21646    bxeq   lr                   @ nothing to do - jump to real handler
21647    EXPORT_PC()
21648    mov    r0, rPC              @ arg0
21649    mov    r1, rFP              @ arg1
21650    mov    r2, rSELF            @ arg2
21651    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21652
21653/* ------------------------------ */
21654    .balign 64
21655.L_ALT_OP_UNUSED_3DFF: /* 0x13d */
21656/* File: armv5te/alt_stub.S */
21657/*
21658 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21659 * any interesting requests and then jump to the real instruction
21660 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21661 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21662 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21663 * bail to the real handler if breakFlags==0.
21664 */
21665    ldrb   r3, [rSELF, #offThread_breakFlags]
21666    adrl   lr, dvmAsmInstructionStart + (317 * 64)
21667    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21668    cmp    r3, #0
21669    bxeq   lr                   @ nothing to do - jump to real handler
21670    EXPORT_PC()
21671    mov    r0, rPC              @ arg0
21672    mov    r1, rFP              @ arg1
21673    mov    r2, rSELF            @ arg2
21674    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21675
21676/* ------------------------------ */
21677    .balign 64
21678.L_ALT_OP_UNUSED_3EFF: /* 0x13e */
21679/* File: armv5te/alt_stub.S */
21680/*
21681 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21682 * any interesting requests and then jump to the real instruction
21683 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21684 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21685 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21686 * bail to the real handler if breakFlags==0.
21687 */
21688    ldrb   r3, [rSELF, #offThread_breakFlags]
21689    adrl   lr, dvmAsmInstructionStart + (318 * 64)
21690    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21691    cmp    r3, #0
21692    bxeq   lr                   @ nothing to do - jump to real handler
21693    EXPORT_PC()
21694    mov    r0, rPC              @ arg0
21695    mov    r1, rFP              @ arg1
21696    mov    r2, rSELF            @ arg2
21697    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21698
21699/* ------------------------------ */
21700    .balign 64
21701.L_ALT_OP_UNUSED_3FFF: /* 0x13f */
21702/* File: armv5te/alt_stub.S */
21703/*
21704 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21705 * any interesting requests and then jump to the real instruction
21706 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21707 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21708 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21709 * bail to the real handler if breakFlags==0.
21710 */
21711    ldrb   r3, [rSELF, #offThread_breakFlags]
21712    adrl   lr, dvmAsmInstructionStart + (319 * 64)
21713    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21714    cmp    r3, #0
21715    bxeq   lr                   @ nothing to do - jump to real handler
21716    EXPORT_PC()
21717    mov    r0, rPC              @ arg0
21718    mov    r1, rFP              @ arg1
21719    mov    r2, rSELF            @ arg2
21720    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21721
21722/* ------------------------------ */
21723    .balign 64
21724.L_ALT_OP_UNUSED_40FF: /* 0x140 */
21725/* File: armv5te/alt_stub.S */
21726/*
21727 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21728 * any interesting requests and then jump to the real instruction
21729 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21730 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21731 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21732 * bail to the real handler if breakFlags==0.
21733 */
21734    ldrb   r3, [rSELF, #offThread_breakFlags]
21735    adrl   lr, dvmAsmInstructionStart + (320 * 64)
21736    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21737    cmp    r3, #0
21738    bxeq   lr                   @ nothing to do - jump to real handler
21739    EXPORT_PC()
21740    mov    r0, rPC              @ arg0
21741    mov    r1, rFP              @ arg1
21742    mov    r2, rSELF            @ arg2
21743    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21744
21745/* ------------------------------ */
21746    .balign 64
21747.L_ALT_OP_UNUSED_41FF: /* 0x141 */
21748/* File: armv5te/alt_stub.S */
21749/*
21750 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21751 * any interesting requests and then jump to the real instruction
21752 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21753 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21754 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21755 * bail to the real handler if breakFlags==0.
21756 */
21757    ldrb   r3, [rSELF, #offThread_breakFlags]
21758    adrl   lr, dvmAsmInstructionStart + (321 * 64)
21759    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21760    cmp    r3, #0
21761    bxeq   lr                   @ nothing to do - jump to real handler
21762    EXPORT_PC()
21763    mov    r0, rPC              @ arg0
21764    mov    r1, rFP              @ arg1
21765    mov    r2, rSELF            @ arg2
21766    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21767
21768/* ------------------------------ */
21769    .balign 64
21770.L_ALT_OP_UNUSED_42FF: /* 0x142 */
21771/* File: armv5te/alt_stub.S */
21772/*
21773 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21774 * any interesting requests and then jump to the real instruction
21775 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21776 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21777 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21778 * bail to the real handler if breakFlags==0.
21779 */
21780    ldrb   r3, [rSELF, #offThread_breakFlags]
21781    adrl   lr, dvmAsmInstructionStart + (322 * 64)
21782    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21783    cmp    r3, #0
21784    bxeq   lr                   @ nothing to do - jump to real handler
21785    EXPORT_PC()
21786    mov    r0, rPC              @ arg0
21787    mov    r1, rFP              @ arg1
21788    mov    r2, rSELF            @ arg2
21789    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21790
21791/* ------------------------------ */
21792    .balign 64
21793.L_ALT_OP_UNUSED_43FF: /* 0x143 */
21794/* File: armv5te/alt_stub.S */
21795/*
21796 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21797 * any interesting requests and then jump to the real instruction
21798 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21799 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21800 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21801 * bail to the real handler if breakFlags==0.
21802 */
21803    ldrb   r3, [rSELF, #offThread_breakFlags]
21804    adrl   lr, dvmAsmInstructionStart + (323 * 64)
21805    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21806    cmp    r3, #0
21807    bxeq   lr                   @ nothing to do - jump to real handler
21808    EXPORT_PC()
21809    mov    r0, rPC              @ arg0
21810    mov    r1, rFP              @ arg1
21811    mov    r2, rSELF            @ arg2
21812    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21813
21814/* ------------------------------ */
21815    .balign 64
21816.L_ALT_OP_UNUSED_44FF: /* 0x144 */
21817/* File: armv5te/alt_stub.S */
21818/*
21819 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21820 * any interesting requests and then jump to the real instruction
21821 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21822 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21823 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21824 * bail to the real handler if breakFlags==0.
21825 */
21826    ldrb   r3, [rSELF, #offThread_breakFlags]
21827    adrl   lr, dvmAsmInstructionStart + (324 * 64)
21828    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21829    cmp    r3, #0
21830    bxeq   lr                   @ nothing to do - jump to real handler
21831    EXPORT_PC()
21832    mov    r0, rPC              @ arg0
21833    mov    r1, rFP              @ arg1
21834    mov    r2, rSELF            @ arg2
21835    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21836
21837/* ------------------------------ */
21838    .balign 64
21839.L_ALT_OP_UNUSED_45FF: /* 0x145 */
21840/* File: armv5te/alt_stub.S */
21841/*
21842 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21843 * any interesting requests and then jump to the real instruction
21844 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21845 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21846 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21847 * bail to the real handler if breakFlags==0.
21848 */
21849    ldrb   r3, [rSELF, #offThread_breakFlags]
21850    adrl   lr, dvmAsmInstructionStart + (325 * 64)
21851    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21852    cmp    r3, #0
21853    bxeq   lr                   @ nothing to do - jump to real handler
21854    EXPORT_PC()
21855    mov    r0, rPC              @ arg0
21856    mov    r1, rFP              @ arg1
21857    mov    r2, rSELF            @ arg2
21858    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21859
21860/* ------------------------------ */
21861    .balign 64
21862.L_ALT_OP_UNUSED_46FF: /* 0x146 */
21863/* File: armv5te/alt_stub.S */
21864/*
21865 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21866 * any interesting requests and then jump to the real instruction
21867 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21868 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21869 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21870 * bail to the real handler if breakFlags==0.
21871 */
21872    ldrb   r3, [rSELF, #offThread_breakFlags]
21873    adrl   lr, dvmAsmInstructionStart + (326 * 64)
21874    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21875    cmp    r3, #0
21876    bxeq   lr                   @ nothing to do - jump to real handler
21877    EXPORT_PC()
21878    mov    r0, rPC              @ arg0
21879    mov    r1, rFP              @ arg1
21880    mov    r2, rSELF            @ arg2
21881    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21882
21883/* ------------------------------ */
21884    .balign 64
21885.L_ALT_OP_UNUSED_47FF: /* 0x147 */
21886/* File: armv5te/alt_stub.S */
21887/*
21888 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21889 * any interesting requests and then jump to the real instruction
21890 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21891 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21892 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21893 * bail to the real handler if breakFlags==0.
21894 */
21895    ldrb   r3, [rSELF, #offThread_breakFlags]
21896    adrl   lr, dvmAsmInstructionStart + (327 * 64)
21897    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21898    cmp    r3, #0
21899    bxeq   lr                   @ nothing to do - jump to real handler
21900    EXPORT_PC()
21901    mov    r0, rPC              @ arg0
21902    mov    r1, rFP              @ arg1
21903    mov    r2, rSELF            @ arg2
21904    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21905
21906/* ------------------------------ */
21907    .balign 64
21908.L_ALT_OP_UNUSED_48FF: /* 0x148 */
21909/* File: armv5te/alt_stub.S */
21910/*
21911 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21912 * any interesting requests and then jump to the real instruction
21913 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21914 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21915 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21916 * bail to the real handler if breakFlags==0.
21917 */
21918    ldrb   r3, [rSELF, #offThread_breakFlags]
21919    adrl   lr, dvmAsmInstructionStart + (328 * 64)
21920    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21921    cmp    r3, #0
21922    bxeq   lr                   @ nothing to do - jump to real handler
21923    EXPORT_PC()
21924    mov    r0, rPC              @ arg0
21925    mov    r1, rFP              @ arg1
21926    mov    r2, rSELF            @ arg2
21927    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21928
21929/* ------------------------------ */
21930    .balign 64
21931.L_ALT_OP_UNUSED_49FF: /* 0x149 */
21932/* File: armv5te/alt_stub.S */
21933/*
21934 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21935 * any interesting requests and then jump to the real instruction
21936 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21937 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21938 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21939 * bail to the real handler if breakFlags==0.
21940 */
21941    ldrb   r3, [rSELF, #offThread_breakFlags]
21942    adrl   lr, dvmAsmInstructionStart + (329 * 64)
21943    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21944    cmp    r3, #0
21945    bxeq   lr                   @ nothing to do - jump to real handler
21946    EXPORT_PC()
21947    mov    r0, rPC              @ arg0
21948    mov    r1, rFP              @ arg1
21949    mov    r2, rSELF            @ arg2
21950    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21951
21952/* ------------------------------ */
21953    .balign 64
21954.L_ALT_OP_UNUSED_4AFF: /* 0x14a */
21955/* File: armv5te/alt_stub.S */
21956/*
21957 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21958 * any interesting requests and then jump to the real instruction
21959 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21960 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21961 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21962 * bail to the real handler if breakFlags==0.
21963 */
21964    ldrb   r3, [rSELF, #offThread_breakFlags]
21965    adrl   lr, dvmAsmInstructionStart + (330 * 64)
21966    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21967    cmp    r3, #0
21968    bxeq   lr                   @ nothing to do - jump to real handler
21969    EXPORT_PC()
21970    mov    r0, rPC              @ arg0
21971    mov    r1, rFP              @ arg1
21972    mov    r2, rSELF            @ arg2
21973    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21974
21975/* ------------------------------ */
21976    .balign 64
21977.L_ALT_OP_UNUSED_4BFF: /* 0x14b */
21978/* File: armv5te/alt_stub.S */
21979/*
21980 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21981 * any interesting requests and then jump to the real instruction
21982 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21983 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21984 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21985 * bail to the real handler if breakFlags==0.
21986 */
21987    ldrb   r3, [rSELF, #offThread_breakFlags]
21988    adrl   lr, dvmAsmInstructionStart + (331 * 64)
21989    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21990    cmp    r3, #0
21991    bxeq   lr                   @ nothing to do - jump to real handler
21992    EXPORT_PC()
21993    mov    r0, rPC              @ arg0
21994    mov    r1, rFP              @ arg1
21995    mov    r2, rSELF            @ arg2
21996    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21997
21998/* ------------------------------ */
21999    .balign 64
22000.L_ALT_OP_UNUSED_4CFF: /* 0x14c */
22001/* File: armv5te/alt_stub.S */
22002/*
22003 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22004 * any interesting requests and then jump to the real instruction
22005 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22006 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22007 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22008 * bail to the real handler if breakFlags==0.
22009 */
22010    ldrb   r3, [rSELF, #offThread_breakFlags]
22011    adrl   lr, dvmAsmInstructionStart + (332 * 64)
22012    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22013    cmp    r3, #0
22014    bxeq   lr                   @ nothing to do - jump to real handler
22015    EXPORT_PC()
22016    mov    r0, rPC              @ arg0
22017    mov    r1, rFP              @ arg1
22018    mov    r2, rSELF            @ arg2
22019    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22020
22021/* ------------------------------ */
22022    .balign 64
22023.L_ALT_OP_UNUSED_4DFF: /* 0x14d */
22024/* File: armv5te/alt_stub.S */
22025/*
22026 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22027 * any interesting requests and then jump to the real instruction
22028 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22029 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22030 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22031 * bail to the real handler if breakFlags==0.
22032 */
22033    ldrb   r3, [rSELF, #offThread_breakFlags]
22034    adrl   lr, dvmAsmInstructionStart + (333 * 64)
22035    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22036    cmp    r3, #0
22037    bxeq   lr                   @ nothing to do - jump to real handler
22038    EXPORT_PC()
22039    mov    r0, rPC              @ arg0
22040    mov    r1, rFP              @ arg1
22041    mov    r2, rSELF            @ arg2
22042    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22043
22044/* ------------------------------ */
22045    .balign 64
22046.L_ALT_OP_UNUSED_4EFF: /* 0x14e */
22047/* File: armv5te/alt_stub.S */
22048/*
22049 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22050 * any interesting requests and then jump to the real instruction
22051 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22052 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22053 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22054 * bail to the real handler if breakFlags==0.
22055 */
22056    ldrb   r3, [rSELF, #offThread_breakFlags]
22057    adrl   lr, dvmAsmInstructionStart + (334 * 64)
22058    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22059    cmp    r3, #0
22060    bxeq   lr                   @ nothing to do - jump to real handler
22061    EXPORT_PC()
22062    mov    r0, rPC              @ arg0
22063    mov    r1, rFP              @ arg1
22064    mov    r2, rSELF            @ arg2
22065    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22066
22067/* ------------------------------ */
22068    .balign 64
22069.L_ALT_OP_UNUSED_4FFF: /* 0x14f */
22070/* File: armv5te/alt_stub.S */
22071/*
22072 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22073 * any interesting requests and then jump to the real instruction
22074 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22075 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22076 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22077 * bail to the real handler if breakFlags==0.
22078 */
22079    ldrb   r3, [rSELF, #offThread_breakFlags]
22080    adrl   lr, dvmAsmInstructionStart + (335 * 64)
22081    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22082    cmp    r3, #0
22083    bxeq   lr                   @ nothing to do - jump to real handler
22084    EXPORT_PC()
22085    mov    r0, rPC              @ arg0
22086    mov    r1, rFP              @ arg1
22087    mov    r2, rSELF            @ arg2
22088    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22089
22090/* ------------------------------ */
22091    .balign 64
22092.L_ALT_OP_UNUSED_50FF: /* 0x150 */
22093/* File: armv5te/alt_stub.S */
22094/*
22095 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22096 * any interesting requests and then jump to the real instruction
22097 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22098 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22099 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22100 * bail to the real handler if breakFlags==0.
22101 */
22102    ldrb   r3, [rSELF, #offThread_breakFlags]
22103    adrl   lr, dvmAsmInstructionStart + (336 * 64)
22104    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22105    cmp    r3, #0
22106    bxeq   lr                   @ nothing to do - jump to real handler
22107    EXPORT_PC()
22108    mov    r0, rPC              @ arg0
22109    mov    r1, rFP              @ arg1
22110    mov    r2, rSELF            @ arg2
22111    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22112
22113/* ------------------------------ */
22114    .balign 64
22115.L_ALT_OP_UNUSED_51FF: /* 0x151 */
22116/* File: armv5te/alt_stub.S */
22117/*
22118 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22119 * any interesting requests and then jump to the real instruction
22120 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22121 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22122 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22123 * bail to the real handler if breakFlags==0.
22124 */
22125    ldrb   r3, [rSELF, #offThread_breakFlags]
22126    adrl   lr, dvmAsmInstructionStart + (337 * 64)
22127    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22128    cmp    r3, #0
22129    bxeq   lr                   @ nothing to do - jump to real handler
22130    EXPORT_PC()
22131    mov    r0, rPC              @ arg0
22132    mov    r1, rFP              @ arg1
22133    mov    r2, rSELF            @ arg2
22134    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22135
22136/* ------------------------------ */
22137    .balign 64
22138.L_ALT_OP_UNUSED_52FF: /* 0x152 */
22139/* File: armv5te/alt_stub.S */
22140/*
22141 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22142 * any interesting requests and then jump to the real instruction
22143 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22144 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22145 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22146 * bail to the real handler if breakFlags==0.
22147 */
22148    ldrb   r3, [rSELF, #offThread_breakFlags]
22149    adrl   lr, dvmAsmInstructionStart + (338 * 64)
22150    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22151    cmp    r3, #0
22152    bxeq   lr                   @ nothing to do - jump to real handler
22153    EXPORT_PC()
22154    mov    r0, rPC              @ arg0
22155    mov    r1, rFP              @ arg1
22156    mov    r2, rSELF            @ arg2
22157    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22158
22159/* ------------------------------ */
22160    .balign 64
22161.L_ALT_OP_UNUSED_53FF: /* 0x153 */
22162/* File: armv5te/alt_stub.S */
22163/*
22164 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22165 * any interesting requests and then jump to the real instruction
22166 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22167 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22168 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22169 * bail to the real handler if breakFlags==0.
22170 */
22171    ldrb   r3, [rSELF, #offThread_breakFlags]
22172    adrl   lr, dvmAsmInstructionStart + (339 * 64)
22173    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22174    cmp    r3, #0
22175    bxeq   lr                   @ nothing to do - jump to real handler
22176    EXPORT_PC()
22177    mov    r0, rPC              @ arg0
22178    mov    r1, rFP              @ arg1
22179    mov    r2, rSELF            @ arg2
22180    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22181
22182/* ------------------------------ */
22183    .balign 64
22184.L_ALT_OP_UNUSED_54FF: /* 0x154 */
22185/* File: armv5te/alt_stub.S */
22186/*
22187 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22188 * any interesting requests and then jump to the real instruction
22189 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22190 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22191 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22192 * bail to the real handler if breakFlags==0.
22193 */
22194    ldrb   r3, [rSELF, #offThread_breakFlags]
22195    adrl   lr, dvmAsmInstructionStart + (340 * 64)
22196    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22197    cmp    r3, #0
22198    bxeq   lr                   @ nothing to do - jump to real handler
22199    EXPORT_PC()
22200    mov    r0, rPC              @ arg0
22201    mov    r1, rFP              @ arg1
22202    mov    r2, rSELF            @ arg2
22203    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22204
22205/* ------------------------------ */
22206    .balign 64
22207.L_ALT_OP_UNUSED_55FF: /* 0x155 */
22208/* File: armv5te/alt_stub.S */
22209/*
22210 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22211 * any interesting requests and then jump to the real instruction
22212 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22213 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22214 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22215 * bail to the real handler if breakFlags==0.
22216 */
22217    ldrb   r3, [rSELF, #offThread_breakFlags]
22218    adrl   lr, dvmAsmInstructionStart + (341 * 64)
22219    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22220    cmp    r3, #0
22221    bxeq   lr                   @ nothing to do - jump to real handler
22222    EXPORT_PC()
22223    mov    r0, rPC              @ arg0
22224    mov    r1, rFP              @ arg1
22225    mov    r2, rSELF            @ arg2
22226    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22227
22228/* ------------------------------ */
22229    .balign 64
22230.L_ALT_OP_UNUSED_56FF: /* 0x156 */
22231/* File: armv5te/alt_stub.S */
22232/*
22233 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22234 * any interesting requests and then jump to the real instruction
22235 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22236 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22237 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22238 * bail to the real handler if breakFlags==0.
22239 */
22240    ldrb   r3, [rSELF, #offThread_breakFlags]
22241    adrl   lr, dvmAsmInstructionStart + (342 * 64)
22242    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22243    cmp    r3, #0
22244    bxeq   lr                   @ nothing to do - jump to real handler
22245    EXPORT_PC()
22246    mov    r0, rPC              @ arg0
22247    mov    r1, rFP              @ arg1
22248    mov    r2, rSELF            @ arg2
22249    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22250
22251/* ------------------------------ */
22252    .balign 64
22253.L_ALT_OP_UNUSED_57FF: /* 0x157 */
22254/* File: armv5te/alt_stub.S */
22255/*
22256 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22257 * any interesting requests and then jump to the real instruction
22258 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22259 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22260 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22261 * bail to the real handler if breakFlags==0.
22262 */
22263    ldrb   r3, [rSELF, #offThread_breakFlags]
22264    adrl   lr, dvmAsmInstructionStart + (343 * 64)
22265    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22266    cmp    r3, #0
22267    bxeq   lr                   @ nothing to do - jump to real handler
22268    EXPORT_PC()
22269    mov    r0, rPC              @ arg0
22270    mov    r1, rFP              @ arg1
22271    mov    r2, rSELF            @ arg2
22272    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22273
22274/* ------------------------------ */
22275    .balign 64
22276.L_ALT_OP_UNUSED_58FF: /* 0x158 */
22277/* File: armv5te/alt_stub.S */
22278/*
22279 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22280 * any interesting requests and then jump to the real instruction
22281 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22282 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22283 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22284 * bail to the real handler if breakFlags==0.
22285 */
22286    ldrb   r3, [rSELF, #offThread_breakFlags]
22287    adrl   lr, dvmAsmInstructionStart + (344 * 64)
22288    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22289    cmp    r3, #0
22290    bxeq   lr                   @ nothing to do - jump to real handler
22291    EXPORT_PC()
22292    mov    r0, rPC              @ arg0
22293    mov    r1, rFP              @ arg1
22294    mov    r2, rSELF            @ arg2
22295    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22296
22297/* ------------------------------ */
22298    .balign 64
22299.L_ALT_OP_UNUSED_59FF: /* 0x159 */
22300/* File: armv5te/alt_stub.S */
22301/*
22302 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22303 * any interesting requests and then jump to the real instruction
22304 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22305 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22306 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22307 * bail to the real handler if breakFlags==0.
22308 */
22309    ldrb   r3, [rSELF, #offThread_breakFlags]
22310    adrl   lr, dvmAsmInstructionStart + (345 * 64)
22311    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22312    cmp    r3, #0
22313    bxeq   lr                   @ nothing to do - jump to real handler
22314    EXPORT_PC()
22315    mov    r0, rPC              @ arg0
22316    mov    r1, rFP              @ arg1
22317    mov    r2, rSELF            @ arg2
22318    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22319
22320/* ------------------------------ */
22321    .balign 64
22322.L_ALT_OP_UNUSED_5AFF: /* 0x15a */
22323/* File: armv5te/alt_stub.S */
22324/*
22325 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22326 * any interesting requests and then jump to the real instruction
22327 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22328 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22329 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22330 * bail to the real handler if breakFlags==0.
22331 */
22332    ldrb   r3, [rSELF, #offThread_breakFlags]
22333    adrl   lr, dvmAsmInstructionStart + (346 * 64)
22334    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22335    cmp    r3, #0
22336    bxeq   lr                   @ nothing to do - jump to real handler
22337    EXPORT_PC()
22338    mov    r0, rPC              @ arg0
22339    mov    r1, rFP              @ arg1
22340    mov    r2, rSELF            @ arg2
22341    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22342
22343/* ------------------------------ */
22344    .balign 64
22345.L_ALT_OP_UNUSED_5BFF: /* 0x15b */
22346/* File: armv5te/alt_stub.S */
22347/*
22348 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22349 * any interesting requests and then jump to the real instruction
22350 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22351 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22352 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22353 * bail to the real handler if breakFlags==0.
22354 */
22355    ldrb   r3, [rSELF, #offThread_breakFlags]
22356    adrl   lr, dvmAsmInstructionStart + (347 * 64)
22357    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22358    cmp    r3, #0
22359    bxeq   lr                   @ nothing to do - jump to real handler
22360    EXPORT_PC()
22361    mov    r0, rPC              @ arg0
22362    mov    r1, rFP              @ arg1
22363    mov    r2, rSELF            @ arg2
22364    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22365
22366/* ------------------------------ */
22367    .balign 64
22368.L_ALT_OP_UNUSED_5CFF: /* 0x15c */
22369/* File: armv5te/alt_stub.S */
22370/*
22371 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22372 * any interesting requests and then jump to the real instruction
22373 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22374 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22375 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22376 * bail to the real handler if breakFlags==0.
22377 */
22378    ldrb   r3, [rSELF, #offThread_breakFlags]
22379    adrl   lr, dvmAsmInstructionStart + (348 * 64)
22380    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22381    cmp    r3, #0
22382    bxeq   lr                   @ nothing to do - jump to real handler
22383    EXPORT_PC()
22384    mov    r0, rPC              @ arg0
22385    mov    r1, rFP              @ arg1
22386    mov    r2, rSELF            @ arg2
22387    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22388
22389/* ------------------------------ */
22390    .balign 64
22391.L_ALT_OP_UNUSED_5DFF: /* 0x15d */
22392/* File: armv5te/alt_stub.S */
22393/*
22394 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22395 * any interesting requests and then jump to the real instruction
22396 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22397 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22398 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22399 * bail to the real handler if breakFlags==0.
22400 */
22401    ldrb   r3, [rSELF, #offThread_breakFlags]
22402    adrl   lr, dvmAsmInstructionStart + (349 * 64)
22403    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22404    cmp    r3, #0
22405    bxeq   lr                   @ nothing to do - jump to real handler
22406    EXPORT_PC()
22407    mov    r0, rPC              @ arg0
22408    mov    r1, rFP              @ arg1
22409    mov    r2, rSELF            @ arg2
22410    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22411
22412/* ------------------------------ */
22413    .balign 64
22414.L_ALT_OP_UNUSED_5EFF: /* 0x15e */
22415/* File: armv5te/alt_stub.S */
22416/*
22417 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22418 * any interesting requests and then jump to the real instruction
22419 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22420 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22421 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22422 * bail to the real handler if breakFlags==0.
22423 */
22424    ldrb   r3, [rSELF, #offThread_breakFlags]
22425    adrl   lr, dvmAsmInstructionStart + (350 * 64)
22426    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22427    cmp    r3, #0
22428    bxeq   lr                   @ nothing to do - jump to real handler
22429    EXPORT_PC()
22430    mov    r0, rPC              @ arg0
22431    mov    r1, rFP              @ arg1
22432    mov    r2, rSELF            @ arg2
22433    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22434
22435/* ------------------------------ */
22436    .balign 64
22437.L_ALT_OP_UNUSED_5FFF: /* 0x15f */
22438/* File: armv5te/alt_stub.S */
22439/*
22440 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22441 * any interesting requests and then jump to the real instruction
22442 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22443 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22444 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22445 * bail to the real handler if breakFlags==0.
22446 */
22447    ldrb   r3, [rSELF, #offThread_breakFlags]
22448    adrl   lr, dvmAsmInstructionStart + (351 * 64)
22449    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22450    cmp    r3, #0
22451    bxeq   lr                   @ nothing to do - jump to real handler
22452    EXPORT_PC()
22453    mov    r0, rPC              @ arg0
22454    mov    r1, rFP              @ arg1
22455    mov    r2, rSELF            @ arg2
22456    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22457
22458/* ------------------------------ */
22459    .balign 64
22460.L_ALT_OP_UNUSED_60FF: /* 0x160 */
22461/* File: armv5te/alt_stub.S */
22462/*
22463 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22464 * any interesting requests and then jump to the real instruction
22465 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22466 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22467 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22468 * bail to the real handler if breakFlags==0.
22469 */
22470    ldrb   r3, [rSELF, #offThread_breakFlags]
22471    adrl   lr, dvmAsmInstructionStart + (352 * 64)
22472    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22473    cmp    r3, #0
22474    bxeq   lr                   @ nothing to do - jump to real handler
22475    EXPORT_PC()
22476    mov    r0, rPC              @ arg0
22477    mov    r1, rFP              @ arg1
22478    mov    r2, rSELF            @ arg2
22479    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22480
22481/* ------------------------------ */
22482    .balign 64
22483.L_ALT_OP_UNUSED_61FF: /* 0x161 */
22484/* File: armv5te/alt_stub.S */
22485/*
22486 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22487 * any interesting requests and then jump to the real instruction
22488 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22489 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22490 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22491 * bail to the real handler if breakFlags==0.
22492 */
22493    ldrb   r3, [rSELF, #offThread_breakFlags]
22494    adrl   lr, dvmAsmInstructionStart + (353 * 64)
22495    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22496    cmp    r3, #0
22497    bxeq   lr                   @ nothing to do - jump to real handler
22498    EXPORT_PC()
22499    mov    r0, rPC              @ arg0
22500    mov    r1, rFP              @ arg1
22501    mov    r2, rSELF            @ arg2
22502    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22503
22504/* ------------------------------ */
22505    .balign 64
22506.L_ALT_OP_UNUSED_62FF: /* 0x162 */
22507/* File: armv5te/alt_stub.S */
22508/*
22509 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22510 * any interesting requests and then jump to the real instruction
22511 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22512 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22513 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22514 * bail to the real handler if breakFlags==0.
22515 */
22516    ldrb   r3, [rSELF, #offThread_breakFlags]
22517    adrl   lr, dvmAsmInstructionStart + (354 * 64)
22518    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22519    cmp    r3, #0
22520    bxeq   lr                   @ nothing to do - jump to real handler
22521    EXPORT_PC()
22522    mov    r0, rPC              @ arg0
22523    mov    r1, rFP              @ arg1
22524    mov    r2, rSELF            @ arg2
22525    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22526
22527/* ------------------------------ */
22528    .balign 64
22529.L_ALT_OP_UNUSED_63FF: /* 0x163 */
22530/* File: armv5te/alt_stub.S */
22531/*
22532 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22533 * any interesting requests and then jump to the real instruction
22534 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22535 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22536 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22537 * bail to the real handler if breakFlags==0.
22538 */
22539    ldrb   r3, [rSELF, #offThread_breakFlags]
22540    adrl   lr, dvmAsmInstructionStart + (355 * 64)
22541    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22542    cmp    r3, #0
22543    bxeq   lr                   @ nothing to do - jump to real handler
22544    EXPORT_PC()
22545    mov    r0, rPC              @ arg0
22546    mov    r1, rFP              @ arg1
22547    mov    r2, rSELF            @ arg2
22548    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22549
22550/* ------------------------------ */
22551    .balign 64
22552.L_ALT_OP_UNUSED_64FF: /* 0x164 */
22553/* File: armv5te/alt_stub.S */
22554/*
22555 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22556 * any interesting requests and then jump to the real instruction
22557 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22558 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22559 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22560 * bail to the real handler if breakFlags==0.
22561 */
22562    ldrb   r3, [rSELF, #offThread_breakFlags]
22563    adrl   lr, dvmAsmInstructionStart + (356 * 64)
22564    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22565    cmp    r3, #0
22566    bxeq   lr                   @ nothing to do - jump to real handler
22567    EXPORT_PC()
22568    mov    r0, rPC              @ arg0
22569    mov    r1, rFP              @ arg1
22570    mov    r2, rSELF            @ arg2
22571    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22572
22573/* ------------------------------ */
22574    .balign 64
22575.L_ALT_OP_UNUSED_65FF: /* 0x165 */
22576/* File: armv5te/alt_stub.S */
22577/*
22578 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22579 * any interesting requests and then jump to the real instruction
22580 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22581 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22582 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22583 * bail to the real handler if breakFlags==0.
22584 */
22585    ldrb   r3, [rSELF, #offThread_breakFlags]
22586    adrl   lr, dvmAsmInstructionStart + (357 * 64)
22587    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22588    cmp    r3, #0
22589    bxeq   lr                   @ nothing to do - jump to real handler
22590    EXPORT_PC()
22591    mov    r0, rPC              @ arg0
22592    mov    r1, rFP              @ arg1
22593    mov    r2, rSELF            @ arg2
22594    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22595
22596/* ------------------------------ */
22597    .balign 64
22598.L_ALT_OP_UNUSED_66FF: /* 0x166 */
22599/* File: armv5te/alt_stub.S */
22600/*
22601 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22602 * any interesting requests and then jump to the real instruction
22603 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22604 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22605 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22606 * bail to the real handler if breakFlags==0.
22607 */
22608    ldrb   r3, [rSELF, #offThread_breakFlags]
22609    adrl   lr, dvmAsmInstructionStart + (358 * 64)
22610    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22611    cmp    r3, #0
22612    bxeq   lr                   @ nothing to do - jump to real handler
22613    EXPORT_PC()
22614    mov    r0, rPC              @ arg0
22615    mov    r1, rFP              @ arg1
22616    mov    r2, rSELF            @ arg2
22617    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22618
22619/* ------------------------------ */
22620    .balign 64
22621.L_ALT_OP_UNUSED_67FF: /* 0x167 */
22622/* File: armv5te/alt_stub.S */
22623/*
22624 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22625 * any interesting requests and then jump to the real instruction
22626 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22627 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22628 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22629 * bail to the real handler if breakFlags==0.
22630 */
22631    ldrb   r3, [rSELF, #offThread_breakFlags]
22632    adrl   lr, dvmAsmInstructionStart + (359 * 64)
22633    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22634    cmp    r3, #0
22635    bxeq   lr                   @ nothing to do - jump to real handler
22636    EXPORT_PC()
22637    mov    r0, rPC              @ arg0
22638    mov    r1, rFP              @ arg1
22639    mov    r2, rSELF            @ arg2
22640    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22641
22642/* ------------------------------ */
22643    .balign 64
22644.L_ALT_OP_UNUSED_68FF: /* 0x168 */
22645/* File: armv5te/alt_stub.S */
22646/*
22647 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22648 * any interesting requests and then jump to the real instruction
22649 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22650 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22651 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22652 * bail to the real handler if breakFlags==0.
22653 */
22654    ldrb   r3, [rSELF, #offThread_breakFlags]
22655    adrl   lr, dvmAsmInstructionStart + (360 * 64)
22656    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22657    cmp    r3, #0
22658    bxeq   lr                   @ nothing to do - jump to real handler
22659    EXPORT_PC()
22660    mov    r0, rPC              @ arg0
22661    mov    r1, rFP              @ arg1
22662    mov    r2, rSELF            @ arg2
22663    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22664
22665/* ------------------------------ */
22666    .balign 64
22667.L_ALT_OP_UNUSED_69FF: /* 0x169 */
22668/* File: armv5te/alt_stub.S */
22669/*
22670 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22671 * any interesting requests and then jump to the real instruction
22672 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22673 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22674 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22675 * bail to the real handler if breakFlags==0.
22676 */
22677    ldrb   r3, [rSELF, #offThread_breakFlags]
22678    adrl   lr, dvmAsmInstructionStart + (361 * 64)
22679    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22680    cmp    r3, #0
22681    bxeq   lr                   @ nothing to do - jump to real handler
22682    EXPORT_PC()
22683    mov    r0, rPC              @ arg0
22684    mov    r1, rFP              @ arg1
22685    mov    r2, rSELF            @ arg2
22686    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22687
22688/* ------------------------------ */
22689    .balign 64
22690.L_ALT_OP_UNUSED_6AFF: /* 0x16a */
22691/* File: armv5te/alt_stub.S */
22692/*
22693 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22694 * any interesting requests and then jump to the real instruction
22695 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22696 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22697 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22698 * bail to the real handler if breakFlags==0.
22699 */
22700    ldrb   r3, [rSELF, #offThread_breakFlags]
22701    adrl   lr, dvmAsmInstructionStart + (362 * 64)
22702    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22703    cmp    r3, #0
22704    bxeq   lr                   @ nothing to do - jump to real handler
22705    EXPORT_PC()
22706    mov    r0, rPC              @ arg0
22707    mov    r1, rFP              @ arg1
22708    mov    r2, rSELF            @ arg2
22709    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22710
22711/* ------------------------------ */
22712    .balign 64
22713.L_ALT_OP_UNUSED_6BFF: /* 0x16b */
22714/* File: armv5te/alt_stub.S */
22715/*
22716 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22717 * any interesting requests and then jump to the real instruction
22718 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22719 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22720 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22721 * bail to the real handler if breakFlags==0.
22722 */
22723    ldrb   r3, [rSELF, #offThread_breakFlags]
22724    adrl   lr, dvmAsmInstructionStart + (363 * 64)
22725    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22726    cmp    r3, #0
22727    bxeq   lr                   @ nothing to do - jump to real handler
22728    EXPORT_PC()
22729    mov    r0, rPC              @ arg0
22730    mov    r1, rFP              @ arg1
22731    mov    r2, rSELF            @ arg2
22732    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22733
22734/* ------------------------------ */
22735    .balign 64
22736.L_ALT_OP_UNUSED_6CFF: /* 0x16c */
22737/* File: armv5te/alt_stub.S */
22738/*
22739 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22740 * any interesting requests and then jump to the real instruction
22741 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22742 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22743 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22744 * bail to the real handler if breakFlags==0.
22745 */
22746    ldrb   r3, [rSELF, #offThread_breakFlags]
22747    adrl   lr, dvmAsmInstructionStart + (364 * 64)
22748    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22749    cmp    r3, #0
22750    bxeq   lr                   @ nothing to do - jump to real handler
22751    EXPORT_PC()
22752    mov    r0, rPC              @ arg0
22753    mov    r1, rFP              @ arg1
22754    mov    r2, rSELF            @ arg2
22755    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22756
22757/* ------------------------------ */
22758    .balign 64
22759.L_ALT_OP_UNUSED_6DFF: /* 0x16d */
22760/* File: armv5te/alt_stub.S */
22761/*
22762 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22763 * any interesting requests and then jump to the real instruction
22764 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22765 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22766 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22767 * bail to the real handler if breakFlags==0.
22768 */
22769    ldrb   r3, [rSELF, #offThread_breakFlags]
22770    adrl   lr, dvmAsmInstructionStart + (365 * 64)
22771    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22772    cmp    r3, #0
22773    bxeq   lr                   @ nothing to do - jump to real handler
22774    EXPORT_PC()
22775    mov    r0, rPC              @ arg0
22776    mov    r1, rFP              @ arg1
22777    mov    r2, rSELF            @ arg2
22778    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22779
22780/* ------------------------------ */
22781    .balign 64
22782.L_ALT_OP_UNUSED_6EFF: /* 0x16e */
22783/* File: armv5te/alt_stub.S */
22784/*
22785 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22786 * any interesting requests and then jump to the real instruction
22787 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22788 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22789 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22790 * bail to the real handler if breakFlags==0.
22791 */
22792    ldrb   r3, [rSELF, #offThread_breakFlags]
22793    adrl   lr, dvmAsmInstructionStart + (366 * 64)
22794    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22795    cmp    r3, #0
22796    bxeq   lr                   @ nothing to do - jump to real handler
22797    EXPORT_PC()
22798    mov    r0, rPC              @ arg0
22799    mov    r1, rFP              @ arg1
22800    mov    r2, rSELF            @ arg2
22801    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22802
22803/* ------------------------------ */
22804    .balign 64
22805.L_ALT_OP_UNUSED_6FFF: /* 0x16f */
22806/* File: armv5te/alt_stub.S */
22807/*
22808 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22809 * any interesting requests and then jump to the real instruction
22810 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22811 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22812 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22813 * bail to the real handler if breakFlags==0.
22814 */
22815    ldrb   r3, [rSELF, #offThread_breakFlags]
22816    adrl   lr, dvmAsmInstructionStart + (367 * 64)
22817    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22818    cmp    r3, #0
22819    bxeq   lr                   @ nothing to do - jump to real handler
22820    EXPORT_PC()
22821    mov    r0, rPC              @ arg0
22822    mov    r1, rFP              @ arg1
22823    mov    r2, rSELF            @ arg2
22824    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22825
22826/* ------------------------------ */
22827    .balign 64
22828.L_ALT_OP_UNUSED_70FF: /* 0x170 */
22829/* File: armv5te/alt_stub.S */
22830/*
22831 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22832 * any interesting requests and then jump to the real instruction
22833 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22834 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22835 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22836 * bail to the real handler if breakFlags==0.
22837 */
22838    ldrb   r3, [rSELF, #offThread_breakFlags]
22839    adrl   lr, dvmAsmInstructionStart + (368 * 64)
22840    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22841    cmp    r3, #0
22842    bxeq   lr                   @ nothing to do - jump to real handler
22843    EXPORT_PC()
22844    mov    r0, rPC              @ arg0
22845    mov    r1, rFP              @ arg1
22846    mov    r2, rSELF            @ arg2
22847    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22848
22849/* ------------------------------ */
22850    .balign 64
22851.L_ALT_OP_UNUSED_71FF: /* 0x171 */
22852/* File: armv5te/alt_stub.S */
22853/*
22854 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22855 * any interesting requests and then jump to the real instruction
22856 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22857 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22858 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22859 * bail to the real handler if breakFlags==0.
22860 */
22861    ldrb   r3, [rSELF, #offThread_breakFlags]
22862    adrl   lr, dvmAsmInstructionStart + (369 * 64)
22863    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22864    cmp    r3, #0
22865    bxeq   lr                   @ nothing to do - jump to real handler
22866    EXPORT_PC()
22867    mov    r0, rPC              @ arg0
22868    mov    r1, rFP              @ arg1
22869    mov    r2, rSELF            @ arg2
22870    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22871
22872/* ------------------------------ */
22873    .balign 64
22874.L_ALT_OP_UNUSED_72FF: /* 0x172 */
22875/* File: armv5te/alt_stub.S */
22876/*
22877 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22878 * any interesting requests and then jump to the real instruction
22879 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22880 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22881 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22882 * bail to the real handler if breakFlags==0.
22883 */
22884    ldrb   r3, [rSELF, #offThread_breakFlags]
22885    adrl   lr, dvmAsmInstructionStart + (370 * 64)
22886    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22887    cmp    r3, #0
22888    bxeq   lr                   @ nothing to do - jump to real handler
22889    EXPORT_PC()
22890    mov    r0, rPC              @ arg0
22891    mov    r1, rFP              @ arg1
22892    mov    r2, rSELF            @ arg2
22893    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22894
22895/* ------------------------------ */
22896    .balign 64
22897.L_ALT_OP_UNUSED_73FF: /* 0x173 */
22898/* File: armv5te/alt_stub.S */
22899/*
22900 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22901 * any interesting requests and then jump to the real instruction
22902 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22903 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22904 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22905 * bail to the real handler if breakFlags==0.
22906 */
22907    ldrb   r3, [rSELF, #offThread_breakFlags]
22908    adrl   lr, dvmAsmInstructionStart + (371 * 64)
22909    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22910    cmp    r3, #0
22911    bxeq   lr                   @ nothing to do - jump to real handler
22912    EXPORT_PC()
22913    mov    r0, rPC              @ arg0
22914    mov    r1, rFP              @ arg1
22915    mov    r2, rSELF            @ arg2
22916    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22917
22918/* ------------------------------ */
22919    .balign 64
22920.L_ALT_OP_UNUSED_74FF: /* 0x174 */
22921/* File: armv5te/alt_stub.S */
22922/*
22923 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22924 * any interesting requests and then jump to the real instruction
22925 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22926 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22927 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22928 * bail to the real handler if breakFlags==0.
22929 */
22930    ldrb   r3, [rSELF, #offThread_breakFlags]
22931    adrl   lr, dvmAsmInstructionStart + (372 * 64)
22932    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22933    cmp    r3, #0
22934    bxeq   lr                   @ nothing to do - jump to real handler
22935    EXPORT_PC()
22936    mov    r0, rPC              @ arg0
22937    mov    r1, rFP              @ arg1
22938    mov    r2, rSELF            @ arg2
22939    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22940
22941/* ------------------------------ */
22942    .balign 64
22943.L_ALT_OP_UNUSED_75FF: /* 0x175 */
22944/* File: armv5te/alt_stub.S */
22945/*
22946 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22947 * any interesting requests and then jump to the real instruction
22948 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22949 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22950 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22951 * bail to the real handler if breakFlags==0.
22952 */
22953    ldrb   r3, [rSELF, #offThread_breakFlags]
22954    adrl   lr, dvmAsmInstructionStart + (373 * 64)
22955    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22956    cmp    r3, #0
22957    bxeq   lr                   @ nothing to do - jump to real handler
22958    EXPORT_PC()
22959    mov    r0, rPC              @ arg0
22960    mov    r1, rFP              @ arg1
22961    mov    r2, rSELF            @ arg2
22962    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22963
22964/* ------------------------------ */
22965    .balign 64
22966.L_ALT_OP_UNUSED_76FF: /* 0x176 */
22967/* File: armv5te/alt_stub.S */
22968/*
22969 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22970 * any interesting requests and then jump to the real instruction
22971 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22972 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22973 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22974 * bail to the real handler if breakFlags==0.
22975 */
22976    ldrb   r3, [rSELF, #offThread_breakFlags]
22977    adrl   lr, dvmAsmInstructionStart + (374 * 64)
22978    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22979    cmp    r3, #0
22980    bxeq   lr                   @ nothing to do - jump to real handler
22981    EXPORT_PC()
22982    mov    r0, rPC              @ arg0
22983    mov    r1, rFP              @ arg1
22984    mov    r2, rSELF            @ arg2
22985    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22986
22987/* ------------------------------ */
22988    .balign 64
22989.L_ALT_OP_UNUSED_77FF: /* 0x177 */
22990/* File: armv5te/alt_stub.S */
22991/*
22992 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22993 * any interesting requests and then jump to the real instruction
22994 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22995 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22996 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22997 * bail to the real handler if breakFlags==0.
22998 */
22999    ldrb   r3, [rSELF, #offThread_breakFlags]
23000    adrl   lr, dvmAsmInstructionStart + (375 * 64)
23001    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23002    cmp    r3, #0
23003    bxeq   lr                   @ nothing to do - jump to real handler
23004    EXPORT_PC()
23005    mov    r0, rPC              @ arg0
23006    mov    r1, rFP              @ arg1
23007    mov    r2, rSELF            @ arg2
23008    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23009
23010/* ------------------------------ */
23011    .balign 64
23012.L_ALT_OP_UNUSED_78FF: /* 0x178 */
23013/* File: armv5te/alt_stub.S */
23014/*
23015 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23016 * any interesting requests and then jump to the real instruction
23017 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23018 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23019 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23020 * bail to the real handler if breakFlags==0.
23021 */
23022    ldrb   r3, [rSELF, #offThread_breakFlags]
23023    adrl   lr, dvmAsmInstructionStart + (376 * 64)
23024    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23025    cmp    r3, #0
23026    bxeq   lr                   @ nothing to do - jump to real handler
23027    EXPORT_PC()
23028    mov    r0, rPC              @ arg0
23029    mov    r1, rFP              @ arg1
23030    mov    r2, rSELF            @ arg2
23031    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23032
23033/* ------------------------------ */
23034    .balign 64
23035.L_ALT_OP_UNUSED_79FF: /* 0x179 */
23036/* File: armv5te/alt_stub.S */
23037/*
23038 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23039 * any interesting requests and then jump to the real instruction
23040 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23041 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23042 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23043 * bail to the real handler if breakFlags==0.
23044 */
23045    ldrb   r3, [rSELF, #offThread_breakFlags]
23046    adrl   lr, dvmAsmInstructionStart + (377 * 64)
23047    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23048    cmp    r3, #0
23049    bxeq   lr                   @ nothing to do - jump to real handler
23050    EXPORT_PC()
23051    mov    r0, rPC              @ arg0
23052    mov    r1, rFP              @ arg1
23053    mov    r2, rSELF            @ arg2
23054    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23055
23056/* ------------------------------ */
23057    .balign 64
23058.L_ALT_OP_UNUSED_7AFF: /* 0x17a */
23059/* File: armv5te/alt_stub.S */
23060/*
23061 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23062 * any interesting requests and then jump to the real instruction
23063 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23064 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23065 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23066 * bail to the real handler if breakFlags==0.
23067 */
23068    ldrb   r3, [rSELF, #offThread_breakFlags]
23069    adrl   lr, dvmAsmInstructionStart + (378 * 64)
23070    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23071    cmp    r3, #0
23072    bxeq   lr                   @ nothing to do - jump to real handler
23073    EXPORT_PC()
23074    mov    r0, rPC              @ arg0
23075    mov    r1, rFP              @ arg1
23076    mov    r2, rSELF            @ arg2
23077    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23078
23079/* ------------------------------ */
23080    .balign 64
23081.L_ALT_OP_UNUSED_7BFF: /* 0x17b */
23082/* File: armv5te/alt_stub.S */
23083/*
23084 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23085 * any interesting requests and then jump to the real instruction
23086 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23087 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23088 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23089 * bail to the real handler if breakFlags==0.
23090 */
23091    ldrb   r3, [rSELF, #offThread_breakFlags]
23092    adrl   lr, dvmAsmInstructionStart + (379 * 64)
23093    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23094    cmp    r3, #0
23095    bxeq   lr                   @ nothing to do - jump to real handler
23096    EXPORT_PC()
23097    mov    r0, rPC              @ arg0
23098    mov    r1, rFP              @ arg1
23099    mov    r2, rSELF            @ arg2
23100    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23101
23102/* ------------------------------ */
23103    .balign 64
23104.L_ALT_OP_UNUSED_7CFF: /* 0x17c */
23105/* File: armv5te/alt_stub.S */
23106/*
23107 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23108 * any interesting requests and then jump to the real instruction
23109 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23110 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23111 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23112 * bail to the real handler if breakFlags==0.
23113 */
23114    ldrb   r3, [rSELF, #offThread_breakFlags]
23115    adrl   lr, dvmAsmInstructionStart + (380 * 64)
23116    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23117    cmp    r3, #0
23118    bxeq   lr                   @ nothing to do - jump to real handler
23119    EXPORT_PC()
23120    mov    r0, rPC              @ arg0
23121    mov    r1, rFP              @ arg1
23122    mov    r2, rSELF            @ arg2
23123    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23124
23125/* ------------------------------ */
23126    .balign 64
23127.L_ALT_OP_UNUSED_7DFF: /* 0x17d */
23128/* File: armv5te/alt_stub.S */
23129/*
23130 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23131 * any interesting requests and then jump to the real instruction
23132 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23133 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23134 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23135 * bail to the real handler if breakFlags==0.
23136 */
23137    ldrb   r3, [rSELF, #offThread_breakFlags]
23138    adrl   lr, dvmAsmInstructionStart + (381 * 64)
23139    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23140    cmp    r3, #0
23141    bxeq   lr                   @ nothing to do - jump to real handler
23142    EXPORT_PC()
23143    mov    r0, rPC              @ arg0
23144    mov    r1, rFP              @ arg1
23145    mov    r2, rSELF            @ arg2
23146    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23147
23148/* ------------------------------ */
23149    .balign 64
23150.L_ALT_OP_UNUSED_7EFF: /* 0x17e */
23151/* File: armv5te/alt_stub.S */
23152/*
23153 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23154 * any interesting requests and then jump to the real instruction
23155 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23156 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23157 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23158 * bail to the real handler if breakFlags==0.
23159 */
23160    ldrb   r3, [rSELF, #offThread_breakFlags]
23161    adrl   lr, dvmAsmInstructionStart + (382 * 64)
23162    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23163    cmp    r3, #0
23164    bxeq   lr                   @ nothing to do - jump to real handler
23165    EXPORT_PC()
23166    mov    r0, rPC              @ arg0
23167    mov    r1, rFP              @ arg1
23168    mov    r2, rSELF            @ arg2
23169    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23170
23171/* ------------------------------ */
23172    .balign 64
23173.L_ALT_OP_UNUSED_7FFF: /* 0x17f */
23174/* File: armv5te/alt_stub.S */
23175/*
23176 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23177 * any interesting requests and then jump to the real instruction
23178 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23179 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23180 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23181 * bail to the real handler if breakFlags==0.
23182 */
23183    ldrb   r3, [rSELF, #offThread_breakFlags]
23184    adrl   lr, dvmAsmInstructionStart + (383 * 64)
23185    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23186    cmp    r3, #0
23187    bxeq   lr                   @ nothing to do - jump to real handler
23188    EXPORT_PC()
23189    mov    r0, rPC              @ arg0
23190    mov    r1, rFP              @ arg1
23191    mov    r2, rSELF            @ arg2
23192    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23193
23194/* ------------------------------ */
23195    .balign 64
23196.L_ALT_OP_UNUSED_80FF: /* 0x180 */
23197/* File: armv5te/alt_stub.S */
23198/*
23199 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23200 * any interesting requests and then jump to the real instruction
23201 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23202 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23203 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23204 * bail to the real handler if breakFlags==0.
23205 */
23206    ldrb   r3, [rSELF, #offThread_breakFlags]
23207    adrl   lr, dvmAsmInstructionStart + (384 * 64)
23208    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23209    cmp    r3, #0
23210    bxeq   lr                   @ nothing to do - jump to real handler
23211    EXPORT_PC()
23212    mov    r0, rPC              @ arg0
23213    mov    r1, rFP              @ arg1
23214    mov    r2, rSELF            @ arg2
23215    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23216
23217/* ------------------------------ */
23218    .balign 64
23219.L_ALT_OP_UNUSED_81FF: /* 0x181 */
23220/* File: armv5te/alt_stub.S */
23221/*
23222 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23223 * any interesting requests and then jump to the real instruction
23224 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23225 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23226 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23227 * bail to the real handler if breakFlags==0.
23228 */
23229    ldrb   r3, [rSELF, #offThread_breakFlags]
23230    adrl   lr, dvmAsmInstructionStart + (385 * 64)
23231    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23232    cmp    r3, #0
23233    bxeq   lr                   @ nothing to do - jump to real handler
23234    EXPORT_PC()
23235    mov    r0, rPC              @ arg0
23236    mov    r1, rFP              @ arg1
23237    mov    r2, rSELF            @ arg2
23238    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23239
23240/* ------------------------------ */
23241    .balign 64
23242.L_ALT_OP_UNUSED_82FF: /* 0x182 */
23243/* File: armv5te/alt_stub.S */
23244/*
23245 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23246 * any interesting requests and then jump to the real instruction
23247 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23248 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23249 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23250 * bail to the real handler if breakFlags==0.
23251 */
23252    ldrb   r3, [rSELF, #offThread_breakFlags]
23253    adrl   lr, dvmAsmInstructionStart + (386 * 64)
23254    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23255    cmp    r3, #0
23256    bxeq   lr                   @ nothing to do - jump to real handler
23257    EXPORT_PC()
23258    mov    r0, rPC              @ arg0
23259    mov    r1, rFP              @ arg1
23260    mov    r2, rSELF            @ arg2
23261    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23262
23263/* ------------------------------ */
23264    .balign 64
23265.L_ALT_OP_UNUSED_83FF: /* 0x183 */
23266/* File: armv5te/alt_stub.S */
23267/*
23268 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23269 * any interesting requests and then jump to the real instruction
23270 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23271 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23272 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23273 * bail to the real handler if breakFlags==0.
23274 */
23275    ldrb   r3, [rSELF, #offThread_breakFlags]
23276    adrl   lr, dvmAsmInstructionStart + (387 * 64)
23277    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23278    cmp    r3, #0
23279    bxeq   lr                   @ nothing to do - jump to real handler
23280    EXPORT_PC()
23281    mov    r0, rPC              @ arg0
23282    mov    r1, rFP              @ arg1
23283    mov    r2, rSELF            @ arg2
23284    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23285
23286/* ------------------------------ */
23287    .balign 64
23288.L_ALT_OP_UNUSED_84FF: /* 0x184 */
23289/* File: armv5te/alt_stub.S */
23290/*
23291 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23292 * any interesting requests and then jump to the real instruction
23293 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23294 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23295 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23296 * bail to the real handler if breakFlags==0.
23297 */
23298    ldrb   r3, [rSELF, #offThread_breakFlags]
23299    adrl   lr, dvmAsmInstructionStart + (388 * 64)
23300    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23301    cmp    r3, #0
23302    bxeq   lr                   @ nothing to do - jump to real handler
23303    EXPORT_PC()
23304    mov    r0, rPC              @ arg0
23305    mov    r1, rFP              @ arg1
23306    mov    r2, rSELF            @ arg2
23307    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23308
23309/* ------------------------------ */
23310    .balign 64
23311.L_ALT_OP_UNUSED_85FF: /* 0x185 */
23312/* File: armv5te/alt_stub.S */
23313/*
23314 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23315 * any interesting requests and then jump to the real instruction
23316 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23317 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23318 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23319 * bail to the real handler if breakFlags==0.
23320 */
23321    ldrb   r3, [rSELF, #offThread_breakFlags]
23322    adrl   lr, dvmAsmInstructionStart + (389 * 64)
23323    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23324    cmp    r3, #0
23325    bxeq   lr                   @ nothing to do - jump to real handler
23326    EXPORT_PC()
23327    mov    r0, rPC              @ arg0
23328    mov    r1, rFP              @ arg1
23329    mov    r2, rSELF            @ arg2
23330    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23331
23332/* ------------------------------ */
23333    .balign 64
23334.L_ALT_OP_UNUSED_86FF: /* 0x186 */
23335/* File: armv5te/alt_stub.S */
23336/*
23337 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23338 * any interesting requests and then jump to the real instruction
23339 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23340 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23341 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23342 * bail to the real handler if breakFlags==0.
23343 */
23344    ldrb   r3, [rSELF, #offThread_breakFlags]
23345    adrl   lr, dvmAsmInstructionStart + (390 * 64)
23346    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23347    cmp    r3, #0
23348    bxeq   lr                   @ nothing to do - jump to real handler
23349    EXPORT_PC()
23350    mov    r0, rPC              @ arg0
23351    mov    r1, rFP              @ arg1
23352    mov    r2, rSELF            @ arg2
23353    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23354
23355/* ------------------------------ */
23356    .balign 64
23357.L_ALT_OP_UNUSED_87FF: /* 0x187 */
23358/* File: armv5te/alt_stub.S */
23359/*
23360 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23361 * any interesting requests and then jump to the real instruction
23362 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23363 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23364 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23365 * bail to the real handler if breakFlags==0.
23366 */
23367    ldrb   r3, [rSELF, #offThread_breakFlags]
23368    adrl   lr, dvmAsmInstructionStart + (391 * 64)
23369    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23370    cmp    r3, #0
23371    bxeq   lr                   @ nothing to do - jump to real handler
23372    EXPORT_PC()
23373    mov    r0, rPC              @ arg0
23374    mov    r1, rFP              @ arg1
23375    mov    r2, rSELF            @ arg2
23376    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23377
23378/* ------------------------------ */
23379    .balign 64
23380.L_ALT_OP_UNUSED_88FF: /* 0x188 */
23381/* File: armv5te/alt_stub.S */
23382/*
23383 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23384 * any interesting requests and then jump to the real instruction
23385 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23386 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23387 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23388 * bail to the real handler if breakFlags==0.
23389 */
23390    ldrb   r3, [rSELF, #offThread_breakFlags]
23391    adrl   lr, dvmAsmInstructionStart + (392 * 64)
23392    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23393    cmp    r3, #0
23394    bxeq   lr                   @ nothing to do - jump to real handler
23395    EXPORT_PC()
23396    mov    r0, rPC              @ arg0
23397    mov    r1, rFP              @ arg1
23398    mov    r2, rSELF            @ arg2
23399    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23400
23401/* ------------------------------ */
23402    .balign 64
23403.L_ALT_OP_UNUSED_89FF: /* 0x189 */
23404/* File: armv5te/alt_stub.S */
23405/*
23406 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23407 * any interesting requests and then jump to the real instruction
23408 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23409 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23410 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23411 * bail to the real handler if breakFlags==0.
23412 */
23413    ldrb   r3, [rSELF, #offThread_breakFlags]
23414    adrl   lr, dvmAsmInstructionStart + (393 * 64)
23415    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23416    cmp    r3, #0
23417    bxeq   lr                   @ nothing to do - jump to real handler
23418    EXPORT_PC()
23419    mov    r0, rPC              @ arg0
23420    mov    r1, rFP              @ arg1
23421    mov    r2, rSELF            @ arg2
23422    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23423
23424/* ------------------------------ */
23425    .balign 64
23426.L_ALT_OP_UNUSED_8AFF: /* 0x18a */
23427/* File: armv5te/alt_stub.S */
23428/*
23429 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23430 * any interesting requests and then jump to the real instruction
23431 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23432 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23433 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23434 * bail to the real handler if breakFlags==0.
23435 */
23436    ldrb   r3, [rSELF, #offThread_breakFlags]
23437    adrl   lr, dvmAsmInstructionStart + (394 * 64)
23438    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23439    cmp    r3, #0
23440    bxeq   lr                   @ nothing to do - jump to real handler
23441    EXPORT_PC()
23442    mov    r0, rPC              @ arg0
23443    mov    r1, rFP              @ arg1
23444    mov    r2, rSELF            @ arg2
23445    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23446
23447/* ------------------------------ */
23448    .balign 64
23449.L_ALT_OP_UNUSED_8BFF: /* 0x18b */
23450/* File: armv5te/alt_stub.S */
23451/*
23452 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23453 * any interesting requests and then jump to the real instruction
23454 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23455 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23456 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23457 * bail to the real handler if breakFlags==0.
23458 */
23459    ldrb   r3, [rSELF, #offThread_breakFlags]
23460    adrl   lr, dvmAsmInstructionStart + (395 * 64)
23461    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23462    cmp    r3, #0
23463    bxeq   lr                   @ nothing to do - jump to real handler
23464    EXPORT_PC()
23465    mov    r0, rPC              @ arg0
23466    mov    r1, rFP              @ arg1
23467    mov    r2, rSELF            @ arg2
23468    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23469
23470/* ------------------------------ */
23471    .balign 64
23472.L_ALT_OP_UNUSED_8CFF: /* 0x18c */
23473/* File: armv5te/alt_stub.S */
23474/*
23475 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23476 * any interesting requests and then jump to the real instruction
23477 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23478 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23479 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23480 * bail to the real handler if breakFlags==0.
23481 */
23482    ldrb   r3, [rSELF, #offThread_breakFlags]
23483    adrl   lr, dvmAsmInstructionStart + (396 * 64)
23484    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23485    cmp    r3, #0
23486    bxeq   lr                   @ nothing to do - jump to real handler
23487    EXPORT_PC()
23488    mov    r0, rPC              @ arg0
23489    mov    r1, rFP              @ arg1
23490    mov    r2, rSELF            @ arg2
23491    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23492
23493/* ------------------------------ */
23494    .balign 64
23495.L_ALT_OP_UNUSED_8DFF: /* 0x18d */
23496/* File: armv5te/alt_stub.S */
23497/*
23498 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23499 * any interesting requests and then jump to the real instruction
23500 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23501 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23502 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23503 * bail to the real handler if breakFlags==0.
23504 */
23505    ldrb   r3, [rSELF, #offThread_breakFlags]
23506    adrl   lr, dvmAsmInstructionStart + (397 * 64)
23507    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23508    cmp    r3, #0
23509    bxeq   lr                   @ nothing to do - jump to real handler
23510    EXPORT_PC()
23511    mov    r0, rPC              @ arg0
23512    mov    r1, rFP              @ arg1
23513    mov    r2, rSELF            @ arg2
23514    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23515
23516/* ------------------------------ */
23517    .balign 64
23518.L_ALT_OP_UNUSED_8EFF: /* 0x18e */
23519/* File: armv5te/alt_stub.S */
23520/*
23521 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23522 * any interesting requests and then jump to the real instruction
23523 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23524 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23525 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23526 * bail to the real handler if breakFlags==0.
23527 */
23528    ldrb   r3, [rSELF, #offThread_breakFlags]
23529    adrl   lr, dvmAsmInstructionStart + (398 * 64)
23530    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23531    cmp    r3, #0
23532    bxeq   lr                   @ nothing to do - jump to real handler
23533    EXPORT_PC()
23534    mov    r0, rPC              @ arg0
23535    mov    r1, rFP              @ arg1
23536    mov    r2, rSELF            @ arg2
23537    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23538
23539/* ------------------------------ */
23540    .balign 64
23541.L_ALT_OP_UNUSED_8FFF: /* 0x18f */
23542/* File: armv5te/alt_stub.S */
23543/*
23544 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23545 * any interesting requests and then jump to the real instruction
23546 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23547 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23548 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23549 * bail to the real handler if breakFlags==0.
23550 */
23551    ldrb   r3, [rSELF, #offThread_breakFlags]
23552    adrl   lr, dvmAsmInstructionStart + (399 * 64)
23553    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23554    cmp    r3, #0
23555    bxeq   lr                   @ nothing to do - jump to real handler
23556    EXPORT_PC()
23557    mov    r0, rPC              @ arg0
23558    mov    r1, rFP              @ arg1
23559    mov    r2, rSELF            @ arg2
23560    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23561
23562/* ------------------------------ */
23563    .balign 64
23564.L_ALT_OP_UNUSED_90FF: /* 0x190 */
23565/* File: armv5te/alt_stub.S */
23566/*
23567 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23568 * any interesting requests and then jump to the real instruction
23569 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23570 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23571 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23572 * bail to the real handler if breakFlags==0.
23573 */
23574    ldrb   r3, [rSELF, #offThread_breakFlags]
23575    adrl   lr, dvmAsmInstructionStart + (400 * 64)
23576    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23577    cmp    r3, #0
23578    bxeq   lr                   @ nothing to do - jump to real handler
23579    EXPORT_PC()
23580    mov    r0, rPC              @ arg0
23581    mov    r1, rFP              @ arg1
23582    mov    r2, rSELF            @ arg2
23583    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23584
23585/* ------------------------------ */
23586    .balign 64
23587.L_ALT_OP_UNUSED_91FF: /* 0x191 */
23588/* File: armv5te/alt_stub.S */
23589/*
23590 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23591 * any interesting requests and then jump to the real instruction
23592 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23593 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23594 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23595 * bail to the real handler if breakFlags==0.
23596 */
23597    ldrb   r3, [rSELF, #offThread_breakFlags]
23598    adrl   lr, dvmAsmInstructionStart + (401 * 64)
23599    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23600    cmp    r3, #0
23601    bxeq   lr                   @ nothing to do - jump to real handler
23602    EXPORT_PC()
23603    mov    r0, rPC              @ arg0
23604    mov    r1, rFP              @ arg1
23605    mov    r2, rSELF            @ arg2
23606    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23607
23608/* ------------------------------ */
23609    .balign 64
23610.L_ALT_OP_UNUSED_92FF: /* 0x192 */
23611/* File: armv5te/alt_stub.S */
23612/*
23613 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23614 * any interesting requests and then jump to the real instruction
23615 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23616 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23617 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23618 * bail to the real handler if breakFlags==0.
23619 */
23620    ldrb   r3, [rSELF, #offThread_breakFlags]
23621    adrl   lr, dvmAsmInstructionStart + (402 * 64)
23622    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23623    cmp    r3, #0
23624    bxeq   lr                   @ nothing to do - jump to real handler
23625    EXPORT_PC()
23626    mov    r0, rPC              @ arg0
23627    mov    r1, rFP              @ arg1
23628    mov    r2, rSELF            @ arg2
23629    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23630
23631/* ------------------------------ */
23632    .balign 64
23633.L_ALT_OP_UNUSED_93FF: /* 0x193 */
23634/* File: armv5te/alt_stub.S */
23635/*
23636 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23637 * any interesting requests and then jump to the real instruction
23638 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23639 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23640 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23641 * bail to the real handler if breakFlags==0.
23642 */
23643    ldrb   r3, [rSELF, #offThread_breakFlags]
23644    adrl   lr, dvmAsmInstructionStart + (403 * 64)
23645    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23646    cmp    r3, #0
23647    bxeq   lr                   @ nothing to do - jump to real handler
23648    EXPORT_PC()
23649    mov    r0, rPC              @ arg0
23650    mov    r1, rFP              @ arg1
23651    mov    r2, rSELF            @ arg2
23652    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23653
23654/* ------------------------------ */
23655    .balign 64
23656.L_ALT_OP_UNUSED_94FF: /* 0x194 */
23657/* File: armv5te/alt_stub.S */
23658/*
23659 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23660 * any interesting requests and then jump to the real instruction
23661 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23662 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23663 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23664 * bail to the real handler if breakFlags==0.
23665 */
23666    ldrb   r3, [rSELF, #offThread_breakFlags]
23667    adrl   lr, dvmAsmInstructionStart + (404 * 64)
23668    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23669    cmp    r3, #0
23670    bxeq   lr                   @ nothing to do - jump to real handler
23671    EXPORT_PC()
23672    mov    r0, rPC              @ arg0
23673    mov    r1, rFP              @ arg1
23674    mov    r2, rSELF            @ arg2
23675    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23676
23677/* ------------------------------ */
23678    .balign 64
23679.L_ALT_OP_UNUSED_95FF: /* 0x195 */
23680/* File: armv5te/alt_stub.S */
23681/*
23682 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23683 * any interesting requests and then jump to the real instruction
23684 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23685 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23686 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23687 * bail to the real handler if breakFlags==0.
23688 */
23689    ldrb   r3, [rSELF, #offThread_breakFlags]
23690    adrl   lr, dvmAsmInstructionStart + (405 * 64)
23691    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23692    cmp    r3, #0
23693    bxeq   lr                   @ nothing to do - jump to real handler
23694    EXPORT_PC()
23695    mov    r0, rPC              @ arg0
23696    mov    r1, rFP              @ arg1
23697    mov    r2, rSELF            @ arg2
23698    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23699
23700/* ------------------------------ */
23701    .balign 64
23702.L_ALT_OP_UNUSED_96FF: /* 0x196 */
23703/* File: armv5te/alt_stub.S */
23704/*
23705 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23706 * any interesting requests and then jump to the real instruction
23707 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23708 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23709 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23710 * bail to the real handler if breakFlags==0.
23711 */
23712    ldrb   r3, [rSELF, #offThread_breakFlags]
23713    adrl   lr, dvmAsmInstructionStart + (406 * 64)
23714    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23715    cmp    r3, #0
23716    bxeq   lr                   @ nothing to do - jump to real handler
23717    EXPORT_PC()
23718    mov    r0, rPC              @ arg0
23719    mov    r1, rFP              @ arg1
23720    mov    r2, rSELF            @ arg2
23721    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23722
23723/* ------------------------------ */
23724    .balign 64
23725.L_ALT_OP_UNUSED_97FF: /* 0x197 */
23726/* File: armv5te/alt_stub.S */
23727/*
23728 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23729 * any interesting requests and then jump to the real instruction
23730 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23731 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23732 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23733 * bail to the real handler if breakFlags==0.
23734 */
23735    ldrb   r3, [rSELF, #offThread_breakFlags]
23736    adrl   lr, dvmAsmInstructionStart + (407 * 64)
23737    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23738    cmp    r3, #0
23739    bxeq   lr                   @ nothing to do - jump to real handler
23740    EXPORT_PC()
23741    mov    r0, rPC              @ arg0
23742    mov    r1, rFP              @ arg1
23743    mov    r2, rSELF            @ arg2
23744    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23745
23746/* ------------------------------ */
23747    .balign 64
23748.L_ALT_OP_UNUSED_98FF: /* 0x198 */
23749/* File: armv5te/alt_stub.S */
23750/*
23751 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23752 * any interesting requests and then jump to the real instruction
23753 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23754 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23755 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23756 * bail to the real handler if breakFlags==0.
23757 */
23758    ldrb   r3, [rSELF, #offThread_breakFlags]
23759    adrl   lr, dvmAsmInstructionStart + (408 * 64)
23760    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23761    cmp    r3, #0
23762    bxeq   lr                   @ nothing to do - jump to real handler
23763    EXPORT_PC()
23764    mov    r0, rPC              @ arg0
23765    mov    r1, rFP              @ arg1
23766    mov    r2, rSELF            @ arg2
23767    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23768
23769/* ------------------------------ */
23770    .balign 64
23771.L_ALT_OP_UNUSED_99FF: /* 0x199 */
23772/* File: armv5te/alt_stub.S */
23773/*
23774 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23775 * any interesting requests and then jump to the real instruction
23776 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23777 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23778 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23779 * bail to the real handler if breakFlags==0.
23780 */
23781    ldrb   r3, [rSELF, #offThread_breakFlags]
23782    adrl   lr, dvmAsmInstructionStart + (409 * 64)
23783    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23784    cmp    r3, #0
23785    bxeq   lr                   @ nothing to do - jump to real handler
23786    EXPORT_PC()
23787    mov    r0, rPC              @ arg0
23788    mov    r1, rFP              @ arg1
23789    mov    r2, rSELF            @ arg2
23790    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23791
23792/* ------------------------------ */
23793    .balign 64
23794.L_ALT_OP_UNUSED_9AFF: /* 0x19a */
23795/* File: armv5te/alt_stub.S */
23796/*
23797 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23798 * any interesting requests and then jump to the real instruction
23799 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23800 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23801 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23802 * bail to the real handler if breakFlags==0.
23803 */
23804    ldrb   r3, [rSELF, #offThread_breakFlags]
23805    adrl   lr, dvmAsmInstructionStart + (410 * 64)
23806    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23807    cmp    r3, #0
23808    bxeq   lr                   @ nothing to do - jump to real handler
23809    EXPORT_PC()
23810    mov    r0, rPC              @ arg0
23811    mov    r1, rFP              @ arg1
23812    mov    r2, rSELF            @ arg2
23813    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23814
23815/* ------------------------------ */
23816    .balign 64
23817.L_ALT_OP_UNUSED_9BFF: /* 0x19b */
23818/* File: armv5te/alt_stub.S */
23819/*
23820 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23821 * any interesting requests and then jump to the real instruction
23822 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23823 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23824 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23825 * bail to the real handler if breakFlags==0.
23826 */
23827    ldrb   r3, [rSELF, #offThread_breakFlags]
23828    adrl   lr, dvmAsmInstructionStart + (411 * 64)
23829    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23830    cmp    r3, #0
23831    bxeq   lr                   @ nothing to do - jump to real handler
23832    EXPORT_PC()
23833    mov    r0, rPC              @ arg0
23834    mov    r1, rFP              @ arg1
23835    mov    r2, rSELF            @ arg2
23836    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23837
23838/* ------------------------------ */
23839    .balign 64
23840.L_ALT_OP_UNUSED_9CFF: /* 0x19c */
23841/* File: armv5te/alt_stub.S */
23842/*
23843 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23844 * any interesting requests and then jump to the real instruction
23845 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23846 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23847 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23848 * bail to the real handler if breakFlags==0.
23849 */
23850    ldrb   r3, [rSELF, #offThread_breakFlags]
23851    adrl   lr, dvmAsmInstructionStart + (412 * 64)
23852    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23853    cmp    r3, #0
23854    bxeq   lr                   @ nothing to do - jump to real handler
23855    EXPORT_PC()
23856    mov    r0, rPC              @ arg0
23857    mov    r1, rFP              @ arg1
23858    mov    r2, rSELF            @ arg2
23859    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23860
23861/* ------------------------------ */
23862    .balign 64
23863.L_ALT_OP_UNUSED_9DFF: /* 0x19d */
23864/* File: armv5te/alt_stub.S */
23865/*
23866 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23867 * any interesting requests and then jump to the real instruction
23868 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23869 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23870 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23871 * bail to the real handler if breakFlags==0.
23872 */
23873    ldrb   r3, [rSELF, #offThread_breakFlags]
23874    adrl   lr, dvmAsmInstructionStart + (413 * 64)
23875    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23876    cmp    r3, #0
23877    bxeq   lr                   @ nothing to do - jump to real handler
23878    EXPORT_PC()
23879    mov    r0, rPC              @ arg0
23880    mov    r1, rFP              @ arg1
23881    mov    r2, rSELF            @ arg2
23882    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23883
23884/* ------------------------------ */
23885    .balign 64
23886.L_ALT_OP_UNUSED_9EFF: /* 0x19e */
23887/* File: armv5te/alt_stub.S */
23888/*
23889 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23890 * any interesting requests and then jump to the real instruction
23891 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23892 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23893 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23894 * bail to the real handler if breakFlags==0.
23895 */
23896    ldrb   r3, [rSELF, #offThread_breakFlags]
23897    adrl   lr, dvmAsmInstructionStart + (414 * 64)
23898    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23899    cmp    r3, #0
23900    bxeq   lr                   @ nothing to do - jump to real handler
23901    EXPORT_PC()
23902    mov    r0, rPC              @ arg0
23903    mov    r1, rFP              @ arg1
23904    mov    r2, rSELF            @ arg2
23905    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23906
23907/* ------------------------------ */
23908    .balign 64
23909.L_ALT_OP_UNUSED_9FFF: /* 0x19f */
23910/* File: armv5te/alt_stub.S */
23911/*
23912 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23913 * any interesting requests and then jump to the real instruction
23914 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23915 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23916 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23917 * bail to the real handler if breakFlags==0.
23918 */
23919    ldrb   r3, [rSELF, #offThread_breakFlags]
23920    adrl   lr, dvmAsmInstructionStart + (415 * 64)
23921    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23922    cmp    r3, #0
23923    bxeq   lr                   @ nothing to do - jump to real handler
23924    EXPORT_PC()
23925    mov    r0, rPC              @ arg0
23926    mov    r1, rFP              @ arg1
23927    mov    r2, rSELF            @ arg2
23928    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23929
23930/* ------------------------------ */
23931    .balign 64
23932.L_ALT_OP_UNUSED_A0FF: /* 0x1a0 */
23933/* File: armv5te/alt_stub.S */
23934/*
23935 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23936 * any interesting requests and then jump to the real instruction
23937 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23938 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23939 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23940 * bail to the real handler if breakFlags==0.
23941 */
23942    ldrb   r3, [rSELF, #offThread_breakFlags]
23943    adrl   lr, dvmAsmInstructionStart + (416 * 64)
23944    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23945    cmp    r3, #0
23946    bxeq   lr                   @ nothing to do - jump to real handler
23947    EXPORT_PC()
23948    mov    r0, rPC              @ arg0
23949    mov    r1, rFP              @ arg1
23950    mov    r2, rSELF            @ arg2
23951    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23952
23953/* ------------------------------ */
23954    .balign 64
23955.L_ALT_OP_UNUSED_A1FF: /* 0x1a1 */
23956/* File: armv5te/alt_stub.S */
23957/*
23958 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23959 * any interesting requests and then jump to the real instruction
23960 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23961 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23962 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23963 * bail to the real handler if breakFlags==0.
23964 */
23965    ldrb   r3, [rSELF, #offThread_breakFlags]
23966    adrl   lr, dvmAsmInstructionStart + (417 * 64)
23967    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23968    cmp    r3, #0
23969    bxeq   lr                   @ nothing to do - jump to real handler
23970    EXPORT_PC()
23971    mov    r0, rPC              @ arg0
23972    mov    r1, rFP              @ arg1
23973    mov    r2, rSELF            @ arg2
23974    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23975
23976/* ------------------------------ */
23977    .balign 64
23978.L_ALT_OP_UNUSED_A2FF: /* 0x1a2 */
23979/* File: armv5te/alt_stub.S */
23980/*
23981 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23982 * any interesting requests and then jump to the real instruction
23983 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23984 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23985 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23986 * bail to the real handler if breakFlags==0.
23987 */
23988    ldrb   r3, [rSELF, #offThread_breakFlags]
23989    adrl   lr, dvmAsmInstructionStart + (418 * 64)
23990    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23991    cmp    r3, #0
23992    bxeq   lr                   @ nothing to do - jump to real handler
23993    EXPORT_PC()
23994    mov    r0, rPC              @ arg0
23995    mov    r1, rFP              @ arg1
23996    mov    r2, rSELF            @ arg2
23997    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23998
23999/* ------------------------------ */
24000    .balign 64
24001.L_ALT_OP_UNUSED_A3FF: /* 0x1a3 */
24002/* File: armv5te/alt_stub.S */
24003/*
24004 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24005 * any interesting requests and then jump to the real instruction
24006 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24007 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24008 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24009 * bail to the real handler if breakFlags==0.
24010 */
24011    ldrb   r3, [rSELF, #offThread_breakFlags]
24012    adrl   lr, dvmAsmInstructionStart + (419 * 64)
24013    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24014    cmp    r3, #0
24015    bxeq   lr                   @ nothing to do - jump to real handler
24016    EXPORT_PC()
24017    mov    r0, rPC              @ arg0
24018    mov    r1, rFP              @ arg1
24019    mov    r2, rSELF            @ arg2
24020    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24021
24022/* ------------------------------ */
24023    .balign 64
24024.L_ALT_OP_UNUSED_A4FF: /* 0x1a4 */
24025/* File: armv5te/alt_stub.S */
24026/*
24027 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24028 * any interesting requests and then jump to the real instruction
24029 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24030 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24031 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24032 * bail to the real handler if breakFlags==0.
24033 */
24034    ldrb   r3, [rSELF, #offThread_breakFlags]
24035    adrl   lr, dvmAsmInstructionStart + (420 * 64)
24036    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24037    cmp    r3, #0
24038    bxeq   lr                   @ nothing to do - jump to real handler
24039    EXPORT_PC()
24040    mov    r0, rPC              @ arg0
24041    mov    r1, rFP              @ arg1
24042    mov    r2, rSELF            @ arg2
24043    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24044
24045/* ------------------------------ */
24046    .balign 64
24047.L_ALT_OP_UNUSED_A5FF: /* 0x1a5 */
24048/* File: armv5te/alt_stub.S */
24049/*
24050 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24051 * any interesting requests and then jump to the real instruction
24052 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24053 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24054 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24055 * bail to the real handler if breakFlags==0.
24056 */
24057    ldrb   r3, [rSELF, #offThread_breakFlags]
24058    adrl   lr, dvmAsmInstructionStart + (421 * 64)
24059    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24060    cmp    r3, #0
24061    bxeq   lr                   @ nothing to do - jump to real handler
24062    EXPORT_PC()
24063    mov    r0, rPC              @ arg0
24064    mov    r1, rFP              @ arg1
24065    mov    r2, rSELF            @ arg2
24066    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24067
24068/* ------------------------------ */
24069    .balign 64
24070.L_ALT_OP_UNUSED_A6FF: /* 0x1a6 */
24071/* File: armv5te/alt_stub.S */
24072/*
24073 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24074 * any interesting requests and then jump to the real instruction
24075 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24076 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24077 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24078 * bail to the real handler if breakFlags==0.
24079 */
24080    ldrb   r3, [rSELF, #offThread_breakFlags]
24081    adrl   lr, dvmAsmInstructionStart + (422 * 64)
24082    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24083    cmp    r3, #0
24084    bxeq   lr                   @ nothing to do - jump to real handler
24085    EXPORT_PC()
24086    mov    r0, rPC              @ arg0
24087    mov    r1, rFP              @ arg1
24088    mov    r2, rSELF            @ arg2
24089    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24090
24091/* ------------------------------ */
24092    .balign 64
24093.L_ALT_OP_UNUSED_A7FF: /* 0x1a7 */
24094/* File: armv5te/alt_stub.S */
24095/*
24096 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24097 * any interesting requests and then jump to the real instruction
24098 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24099 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24100 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24101 * bail to the real handler if breakFlags==0.
24102 */
24103    ldrb   r3, [rSELF, #offThread_breakFlags]
24104    adrl   lr, dvmAsmInstructionStart + (423 * 64)
24105    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24106    cmp    r3, #0
24107    bxeq   lr                   @ nothing to do - jump to real handler
24108    EXPORT_PC()
24109    mov    r0, rPC              @ arg0
24110    mov    r1, rFP              @ arg1
24111    mov    r2, rSELF            @ arg2
24112    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24113
24114/* ------------------------------ */
24115    .balign 64
24116.L_ALT_OP_UNUSED_A8FF: /* 0x1a8 */
24117/* File: armv5te/alt_stub.S */
24118/*
24119 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24120 * any interesting requests and then jump to the real instruction
24121 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24122 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24123 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24124 * bail to the real handler if breakFlags==0.
24125 */
24126    ldrb   r3, [rSELF, #offThread_breakFlags]
24127    adrl   lr, dvmAsmInstructionStart + (424 * 64)
24128    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24129    cmp    r3, #0
24130    bxeq   lr                   @ nothing to do - jump to real handler
24131    EXPORT_PC()
24132    mov    r0, rPC              @ arg0
24133    mov    r1, rFP              @ arg1
24134    mov    r2, rSELF            @ arg2
24135    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24136
24137/* ------------------------------ */
24138    .balign 64
24139.L_ALT_OP_UNUSED_A9FF: /* 0x1a9 */
24140/* File: armv5te/alt_stub.S */
24141/*
24142 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24143 * any interesting requests and then jump to the real instruction
24144 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24145 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24146 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24147 * bail to the real handler if breakFlags==0.
24148 */
24149    ldrb   r3, [rSELF, #offThread_breakFlags]
24150    adrl   lr, dvmAsmInstructionStart + (425 * 64)
24151    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24152    cmp    r3, #0
24153    bxeq   lr                   @ nothing to do - jump to real handler
24154    EXPORT_PC()
24155    mov    r0, rPC              @ arg0
24156    mov    r1, rFP              @ arg1
24157    mov    r2, rSELF            @ arg2
24158    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24159
24160/* ------------------------------ */
24161    .balign 64
24162.L_ALT_OP_UNUSED_AAFF: /* 0x1aa */
24163/* File: armv5te/alt_stub.S */
24164/*
24165 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24166 * any interesting requests and then jump to the real instruction
24167 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24168 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24169 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24170 * bail to the real handler if breakFlags==0.
24171 */
24172    ldrb   r3, [rSELF, #offThread_breakFlags]
24173    adrl   lr, dvmAsmInstructionStart + (426 * 64)
24174    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24175    cmp    r3, #0
24176    bxeq   lr                   @ nothing to do - jump to real handler
24177    EXPORT_PC()
24178    mov    r0, rPC              @ arg0
24179    mov    r1, rFP              @ arg1
24180    mov    r2, rSELF            @ arg2
24181    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24182
24183/* ------------------------------ */
24184    .balign 64
24185.L_ALT_OP_UNUSED_ABFF: /* 0x1ab */
24186/* File: armv5te/alt_stub.S */
24187/*
24188 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24189 * any interesting requests and then jump to the real instruction
24190 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24191 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24192 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24193 * bail to the real handler if breakFlags==0.
24194 */
24195    ldrb   r3, [rSELF, #offThread_breakFlags]
24196    adrl   lr, dvmAsmInstructionStart + (427 * 64)
24197    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24198    cmp    r3, #0
24199    bxeq   lr                   @ nothing to do - jump to real handler
24200    EXPORT_PC()
24201    mov    r0, rPC              @ arg0
24202    mov    r1, rFP              @ arg1
24203    mov    r2, rSELF            @ arg2
24204    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24205
24206/* ------------------------------ */
24207    .balign 64
24208.L_ALT_OP_UNUSED_ACFF: /* 0x1ac */
24209/* File: armv5te/alt_stub.S */
24210/*
24211 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24212 * any interesting requests and then jump to the real instruction
24213 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24214 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24215 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24216 * bail to the real handler if breakFlags==0.
24217 */
24218    ldrb   r3, [rSELF, #offThread_breakFlags]
24219    adrl   lr, dvmAsmInstructionStart + (428 * 64)
24220    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24221    cmp    r3, #0
24222    bxeq   lr                   @ nothing to do - jump to real handler
24223    EXPORT_PC()
24224    mov    r0, rPC              @ arg0
24225    mov    r1, rFP              @ arg1
24226    mov    r2, rSELF            @ arg2
24227    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24228
24229/* ------------------------------ */
24230    .balign 64
24231.L_ALT_OP_UNUSED_ADFF: /* 0x1ad */
24232/* File: armv5te/alt_stub.S */
24233/*
24234 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24235 * any interesting requests and then jump to the real instruction
24236 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24237 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24238 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24239 * bail to the real handler if breakFlags==0.
24240 */
24241    ldrb   r3, [rSELF, #offThread_breakFlags]
24242    adrl   lr, dvmAsmInstructionStart + (429 * 64)
24243    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24244    cmp    r3, #0
24245    bxeq   lr                   @ nothing to do - jump to real handler
24246    EXPORT_PC()
24247    mov    r0, rPC              @ arg0
24248    mov    r1, rFP              @ arg1
24249    mov    r2, rSELF            @ arg2
24250    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24251
24252/* ------------------------------ */
24253    .balign 64
24254.L_ALT_OP_UNUSED_AEFF: /* 0x1ae */
24255/* File: armv5te/alt_stub.S */
24256/*
24257 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24258 * any interesting requests and then jump to the real instruction
24259 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24260 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24261 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24262 * bail to the real handler if breakFlags==0.
24263 */
24264    ldrb   r3, [rSELF, #offThread_breakFlags]
24265    adrl   lr, dvmAsmInstructionStart + (430 * 64)
24266    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24267    cmp    r3, #0
24268    bxeq   lr                   @ nothing to do - jump to real handler
24269    EXPORT_PC()
24270    mov    r0, rPC              @ arg0
24271    mov    r1, rFP              @ arg1
24272    mov    r2, rSELF            @ arg2
24273    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24274
24275/* ------------------------------ */
24276    .balign 64
24277.L_ALT_OP_UNUSED_AFFF: /* 0x1af */
24278/* File: armv5te/alt_stub.S */
24279/*
24280 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24281 * any interesting requests and then jump to the real instruction
24282 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24283 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24284 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24285 * bail to the real handler if breakFlags==0.
24286 */
24287    ldrb   r3, [rSELF, #offThread_breakFlags]
24288    adrl   lr, dvmAsmInstructionStart + (431 * 64)
24289    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24290    cmp    r3, #0
24291    bxeq   lr                   @ nothing to do - jump to real handler
24292    EXPORT_PC()
24293    mov    r0, rPC              @ arg0
24294    mov    r1, rFP              @ arg1
24295    mov    r2, rSELF            @ arg2
24296    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24297
24298/* ------------------------------ */
24299    .balign 64
24300.L_ALT_OP_UNUSED_B0FF: /* 0x1b0 */
24301/* File: armv5te/alt_stub.S */
24302/*
24303 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24304 * any interesting requests and then jump to the real instruction
24305 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24306 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24307 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24308 * bail to the real handler if breakFlags==0.
24309 */
24310    ldrb   r3, [rSELF, #offThread_breakFlags]
24311    adrl   lr, dvmAsmInstructionStart + (432 * 64)
24312    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24313    cmp    r3, #0
24314    bxeq   lr                   @ nothing to do - jump to real handler
24315    EXPORT_PC()
24316    mov    r0, rPC              @ arg0
24317    mov    r1, rFP              @ arg1
24318    mov    r2, rSELF            @ arg2
24319    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24320
24321/* ------------------------------ */
24322    .balign 64
24323.L_ALT_OP_UNUSED_B1FF: /* 0x1b1 */
24324/* File: armv5te/alt_stub.S */
24325/*
24326 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24327 * any interesting requests and then jump to the real instruction
24328 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24329 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24330 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24331 * bail to the real handler if breakFlags==0.
24332 */
24333    ldrb   r3, [rSELF, #offThread_breakFlags]
24334    adrl   lr, dvmAsmInstructionStart + (433 * 64)
24335    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24336    cmp    r3, #0
24337    bxeq   lr                   @ nothing to do - jump to real handler
24338    EXPORT_PC()
24339    mov    r0, rPC              @ arg0
24340    mov    r1, rFP              @ arg1
24341    mov    r2, rSELF            @ arg2
24342    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24343
24344/* ------------------------------ */
24345    .balign 64
24346.L_ALT_OP_UNUSED_B2FF: /* 0x1b2 */
24347/* File: armv5te/alt_stub.S */
24348/*
24349 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24350 * any interesting requests and then jump to the real instruction
24351 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24352 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24353 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24354 * bail to the real handler if breakFlags==0.
24355 */
24356    ldrb   r3, [rSELF, #offThread_breakFlags]
24357    adrl   lr, dvmAsmInstructionStart + (434 * 64)
24358    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24359    cmp    r3, #0
24360    bxeq   lr                   @ nothing to do - jump to real handler
24361    EXPORT_PC()
24362    mov    r0, rPC              @ arg0
24363    mov    r1, rFP              @ arg1
24364    mov    r2, rSELF            @ arg2
24365    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24366
24367/* ------------------------------ */
24368    .balign 64
24369.L_ALT_OP_UNUSED_B3FF: /* 0x1b3 */
24370/* File: armv5te/alt_stub.S */
24371/*
24372 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24373 * any interesting requests and then jump to the real instruction
24374 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24375 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24376 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24377 * bail to the real handler if breakFlags==0.
24378 */
24379    ldrb   r3, [rSELF, #offThread_breakFlags]
24380    adrl   lr, dvmAsmInstructionStart + (435 * 64)
24381    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24382    cmp    r3, #0
24383    bxeq   lr                   @ nothing to do - jump to real handler
24384    EXPORT_PC()
24385    mov    r0, rPC              @ arg0
24386    mov    r1, rFP              @ arg1
24387    mov    r2, rSELF            @ arg2
24388    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24389
24390/* ------------------------------ */
24391    .balign 64
24392.L_ALT_OP_UNUSED_B4FF: /* 0x1b4 */
24393/* File: armv5te/alt_stub.S */
24394/*
24395 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24396 * any interesting requests and then jump to the real instruction
24397 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24398 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24399 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24400 * bail to the real handler if breakFlags==0.
24401 */
24402    ldrb   r3, [rSELF, #offThread_breakFlags]
24403    adrl   lr, dvmAsmInstructionStart + (436 * 64)
24404    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24405    cmp    r3, #0
24406    bxeq   lr                   @ nothing to do - jump to real handler
24407    EXPORT_PC()
24408    mov    r0, rPC              @ arg0
24409    mov    r1, rFP              @ arg1
24410    mov    r2, rSELF            @ arg2
24411    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24412
24413/* ------------------------------ */
24414    .balign 64
24415.L_ALT_OP_UNUSED_B5FF: /* 0x1b5 */
24416/* File: armv5te/alt_stub.S */
24417/*
24418 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24419 * any interesting requests and then jump to the real instruction
24420 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24421 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24422 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24423 * bail to the real handler if breakFlags==0.
24424 */
24425    ldrb   r3, [rSELF, #offThread_breakFlags]
24426    adrl   lr, dvmAsmInstructionStart + (437 * 64)
24427    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24428    cmp    r3, #0
24429    bxeq   lr                   @ nothing to do - jump to real handler
24430    EXPORT_PC()
24431    mov    r0, rPC              @ arg0
24432    mov    r1, rFP              @ arg1
24433    mov    r2, rSELF            @ arg2
24434    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24435
24436/* ------------------------------ */
24437    .balign 64
24438.L_ALT_OP_UNUSED_B6FF: /* 0x1b6 */
24439/* File: armv5te/alt_stub.S */
24440/*
24441 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24442 * any interesting requests and then jump to the real instruction
24443 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24444 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24445 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24446 * bail to the real handler if breakFlags==0.
24447 */
24448    ldrb   r3, [rSELF, #offThread_breakFlags]
24449    adrl   lr, dvmAsmInstructionStart + (438 * 64)
24450    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24451    cmp    r3, #0
24452    bxeq   lr                   @ nothing to do - jump to real handler
24453    EXPORT_PC()
24454    mov    r0, rPC              @ arg0
24455    mov    r1, rFP              @ arg1
24456    mov    r2, rSELF            @ arg2
24457    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24458
24459/* ------------------------------ */
24460    .balign 64
24461.L_ALT_OP_UNUSED_B7FF: /* 0x1b7 */
24462/* File: armv5te/alt_stub.S */
24463/*
24464 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24465 * any interesting requests and then jump to the real instruction
24466 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24467 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24468 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24469 * bail to the real handler if breakFlags==0.
24470 */
24471    ldrb   r3, [rSELF, #offThread_breakFlags]
24472    adrl   lr, dvmAsmInstructionStart + (439 * 64)
24473    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24474    cmp    r3, #0
24475    bxeq   lr                   @ nothing to do - jump to real handler
24476    EXPORT_PC()
24477    mov    r0, rPC              @ arg0
24478    mov    r1, rFP              @ arg1
24479    mov    r2, rSELF            @ arg2
24480    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24481
24482/* ------------------------------ */
24483    .balign 64
24484.L_ALT_OP_UNUSED_B8FF: /* 0x1b8 */
24485/* File: armv5te/alt_stub.S */
24486/*
24487 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24488 * any interesting requests and then jump to the real instruction
24489 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24490 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24491 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24492 * bail to the real handler if breakFlags==0.
24493 */
24494    ldrb   r3, [rSELF, #offThread_breakFlags]
24495    adrl   lr, dvmAsmInstructionStart + (440 * 64)
24496    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24497    cmp    r3, #0
24498    bxeq   lr                   @ nothing to do - jump to real handler
24499    EXPORT_PC()
24500    mov    r0, rPC              @ arg0
24501    mov    r1, rFP              @ arg1
24502    mov    r2, rSELF            @ arg2
24503    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24504
24505/* ------------------------------ */
24506    .balign 64
24507.L_ALT_OP_UNUSED_B9FF: /* 0x1b9 */
24508/* File: armv5te/alt_stub.S */
24509/*
24510 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24511 * any interesting requests and then jump to the real instruction
24512 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24513 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24514 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24515 * bail to the real handler if breakFlags==0.
24516 */
24517    ldrb   r3, [rSELF, #offThread_breakFlags]
24518    adrl   lr, dvmAsmInstructionStart + (441 * 64)
24519    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24520    cmp    r3, #0
24521    bxeq   lr                   @ nothing to do - jump to real handler
24522    EXPORT_PC()
24523    mov    r0, rPC              @ arg0
24524    mov    r1, rFP              @ arg1
24525    mov    r2, rSELF            @ arg2
24526    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24527
24528/* ------------------------------ */
24529    .balign 64
24530.L_ALT_OP_UNUSED_BAFF: /* 0x1ba */
24531/* File: armv5te/alt_stub.S */
24532/*
24533 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24534 * any interesting requests and then jump to the real instruction
24535 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24536 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24537 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24538 * bail to the real handler if breakFlags==0.
24539 */
24540    ldrb   r3, [rSELF, #offThread_breakFlags]
24541    adrl   lr, dvmAsmInstructionStart + (442 * 64)
24542    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24543    cmp    r3, #0
24544    bxeq   lr                   @ nothing to do - jump to real handler
24545    EXPORT_PC()
24546    mov    r0, rPC              @ arg0
24547    mov    r1, rFP              @ arg1
24548    mov    r2, rSELF            @ arg2
24549    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24550
24551/* ------------------------------ */
24552    .balign 64
24553.L_ALT_OP_UNUSED_BBFF: /* 0x1bb */
24554/* File: armv5te/alt_stub.S */
24555/*
24556 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24557 * any interesting requests and then jump to the real instruction
24558 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24559 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24560 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24561 * bail to the real handler if breakFlags==0.
24562 */
24563    ldrb   r3, [rSELF, #offThread_breakFlags]
24564    adrl   lr, dvmAsmInstructionStart + (443 * 64)
24565    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24566    cmp    r3, #0
24567    bxeq   lr                   @ nothing to do - jump to real handler
24568    EXPORT_PC()
24569    mov    r0, rPC              @ arg0
24570    mov    r1, rFP              @ arg1
24571    mov    r2, rSELF            @ arg2
24572    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24573
24574/* ------------------------------ */
24575    .balign 64
24576.L_ALT_OP_UNUSED_BCFF: /* 0x1bc */
24577/* File: armv5te/alt_stub.S */
24578/*
24579 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24580 * any interesting requests and then jump to the real instruction
24581 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24582 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24583 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24584 * bail to the real handler if breakFlags==0.
24585 */
24586    ldrb   r3, [rSELF, #offThread_breakFlags]
24587    adrl   lr, dvmAsmInstructionStart + (444 * 64)
24588    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24589    cmp    r3, #0
24590    bxeq   lr                   @ nothing to do - jump to real handler
24591    EXPORT_PC()
24592    mov    r0, rPC              @ arg0
24593    mov    r1, rFP              @ arg1
24594    mov    r2, rSELF            @ arg2
24595    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24596
24597/* ------------------------------ */
24598    .balign 64
24599.L_ALT_OP_UNUSED_BDFF: /* 0x1bd */
24600/* File: armv5te/alt_stub.S */
24601/*
24602 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24603 * any interesting requests and then jump to the real instruction
24604 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24605 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24606 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24607 * bail to the real handler if breakFlags==0.
24608 */
24609    ldrb   r3, [rSELF, #offThread_breakFlags]
24610    adrl   lr, dvmAsmInstructionStart + (445 * 64)
24611    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24612    cmp    r3, #0
24613    bxeq   lr                   @ nothing to do - jump to real handler
24614    EXPORT_PC()
24615    mov    r0, rPC              @ arg0
24616    mov    r1, rFP              @ arg1
24617    mov    r2, rSELF            @ arg2
24618    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24619
24620/* ------------------------------ */
24621    .balign 64
24622.L_ALT_OP_UNUSED_BEFF: /* 0x1be */
24623/* File: armv5te/alt_stub.S */
24624/*
24625 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24626 * any interesting requests and then jump to the real instruction
24627 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24628 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24629 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24630 * bail to the real handler if breakFlags==0.
24631 */
24632    ldrb   r3, [rSELF, #offThread_breakFlags]
24633    adrl   lr, dvmAsmInstructionStart + (446 * 64)
24634    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24635    cmp    r3, #0
24636    bxeq   lr                   @ nothing to do - jump to real handler
24637    EXPORT_PC()
24638    mov    r0, rPC              @ arg0
24639    mov    r1, rFP              @ arg1
24640    mov    r2, rSELF            @ arg2
24641    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24642
24643/* ------------------------------ */
24644    .balign 64
24645.L_ALT_OP_UNUSED_BFFF: /* 0x1bf */
24646/* File: armv5te/alt_stub.S */
24647/*
24648 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24649 * any interesting requests and then jump to the real instruction
24650 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24651 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24652 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24653 * bail to the real handler if breakFlags==0.
24654 */
24655    ldrb   r3, [rSELF, #offThread_breakFlags]
24656    adrl   lr, dvmAsmInstructionStart + (447 * 64)
24657    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24658    cmp    r3, #0
24659    bxeq   lr                   @ nothing to do - jump to real handler
24660    EXPORT_PC()
24661    mov    r0, rPC              @ arg0
24662    mov    r1, rFP              @ arg1
24663    mov    r2, rSELF            @ arg2
24664    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24665
24666/* ------------------------------ */
24667    .balign 64
24668.L_ALT_OP_UNUSED_C0FF: /* 0x1c0 */
24669/* File: armv5te/alt_stub.S */
24670/*
24671 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24672 * any interesting requests and then jump to the real instruction
24673 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24674 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24675 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24676 * bail to the real handler if breakFlags==0.
24677 */
24678    ldrb   r3, [rSELF, #offThread_breakFlags]
24679    adrl   lr, dvmAsmInstructionStart + (448 * 64)
24680    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24681    cmp    r3, #0
24682    bxeq   lr                   @ nothing to do - jump to real handler
24683    EXPORT_PC()
24684    mov    r0, rPC              @ arg0
24685    mov    r1, rFP              @ arg1
24686    mov    r2, rSELF            @ arg2
24687    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24688
24689/* ------------------------------ */
24690    .balign 64
24691.L_ALT_OP_UNUSED_C1FF: /* 0x1c1 */
24692/* File: armv5te/alt_stub.S */
24693/*
24694 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24695 * any interesting requests and then jump to the real instruction
24696 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24697 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24698 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24699 * bail to the real handler if breakFlags==0.
24700 */
24701    ldrb   r3, [rSELF, #offThread_breakFlags]
24702    adrl   lr, dvmAsmInstructionStart + (449 * 64)
24703    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24704    cmp    r3, #0
24705    bxeq   lr                   @ nothing to do - jump to real handler
24706    EXPORT_PC()
24707    mov    r0, rPC              @ arg0
24708    mov    r1, rFP              @ arg1
24709    mov    r2, rSELF            @ arg2
24710    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24711
24712/* ------------------------------ */
24713    .balign 64
24714.L_ALT_OP_UNUSED_C2FF: /* 0x1c2 */
24715/* File: armv5te/alt_stub.S */
24716/*
24717 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24718 * any interesting requests and then jump to the real instruction
24719 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24720 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24721 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24722 * bail to the real handler if breakFlags==0.
24723 */
24724    ldrb   r3, [rSELF, #offThread_breakFlags]
24725    adrl   lr, dvmAsmInstructionStart + (450 * 64)
24726    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24727    cmp    r3, #0
24728    bxeq   lr                   @ nothing to do - jump to real handler
24729    EXPORT_PC()
24730    mov    r0, rPC              @ arg0
24731    mov    r1, rFP              @ arg1
24732    mov    r2, rSELF            @ arg2
24733    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24734
24735/* ------------------------------ */
24736    .balign 64
24737.L_ALT_OP_UNUSED_C3FF: /* 0x1c3 */
24738/* File: armv5te/alt_stub.S */
24739/*
24740 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24741 * any interesting requests and then jump to the real instruction
24742 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24743 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24744 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24745 * bail to the real handler if breakFlags==0.
24746 */
24747    ldrb   r3, [rSELF, #offThread_breakFlags]
24748    adrl   lr, dvmAsmInstructionStart + (451 * 64)
24749    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24750    cmp    r3, #0
24751    bxeq   lr                   @ nothing to do - jump to real handler
24752    EXPORT_PC()
24753    mov    r0, rPC              @ arg0
24754    mov    r1, rFP              @ arg1
24755    mov    r2, rSELF            @ arg2
24756    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24757
24758/* ------------------------------ */
24759    .balign 64
24760.L_ALT_OP_UNUSED_C4FF: /* 0x1c4 */
24761/* File: armv5te/alt_stub.S */
24762/*
24763 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24764 * any interesting requests and then jump to the real instruction
24765 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24766 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24767 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24768 * bail to the real handler if breakFlags==0.
24769 */
24770    ldrb   r3, [rSELF, #offThread_breakFlags]
24771    adrl   lr, dvmAsmInstructionStart + (452 * 64)
24772    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24773    cmp    r3, #0
24774    bxeq   lr                   @ nothing to do - jump to real handler
24775    EXPORT_PC()
24776    mov    r0, rPC              @ arg0
24777    mov    r1, rFP              @ arg1
24778    mov    r2, rSELF            @ arg2
24779    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24780
24781/* ------------------------------ */
24782    .balign 64
24783.L_ALT_OP_UNUSED_C5FF: /* 0x1c5 */
24784/* File: armv5te/alt_stub.S */
24785/*
24786 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24787 * any interesting requests and then jump to the real instruction
24788 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24789 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24790 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24791 * bail to the real handler if breakFlags==0.
24792 */
24793    ldrb   r3, [rSELF, #offThread_breakFlags]
24794    adrl   lr, dvmAsmInstructionStart + (453 * 64)
24795    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24796    cmp    r3, #0
24797    bxeq   lr                   @ nothing to do - jump to real handler
24798    EXPORT_PC()
24799    mov    r0, rPC              @ arg0
24800    mov    r1, rFP              @ arg1
24801    mov    r2, rSELF            @ arg2
24802    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24803
24804/* ------------------------------ */
24805    .balign 64
24806.L_ALT_OP_UNUSED_C6FF: /* 0x1c6 */
24807/* File: armv5te/alt_stub.S */
24808/*
24809 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24810 * any interesting requests and then jump to the real instruction
24811 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24812 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24813 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24814 * bail to the real handler if breakFlags==0.
24815 */
24816    ldrb   r3, [rSELF, #offThread_breakFlags]
24817    adrl   lr, dvmAsmInstructionStart + (454 * 64)
24818    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24819    cmp    r3, #0
24820    bxeq   lr                   @ nothing to do - jump to real handler
24821    EXPORT_PC()
24822    mov    r0, rPC              @ arg0
24823    mov    r1, rFP              @ arg1
24824    mov    r2, rSELF            @ arg2
24825    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24826
24827/* ------------------------------ */
24828    .balign 64
24829.L_ALT_OP_UNUSED_C7FF: /* 0x1c7 */
24830/* File: armv5te/alt_stub.S */
24831/*
24832 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24833 * any interesting requests and then jump to the real instruction
24834 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24835 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24836 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24837 * bail to the real handler if breakFlags==0.
24838 */
24839    ldrb   r3, [rSELF, #offThread_breakFlags]
24840    adrl   lr, dvmAsmInstructionStart + (455 * 64)
24841    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24842    cmp    r3, #0
24843    bxeq   lr                   @ nothing to do - jump to real handler
24844    EXPORT_PC()
24845    mov    r0, rPC              @ arg0
24846    mov    r1, rFP              @ arg1
24847    mov    r2, rSELF            @ arg2
24848    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24849
24850/* ------------------------------ */
24851    .balign 64
24852.L_ALT_OP_UNUSED_C8FF: /* 0x1c8 */
24853/* File: armv5te/alt_stub.S */
24854/*
24855 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24856 * any interesting requests and then jump to the real instruction
24857 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24858 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24859 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24860 * bail to the real handler if breakFlags==0.
24861 */
24862    ldrb   r3, [rSELF, #offThread_breakFlags]
24863    adrl   lr, dvmAsmInstructionStart + (456 * 64)
24864    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24865    cmp    r3, #0
24866    bxeq   lr                   @ nothing to do - jump to real handler
24867    EXPORT_PC()
24868    mov    r0, rPC              @ arg0
24869    mov    r1, rFP              @ arg1
24870    mov    r2, rSELF            @ arg2
24871    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24872
24873/* ------------------------------ */
24874    .balign 64
24875.L_ALT_OP_UNUSED_C9FF: /* 0x1c9 */
24876/* File: armv5te/alt_stub.S */
24877/*
24878 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24879 * any interesting requests and then jump to the real instruction
24880 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24881 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24882 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24883 * bail to the real handler if breakFlags==0.
24884 */
24885    ldrb   r3, [rSELF, #offThread_breakFlags]
24886    adrl   lr, dvmAsmInstructionStart + (457 * 64)
24887    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24888    cmp    r3, #0
24889    bxeq   lr                   @ nothing to do - jump to real handler
24890    EXPORT_PC()
24891    mov    r0, rPC              @ arg0
24892    mov    r1, rFP              @ arg1
24893    mov    r2, rSELF            @ arg2
24894    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24895
24896/* ------------------------------ */
24897    .balign 64
24898.L_ALT_OP_UNUSED_CAFF: /* 0x1ca */
24899/* File: armv5te/alt_stub.S */
24900/*
24901 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24902 * any interesting requests and then jump to the real instruction
24903 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24904 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24905 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24906 * bail to the real handler if breakFlags==0.
24907 */
24908    ldrb   r3, [rSELF, #offThread_breakFlags]
24909    adrl   lr, dvmAsmInstructionStart + (458 * 64)
24910    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24911    cmp    r3, #0
24912    bxeq   lr                   @ nothing to do - jump to real handler
24913    EXPORT_PC()
24914    mov    r0, rPC              @ arg0
24915    mov    r1, rFP              @ arg1
24916    mov    r2, rSELF            @ arg2
24917    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24918
24919/* ------------------------------ */
24920    .balign 64
24921.L_ALT_OP_UNUSED_CBFF: /* 0x1cb */
24922/* File: armv5te/alt_stub.S */
24923/*
24924 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24925 * any interesting requests and then jump to the real instruction
24926 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24927 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24928 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24929 * bail to the real handler if breakFlags==0.
24930 */
24931    ldrb   r3, [rSELF, #offThread_breakFlags]
24932    adrl   lr, dvmAsmInstructionStart + (459 * 64)
24933    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24934    cmp    r3, #0
24935    bxeq   lr                   @ nothing to do - jump to real handler
24936    EXPORT_PC()
24937    mov    r0, rPC              @ arg0
24938    mov    r1, rFP              @ arg1
24939    mov    r2, rSELF            @ arg2
24940    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24941
24942/* ------------------------------ */
24943    .balign 64
24944.L_ALT_OP_UNUSED_CCFF: /* 0x1cc */
24945/* File: armv5te/alt_stub.S */
24946/*
24947 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24948 * any interesting requests and then jump to the real instruction
24949 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24950 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24951 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24952 * bail to the real handler if breakFlags==0.
24953 */
24954    ldrb   r3, [rSELF, #offThread_breakFlags]
24955    adrl   lr, dvmAsmInstructionStart + (460 * 64)
24956    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24957    cmp    r3, #0
24958    bxeq   lr                   @ nothing to do - jump to real handler
24959    EXPORT_PC()
24960    mov    r0, rPC              @ arg0
24961    mov    r1, rFP              @ arg1
24962    mov    r2, rSELF            @ arg2
24963    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24964
24965/* ------------------------------ */
24966    .balign 64
24967.L_ALT_OP_UNUSED_CDFF: /* 0x1cd */
24968/* File: armv5te/alt_stub.S */
24969/*
24970 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24971 * any interesting requests and then jump to the real instruction
24972 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24973 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24974 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24975 * bail to the real handler if breakFlags==0.
24976 */
24977    ldrb   r3, [rSELF, #offThread_breakFlags]
24978    adrl   lr, dvmAsmInstructionStart + (461 * 64)
24979    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24980    cmp    r3, #0
24981    bxeq   lr                   @ nothing to do - jump to real handler
24982    EXPORT_PC()
24983    mov    r0, rPC              @ arg0
24984    mov    r1, rFP              @ arg1
24985    mov    r2, rSELF            @ arg2
24986    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24987
24988/* ------------------------------ */
24989    .balign 64
24990.L_ALT_OP_UNUSED_CEFF: /* 0x1ce */
24991/* File: armv5te/alt_stub.S */
24992/*
24993 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24994 * any interesting requests and then jump to the real instruction
24995 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24996 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24997 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24998 * bail to the real handler if breakFlags==0.
24999 */
25000    ldrb   r3, [rSELF, #offThread_breakFlags]
25001    adrl   lr, dvmAsmInstructionStart + (462 * 64)
25002    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25003    cmp    r3, #0
25004    bxeq   lr                   @ nothing to do - jump to real handler
25005    EXPORT_PC()
25006    mov    r0, rPC              @ arg0
25007    mov    r1, rFP              @ arg1
25008    mov    r2, rSELF            @ arg2
25009    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25010
25011/* ------------------------------ */
25012    .balign 64
25013.L_ALT_OP_UNUSED_CFFF: /* 0x1cf */
25014/* File: armv5te/alt_stub.S */
25015/*
25016 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25017 * any interesting requests and then jump to the real instruction
25018 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25019 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25020 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25021 * bail to the real handler if breakFlags==0.
25022 */
25023    ldrb   r3, [rSELF, #offThread_breakFlags]
25024    adrl   lr, dvmAsmInstructionStart + (463 * 64)
25025    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25026    cmp    r3, #0
25027    bxeq   lr                   @ nothing to do - jump to real handler
25028    EXPORT_PC()
25029    mov    r0, rPC              @ arg0
25030    mov    r1, rFP              @ arg1
25031    mov    r2, rSELF            @ arg2
25032    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25033
25034/* ------------------------------ */
25035    .balign 64
25036.L_ALT_OP_UNUSED_D0FF: /* 0x1d0 */
25037/* File: armv5te/alt_stub.S */
25038/*
25039 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25040 * any interesting requests and then jump to the real instruction
25041 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25042 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25043 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25044 * bail to the real handler if breakFlags==0.
25045 */
25046    ldrb   r3, [rSELF, #offThread_breakFlags]
25047    adrl   lr, dvmAsmInstructionStart + (464 * 64)
25048    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25049    cmp    r3, #0
25050    bxeq   lr                   @ nothing to do - jump to real handler
25051    EXPORT_PC()
25052    mov    r0, rPC              @ arg0
25053    mov    r1, rFP              @ arg1
25054    mov    r2, rSELF            @ arg2
25055    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25056
25057/* ------------------------------ */
25058    .balign 64
25059.L_ALT_OP_UNUSED_D1FF: /* 0x1d1 */
25060/* File: armv5te/alt_stub.S */
25061/*
25062 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25063 * any interesting requests and then jump to the real instruction
25064 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25065 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25066 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25067 * bail to the real handler if breakFlags==0.
25068 */
25069    ldrb   r3, [rSELF, #offThread_breakFlags]
25070    adrl   lr, dvmAsmInstructionStart + (465 * 64)
25071    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25072    cmp    r3, #0
25073    bxeq   lr                   @ nothing to do - jump to real handler
25074    EXPORT_PC()
25075    mov    r0, rPC              @ arg0
25076    mov    r1, rFP              @ arg1
25077    mov    r2, rSELF            @ arg2
25078    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25079
25080/* ------------------------------ */
25081    .balign 64
25082.L_ALT_OP_UNUSED_D2FF: /* 0x1d2 */
25083/* File: armv5te/alt_stub.S */
25084/*
25085 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25086 * any interesting requests and then jump to the real instruction
25087 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25088 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25089 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25090 * bail to the real handler if breakFlags==0.
25091 */
25092    ldrb   r3, [rSELF, #offThread_breakFlags]
25093    adrl   lr, dvmAsmInstructionStart + (466 * 64)
25094    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25095    cmp    r3, #0
25096    bxeq   lr                   @ nothing to do - jump to real handler
25097    EXPORT_PC()
25098    mov    r0, rPC              @ arg0
25099    mov    r1, rFP              @ arg1
25100    mov    r2, rSELF            @ arg2
25101    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25102
25103/* ------------------------------ */
25104    .balign 64
25105.L_ALT_OP_UNUSED_D3FF: /* 0x1d3 */
25106/* File: armv5te/alt_stub.S */
25107/*
25108 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25109 * any interesting requests and then jump to the real instruction
25110 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25111 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25112 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25113 * bail to the real handler if breakFlags==0.
25114 */
25115    ldrb   r3, [rSELF, #offThread_breakFlags]
25116    adrl   lr, dvmAsmInstructionStart + (467 * 64)
25117    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25118    cmp    r3, #0
25119    bxeq   lr                   @ nothing to do - jump to real handler
25120    EXPORT_PC()
25121    mov    r0, rPC              @ arg0
25122    mov    r1, rFP              @ arg1
25123    mov    r2, rSELF            @ arg2
25124    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25125
25126/* ------------------------------ */
25127    .balign 64
25128.L_ALT_OP_UNUSED_D4FF: /* 0x1d4 */
25129/* File: armv5te/alt_stub.S */
25130/*
25131 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25132 * any interesting requests and then jump to the real instruction
25133 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25134 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25135 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25136 * bail to the real handler if breakFlags==0.
25137 */
25138    ldrb   r3, [rSELF, #offThread_breakFlags]
25139    adrl   lr, dvmAsmInstructionStart + (468 * 64)
25140    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25141    cmp    r3, #0
25142    bxeq   lr                   @ nothing to do - jump to real handler
25143    EXPORT_PC()
25144    mov    r0, rPC              @ arg0
25145    mov    r1, rFP              @ arg1
25146    mov    r2, rSELF            @ arg2
25147    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25148
25149/* ------------------------------ */
25150    .balign 64
25151.L_ALT_OP_UNUSED_D5FF: /* 0x1d5 */
25152/* File: armv5te/alt_stub.S */
25153/*
25154 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25155 * any interesting requests and then jump to the real instruction
25156 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25157 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25158 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25159 * bail to the real handler if breakFlags==0.
25160 */
25161    ldrb   r3, [rSELF, #offThread_breakFlags]
25162    adrl   lr, dvmAsmInstructionStart + (469 * 64)
25163    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25164    cmp    r3, #0
25165    bxeq   lr                   @ nothing to do - jump to real handler
25166    EXPORT_PC()
25167    mov    r0, rPC              @ arg0
25168    mov    r1, rFP              @ arg1
25169    mov    r2, rSELF            @ arg2
25170    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25171
25172/* ------------------------------ */
25173    .balign 64
25174.L_ALT_OP_UNUSED_D6FF: /* 0x1d6 */
25175/* File: armv5te/alt_stub.S */
25176/*
25177 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25178 * any interesting requests and then jump to the real instruction
25179 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25180 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25181 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25182 * bail to the real handler if breakFlags==0.
25183 */
25184    ldrb   r3, [rSELF, #offThread_breakFlags]
25185    adrl   lr, dvmAsmInstructionStart + (470 * 64)
25186    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25187    cmp    r3, #0
25188    bxeq   lr                   @ nothing to do - jump to real handler
25189    EXPORT_PC()
25190    mov    r0, rPC              @ arg0
25191    mov    r1, rFP              @ arg1
25192    mov    r2, rSELF            @ arg2
25193    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25194
25195/* ------------------------------ */
25196    .balign 64
25197.L_ALT_OP_UNUSED_D7FF: /* 0x1d7 */
25198/* File: armv5te/alt_stub.S */
25199/*
25200 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25201 * any interesting requests and then jump to the real instruction
25202 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25203 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25204 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25205 * bail to the real handler if breakFlags==0.
25206 */
25207    ldrb   r3, [rSELF, #offThread_breakFlags]
25208    adrl   lr, dvmAsmInstructionStart + (471 * 64)
25209    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25210    cmp    r3, #0
25211    bxeq   lr                   @ nothing to do - jump to real handler
25212    EXPORT_PC()
25213    mov    r0, rPC              @ arg0
25214    mov    r1, rFP              @ arg1
25215    mov    r2, rSELF            @ arg2
25216    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25217
25218/* ------------------------------ */
25219    .balign 64
25220.L_ALT_OP_UNUSED_D8FF: /* 0x1d8 */
25221/* File: armv5te/alt_stub.S */
25222/*
25223 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25224 * any interesting requests and then jump to the real instruction
25225 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25226 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25227 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25228 * bail to the real handler if breakFlags==0.
25229 */
25230    ldrb   r3, [rSELF, #offThread_breakFlags]
25231    adrl   lr, dvmAsmInstructionStart + (472 * 64)
25232    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25233    cmp    r3, #0
25234    bxeq   lr                   @ nothing to do - jump to real handler
25235    EXPORT_PC()
25236    mov    r0, rPC              @ arg0
25237    mov    r1, rFP              @ arg1
25238    mov    r2, rSELF            @ arg2
25239    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25240
25241/* ------------------------------ */
25242    .balign 64
25243.L_ALT_OP_UNUSED_D9FF: /* 0x1d9 */
25244/* File: armv5te/alt_stub.S */
25245/*
25246 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25247 * any interesting requests and then jump to the real instruction
25248 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25249 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25250 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25251 * bail to the real handler if breakFlags==0.
25252 */
25253    ldrb   r3, [rSELF, #offThread_breakFlags]
25254    adrl   lr, dvmAsmInstructionStart + (473 * 64)
25255    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25256    cmp    r3, #0
25257    bxeq   lr                   @ nothing to do - jump to real handler
25258    EXPORT_PC()
25259    mov    r0, rPC              @ arg0
25260    mov    r1, rFP              @ arg1
25261    mov    r2, rSELF            @ arg2
25262    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25263
25264/* ------------------------------ */
25265    .balign 64
25266.L_ALT_OP_UNUSED_DAFF: /* 0x1da */
25267/* File: armv5te/alt_stub.S */
25268/*
25269 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25270 * any interesting requests and then jump to the real instruction
25271 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25272 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25273 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25274 * bail to the real handler if breakFlags==0.
25275 */
25276    ldrb   r3, [rSELF, #offThread_breakFlags]
25277    adrl   lr, dvmAsmInstructionStart + (474 * 64)
25278    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25279    cmp    r3, #0
25280    bxeq   lr                   @ nothing to do - jump to real handler
25281    EXPORT_PC()
25282    mov    r0, rPC              @ arg0
25283    mov    r1, rFP              @ arg1
25284    mov    r2, rSELF            @ arg2
25285    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25286
25287/* ------------------------------ */
25288    .balign 64
25289.L_ALT_OP_UNUSED_DBFF: /* 0x1db */
25290/* File: armv5te/alt_stub.S */
25291/*
25292 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25293 * any interesting requests and then jump to the real instruction
25294 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25295 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25296 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25297 * bail to the real handler if breakFlags==0.
25298 */
25299    ldrb   r3, [rSELF, #offThread_breakFlags]
25300    adrl   lr, dvmAsmInstructionStart + (475 * 64)
25301    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25302    cmp    r3, #0
25303    bxeq   lr                   @ nothing to do - jump to real handler
25304    EXPORT_PC()
25305    mov    r0, rPC              @ arg0
25306    mov    r1, rFP              @ arg1
25307    mov    r2, rSELF            @ arg2
25308    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25309
25310/* ------------------------------ */
25311    .balign 64
25312.L_ALT_OP_UNUSED_DCFF: /* 0x1dc */
25313/* File: armv5te/alt_stub.S */
25314/*
25315 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25316 * any interesting requests and then jump to the real instruction
25317 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25318 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25319 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25320 * bail to the real handler if breakFlags==0.
25321 */
25322    ldrb   r3, [rSELF, #offThread_breakFlags]
25323    adrl   lr, dvmAsmInstructionStart + (476 * 64)
25324    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25325    cmp    r3, #0
25326    bxeq   lr                   @ nothing to do - jump to real handler
25327    EXPORT_PC()
25328    mov    r0, rPC              @ arg0
25329    mov    r1, rFP              @ arg1
25330    mov    r2, rSELF            @ arg2
25331    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25332
25333/* ------------------------------ */
25334    .balign 64
25335.L_ALT_OP_UNUSED_DDFF: /* 0x1dd */
25336/* File: armv5te/alt_stub.S */
25337/*
25338 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25339 * any interesting requests and then jump to the real instruction
25340 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25341 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25342 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25343 * bail to the real handler if breakFlags==0.
25344 */
25345    ldrb   r3, [rSELF, #offThread_breakFlags]
25346    adrl   lr, dvmAsmInstructionStart + (477 * 64)
25347    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25348    cmp    r3, #0
25349    bxeq   lr                   @ nothing to do - jump to real handler
25350    EXPORT_PC()
25351    mov    r0, rPC              @ arg0
25352    mov    r1, rFP              @ arg1
25353    mov    r2, rSELF            @ arg2
25354    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25355
25356/* ------------------------------ */
25357    .balign 64
25358.L_ALT_OP_UNUSED_DEFF: /* 0x1de */
25359/* File: armv5te/alt_stub.S */
25360/*
25361 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25362 * any interesting requests and then jump to the real instruction
25363 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25364 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25365 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25366 * bail to the real handler if breakFlags==0.
25367 */
25368    ldrb   r3, [rSELF, #offThread_breakFlags]
25369    adrl   lr, dvmAsmInstructionStart + (478 * 64)
25370    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25371    cmp    r3, #0
25372    bxeq   lr                   @ nothing to do - jump to real handler
25373    EXPORT_PC()
25374    mov    r0, rPC              @ arg0
25375    mov    r1, rFP              @ arg1
25376    mov    r2, rSELF            @ arg2
25377    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25378
25379/* ------------------------------ */
25380    .balign 64
25381.L_ALT_OP_UNUSED_DFFF: /* 0x1df */
25382/* File: armv5te/alt_stub.S */
25383/*
25384 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25385 * any interesting requests and then jump to the real instruction
25386 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25387 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25388 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25389 * bail to the real handler if breakFlags==0.
25390 */
25391    ldrb   r3, [rSELF, #offThread_breakFlags]
25392    adrl   lr, dvmAsmInstructionStart + (479 * 64)
25393    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25394    cmp    r3, #0
25395    bxeq   lr                   @ nothing to do - jump to real handler
25396    EXPORT_PC()
25397    mov    r0, rPC              @ arg0
25398    mov    r1, rFP              @ arg1
25399    mov    r2, rSELF            @ arg2
25400    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25401
25402/* ------------------------------ */
25403    .balign 64
25404.L_ALT_OP_UNUSED_E0FF: /* 0x1e0 */
25405/* File: armv5te/alt_stub.S */
25406/*
25407 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25408 * any interesting requests and then jump to the real instruction
25409 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25410 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25411 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25412 * bail to the real handler if breakFlags==0.
25413 */
25414    ldrb   r3, [rSELF, #offThread_breakFlags]
25415    adrl   lr, dvmAsmInstructionStart + (480 * 64)
25416    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25417    cmp    r3, #0
25418    bxeq   lr                   @ nothing to do - jump to real handler
25419    EXPORT_PC()
25420    mov    r0, rPC              @ arg0
25421    mov    r1, rFP              @ arg1
25422    mov    r2, rSELF            @ arg2
25423    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25424
25425/* ------------------------------ */
25426    .balign 64
25427.L_ALT_OP_UNUSED_E1FF: /* 0x1e1 */
25428/* File: armv5te/alt_stub.S */
25429/*
25430 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25431 * any interesting requests and then jump to the real instruction
25432 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25433 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25434 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25435 * bail to the real handler if breakFlags==0.
25436 */
25437    ldrb   r3, [rSELF, #offThread_breakFlags]
25438    adrl   lr, dvmAsmInstructionStart + (481 * 64)
25439    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25440    cmp    r3, #0
25441    bxeq   lr                   @ nothing to do - jump to real handler
25442    EXPORT_PC()
25443    mov    r0, rPC              @ arg0
25444    mov    r1, rFP              @ arg1
25445    mov    r2, rSELF            @ arg2
25446    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25447
25448/* ------------------------------ */
25449    .balign 64
25450.L_ALT_OP_UNUSED_E2FF: /* 0x1e2 */
25451/* File: armv5te/alt_stub.S */
25452/*
25453 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25454 * any interesting requests and then jump to the real instruction
25455 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25456 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25457 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25458 * bail to the real handler if breakFlags==0.
25459 */
25460    ldrb   r3, [rSELF, #offThread_breakFlags]
25461    adrl   lr, dvmAsmInstructionStart + (482 * 64)
25462    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25463    cmp    r3, #0
25464    bxeq   lr                   @ nothing to do - jump to real handler
25465    EXPORT_PC()
25466    mov    r0, rPC              @ arg0
25467    mov    r1, rFP              @ arg1
25468    mov    r2, rSELF            @ arg2
25469    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25470
25471/* ------------------------------ */
25472    .balign 64
25473.L_ALT_OP_UNUSED_E3FF: /* 0x1e3 */
25474/* File: armv5te/alt_stub.S */
25475/*
25476 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25477 * any interesting requests and then jump to the real instruction
25478 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25479 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25480 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25481 * bail to the real handler if breakFlags==0.
25482 */
25483    ldrb   r3, [rSELF, #offThread_breakFlags]
25484    adrl   lr, dvmAsmInstructionStart + (483 * 64)
25485    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25486    cmp    r3, #0
25487    bxeq   lr                   @ nothing to do - jump to real handler
25488    EXPORT_PC()
25489    mov    r0, rPC              @ arg0
25490    mov    r1, rFP              @ arg1
25491    mov    r2, rSELF            @ arg2
25492    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25493
25494/* ------------------------------ */
25495    .balign 64
25496.L_ALT_OP_UNUSED_E4FF: /* 0x1e4 */
25497/* File: armv5te/alt_stub.S */
25498/*
25499 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25500 * any interesting requests and then jump to the real instruction
25501 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25502 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25503 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25504 * bail to the real handler if breakFlags==0.
25505 */
25506    ldrb   r3, [rSELF, #offThread_breakFlags]
25507    adrl   lr, dvmAsmInstructionStart + (484 * 64)
25508    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25509    cmp    r3, #0
25510    bxeq   lr                   @ nothing to do - jump to real handler
25511    EXPORT_PC()
25512    mov    r0, rPC              @ arg0
25513    mov    r1, rFP              @ arg1
25514    mov    r2, rSELF            @ arg2
25515    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25516
25517/* ------------------------------ */
25518    .balign 64
25519.L_ALT_OP_UNUSED_E5FF: /* 0x1e5 */
25520/* File: armv5te/alt_stub.S */
25521/*
25522 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25523 * any interesting requests and then jump to the real instruction
25524 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25525 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25526 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25527 * bail to the real handler if breakFlags==0.
25528 */
25529    ldrb   r3, [rSELF, #offThread_breakFlags]
25530    adrl   lr, dvmAsmInstructionStart + (485 * 64)
25531    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25532    cmp    r3, #0
25533    bxeq   lr                   @ nothing to do - jump to real handler
25534    EXPORT_PC()
25535    mov    r0, rPC              @ arg0
25536    mov    r1, rFP              @ arg1
25537    mov    r2, rSELF            @ arg2
25538    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25539
25540/* ------------------------------ */
25541    .balign 64
25542.L_ALT_OP_UNUSED_E6FF: /* 0x1e6 */
25543/* File: armv5te/alt_stub.S */
25544/*
25545 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25546 * any interesting requests and then jump to the real instruction
25547 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25548 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25549 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25550 * bail to the real handler if breakFlags==0.
25551 */
25552    ldrb   r3, [rSELF, #offThread_breakFlags]
25553    adrl   lr, dvmAsmInstructionStart + (486 * 64)
25554    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25555    cmp    r3, #0
25556    bxeq   lr                   @ nothing to do - jump to real handler
25557    EXPORT_PC()
25558    mov    r0, rPC              @ arg0
25559    mov    r1, rFP              @ arg1
25560    mov    r2, rSELF            @ arg2
25561    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25562
25563/* ------------------------------ */
25564    .balign 64
25565.L_ALT_OP_UNUSED_E7FF: /* 0x1e7 */
25566/* File: armv5te/alt_stub.S */
25567/*
25568 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25569 * any interesting requests and then jump to the real instruction
25570 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25571 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25572 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25573 * bail to the real handler if breakFlags==0.
25574 */
25575    ldrb   r3, [rSELF, #offThread_breakFlags]
25576    adrl   lr, dvmAsmInstructionStart + (487 * 64)
25577    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25578    cmp    r3, #0
25579    bxeq   lr                   @ nothing to do - jump to real handler
25580    EXPORT_PC()
25581    mov    r0, rPC              @ arg0
25582    mov    r1, rFP              @ arg1
25583    mov    r2, rSELF            @ arg2
25584    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25585
25586/* ------------------------------ */
25587    .balign 64
25588.L_ALT_OP_UNUSED_E8FF: /* 0x1e8 */
25589/* File: armv5te/alt_stub.S */
25590/*
25591 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25592 * any interesting requests and then jump to the real instruction
25593 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25594 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25595 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25596 * bail to the real handler if breakFlags==0.
25597 */
25598    ldrb   r3, [rSELF, #offThread_breakFlags]
25599    adrl   lr, dvmAsmInstructionStart + (488 * 64)
25600    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25601    cmp    r3, #0
25602    bxeq   lr                   @ nothing to do - jump to real handler
25603    EXPORT_PC()
25604    mov    r0, rPC              @ arg0
25605    mov    r1, rFP              @ arg1
25606    mov    r2, rSELF            @ arg2
25607    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25608
25609/* ------------------------------ */
25610    .balign 64
25611.L_ALT_OP_UNUSED_E9FF: /* 0x1e9 */
25612/* File: armv5te/alt_stub.S */
25613/*
25614 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25615 * any interesting requests and then jump to the real instruction
25616 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25617 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25618 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25619 * bail to the real handler if breakFlags==0.
25620 */
25621    ldrb   r3, [rSELF, #offThread_breakFlags]
25622    adrl   lr, dvmAsmInstructionStart + (489 * 64)
25623    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25624    cmp    r3, #0
25625    bxeq   lr                   @ nothing to do - jump to real handler
25626    EXPORT_PC()
25627    mov    r0, rPC              @ arg0
25628    mov    r1, rFP              @ arg1
25629    mov    r2, rSELF            @ arg2
25630    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25631
25632/* ------------------------------ */
25633    .balign 64
25634.L_ALT_OP_UNUSED_EAFF: /* 0x1ea */
25635/* File: armv5te/alt_stub.S */
25636/*
25637 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25638 * any interesting requests and then jump to the real instruction
25639 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25640 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25641 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25642 * bail to the real handler if breakFlags==0.
25643 */
25644    ldrb   r3, [rSELF, #offThread_breakFlags]
25645    adrl   lr, dvmAsmInstructionStart + (490 * 64)
25646    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25647    cmp    r3, #0
25648    bxeq   lr                   @ nothing to do - jump to real handler
25649    EXPORT_PC()
25650    mov    r0, rPC              @ arg0
25651    mov    r1, rFP              @ arg1
25652    mov    r2, rSELF            @ arg2
25653    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25654
25655/* ------------------------------ */
25656    .balign 64
25657.L_ALT_OP_UNUSED_EBFF: /* 0x1eb */
25658/* File: armv5te/alt_stub.S */
25659/*
25660 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25661 * any interesting requests and then jump to the real instruction
25662 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25663 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25664 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25665 * bail to the real handler if breakFlags==0.
25666 */
25667    ldrb   r3, [rSELF, #offThread_breakFlags]
25668    adrl   lr, dvmAsmInstructionStart + (491 * 64)
25669    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25670    cmp    r3, #0
25671    bxeq   lr                   @ nothing to do - jump to real handler
25672    EXPORT_PC()
25673    mov    r0, rPC              @ arg0
25674    mov    r1, rFP              @ arg1
25675    mov    r2, rSELF            @ arg2
25676    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25677
25678/* ------------------------------ */
25679    .balign 64
25680.L_ALT_OP_UNUSED_ECFF: /* 0x1ec */
25681/* File: armv5te/alt_stub.S */
25682/*
25683 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25684 * any interesting requests and then jump to the real instruction
25685 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25686 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25687 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25688 * bail to the real handler if breakFlags==0.
25689 */
25690    ldrb   r3, [rSELF, #offThread_breakFlags]
25691    adrl   lr, dvmAsmInstructionStart + (492 * 64)
25692    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25693    cmp    r3, #0
25694    bxeq   lr                   @ nothing to do - jump to real handler
25695    EXPORT_PC()
25696    mov    r0, rPC              @ arg0
25697    mov    r1, rFP              @ arg1
25698    mov    r2, rSELF            @ arg2
25699    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25700
25701/* ------------------------------ */
25702    .balign 64
25703.L_ALT_OP_UNUSED_EDFF: /* 0x1ed */
25704/* File: armv5te/alt_stub.S */
25705/*
25706 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25707 * any interesting requests and then jump to the real instruction
25708 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25709 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25710 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25711 * bail to the real handler if breakFlags==0.
25712 */
25713    ldrb   r3, [rSELF, #offThread_breakFlags]
25714    adrl   lr, dvmAsmInstructionStart + (493 * 64)
25715    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25716    cmp    r3, #0
25717    bxeq   lr                   @ nothing to do - jump to real handler
25718    EXPORT_PC()
25719    mov    r0, rPC              @ arg0
25720    mov    r1, rFP              @ arg1
25721    mov    r2, rSELF            @ arg2
25722    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25723
25724/* ------------------------------ */
25725    .balign 64
25726.L_ALT_OP_UNUSED_EEFF: /* 0x1ee */
25727/* File: armv5te/alt_stub.S */
25728/*
25729 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25730 * any interesting requests and then jump to the real instruction
25731 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25732 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25733 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25734 * bail to the real handler if breakFlags==0.
25735 */
25736    ldrb   r3, [rSELF, #offThread_breakFlags]
25737    adrl   lr, dvmAsmInstructionStart + (494 * 64)
25738    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25739    cmp    r3, #0
25740    bxeq   lr                   @ nothing to do - jump to real handler
25741    EXPORT_PC()
25742    mov    r0, rPC              @ arg0
25743    mov    r1, rFP              @ arg1
25744    mov    r2, rSELF            @ arg2
25745    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25746
25747/* ------------------------------ */
25748    .balign 64
25749.L_ALT_OP_UNUSED_EFFF: /* 0x1ef */
25750/* File: armv5te/alt_stub.S */
25751/*
25752 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25753 * any interesting requests and then jump to the real instruction
25754 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25755 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25756 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25757 * bail to the real handler if breakFlags==0.
25758 */
25759    ldrb   r3, [rSELF, #offThread_breakFlags]
25760    adrl   lr, dvmAsmInstructionStart + (495 * 64)
25761    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25762    cmp    r3, #0
25763    bxeq   lr                   @ nothing to do - jump to real handler
25764    EXPORT_PC()
25765    mov    r0, rPC              @ arg0
25766    mov    r1, rFP              @ arg1
25767    mov    r2, rSELF            @ arg2
25768    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25769
25770/* ------------------------------ */
25771    .balign 64
25772.L_ALT_OP_UNUSED_F0FF: /* 0x1f0 */
25773/* File: armv5te/alt_stub.S */
25774/*
25775 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25776 * any interesting requests and then jump to the real instruction
25777 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25778 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25779 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25780 * bail to the real handler if breakFlags==0.
25781 */
25782    ldrb   r3, [rSELF, #offThread_breakFlags]
25783    adrl   lr, dvmAsmInstructionStart + (496 * 64)
25784    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25785    cmp    r3, #0
25786    bxeq   lr                   @ nothing to do - jump to real handler
25787    EXPORT_PC()
25788    mov    r0, rPC              @ arg0
25789    mov    r1, rFP              @ arg1
25790    mov    r2, rSELF            @ arg2
25791    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25792
25793/* ------------------------------ */
25794    .balign 64
25795.L_ALT_OP_UNUSED_F1FF: /* 0x1f1 */
25796/* File: armv5te/alt_stub.S */
25797/*
25798 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25799 * any interesting requests and then jump to the real instruction
25800 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25801 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25802 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25803 * bail to the real handler if breakFlags==0.
25804 */
25805    ldrb   r3, [rSELF, #offThread_breakFlags]
25806    adrl   lr, dvmAsmInstructionStart + (497 * 64)
25807    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25808    cmp    r3, #0
25809    bxeq   lr                   @ nothing to do - jump to real handler
25810    EXPORT_PC()
25811    mov    r0, rPC              @ arg0
25812    mov    r1, rFP              @ arg1
25813    mov    r2, rSELF            @ arg2
25814    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25815
25816/* ------------------------------ */
25817    .balign 64
25818.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
25819/* File: armv5te/alt_stub.S */
25820/*
25821 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25822 * any interesting requests and then jump to the real instruction
25823 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25824 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25825 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25826 * bail to the real handler if breakFlags==0.
25827 */
25828    ldrb   r3, [rSELF, #offThread_breakFlags]
25829    adrl   lr, dvmAsmInstructionStart + (498 * 64)
25830    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25831    cmp    r3, #0
25832    bxeq   lr                   @ nothing to do - jump to real handler
25833    EXPORT_PC()
25834    mov    r0, rPC              @ arg0
25835    mov    r1, rFP              @ arg1
25836    mov    r2, rSELF            @ arg2
25837    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25838
25839/* ------------------------------ */
25840    .balign 64
25841.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
25842/* File: armv5te/alt_stub.S */
25843/*
25844 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25845 * any interesting requests and then jump to the real instruction
25846 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25847 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25848 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25849 * bail to the real handler if breakFlags==0.
25850 */
25851    ldrb   r3, [rSELF, #offThread_breakFlags]
25852    adrl   lr, dvmAsmInstructionStart + (499 * 64)
25853    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25854    cmp    r3, #0
25855    bxeq   lr                   @ nothing to do - jump to real handler
25856    EXPORT_PC()
25857    mov    r0, rPC              @ arg0
25858    mov    r1, rFP              @ arg1
25859    mov    r2, rSELF            @ arg2
25860    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25861
25862/* ------------------------------ */
25863    .balign 64
25864.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
25865/* File: armv5te/alt_stub.S */
25866/*
25867 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25868 * any interesting requests and then jump to the real instruction
25869 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25870 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25871 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25872 * bail to the real handler if breakFlags==0.
25873 */
25874    ldrb   r3, [rSELF, #offThread_breakFlags]
25875    adrl   lr, dvmAsmInstructionStart + (500 * 64)
25876    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25877    cmp    r3, #0
25878    bxeq   lr                   @ nothing to do - jump to real handler
25879    EXPORT_PC()
25880    mov    r0, rPC              @ arg0
25881    mov    r1, rFP              @ arg1
25882    mov    r2, rSELF            @ arg2
25883    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25884
25885/* ------------------------------ */
25886    .balign 64
25887.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
25888/* File: armv5te/alt_stub.S */
25889/*
25890 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25891 * any interesting requests and then jump to the real instruction
25892 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25893 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25894 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25895 * bail to the real handler if breakFlags==0.
25896 */
25897    ldrb   r3, [rSELF, #offThread_breakFlags]
25898    adrl   lr, dvmAsmInstructionStart + (501 * 64)
25899    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25900    cmp    r3, #0
25901    bxeq   lr                   @ nothing to do - jump to real handler
25902    EXPORT_PC()
25903    mov    r0, rPC              @ arg0
25904    mov    r1, rFP              @ arg1
25905    mov    r2, rSELF            @ arg2
25906    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25907
25908/* ------------------------------ */
25909    .balign 64
25910.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
25911/* File: armv5te/alt_stub.S */
25912/*
25913 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25914 * any interesting requests and then jump to the real instruction
25915 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25916 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25917 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25918 * bail to the real handler if breakFlags==0.
25919 */
25920    ldrb   r3, [rSELF, #offThread_breakFlags]
25921    adrl   lr, dvmAsmInstructionStart + (502 * 64)
25922    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25923    cmp    r3, #0
25924    bxeq   lr                   @ nothing to do - jump to real handler
25925    EXPORT_PC()
25926    mov    r0, rPC              @ arg0
25927    mov    r1, rFP              @ arg1
25928    mov    r2, rSELF            @ arg2
25929    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25930
25931/* ------------------------------ */
25932    .balign 64
25933.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
25934/* File: armv5te/alt_stub.S */
25935/*
25936 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25937 * any interesting requests and then jump to the real instruction
25938 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25939 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25940 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25941 * bail to the real handler if breakFlags==0.
25942 */
25943    ldrb   r3, [rSELF, #offThread_breakFlags]
25944    adrl   lr, dvmAsmInstructionStart + (503 * 64)
25945    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25946    cmp    r3, #0
25947    bxeq   lr                   @ nothing to do - jump to real handler
25948    EXPORT_PC()
25949    mov    r0, rPC              @ arg0
25950    mov    r1, rFP              @ arg1
25951    mov    r2, rSELF            @ arg2
25952    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25953
25954/* ------------------------------ */
25955    .balign 64
25956.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
25957/* File: armv5te/alt_stub.S */
25958/*
25959 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25960 * any interesting requests and then jump to the real instruction
25961 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25962 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25963 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25964 * bail to the real handler if breakFlags==0.
25965 */
25966    ldrb   r3, [rSELF, #offThread_breakFlags]
25967    adrl   lr, dvmAsmInstructionStart + (504 * 64)
25968    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25969    cmp    r3, #0
25970    bxeq   lr                   @ nothing to do - jump to real handler
25971    EXPORT_PC()
25972    mov    r0, rPC              @ arg0
25973    mov    r1, rFP              @ arg1
25974    mov    r2, rSELF            @ arg2
25975    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25976
25977/* ------------------------------ */
25978    .balign 64
25979.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
25980/* File: armv5te/alt_stub.S */
25981/*
25982 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25983 * any interesting requests and then jump to the real instruction
25984 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25985 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25986 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25987 * bail to the real handler if breakFlags==0.
25988 */
25989    ldrb   r3, [rSELF, #offThread_breakFlags]
25990    adrl   lr, dvmAsmInstructionStart + (505 * 64)
25991    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25992    cmp    r3, #0
25993    bxeq   lr                   @ nothing to do - jump to real handler
25994    EXPORT_PC()
25995    mov    r0, rPC              @ arg0
25996    mov    r1, rFP              @ arg1
25997    mov    r2, rSELF            @ arg2
25998    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25999
26000/* ------------------------------ */
26001    .balign 64
26002.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
26003/* File: armv5te/alt_stub.S */
26004/*
26005 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26006 * any interesting requests and then jump to the real instruction
26007 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26008 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26009 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26010 * bail to the real handler if breakFlags==0.
26011 */
26012    ldrb   r3, [rSELF, #offThread_breakFlags]
26013    adrl   lr, dvmAsmInstructionStart + (506 * 64)
26014    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26015    cmp    r3, #0
26016    bxeq   lr                   @ nothing to do - jump to real handler
26017    EXPORT_PC()
26018    mov    r0, rPC              @ arg0
26019    mov    r1, rFP              @ arg1
26020    mov    r2, rSELF            @ arg2
26021    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26022
26023/* ------------------------------ */
26024    .balign 64
26025.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
26026/* File: armv5te/alt_stub.S */
26027/*
26028 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26029 * any interesting requests and then jump to the real instruction
26030 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26031 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26032 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26033 * bail to the real handler if breakFlags==0.
26034 */
26035    ldrb   r3, [rSELF, #offThread_breakFlags]
26036    adrl   lr, dvmAsmInstructionStart + (507 * 64)
26037    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26038    cmp    r3, #0
26039    bxeq   lr                   @ nothing to do - jump to real handler
26040    EXPORT_PC()
26041    mov    r0, rPC              @ arg0
26042    mov    r1, rFP              @ arg1
26043    mov    r2, rSELF            @ arg2
26044    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26045
26046/* ------------------------------ */
26047    .balign 64
26048.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
26049/* File: armv5te/alt_stub.S */
26050/*
26051 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26052 * any interesting requests and then jump to the real instruction
26053 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26054 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26055 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26056 * bail to the real handler if breakFlags==0.
26057 */
26058    ldrb   r3, [rSELF, #offThread_breakFlags]
26059    adrl   lr, dvmAsmInstructionStart + (508 * 64)
26060    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26061    cmp    r3, #0
26062    bxeq   lr                   @ nothing to do - jump to real handler
26063    EXPORT_PC()
26064    mov    r0, rPC              @ arg0
26065    mov    r1, rFP              @ arg1
26066    mov    r2, rSELF            @ arg2
26067    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26068
26069/* ------------------------------ */
26070    .balign 64
26071.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
26072/* File: armv5te/alt_stub.S */
26073/*
26074 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26075 * any interesting requests and then jump to the real instruction
26076 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26077 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26078 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26079 * bail to the real handler if breakFlags==0.
26080 */
26081    ldrb   r3, [rSELF, #offThread_breakFlags]
26082    adrl   lr, dvmAsmInstructionStart + (509 * 64)
26083    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26084    cmp    r3, #0
26085    bxeq   lr                   @ nothing to do - jump to real handler
26086    EXPORT_PC()
26087    mov    r0, rPC              @ arg0
26088    mov    r1, rFP              @ arg1
26089    mov    r2, rSELF            @ arg2
26090    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26091
26092/* ------------------------------ */
26093    .balign 64
26094.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
26095/* File: armv5te/alt_stub.S */
26096/*
26097 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26098 * any interesting requests and then jump to the real instruction
26099 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26100 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26101 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26102 * bail to the real handler if breakFlags==0.
26103 */
26104    ldrb   r3, [rSELF, #offThread_breakFlags]
26105    adrl   lr, dvmAsmInstructionStart + (510 * 64)
26106    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26107    cmp    r3, #0
26108    bxeq   lr                   @ nothing to do - jump to real handler
26109    EXPORT_PC()
26110    mov    r0, rPC              @ arg0
26111    mov    r1, rFP              @ arg1
26112    mov    r2, rSELF            @ arg2
26113    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26114
26115/* ------------------------------ */
26116    .balign 64
26117.L_ALT_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
26118/* File: armv5te/alt_stub.S */
26119/*
26120 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26121 * any interesting requests and then jump to the real instruction
26122 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26123 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26124 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26125 * bail to the real handler if breakFlags==0.
26126 */
26127    ldrb   r3, [rSELF, #offThread_breakFlags]
26128    adrl   lr, dvmAsmInstructionStart + (511 * 64)
26129    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26130    cmp    r3, #0
26131    bxeq   lr                   @ nothing to do - jump to real handler
26132    EXPORT_PC()
26133    mov    r0, rPC              @ arg0
26134    mov    r1, rFP              @ arg1
26135    mov    r2, rSELF            @ arg2
26136    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26137
26138    .balign 64
26139    .size   dvmAsmAltInstructionStart, .-dvmAsmAltInstructionStart
26140    .global dvmAsmAltInstructionEnd
26141dvmAsmAltInstructionEnd:
26142/* File: armv5te/footer.S */
26143/*
26144 * ===========================================================================
26145 *  Common subroutines and data
26146 * ===========================================================================
26147 */
26148
26149    .text
26150    .align  2
26151
26152#if defined(WITH_JIT)
26153
26154#if defined(WITH_SELF_VERIFICATION)
26155/*
26156 * "longjmp" to a translation after single-stepping.  Before returning
26157 * to translation, must save state for self-verification.
26158 */
26159    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26160dvmJitResumeTranslation:
26161    mov    rSELF, r0                             @ restore self
26162    mov    rPC, r1                               @ restore Dalvik pc
26163    mov    rFP, r2                               @ restore Dalvik fp
26164    ldr    r10, [rSELF,#offThread_jitResumeNPC]  @ resume address
26165    mov    r2, #0
26166    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26167    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26168    b      jitSVShadowRunStart                   @ resume as if cache hit
26169                                                 @ expects resume addr in r10
26170
26171    .global dvmJitToInterpPunt
26172dvmJitToInterpPunt:
26173    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
26174    mov    r3, #0
26175    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26176    b      jitSVShadowRunEnd            @ doesn't return
26177
26178    .global dvmJitToInterpSingleStep
26179dvmJitToInterpSingleStep:
26180    mov    rPC, r0              @ set up dalvik pc
26181    EXPORT_PC()
26182    str    lr, [rSELF,#offThread_jitResumeNPC]
26183    str    sp, [rSELF,#offThread_jitResumeNSP]
26184    str    r1, [rSELF,#offThread_jitResumeDPC]
26185    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
26186    b      jitSVShadowRunEnd            @ doesn't return
26187
26188
26189    .global dvmJitToInterpNoChainNoProfile
26190dvmJitToInterpNoChainNoProfile:
26191    mov    r0,rPC                       @ pass our target PC
26192    mov    r2,#kSVSNoProfile            @ r2<- interpreter entry point
26193    mov    r3, #0                       @ 0 means !inJitCodeCache
26194    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26195    b      jitSVShadowRunEnd            @ doesn't return
26196
26197    .global dvmJitToInterpTraceSelectNoChain
26198dvmJitToInterpTraceSelectNoChain:
26199    mov    r0,rPC                       @ pass our target PC
26200    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26201    mov    r3, #0                       @ 0 means !inJitCodeCache
26202    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26203    b      jitSVShadowRunEnd            @ doesn't return
26204
26205    .global dvmJitToInterpTraceSelect
26206dvmJitToInterpTraceSelect:
26207    ldr    r0,[lr, #-1]                 @ pass our target PC
26208    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26209    mov    r3, #0                       @ 0 means !inJitCodeCache
26210    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26211    b      jitSVShadowRunEnd            @ doesn't return
26212
26213    .global dvmJitToInterpBackwardBranch
26214dvmJitToInterpBackwardBranch:
26215    ldr    r0,[lr, #-1]                 @ pass our target PC
26216    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
26217    mov    r3, #0                       @ 0 means !inJitCodeCache
26218    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26219    b      jitSVShadowRunEnd            @ doesn't return
26220
26221    .global dvmJitToInterpNormal
26222dvmJitToInterpNormal:
26223    ldr    r0,[lr, #-1]                 @ pass our target PC
26224    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
26225    mov    r3, #0                       @ 0 means !inJitCodeCache
26226    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26227    b      jitSVShadowRunEnd            @ doesn't return
26228
26229    .global dvmJitToInterpNoChain
26230dvmJitToInterpNoChain:
26231    mov    r0,rPC                       @ pass our target PC
26232    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
26233    mov    r3, #0                       @ 0 means !inJitCodeCache
26234    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26235    b      jitSVShadowRunEnd            @ doesn't return
26236#else
26237
26238/*
26239 * "longjmp" to a translation after single-stepping.
26240 */
26241    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26242dvmJitResumeTranslation:
26243    mov    rSELF, r0                             @ restore self
26244    mov    rPC, r1                               @ restore Dalvik pc
26245    mov    rFP, r2                               @ restore Dalvik fp
26246    ldr    r0, [rSELF,#offThread_jitResumeNPC]
26247    mov    r2, #0
26248    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26249    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26250    bx     r0                                    @ resume translation
26251
26252/*
26253 * Return from the translation cache to the interpreter when the compiler is
26254 * having issues translating/executing a Dalvik instruction. We have to skip
26255 * the code cache lookup otherwise it is possible to indefinitely bouce
26256 * between the interpreter and the code cache if the instruction that fails
26257 * to be compiled happens to be at a trace start.
26258 */
26259    .global dvmJitToInterpPunt
26260dvmJitToInterpPunt:
26261    mov    rPC, r0
26262#if defined(WITH_JIT_TUNING)
26263    mov    r0,lr
26264    bl     dvmBumpPunt;
26265#endif
26266    EXPORT_PC()
26267    mov    r0, #0
26268    str    r0, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26269    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26270    FETCH_INST()
26271    GET_INST_OPCODE(ip)
26272    GOTO_OPCODE(ip)
26273
26274/*
26275 * Return to the interpreter to handle a single instruction.
26276 * We'll use the normal single-stepping mechanism via interpBreak,
26277 * but also save the native pc of the resume point in the translation
26278 * and the native sp so that we can later do the equivalent of a
26279 * longjmp() to resume.
26280 * On entry:
26281 *    dPC <= Dalvik PC of instrucion to interpret
26282 *    lr <= resume point in translation
26283 *    r1 <= Dalvik PC of next instruction
26284 */
26285    .global dvmJitToInterpSingleStep
26286dvmJitToInterpSingleStep:
26287    mov    rPC, r0              @ set up dalvik pc
26288    EXPORT_PC()
26289    str    lr, [rSELF,#offThread_jitResumeNPC]
26290    str    sp, [rSELF,#offThread_jitResumeNSP]
26291    str    r1, [rSELF,#offThread_jitResumeDPC]
26292    mov    r1, #1
26293    str    r1, [rSELF,#offThread_singleStepCount]  @ just step once
26294    mov    r0, rSELF
26295    mov    r1, #kInterpSingleStep
26296    mov    r2, #kSubModeNormal
26297    mov    r3, #1                @ true
26298    bl     dvmUpdateInterpBreak  @ (self, newBreak, newMode, enable)
26299    ldr    rIBASE, [rSELF,#offThread_curHandlerTable]
26300    FETCH_INST()
26301    GET_INST_OPCODE(ip)
26302    GOTO_OPCODE(ip)
26303
26304/*
26305 * Return from the translation cache and immediately request
26306 * a translation for the exit target.  Commonly used for callees.
26307 */
26308    .global dvmJitToInterpTraceSelectNoChain
26309dvmJitToInterpTraceSelectNoChain:
26310#if defined(WITH_JIT_TUNING)
26311    bl     dvmBumpNoChain
26312#endif
26313    mov    r0,rPC
26314    mov    r1,rSELF
26315    bl     dvmJitGetTraceAddrThread @ (pc, self)
26316    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26317    mov    r1, rPC                  @ arg1 of translation may need this
26318    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26319    cmp    r0,#0                    @ !0 means translation exists
26320    bxne   r0                       @ continue native execution if so
26321    b      2f                       @ branch over to use the interpreter
26322
26323/*
26324 * Return from the translation cache and immediately request
26325 * a translation for the exit target.  Commonly used following
26326 * invokes.
26327 */
26328    .global dvmJitToInterpTraceSelect
26329dvmJitToInterpTraceSelect:
26330    ldr    rPC,[lr, #-1]           @ get our target PC
26331    add    rINST,lr,#-5            @ save start of chain branch
26332    add    rINST, #-4              @  .. which is 9 bytes back
26333    mov    r0,rPC
26334    mov    r1,rSELF
26335    bl     dvmJitGetTraceAddrThread @ (pc, self)
26336    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26337    cmp    r0,#0
26338    beq    2f
26339    mov    r1,rINST
26340    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26341    mov    r1, rPC                  @ arg1 of translation may need this
26342    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
26343    cmp    r0,#0                    @ successful chain?
26344    bxne   r0                       @ continue native execution
26345    b      toInterpreter            @ didn't chain - resume with interpreter
26346
26347/* No translation, so request one if profiling isn't disabled*/
263482:
26349    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26350    ldr    r0, [rSELF, #offThread_pJitProfTable]
26351    FETCH_INST()
26352    cmp    r0, #0
26353    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
26354    bne    common_selectTrace
26355    GET_INST_OPCODE(ip)
26356    GOTO_OPCODE(ip)
26357
26358/*
26359 * Return from the translation cache to the interpreter.
26360 * The return was done with a BLX from thumb mode, and
26361 * the following 32-bit word contains the target rPC value.
26362 * Note that lr (r14) will have its low-order bit set to denote
26363 * its thumb-mode origin.
26364 *
26365 * We'll need to stash our lr origin away, recover the new
26366 * target and then check to see if there is a translation available
26367 * for our new target.  If so, we do a translation chain and
26368 * go back to native execution.  Otherwise, it's back to the
26369 * interpreter (after treating this entry as a potential
26370 * trace start).
26371 */
26372    .global dvmJitToInterpNormal
26373dvmJitToInterpNormal:
26374    ldr    rPC,[lr, #-1]           @ get our target PC
26375    add    rINST,lr,#-5            @ save start of chain branch
26376    add    rINST,#-4               @ .. which is 9 bytes back
26377#if defined(WITH_JIT_TUNING)
26378    bl     dvmBumpNormal
26379#endif
26380    mov    r0,rPC
26381    mov    r1,rSELF
26382    bl     dvmJitGetTraceAddrThread @ (pc, self)
26383    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26384    cmp    r0,#0
26385    beq    toInterpreter            @ go if not, otherwise do chain
26386    mov    r1,rINST
26387    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26388    mov    r1, rPC                  @ arg1 of translation may need this
26389    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26390    cmp    r0,#0                    @ successful chain?
26391    bxne   r0                       @ continue native execution
26392    b      toInterpreter            @ didn't chain - resume with interpreter
26393
26394/*
26395 * Return from the translation cache to the interpreter to do method invocation.
26396 * Check if translation exists for the callee, but don't chain to it.
26397 */
26398    .global dvmJitToInterpNoChainNoProfile
26399dvmJitToInterpNoChainNoProfile:
26400#if defined(WITH_JIT_TUNING)
26401    bl     dvmBumpNoChain
26402#endif
26403    mov    r0,rPC
26404    mov    r1,rSELF
26405    bl     dvmJitGetTraceAddrThread @ (pc, self)
26406    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26407    mov    r1, rPC                  @ arg1 of translation may need this
26408    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26409    cmp    r0,#0
26410    bxne   r0                       @ continue native execution if so
26411    EXPORT_PC()
26412    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26413    FETCH_INST()
26414    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26415    GOTO_OPCODE(ip)                     @ jump to next instruction
26416
26417/*
26418 * Return from the translation cache to the interpreter to do method invocation.
26419 * Check if translation exists for the callee, but don't chain to it.
26420 */
26421    .global dvmJitToInterpNoChain
26422dvmJitToInterpNoChain:
26423#if defined(WITH_JIT_TUNING)
26424    bl     dvmBumpNoChain
26425#endif
26426    mov    r0,rPC
26427    mov    r1,rSELF
26428    bl     dvmJitGetTraceAddrThread @ (pc, self)
26429    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26430    mov    r1, rPC                  @ arg1 of translation may need this
26431    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26432    cmp    r0,#0
26433    bxne   r0                       @ continue native execution if so
26434#endif
26435
26436/*
26437 * No translation, restore interpreter regs and start interpreting.
26438 * rSELF & rFP were preserved in the translated code, and rPC has
26439 * already been restored by the time we get here.  We'll need to set
26440 * up rIBASE & rINST, and load the address of the JitTable into r0.
26441 */
26442toInterpreter:
26443    EXPORT_PC()
26444    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26445    FETCH_INST()
26446    ldr    r0, [rSELF, #offThread_pJitProfTable]
26447    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26448    @ NOTE: intended fallthrough
26449
26450/*
26451 * Similar to common_updateProfile, but tests for null pJitProfTable
26452 * r0 holds pJifProfTAble, rINST is loaded, rPC is current and
26453 * rIBASE has been recently refreshed.
26454 */
26455common_testUpdateProfile:
26456    cmp     r0, #0               @ JIT switched off?
26457    beq     4f                   @ return to interp if so
26458
26459/*
26460 * Common code to update potential trace start counter, and initiate
26461 * a trace-build if appropriate.
26462 * On entry here:
26463 *    r0    <= pJitProfTable (verified non-NULL)
26464 *    rPC   <= Dalvik PC
26465 *    rINST <= next instruction
26466 */
26467common_updateProfile:
26468    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
26469    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
26470    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
26471    GET_INST_OPCODE(ip)
26472    subs    r1,r1,#1           @ decrement counter
26473    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
26474    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
26475
26476    /* Looks good, reset the counter */
26477    ldr     r1, [rSELF, #offThread_jitThreshold]
26478    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
26479    EXPORT_PC()
26480    mov     r0,rPC
26481    mov     r1,rSELF
26482    bl      dvmJitGetTraceAddrThread    @ (pc, self)
26483    str     r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26484    mov     r1, rPC                     @ arg1 of translation may need this
26485    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
26486    cmp     r0,#0
26487#if !defined(WITH_SELF_VERIFICATION)
26488    bxne    r0                          @ jump to the translation
26489    mov     r2,#kJitTSelectRequest      @ ask for trace selection
26490    @ fall-through to common_selectTrace
26491#else
26492    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
26493    beq     common_selectTrace
26494    /*
26495     * At this point, we have a target translation.  However, if
26496     * that translation is actually the interpret-only pseudo-translation
26497     * we want to treat it the same as no translation.
26498     */
26499    mov     r10, r0                     @ save target
26500    bl      dvmCompilerGetInterpretTemplate
26501    cmp     r0, r10                     @ special case?
26502    bne     jitSVShadowRunStart         @ set up self verification shadow space
26503    @ Need to clear the inJitCodeCache flag
26504    mov    r3, #0                       @ 0 means not in the JIT code cache
26505    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26506    GET_INST_OPCODE(ip)
26507    GOTO_OPCODE(ip)
26508    /* no return */
26509#endif
26510
26511/*
26512 * On entry:
26513 *  r2 is jit state.
26514 */
26515common_selectTrace:
26516    ldrb    r0,[rSELF,#offThread_breakFlags]
26517    ands    r0,#kInterpJitBreak
26518    bne     3f                         @ already doing JIT work, continue
26519    str     r2,[rSELF,#offThread_jitState]
26520    mov     r0, rSELF
26521/*
26522 * Call out to validate trace-building request.  If successful,
26523 * rIBASE will be swapped to to send us into single-stepping trace
26524 * building mode, so we need to refresh before we continue.
26525 */
26526    EXPORT_PC()
26527    SAVE_PC_FP_TO_SELF()                 @ copy of pc/fp to Thread
26528    bl      dvmJitCheckTraceRequest
265293:
26530    FETCH_INST()
26531    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
265324:
26533    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26534    GOTO_OPCODE(ip)
26535    /* no return */
26536#endif
26537
26538#if defined(WITH_SELF_VERIFICATION)
26539/*
26540 * Save PC and registers to shadow memory for self verification mode
26541 * before jumping to native translation.
26542 * On entry:
26543 *    rPC, rFP, rSELF: the values that they should contain
26544 *    r10: the address of the target translation.
26545 */
26546jitSVShadowRunStart:
26547    mov     r0,rPC                      @ r0<- program counter
26548    mov     r1,rFP                      @ r1<- frame pointer
26549    mov     r2,rSELF                    @ r2<- self (Thread) pointer
26550    mov     r3,r10                      @ r3<- target translation
26551    bl      dvmSelfVerificationSaveState @ save registers to shadow space
26552    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
26553    bx      r10                         @ jump to the translation
26554
26555/*
26556 * Restore PC, registers, and interpreter state to original values
26557 * before jumping back to the interpreter.
26558 * On entry:
26559 *   r0:  dPC
26560 *   r2:  self verification state
26561 */
26562jitSVShadowRunEnd:
26563    mov    r1,rFP                        @ pass ending fp
26564    mov    r3,rSELF                      @ pass self ptr for convenience
26565    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
26566    LOAD_PC_FP_FROM_SELF()               @ restore pc, fp
26567    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
26568    cmp    r1,#0                         @ check for punt condition
26569    beq    1f
26570    @ Set up SV single-stepping
26571    mov    r0, rSELF
26572    mov    r1, #kInterpJitBreak
26573    mov    r2, #kSubModeJitSV
26574    mov    r3, #1                @ true
26575    bl     dvmUpdateInterpBreak  @ (self, newBreak, newMode, enable)
26576    mov    r2,#kJitSelfVerification      @ ask for self verification
26577    str    r2,[rSELF,#offThread_jitState]
26578    @ intentional fallthrough
265791:                                       @ exit to interpreter without check
26580    EXPORT_PC()
26581    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26582    FETCH_INST()
26583    GET_INST_OPCODE(ip)
26584    GOTO_OPCODE(ip)
26585#endif
26586
26587/*
26588 * The equivalent of "goto bail", this calls through the "bail handler".
26589 * It will end this interpreter activation, and return to the caller
26590 * of dvmMterpStdRun.
26591 *
26592 * State registers will be saved to the "thread" area before bailing
26593 * debugging purposes
26594 */
26595common_gotoBail:
26596    SAVE_PC_FP_TO_SELF()                @ export state to "thread"
26597    mov     r0, rSELF                   @ r0<- self ptr
26598    b       dvmMterpStdBail             @ call(self, changeInterp)
26599
26600/*
26601 * The JIT's invoke method needs to remember the callsite class and
26602 * target pair.  Save them here so that they are available to
26603 * dvmCheckJit following the interpretation of this invoke.
26604 */
26605#if defined(WITH_JIT)
26606save_callsiteinfo:
26607    cmp     r9, #0
26608    ldrne   r9, [r9, #offObject_clazz]
26609    str     r0, [rSELF, #offThread_methodToCall]
26610    str     r9, [rSELF, #offThread_callsiteClass]
26611    bx      lr
26612#endif
26613
26614/*
26615 * Common code for jumbo method invocation.
26616 * NOTE: this adjusts rPC to account for the difference in instruction width.
26617 * As a result, the savedPc in the stack frame will not be wholly accurate. So
26618 * long as that is only used for source file line number calculations, we're
26619 * okay.
26620 */
26621common_invokeMethodJumboNoThis:
26622#if defined(WITH_JIT)
26623 /* On entry: r0 is "Method* methodToCall */
26624    mov     r9, #0                      @ clear "this"
26625#endif
26626common_invokeMethodJumbo:
26627 /* On entry: r0 is "Method* methodToCall, r9 is "this" */
26628.LinvokeNewJumbo:
26629#if defined(WITH_JIT)
26630    ldrb    r1, [rSELF, #offThread_subMode]
26631    ands    r1, #kSubModeJitTraceBuild
26632    blne    save_callsiteinfo
26633#endif
26634    @ prepare to copy args to "outs" area of current frame
26635    add     rPC, rPC, #4                @ adjust pc to make return consistent
26636    FETCH(r2, 1)                        @ r2<- BBBB (arg count)
26637    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26638    cmp     r2, #0                      @ no args?
26639    beq     .LinvokeArgsDone            @ if no args, skip the rest
26640    FETCH(r1, 2)                        @ r1<- CCCC
26641    b       .LinvokeRangeArgs           @ handle args like invoke range
26642
26643/*
26644 * Common code for method invocation with range.
26645 *
26646 * On entry:
26647 *  r0 is "Method* methodToCall", r9 is "this"
26648 */
26649common_invokeMethodRange:
26650.LinvokeNewRange:
26651#if defined(WITH_JIT)
26652    ldrb    r1, [rSELF, #offThread_subMode]
26653    ands    r1, #kSubModeJitTraceBuild
26654    blne    save_callsiteinfo
26655#endif
26656    @ prepare to copy args to "outs" area of current frame
26657    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
26658    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26659    beq     .LinvokeArgsDone            @ if no args, skip the rest
26660    FETCH(r1, 2)                        @ r1<- CCCC
26661
26662.LinvokeRangeArgs:
26663    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
26664    @ (very few methods have > 10 args; could unroll for common cases)
26665    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
26666    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
266671:  ldr     r1, [r3], #4                @ val = *fp++
26668    subs    r2, r2, #1                  @ count--
26669    str     r1, [r10], #4               @ *outs++ = val
26670    bne     1b                          @ ...while count != 0
26671    b       .LinvokeArgsDone
26672
26673/*
26674 * Common code for method invocation without range.
26675 *
26676 * On entry:
26677 *  r0 is "Method* methodToCall", r9 is "this"
26678 */
26679common_invokeMethodNoRange:
26680.LinvokeNewNoRange:
26681#if defined(WITH_JIT)
26682    ldrb    r1, [rSELF, #offThread_subMode]
26683    ands    r1, #kSubModeJitTraceBuild
26684    blne    save_callsiteinfo
26685#endif
26686    @ prepare to copy args to "outs" area of current frame
26687    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
26688    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26689    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
26690    beq     .LinvokeArgsDone
26691
26692    @ r0=methodToCall, r1=GFED, r2=count, r10=outs
26693.LinvokeNonRange:
26694    rsb     r2, r2, #5                  @ r2<- 5-r2
26695    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
26696    bl      common_abort                @ (skipped due to ARM prefetch)
266975:  and     ip, rINST, #0x0f00          @ isolate A
26698    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
26699    mov     r0, r0                      @ nop
26700    str     r2, [r10, #-4]!             @ *--outs = vA
267014:  and     ip, r1, #0xf000             @ isolate G
26702    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
26703    mov     r0, r0                      @ nop
26704    str     r2, [r10, #-4]!             @ *--outs = vG
267053:  and     ip, r1, #0x0f00             @ isolate F
26706    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
26707    mov     r0, r0                      @ nop
26708    str     r2, [r10, #-4]!             @ *--outs = vF
267092:  and     ip, r1, #0x00f0             @ isolate E
26710    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
26711    mov     r0, r0                      @ nop
26712    str     r2, [r10, #-4]!             @ *--outs = vE
267131:  and     ip, r1, #0x000f             @ isolate D
26714    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
26715    mov     r0, r0                      @ nop
26716    str     r2, [r10, #-4]!             @ *--outs = vD
267170:  @ fall through to .LinvokeArgsDone
26718
26719.LinvokeArgsDone: @ r0=methodToCall
26720    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
26721    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
26722    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
26723    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
26724    @ find space for the new stack frame, check for overflow
26725    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
26726    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
26727    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
26728@    bl      common_dumpRegs
26729    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
26730    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
26731    cmp     r3, r9                      @ bottom < interpStackEnd?
26732    ldrb    lr, [rSELF, #offThread_subMode]
26733    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
26734    blo     .LstackOverflow             @ yes, this frame will overflow stack
26735
26736    @ set up newSaveArea
26737#ifdef EASY_GDB
26738    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
26739    str     ip, [r10, #offStackSaveArea_prevSave]
26740#endif
26741    str     rFP, [r10, #offStackSaveArea_prevFrame]
26742    str     rPC, [r10, #offStackSaveArea_savedPc]
26743#if defined(WITH_JIT)
26744    mov     r9, #0
26745    str     r9, [r10, #offStackSaveArea_returnAddr]
26746#endif
26747    str     r0, [r10, #offStackSaveArea_method]
26748
26749    @ Profiling?
26750    cmp     lr, #0                      @ any special modes happening?
26751    bne     2f                          @ go if so
267521:
26753    tst     r3, #ACC_NATIVE
26754    bne     .LinvokeNative
26755
26756    /*
26757    stmfd   sp!, {r0-r3}
26758    bl      common_printNewline
26759    mov     r0, rFP
26760    mov     r1, #0
26761    bl      dvmDumpFp
26762    ldmfd   sp!, {r0-r3}
26763    stmfd   sp!, {r0-r3}
26764    mov     r0, r1
26765    mov     r1, r10
26766    bl      dvmDumpFp
26767    bl      common_printNewline
26768    ldmfd   sp!, {r0-r3}
26769    */
26770
26771    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
26772    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
26773    mov     rPC, r2                         @ publish new rPC
26774
26775    @ Update state values for the new method
26776    @ r0=methodToCall, r1=newFp, r3=newMethodClass, r9=newINST
26777    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
26778    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
26779    mov     r2, #1
26780    str     r2, [rSELF, #offThread_debugIsMethodEntry]
26781#if defined(WITH_JIT)
26782    ldr     r0, [rSELF, #offThread_pJitProfTable]
26783    mov     rFP, r1                         @ fp = newFp
26784    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
26785    mov     rINST, r9                       @ publish new rINST
26786    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26787    cmp     r0,#0
26788    bne     common_updateProfile
26789    GOTO_OPCODE(ip)                         @ jump to next instruction
26790#else
26791    mov     rFP, r1                         @ fp = newFp
26792    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
26793    mov     rINST, r9                       @ publish new rINST
26794    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26795    GOTO_OPCODE(ip)                         @ jump to next instruction
26796#endif
26797
267982:
26799    @ Profiling - record method entry.  r0: methodToCall
26800    stmfd   sp!, {r0-r3}                @ preserve r0-r3
26801    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
26802    mov     r1, r0
26803    mov     r0, rSELF
26804    bl      dvmReportInvoke             @ (self, method)
26805    ldmfd   sp!, {r0-r3}                @ restore r0-r3
26806    b       1b
26807
26808.LinvokeNative:
26809    @ Prep for the native call
26810    @ r0=methodToCall, r1=newFp, r10=newSaveArea
26811    ldrb    lr, [rSELF, #offThread_subMode]
26812    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
26813    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26814    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
26815    mov     r2, r0                      @ r2<- methodToCall
26816    mov     r0, r1                      @ r0<- newFp (points to args)
26817    add     r1, rSELF, #offThread_retval  @ r1<- &retval
26818    mov     r3, rSELF                   @ arg3<- self
26819
26820#ifdef ASSIST_DEBUGGER
26821    /* insert fake function header to help gdb find the stack frame */
26822    b       .Lskip
26823    .type   dalvik_mterp, %function
26824dalvik_mterp:
26825    .fnstart
26826    MTERP_ENTRY1
26827    MTERP_ENTRY2
26828.Lskip:
26829#endif
26830
26831    cmp     lr, #0                      @ any special SubModes active?
26832    bne     11f                         @ go handle them if so
26833    mov     lr, pc                      @ set return addr
26834    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
268357:
26836
26837    @ native return; r10=newSaveArea
26838    @ equivalent to dvmPopJniLocals
26839    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
26840    ldr     r1, [rSELF, #offThread_exception] @ check for exception
26841    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
26842    cmp     r1, #0                      @ null?
26843    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
26844    bne     common_exceptionThrown      @ no, handle exception
26845
26846    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
26847    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26848    GOTO_OPCODE(ip)                     @ jump to next instruction
26849
2685011:
26851    @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
26852    stmfd   sp!, {r0-r3}                @ save all but subModes
26853    mov     r0, r2                      @ r0<- methodToCall
26854    mov     r1, rSELF
26855    mov     r2, rFP
26856    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
26857    ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
26858
26859    @ Call the native method
26860    mov     lr, pc                      @ set return addr
26861    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
26862
26863    @ Restore the pre-call arguments
26864    ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
26865
26866    @ Finish up any post-invoke subMode requirements
26867    mov     r0, r2                      @ r0<- methodToCall
26868    mov     r1, rSELF
26869    mov     r2, rFP
26870    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
26871    b       7b                          @ resume
26872
26873.LstackOverflow:    @ r0=methodToCall
26874    mov     r1, r0                      @ r1<- methodToCall
26875    mov     r0, rSELF                   @ r0<- self
26876    bl      dvmHandleStackOverflow
26877    b       common_exceptionThrown
26878#ifdef ASSIST_DEBUGGER
26879    .fnend
26880    .size   dalvik_mterp, .-dalvik_mterp
26881#endif
26882
26883
26884    /*
26885     * Common code for method invocation, calling through "glue code".
26886     *
26887     * TODO: now that we have range and non-range invoke handlers, this
26888     *       needs to be split into two.  Maybe just create entry points
26889     *       that set r9 and jump here?
26890     *
26891     * On entry:
26892     *  r0 is "Method* methodToCall", the method we're trying to call
26893     *  r9 is "bool methodCallRange", indicating if this is a /range variant
26894     */
26895     .if    0
26896.LinvokeOld:
26897    sub     sp, sp, #8                  @ space for args + pad
26898    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
26899    mov     r2, r0                      @ A2<- methodToCall
26900    mov     r0, rSELF                   @ A0<- self
26901    SAVE_PC_FP_TO_SELF()                @ export state to "self"
26902    mov     r1, r9                      @ A1<- methodCallRange
26903    mov     r3, rINST, lsr #8           @ A3<- AA
26904    str     ip, [sp, #0]                @ A4<- ip
26905    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
26906    add     sp, sp, #8                  @ remove arg area
26907    b       common_resumeAfterGlueCall  @ continue to next instruction
26908    .endif
26909
26910
26911
26912/*
26913 * Common code for handling a return instruction.
26914 *
26915 * This does not return.
26916 */
26917common_returnFromMethod:
26918.LreturnNew:
26919    ldrb    lr, [rSELF, #offThread_subMode]
26920    SAVEAREA_FROM_FP(r0, rFP)
26921    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
26922    cmp     lr, #0                      @ any special subMode handling needed?
26923    bne     19f
2692414:
26925    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
26926    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
26927                                        @ r2<- method we're returning to
26928    cmp     r2, #0                      @ is this a break frame?
26929#if defined(WORKAROUND_CORTEX_A9_745320)
26930    /* Don't use conditional loads if the HW defect exists */
26931    beq     15f
26932    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
2693315:
26934#else
26935    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
26936#endif
26937    beq     common_gotoBail             @ break frame, bail out completely
26938
26939    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
26940    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
26941    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
26942    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
26943    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
26944#if defined(WITH_JIT)
26945    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
26946    mov     rPC, r9                     @ publish new rPC
26947    str     r1, [rSELF, #offThread_methodClassDex]
26948    str     r10, [rSELF, #offThread_inJitCodeCache]  @ may return to JIT'ed land
26949    cmp     r10, #0                      @ caller is compiled code
26950    blxne   r10
26951    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26952    GOTO_OPCODE(ip)                     @ jump to next instruction
26953#else
26954    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26955    mov     rPC, r9                     @ publish new rPC
26956    str     r1, [rSELF, #offThread_methodClassDex]
26957    GOTO_OPCODE(ip)                     @ jump to next instruction
26958#endif
26959
2696019:
26961    @ Handle special actions
26962    @ On entry, r0: StackSaveArea
26963    ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
26964    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
26965    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
26966    mov     r0, rSELF
26967    bl      dvmReportReturn             @ (self)
26968    SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
26969    b       14b                         @ continue
26970
26971    /*
26972     * Return handling, calls through "glue code".
26973     */
26974     .if    0
26975.LreturnOld:
26976    SAVE_PC_FP_TO_SELF()                @ export state
26977    mov     r0, rSELF                   @ arg to function
26978    bl      dvmMterp_returnFromMethod
26979    b       common_resumeAfterGlueCall
26980    .endif
26981
26982
26983/*
26984 * Somebody has thrown an exception.  Handle it.
26985 *
26986 * If the exception processing code returns to us (instead of falling
26987 * out of the interpreter), continue with whatever the next instruction
26988 * now happens to be.
26989 *
26990 * This does not return.
26991 */
26992     .global dvmMterpCommonExceptionThrown
26993dvmMterpCommonExceptionThrown:
26994common_exceptionThrown:
26995.LexceptionNew:
26996
26997    EXPORT_PC()
26998
26999    mov     r0, rSELF
27000    bl      dvmCheckSuspendPending
27001
27002    ldr     r9, [rSELF, #offThread_exception] @ r9<- self->exception
27003    mov     r1, rSELF                   @ r1<- self
27004    mov     r0, r9                      @ r0<- exception
27005    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
27006    ldrb    r2, [rSELF, #offThread_subMode]  @ get subMode flags
27007    mov     r3, #0                      @ r3<- NULL
27008    str     r3, [rSELF, #offThread_exception] @ self->exception = NULL
27009
27010    @ Special subMode?
27011    cmp     r2, #0                      @ any special subMode handling needed?
27012    bne     7f                          @ go if so
270138:
27014    /* set up args and a local for "&fp" */
27015    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
27016    str     rFP, [sp, #-4]!             @ *--sp = fp
27017    mov     ip, sp                      @ ip<- &fp
27018    mov     r3, #0                      @ r3<- false
27019    str     ip, [sp, #-4]!              @ *--sp = &fp
27020    ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
27021    mov     r0, rSELF                   @ r0<- self
27022    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
27023    ldrb    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
27024    mov     r2, r9                      @ r2<- exception
27025    sub     r1, rPC, r1                 @ r1<- pc - method->insns
27026    mov     r1, r1, asr #1              @ r1<- offset in code units
27027
27028    /* call, r0 gets catchRelPc (a code-unit offset) */
27029    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
27030
27031    /* fix earlier stack overflow if necessary; may trash rFP */
27032    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27033    cmp     r1, #0                      @ did we overflow earlier?
27034    beq     1f                          @ no, skip ahead
27035    mov     rFP, r0                     @ save relPc result in rFP
27036    mov     r0, rSELF                   @ r0<- self
27037    mov     r1, r9                      @ r1<- exception
27038    bl      dvmCleanupStackOverflow     @ call(self)
27039    mov     r0, rFP                     @ restore result
270401:
27041
27042    /* update frame pointer and check result from dvmFindCatchBlock */
27043    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
27044    cmp     r0, #0                      @ is catchRelPc < 0?
27045    add     sp, sp, #8                  @ restore stack
27046    bmi     .LnotCaughtLocally
27047
27048    /* adjust locals to match self->interpSave.curFrame and updated PC */
27049    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
27050    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
27051    str     r1, [rSELF, #offThread_method]  @ self->method = new method
27052    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
27053    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
27054    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
27055    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
27056    str     r2, [rSELF, #offThread_methodClassDex] @ self->pDvmDex = meth...
27057
27058    /* release the tracked alloc on the exception */
27059    mov     r0, r9                      @ r0<- exception
27060    mov     r1, rSELF                   @ r1<- self
27061    bl      dvmReleaseTrackedAlloc      @ release the exception
27062
27063    /* restore the exception if the handler wants it */
27064    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
27065    FETCH_INST()                        @ load rINST from rPC
27066    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27067    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
27068    streq   r9, [rSELF, #offThread_exception] @ yes, restore the exception
27069    GOTO_OPCODE(ip)                     @ jump to next instruction
27070
27071    @ Manage debugger bookkeeping
270727:
27073    str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
27074    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
27075    mov     r0, rSELF                       @ arg0<- self
27076    mov     r1, r9                          @ arg1<- exception
27077    bl      dvmReportExceptionThrow         @ (self, exception)
27078    b       8b                              @ resume with normal handling
27079
27080.LnotCaughtLocally: @ r9=exception
27081    /* fix stack overflow if necessary */
27082    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27083    cmp     r1, #0                      @ did we overflow earlier?
27084    movne   r0, rSELF                   @ if yes: r0<- self
27085    movne   r1, r9                      @ if yes: r1<- exception
27086    blne    dvmCleanupStackOverflow     @ if yes: call(self)
27087
27088    @ may want to show "not caught locally" debug messages here
27089#if DVM_SHOW_EXCEPTION >= 2
27090    /* call __android_log_print(prio, tag, format, ...) */
27091    /* "Exception %s from %s:%d not caught locally" */
27092    @ dvmLineNumFromPC(method, pc - method->insns)
27093    ldr     r0, [rSELF, #offThread_method]
27094    ldr     r1, [r0, #offMethod_insns]
27095    sub     r1, rPC, r1
27096    asr     r1, r1, #1
27097    bl      dvmLineNumFromPC
27098    str     r0, [sp, #-4]!
27099    @ dvmGetMethodSourceFile(method)
27100    ldr     r0, [rSELF, #offThread_method]
27101    bl      dvmGetMethodSourceFile
27102    str     r0, [sp, #-4]!
27103    @ exception->clazz->descriptor
27104    ldr     r3, [r9, #offObject_clazz]
27105    ldr     r3, [r3, #offClassObject_descriptor]
27106    @
27107    ldr     r2, strExceptionNotCaughtLocally
27108    ldr     r1, strLogTag
27109    mov     r0, #3                      @ LOG_DEBUG
27110    bl      __android_log_print
27111#endif
27112    str     r9, [rSELF, #offThread_exception] @ restore exception
27113    mov     r0, r9                      @ r0<- exception
27114    mov     r1, rSELF                   @ r1<- self
27115    bl      dvmReleaseTrackedAlloc      @ release the exception
27116    b       common_gotoBail             @ bail out
27117
27118
27119    /*
27120     * Exception handling, calls through "glue code".
27121     */
27122    .if     0
27123.LexceptionOld:
27124    SAVE_PC_FP_TO_SELF()                @ export state
27125    mov     r0, rSELF                   @ arg to function
27126    bl      dvmMterp_exceptionThrown
27127    b       common_resumeAfterGlueCall
27128    .endif
27129
27130#if defined(WITH_JIT)
27131    /*
27132     * If the JIT is actively building a trace we need to make sure
27133     * that the field is fully resolved before including the current
27134     * instruction.
27135     *
27136     * On entry:
27137     *     r10: &dvmDex->pResFields[field]
27138     *     r0:  field pointer (must preserve)
27139     */
27140common_verifyField:
27141    ldrb    r3, [rSELF, #offThread_subMode]  @ r3 <- submode byte
27142    ands    r3, #kSubModeJitTraceBuild
27143    bxeq    lr                          @ Not building trace, continue
27144    ldr     r1, [r10]                   @ r1<- reload resolved StaticField ptr
27145    cmp     r1, #0                      @ resolution complete?
27146    bxne    lr                          @ yes, continue
27147    stmfd   sp!, {r0-r2,lr}             @ save regs
27148    mov     r0, rSELF
27149    mov     r1, rPC
27150    bl      dvmJitEndTraceSelect        @ (self,pc) end trace before this inst
27151    ldmfd   sp!, {r0-r2, lr}
27152    bx      lr                          @ return
27153#endif
27154
27155/*
27156 * After returning from a "glued" function, pull out the updated
27157 * values and start executing at the next instruction.
27158 */
27159common_resumeAfterGlueCall:
27160    LOAD_PC_FP_FROM_SELF()              @ pull rPC and rFP out of thread
27161    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh
27162    FETCH_INST()                        @ load rINST from rPC
27163    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27164    GOTO_OPCODE(ip)                     @ jump to next instruction
27165
27166/*
27167 * Invalid array index. Note that our calling convention is strange; we use r1
27168 * and r3 because those just happen to be the registers all our callers are
27169 * using. We move r3 before calling the C function, but r1 happens to match.
27170 * r1: index
27171 * r3: size
27172 */
27173common_errArrayIndex:
27174    EXPORT_PC()
27175    mov     r0, r3
27176    bl      dvmThrowArrayIndexOutOfBoundsException
27177    b       common_exceptionThrown
27178
27179/*
27180 * Integer divide or mod by zero.
27181 */
27182common_errDivideByZero:
27183    EXPORT_PC()
27184    ldr     r0, strDivideByZero
27185    bl      dvmThrowArithmeticException
27186    b       common_exceptionThrown
27187
27188/*
27189 * Attempt to allocate an array with a negative size.
27190 * On entry: length in r1
27191 */
27192common_errNegativeArraySize:
27193    EXPORT_PC()
27194    mov     r0, r1                                @ arg0 <- len
27195    bl      dvmThrowNegativeArraySizeException    @ (len)
27196    b       common_exceptionThrown
27197
27198/*
27199 * Invocation of a non-existent method.
27200 * On entry: method name in r1
27201 */
27202common_errNoSuchMethod:
27203    EXPORT_PC()
27204    mov     r0, r1
27205    bl      dvmThrowNoSuchMethodError
27206    b       common_exceptionThrown
27207
27208/*
27209 * We encountered a null object when we weren't expecting one.  We
27210 * export the PC, throw a NullPointerException, and goto the exception
27211 * processing code.
27212 */
27213common_errNullObject:
27214    EXPORT_PC()
27215    mov     r0, #0
27216    bl      dvmThrowNullPointerException
27217    b       common_exceptionThrown
27218
27219/*
27220 * For debugging, cause an immediate fault.  The source address will
27221 * be in lr (use a bl instruction to jump here).
27222 */
27223common_abort:
27224    ldr     pc, .LdeadFood
27225.LdeadFood:
27226    .word   0xdeadf00d
27227
27228/*
27229 * Spit out a "we were here", preserving all registers.  (The attempt
27230 * to save ip won't work, but we need to save an even number of
27231 * registers for EABI 64-bit stack alignment.)
27232 */
27233    .macro  SQUEAK num
27234common_squeak\num:
27235    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27236    ldr     r0, strSqueak
27237    mov     r1, #\num
27238    bl      printf
27239    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27240    bx      lr
27241    .endm
27242
27243    SQUEAK  0
27244    SQUEAK  1
27245    SQUEAK  2
27246    SQUEAK  3
27247    SQUEAK  4
27248    SQUEAK  5
27249
27250/*
27251 * Spit out the number in r0, preserving registers.
27252 */
27253common_printNum:
27254    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27255    mov     r1, r0
27256    ldr     r0, strSqueak
27257    bl      printf
27258    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27259    bx      lr
27260
27261/*
27262 * Print a newline, preserving registers.
27263 */
27264common_printNewline:
27265    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27266    ldr     r0, strNewline
27267    bl      printf
27268    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27269    bx      lr
27270
27271    /*
27272     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
27273     */
27274common_printHex:
27275    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27276    mov     r1, r0
27277    ldr     r0, strPrintHex
27278    bl      printf
27279    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27280    bx      lr
27281
27282/*
27283 * Print the 64-bit quantity in r0-r1, preserving registers.
27284 */
27285common_printLong:
27286    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27287    mov     r3, r1
27288    mov     r2, r0
27289    ldr     r0, strPrintLong
27290    bl      printf
27291    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27292    bx      lr
27293
27294/*
27295 * Print full method info.  Pass the Method* in r0.  Preserves regs.
27296 */
27297common_printMethod:
27298    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27299    bl      dvmMterpPrintMethod
27300    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27301    bx      lr
27302
27303/*
27304 * Call a C helper function that dumps regs and possibly some
27305 * additional info.  Requires the C function to be compiled in.
27306 */
27307    .if     0
27308common_dumpRegs:
27309    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27310    bl      dvmMterpDumpArmRegs
27311    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27312    bx      lr
27313    .endif
27314
27315#if 0
27316/*
27317 * Experiment on VFP mode.
27318 *
27319 * uint32_t setFPSCR(uint32_t val, uint32_t mask)
27320 *
27321 * Updates the bits specified by "mask", setting them to the values in "val".
27322 */
27323setFPSCR:
27324    and     r0, r0, r1                  @ make sure no stray bits are set
27325    fmrx    r2, fpscr                   @ get VFP reg
27326    mvn     r1, r1                      @ bit-invert mask
27327    and     r2, r2, r1                  @ clear masked bits
27328    orr     r2, r2, r0                  @ set specified bits
27329    fmxr    fpscr, r2                   @ set VFP reg
27330    mov     r0, r2                      @ return new value
27331    bx      lr
27332
27333    .align  2
27334    .global dvmConfigureFP
27335    .type   dvmConfigureFP, %function
27336dvmConfigureFP:
27337    stmfd   sp!, {ip, lr}
27338    /* 0x03000000 sets DN/FZ */
27339    /* 0x00009f00 clears the six exception enable flags */
27340    bl      common_squeak0
27341    mov     r0, #0x03000000             @ r0<- 0x03000000
27342    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
27343    bl      setFPSCR
27344    ldmfd   sp!, {ip, pc}
27345#endif
27346
27347
27348/*
27349 * String references, must be close to the code that uses them.
27350 */
27351    .align  2
27352strDivideByZero:
27353    .word   .LstrDivideByZero
27354strLogTag:
27355    .word   .LstrLogTag
27356strExceptionNotCaughtLocally:
27357    .word   .LstrExceptionNotCaughtLocally
27358
27359strNewline:
27360    .word   .LstrNewline
27361strSqueak:
27362    .word   .LstrSqueak
27363strPrintHex:
27364    .word   .LstrPrintHex
27365strPrintLong:
27366    .word   .LstrPrintLong
27367
27368/*
27369 * Zero-terminated ASCII string data.
27370 *
27371 * On ARM we have two choices: do like gcc does, and LDR from a .word
27372 * with the address, or use an ADR pseudo-op to get the address
27373 * directly.  ADR saves 4 bytes and an indirection, but it's using a
27374 * PC-relative addressing mode and hence has a limited range, which
27375 * makes it not work well with mergeable string sections.
27376 */
27377    .section .rodata.str1.4,"aMS",%progbits,1
27378
27379.LstrBadEntryPoint:
27380    .asciz  "Bad entry point %d\n"
27381.LstrFilledNewArrayNotImpl:
27382    .asciz  "filled-new-array only implemented for objects and 'int'"
27383.LstrDivideByZero:
27384    .asciz  "divide by zero"
27385.LstrLogTag:
27386    .asciz  "mterp"
27387.LstrExceptionNotCaughtLocally:
27388    .asciz  "Exception %s from %s:%d not caught locally\n"
27389
27390.LstrNewline:
27391    .asciz  "\n"
27392.LstrSqueak:
27393    .asciz  "<%d>"
27394.LstrPrintHex:
27395    .asciz  "<0x%x>"
27396.LstrPrintLong:
27397    .asciz  "<%lld>"
27398
27399