InterpAsm-armv5te-vfp.S revision cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bda
1/*
2 * This file was generated automatically by gen-mterp.py for 'armv5te-vfp'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: armv5te/header.S */
8/*
9 * Copyright (C) 2008 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 *      http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25 * ARMv5 definitions and declarations.
26 */
27
28/*
29ARM EABI general notes:
30
31r0-r3 hold first 4 args to a method; they are not preserved across method calls
32r4-r8 are available for general use
33r9 is given special treatment in some situations, but not for us
34r10 (sl) seems to be generally available
35r11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
36r12 (ip) is scratch -- not preserved across method calls
37r13 (sp) should be managed carefully in case a signal arrives
38r14 (lr) must be preserved
39r15 (pc) can be tinkered with directly
40
41r0 holds returns of <= 4 bytes
42r0-r1 hold returns of 8 bytes, low word in r0
43
44Callee must save/restore r4+ (except r12) if it modifies them.  If VFP
45is present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
46s0-s15 (d0-d7, q0-a3) do not need to be.
47
48Stack is "full descending".  Only the arguments that don't fit in the first 4
49registers are placed on the stack.  "sp" points at the first stacked argument
50(i.e. the 5th arg).
51
52VFP: single-precision results in s0, double-precision results in d0.
53
54In the EABI, "sp" must be 64-bit aligned on entry to a function, and any
5564-bit quantities (long long, double) must be 64-bit aligned.
56*/
57
58/*
59Mterp and ARM notes:
60
61The following registers have fixed assignments:
62
63  reg nick      purpose
64  r4  rPC       interpreted program counter, used for fetching instructions
65  r5  rFP       interpreted frame pointer, used for accessing locals and args
66  r6  rSELF     self (Thread) pointer
67  r7  rINST     first 16-bit code unit of current instruction
68  r8  rIBASE    interpreted instruction base pointer, used for computed goto
69
70Macros are provided for common operations.  Each macro MUST emit only
71one instruction to make instruction-counting easier.  They MUST NOT alter
72unspecified registers or condition codes.
73*/
74
75/* single-purpose registers, given names for clarity */
76#define rPC     r4
77#define rFP     r5
78#define rSELF   r6
79#define rINST   r7
80#define rIBASE  r8
81
82/* save/restore the PC and/or FP from the thread struct */
83#define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
84#define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
85#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
86#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
87#define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
88#define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
89
90/*
91 * "export" the PC to the stack frame, f/b/o future exception objects.  Must
92 * be done *before* something throws.
93 *
94 * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
95 * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
96 *
97 * It's okay to do this more than once.
98 */
99#define EXPORT_PC() \
100    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
101
102/*
103 * Given a frame pointer, find the stack save area.
104 *
105 * In C this is "((StackSaveArea*)(_fp) -1)".
106 */
107#define SAVEAREA_FROM_FP(_reg, _fpreg) \
108    sub     _reg, _fpreg, #sizeofStackSaveArea
109
110/*
111 * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
112 */
113#define FETCH_INST()            ldrh    rINST, [rPC]
114
115/*
116 * Fetch the next instruction from the specified offset.  Advances rPC
117 * to point to the next instruction.  "_count" is in 16-bit code units.
118 *
119 * Because of the limited size of immediate constants on ARM, this is only
120 * suitable for small forward movements (i.e. don't try to implement "goto"
121 * with this).
122 *
123 * This must come AFTER anything that can throw an exception, or the
124 * exception catch may miss.  (This also implies that it must come after
125 * EXPORT_PC().)
126 */
127#define FETCH_ADVANCE_INST(_count) ldrh    rINST, [rPC, #((_count)*2)]!
128
129/*
130 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
131 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
132 */
133#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
134        ldrh    _dreg, [_sreg, #((_count)*2)]!
135
136/*
137 * Fetch the next instruction from an offset specified by _reg.  Updates
138 * rPC to point to the next instruction.  "_reg" must specify the distance
139 * in bytes, *not* 16-bit code units, and may be a signed value.
140 *
141 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
142 * bits that hold the shift distance are used for the half/byte/sign flags.
143 * In some cases we can pre-double _reg for free, so we require a byte offset
144 * here.
145 */
146#define FETCH_ADVANCE_INST_RB(_reg) ldrh    rINST, [rPC, _reg]!
147
148/*
149 * Fetch a half-word code unit from an offset past the current PC.  The
150 * "_count" value is in 16-bit code units.  Does not advance rPC.
151 *
152 * The "_S" variant works the same but treats the value as signed.
153 */
154#define FETCH(_reg, _count)     ldrh    _reg, [rPC, #((_count)*2)]
155#define FETCH_S(_reg, _count)   ldrsh   _reg, [rPC, #((_count)*2)]
156
157/*
158 * Fetch one byte from an offset past the current PC.  Pass in the same
159 * "_count" as you would for FETCH, and an additional 0/1 indicating which
160 * byte of the halfword you want (lo/hi).
161 */
162#define FETCH_B(_reg, _count, _byte) ldrb     _reg, [rPC, #((_count)*2+(_byte))]
163
164/*
165 * Put the instruction's opcode field into the specified register.
166 */
167#define GET_INST_OPCODE(_reg)   and     _reg, rINST, #255
168
169/*
170 * Put the prefetched instruction's opcode field into the specified register.
171 */
172#define GET_PREFETCHED_OPCODE(_oreg, _ireg)   and     _oreg, _ireg, #255
173
174/*
175 * Begin executing the opcode in _reg.  Because this only jumps within the
176 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
177 */
178#define GOTO_OPCODE(_reg)       add     pc, rIBASE, _reg, lsl #6
179#define GOTO_OPCODE_BASE(_base,_reg)  add     pc, _base, _reg, lsl #6
180#define GOTO_OPCODE_IFEQ(_reg)  addeq   pc, rIBASE, _reg, lsl #6
181#define GOTO_OPCODE_IFNE(_reg)  addne   pc, rIBASE, _reg, lsl #6
182
183/*
184 * Get/set the 32-bit value from a Dalvik register.
185 */
186#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
187#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
188
189/*
190 * Convert a virtual register index into an address.
191 */
192#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
193        add     _reg, rFP, _vreg, lsl #2
194
195/*
196 * This is a #include, not a %include, because we want the C pre-processor
197 * to expand the macros into assembler assignment statements.
198 */
199#include "../common/asm-constants.h"
200
201#if defined(WITH_JIT)
202#include "../common/jit-config.h"
203#endif
204
205/* File: armv5te/platform.S */
206/*
207 * ===========================================================================
208 *  CPU-version-specific defines
209 * ===========================================================================
210 */
211
212/*
213 * Macro for data memory barrier; not meaningful pre-ARMv6K.
214 */
215.macro  SMP_DMB
216.endm
217
218/*
219 * Macro for data memory barrier; not meaningful pre-ARMv6K.
220 */
221.macro  SMP_DMB_ST
222.endm
223
224/* File: armv5te/entry.S */
225/*
226 * Copyright (C) 2008 The Android Open Source Project
227 *
228 * Licensed under the Apache License, Version 2.0 (the "License");
229 * you may not use this file except in compliance with the License.
230 * You may obtain a copy of the License at
231 *
232 *      http://www.apache.org/licenses/LICENSE-2.0
233 *
234 * Unless required by applicable law or agreed to in writing, software
235 * distributed under the License is distributed on an "AS IS" BASIS,
236 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
237 * See the License for the specific language governing permissions and
238 * limitations under the License.
239 */
240/*
241 * Interpreter entry point.
242 */
243
244/*
245 * We don't have formal stack frames, so gdb scans upward in the code
246 * to find the start of the function (a label with the %function type),
247 * and then looks at the next few instructions to figure out what
248 * got pushed onto the stack.  From this it figures out how to restore
249 * the registers, including PC, for the previous stack frame.  If gdb
250 * sees a non-function label, it stops scanning, so either we need to
251 * have nothing but assembler-local labels between the entry point and
252 * the break, or we need to fake it out.
253 *
254 * When this is defined, we add some stuff to make gdb less confused.
255 */
256#define ASSIST_DEBUGGER 1
257
258    .text
259    .align  2
260    .global dvmMterpStdRun
261    .type   dvmMterpStdRun, %function
262
263/*
264 * On entry:
265 *  r0  Thread* self
266 *
267 * The return comes via a call to dvmMterpStdBail().
268 */
269dvmMterpStdRun:
270#define MTERP_ENTRY1 \
271    .save {r4-r10,fp,lr}; \
272    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
273#define MTERP_ENTRY2 \
274    .pad    #4; \
275    sub     sp, sp, #4                  @ align 64
276
277    .fnstart
278    MTERP_ENTRY1
279    MTERP_ENTRY2
280
281    /* save stack pointer, add magic word for debuggerd */
282    str     sp, [r0, #offThread_bailPtr]  @ save SP for eventual return
283
284    /* set up "named" registers, figure out entry point */
285    mov     rSELF, r0                   @ set rSELF
286    LOAD_PC_FP_FROM_SELF()              @ load rPC and rFP from "thread"
287    ldr     rIBASE, [rSELF, #offThread_curHandlerTable] @ set rIBASE
288
289#if defined(WITH_JIT)
290.LentryInstr:
291    /* Entry is always a possible trace start */
292    ldr     r0, [rSELF, #offThread_pJitProfTable]
293    FETCH_INST()
294    mov     r1, #0                      @ prepare the value for the new state
295    str     r1, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
296    cmp     r0,#0                       @ is profiling disabled?
297#if !defined(WITH_SELF_VERIFICATION)
298    bne     common_updateProfile        @ profiling is enabled
299#else
300    ldr     r2, [rSELF, #offThread_shadowSpace] @ to find out the jit exit state
301    beq     1f                          @ profiling is disabled
302    ldr     r3, [r2, #offShadowSpace_jitExitState]  @ jit exit state
303    cmp     r3, #kSVSTraceSelect        @ hot trace following?
304    moveq   r2,#kJitTSelectRequestHot   @ ask for trace selection
305    beq     common_selectTrace          @ go build the trace
306    cmp     r3, #kSVSNoProfile          @ don't profile the next instruction?
307    beq     1f                          @ intrepret the next instruction
308    b       common_updateProfile        @ collect profiles
309#endif
3101:
311    GET_INST_OPCODE(ip)
312    GOTO_OPCODE(ip)
313#else
314    /* start executing the instruction at rPC */
315    FETCH_INST()                        @ load rINST from rPC
316    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
317    GOTO_OPCODE(ip)                     @ jump to next instruction
318#endif
319
320.Lbad_arg:
321    ldr     r0, strBadEntryPoint
322    @ r1 holds value of entryPoint
323    bl      printf
324    bl      dvmAbort
325    .fnend
326    .size   dvmMterpStdRun, .-dvmMterpStdRun
327
328
329    .global dvmMterpStdBail
330    .type   dvmMterpStdBail, %function
331
332/*
333 * Restore the stack pointer and PC from the save point established on entry.
334 * This is essentially the same as a longjmp, but should be cheaper.  The
335 * last instruction causes us to return to whoever called dvmMterpStdRun.
336 *
337 * We pushed some registers on the stack in dvmMterpStdRun, then saved
338 * SP and LR.  Here we restore SP, restore the registers, and then restore
339 * LR to PC.
340 *
341 * On entry:
342 *  r0  Thread* self
343 */
344dvmMterpStdBail:
345    ldr     sp, [r0, #offThread_bailPtr]    @ sp<- saved SP
346    add     sp, sp, #4                      @ un-align 64
347    ldmfd   sp!, {r4-r10,fp,pc}             @ restore 9 regs and return
348
349
350/*
351 * String references.
352 */
353strBadEntryPoint:
354    .word   .LstrBadEntryPoint
355
356
357    .global dvmAsmInstructionStart
358    .type   dvmAsmInstructionStart, %function
359dvmAsmInstructionStart = .L_OP_NOP
360    .text
361
362/* ------------------------------ */
363    .balign 64
364.L_OP_NOP: /* 0x00 */
365/* File: armv5te/OP_NOP.S */
366    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
367    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
368    GOTO_OPCODE(ip)                     @ execute it
369
370#ifdef ASSIST_DEBUGGER
371    /* insert fake function header to help gdb find the stack frame */
372    .type   dalvik_inst, %function
373dalvik_inst:
374    .fnstart
375    MTERP_ENTRY1
376    MTERP_ENTRY2
377    .fnend
378#endif
379
380/* ------------------------------ */
381    .balign 64
382.L_OP_MOVE: /* 0x01 */
383/* File: armv5te/OP_MOVE.S */
384    /* for move, move-object, long-to-int */
385    /* op vA, vB */
386    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
387    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
388    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
389    GET_VREG(r2, r1)                    @ r2<- fp[B]
390    and     r0, r0, #15
391    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
392    SET_VREG(r2, r0)                    @ fp[A]<- r2
393    GOTO_OPCODE(ip)                     @ execute next instruction
394
395/* ------------------------------ */
396    .balign 64
397.L_OP_MOVE_FROM16: /* 0x02 */
398/* File: armv5te/OP_MOVE_FROM16.S */
399    /* for: move/from16, move-object/from16 */
400    /* op vAA, vBBBB */
401    FETCH(r1, 1)                        @ r1<- BBBB
402    mov     r0, rINST, lsr #8           @ r0<- AA
403    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
404    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
405    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
406    SET_VREG(r2, r0)                    @ fp[AA]<- r2
407    GOTO_OPCODE(ip)                     @ jump to next instruction
408
409/* ------------------------------ */
410    .balign 64
411.L_OP_MOVE_16: /* 0x03 */
412/* File: armv5te/OP_MOVE_16.S */
413    /* for: move/16, move-object/16 */
414    /* op vAAAA, vBBBB */
415    FETCH(r1, 2)                        @ r1<- BBBB
416    FETCH(r0, 1)                        @ r0<- AAAA
417    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
418    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
419    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
420    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
421    GOTO_OPCODE(ip)                     @ jump to next instruction
422
423/* ------------------------------ */
424    .balign 64
425.L_OP_MOVE_WIDE: /* 0x04 */
426/* File: armv5te/OP_MOVE_WIDE.S */
427    /* move-wide vA, vB */
428    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
429    mov     r2, rINST, lsr #8           @ r2<- A(+)
430    mov     r3, rINST, lsr #12          @ r3<- B
431    and     r2, r2, #15
432    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
433    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
434    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
435    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
436    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
437    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
438    GOTO_OPCODE(ip)                     @ jump to next instruction
439
440/* ------------------------------ */
441    .balign 64
442.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
443/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
444    /* move-wide/from16 vAA, vBBBB */
445    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
446    FETCH(r3, 1)                        @ r3<- BBBB
447    mov     r2, rINST, lsr #8           @ r2<- AA
448    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
449    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
450    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
451    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
452    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
453    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
454    GOTO_OPCODE(ip)                     @ jump to next instruction
455
456/* ------------------------------ */
457    .balign 64
458.L_OP_MOVE_WIDE_16: /* 0x06 */
459/* File: armv5te/OP_MOVE_WIDE_16.S */
460    /* move-wide/16 vAAAA, vBBBB */
461    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
462    FETCH(r3, 2)                        @ r3<- BBBB
463    FETCH(r2, 1)                        @ r2<- AAAA
464    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
465    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
466    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
467    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
468    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
469    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
470    GOTO_OPCODE(ip)                     @ jump to next instruction
471
472/* ------------------------------ */
473    .balign 64
474.L_OP_MOVE_OBJECT: /* 0x07 */
475/* File: armv5te/OP_MOVE_OBJECT.S */
476/* File: armv5te/OP_MOVE.S */
477    /* for move, move-object, long-to-int */
478    /* op vA, vB */
479    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
480    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
481    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
482    GET_VREG(r2, r1)                    @ r2<- fp[B]
483    and     r0, r0, #15
484    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
485    SET_VREG(r2, r0)                    @ fp[A]<- r2
486    GOTO_OPCODE(ip)                     @ execute next instruction
487
488
489/* ------------------------------ */
490    .balign 64
491.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
492/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
493/* File: armv5te/OP_MOVE_FROM16.S */
494    /* for: move/from16, move-object/from16 */
495    /* op vAA, vBBBB */
496    FETCH(r1, 1)                        @ r1<- BBBB
497    mov     r0, rINST, lsr #8           @ r0<- AA
498    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
499    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
500    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
501    SET_VREG(r2, r0)                    @ fp[AA]<- r2
502    GOTO_OPCODE(ip)                     @ jump to next instruction
503
504
505/* ------------------------------ */
506    .balign 64
507.L_OP_MOVE_OBJECT_16: /* 0x09 */
508/* File: armv5te/OP_MOVE_OBJECT_16.S */
509/* File: armv5te/OP_MOVE_16.S */
510    /* for: move/16, move-object/16 */
511    /* op vAAAA, vBBBB */
512    FETCH(r1, 2)                        @ r1<- BBBB
513    FETCH(r0, 1)                        @ r0<- AAAA
514    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
515    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
516    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
517    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
518    GOTO_OPCODE(ip)                     @ jump to next instruction
519
520
521/* ------------------------------ */
522    .balign 64
523.L_OP_MOVE_RESULT: /* 0x0a */
524/* File: armv5te/OP_MOVE_RESULT.S */
525    /* for: move-result, move-result-object */
526    /* op vAA */
527    mov     r2, rINST, lsr #8           @ r2<- AA
528    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
529    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
530    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
531    SET_VREG(r0, r2)                    @ fp[AA]<- r0
532    GOTO_OPCODE(ip)                     @ jump to next instruction
533
534/* ------------------------------ */
535    .balign 64
536.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
537/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
538    /* move-result-wide vAA */
539    mov     r2, rINST, lsr #8           @ r2<- AA
540    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
541    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
542    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
543    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
544    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
545    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
546    GOTO_OPCODE(ip)                     @ jump to next instruction
547
548/* ------------------------------ */
549    .balign 64
550.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
551/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
552/* File: armv5te/OP_MOVE_RESULT.S */
553    /* for: move-result, move-result-object */
554    /* op vAA */
555    mov     r2, rINST, lsr #8           @ r2<- AA
556    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
557    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
558    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
559    SET_VREG(r0, r2)                    @ fp[AA]<- r0
560    GOTO_OPCODE(ip)                     @ jump to next instruction
561
562
563/* ------------------------------ */
564    .balign 64
565.L_OP_MOVE_EXCEPTION: /* 0x0d */
566/* File: armv5te/OP_MOVE_EXCEPTION.S */
567    /* move-exception vAA */
568    mov     r2, rINST, lsr #8           @ r2<- AA
569    ldr     r3, [rSELF, #offThread_exception]  @ r3<- dvmGetException bypass
570    mov     r1, #0                      @ r1<- 0
571    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
572    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
573    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
574    str     r1, [rSELF, #offThread_exception]  @ dvmClearException bypass
575    GOTO_OPCODE(ip)                     @ jump to next instruction
576
577/* ------------------------------ */
578    .balign 64
579.L_OP_RETURN_VOID: /* 0x0e */
580/* File: armv5te/OP_RETURN_VOID.S */
581    b       common_returnFromMethod
582
583/* ------------------------------ */
584    .balign 64
585.L_OP_RETURN: /* 0x0f */
586/* File: armv5te/OP_RETURN.S */
587    /*
588     * Return a 32-bit value.  Copies the return value into the "thread"
589     * structure, then jumps to the return handler.
590     *
591     * for: return, return-object
592     */
593    /* op vAA */
594    mov     r2, rINST, lsr #8           @ r2<- AA
595    GET_VREG(r0, r2)                    @ r0<- vAA
596    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
597    b       common_returnFromMethod
598
599/* ------------------------------ */
600    .balign 64
601.L_OP_RETURN_WIDE: /* 0x10 */
602/* File: armv5te/OP_RETURN_WIDE.S */
603    /*
604     * Return a 64-bit value.  Copies the return value into the "thread"
605     * structure, then jumps to the return handler.
606     */
607    /* return-wide vAA */
608    mov     r2, rINST, lsr #8           @ r2<- AA
609    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
610    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
611    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
612    stmia   r3, {r0-r1}                 @ retval<- r0/r1
613    b       common_returnFromMethod
614
615/* ------------------------------ */
616    .balign 64
617.L_OP_RETURN_OBJECT: /* 0x11 */
618/* File: armv5te/OP_RETURN_OBJECT.S */
619/* File: armv5te/OP_RETURN.S */
620    /*
621     * Return a 32-bit value.  Copies the return value into the "thread"
622     * structure, then jumps to the return handler.
623     *
624     * for: return, return-object
625     */
626    /* op vAA */
627    mov     r2, rINST, lsr #8           @ r2<- AA
628    GET_VREG(r0, r2)                    @ r0<- vAA
629    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
630    b       common_returnFromMethod
631
632
633/* ------------------------------ */
634    .balign 64
635.L_OP_CONST_4: /* 0x12 */
636/* File: armv5te/OP_CONST_4.S */
637    /* const/4 vA, #+B */
638    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
639    mov     r0, rINST, lsr #8           @ r0<- A+
640    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
641    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
642    and     r0, r0, #15
643    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
644    SET_VREG(r1, r0)                    @ fp[A]<- r1
645    GOTO_OPCODE(ip)                     @ execute next instruction
646
647/* ------------------------------ */
648    .balign 64
649.L_OP_CONST_16: /* 0x13 */
650/* File: armv5te/OP_CONST_16.S */
651    /* const/16 vAA, #+BBBB */
652    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
653    mov     r3, rINST, lsr #8           @ r3<- AA
654    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
655    SET_VREG(r0, r3)                    @ vAA<- r0
656    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
657    GOTO_OPCODE(ip)                     @ jump to next instruction
658
659/* ------------------------------ */
660    .balign 64
661.L_OP_CONST: /* 0x14 */
662/* File: armv5te/OP_CONST.S */
663    /* const vAA, #+BBBBbbbb */
664    mov     r3, rINST, lsr #8           @ r3<- AA
665    FETCH(r0, 1)                        @ r0<- bbbb (low)
666    FETCH(r1, 2)                        @ r1<- BBBB (high)
667    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
668    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
669    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
670    SET_VREG(r0, r3)                    @ vAA<- r0
671    GOTO_OPCODE(ip)                     @ jump to next instruction
672
673/* ------------------------------ */
674    .balign 64
675.L_OP_CONST_HIGH16: /* 0x15 */
676/* File: armv5te/OP_CONST_HIGH16.S */
677    /* const/high16 vAA, #+BBBB0000 */
678    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
679    mov     r3, rINST, lsr #8           @ r3<- AA
680    mov     r0, r0, lsl #16             @ r0<- BBBB0000
681    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
682    SET_VREG(r0, r3)                    @ vAA<- r0
683    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
684    GOTO_OPCODE(ip)                     @ jump to next instruction
685
686/* ------------------------------ */
687    .balign 64
688.L_OP_CONST_WIDE_16: /* 0x16 */
689/* File: armv5te/OP_CONST_WIDE_16.S */
690    /* const-wide/16 vAA, #+BBBB */
691    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
692    mov     r3, rINST, lsr #8           @ r3<- AA
693    mov     r1, r0, asr #31             @ r1<- ssssssss
694    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
695    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
697    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
698    GOTO_OPCODE(ip)                     @ jump to next instruction
699
700/* ------------------------------ */
701    .balign 64
702.L_OP_CONST_WIDE_32: /* 0x17 */
703/* File: armv5te/OP_CONST_WIDE_32.S */
704    /* const-wide/32 vAA, #+BBBBbbbb */
705    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
706    mov     r3, rINST, lsr #8           @ r3<- AA
707    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
708    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
709    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
710    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
711    mov     r1, r0, asr #31             @ r1<- ssssssss
712    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
713    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
714    GOTO_OPCODE(ip)                     @ jump to next instruction
715
716/* ------------------------------ */
717    .balign 64
718.L_OP_CONST_WIDE: /* 0x18 */
719/* File: armv5te/OP_CONST_WIDE.S */
720    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
721    FETCH(r0, 1)                        @ r0<- bbbb (low)
722    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
723    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
724    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
725    FETCH(r3, 4)                        @ r3<- HHHH (high)
726    mov     r9, rINST, lsr #8           @ r9<- AA
727    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
728    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
729    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
730    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
731    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
732    GOTO_OPCODE(ip)                     @ jump to next instruction
733
734/* ------------------------------ */
735    .balign 64
736.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
737/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
738    /* const-wide/high16 vAA, #+BBBB000000000000 */
739    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
740    mov     r3, rINST, lsr #8           @ r3<- AA
741    mov     r0, #0                      @ r0<- 00000000
742    mov     r1, r1, lsl #16             @ r1<- BBBB0000
743    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
744    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
745    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
746    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
747    GOTO_OPCODE(ip)                     @ jump to next instruction
748
749/* ------------------------------ */
750    .balign 64
751.L_OP_CONST_STRING: /* 0x1a */
752/* File: armv5te/OP_CONST_STRING.S */
753    /* const/string vAA, String@BBBB */
754    FETCH(r1, 1)                        @ r1<- BBBB
755    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
756    mov     r9, rINST, lsr #8           @ r9<- AA
757    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
758    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
759    cmp     r0, #0                      @ not yet resolved?
760    beq     .LOP_CONST_STRING_resolve
761    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
762    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
763    SET_VREG(r0, r9)                    @ vAA<- r0
764    GOTO_OPCODE(ip)                     @ jump to next instruction
765
766/* ------------------------------ */
767    .balign 64
768.L_OP_CONST_STRING_JUMBO: /* 0x1b */
769/* File: armv5te/OP_CONST_STRING_JUMBO.S */
770    /* const/string vAA, String@BBBBBBBB */
771    FETCH(r0, 1)                        @ r0<- bbbb (low)
772    FETCH(r1, 2)                        @ r1<- BBBB (high)
773    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
774    mov     r9, rINST, lsr #8           @ r9<- AA
775    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
776    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
777    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
778    cmp     r0, #0
779    beq     .LOP_CONST_STRING_JUMBO_resolve
780    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
781    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
782    SET_VREG(r0, r9)                    @ vAA<- r0
783    GOTO_OPCODE(ip)                     @ jump to next instruction
784
785/* ------------------------------ */
786    .balign 64
787.L_OP_CONST_CLASS: /* 0x1c */
788/* File: armv5te/OP_CONST_CLASS.S */
789    /* const/class vAA, Class@BBBB */
790    FETCH(r1, 1)                        @ r1<- BBBB
791    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
792    mov     r9, rINST, lsr #8           @ r9<- AA
793    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
794    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
795    cmp     r0, #0                      @ not yet resolved?
796    beq     .LOP_CONST_CLASS_resolve
797    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
798    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
799    SET_VREG(r0, r9)                    @ vAA<- r0
800    GOTO_OPCODE(ip)                     @ jump to next instruction
801
802/* ------------------------------ */
803    .balign 64
804.L_OP_MONITOR_ENTER: /* 0x1d */
805/* File: armv5te/OP_MONITOR_ENTER.S */
806    /*
807     * Synchronize on an object.
808     */
809    /* monitor-enter vAA */
810    mov     r2, rINST, lsr #8           @ r2<- AA
811    GET_VREG(r1, r2)                    @ r1<- vAA (object)
812    mov     r0, rSELF                   @ r0<- self
813    cmp     r1, #0                      @ null object?
814    EXPORT_PC()                         @ need for precise GC
815    beq     common_errNullObject        @ null object, throw an exception
816    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
817    bl      dvmLockObject               @ call(self, obj)
818    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
819    GOTO_OPCODE(ip)                     @ jump to next instruction
820
821/* ------------------------------ */
822    .balign 64
823.L_OP_MONITOR_EXIT: /* 0x1e */
824/* File: armv5te/OP_MONITOR_EXIT.S */
825    /*
826     * Unlock an object.
827     *
828     * Exceptions that occur when unlocking a monitor need to appear as
829     * if they happened at the following instruction.  See the Dalvik
830     * instruction spec.
831     */
832    /* monitor-exit vAA */
833    mov     r2, rINST, lsr #8           @ r2<- AA
834    EXPORT_PC()                         @ before fetch: export the PC
835    GET_VREG(r1, r2)                    @ r1<- vAA (object)
836    cmp     r1, #0                      @ null object?
837    beq     1f                          @ yes
838    mov     r0, rSELF                   @ r0<- self
839    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
840    cmp     r0, #0                      @ failed?
841    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
842    beq     common_exceptionThrown      @ yes, exception is pending
843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
844    GOTO_OPCODE(ip)                     @ jump to next instruction
8451:
846    FETCH_ADVANCE_INST(1)               @ advance before throw
847    b      common_errNullObject
848
849/* ------------------------------ */
850    .balign 64
851.L_OP_CHECK_CAST: /* 0x1f */
852/* File: armv5te/OP_CHECK_CAST.S */
853    /*
854     * Check to see if a cast from one class to another is allowed.
855     */
856    /* check-cast vAA, class@BBBB */
857    mov     r3, rINST, lsr #8           @ r3<- AA
858    FETCH(r2, 1)                        @ r2<- BBBB
859    GET_VREG(r9, r3)                    @ r9<- object
860    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
861    cmp     r9, #0                      @ is object null?
862    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
863    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
864    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
865    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
866    cmp     r1, #0                      @ have we resolved this before?
867    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
868.LOP_CHECK_CAST_resolved:
869    cmp     r0, r1                      @ same class (trivial success)?
870    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
871.LOP_CHECK_CAST_okay:
872    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
873    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
874    GOTO_OPCODE(ip)                     @ jump to next instruction
875
876/* ------------------------------ */
877    .balign 64
878.L_OP_INSTANCE_OF: /* 0x20 */
879/* File: armv5te/OP_INSTANCE_OF.S */
880    /*
881     * Check to see if an object reference is an instance of a class.
882     *
883     * Most common situation is a non-null object, being compared against
884     * an already-resolved class.
885     */
886    /* instance-of vA, vB, class@CCCC */
887    mov     r3, rINST, lsr #12          @ r3<- B
888    mov     r9, rINST, lsr #8           @ r9<- A+
889    GET_VREG(r0, r3)                    @ r0<- vB (object)
890    and     r9, r9, #15                 @ r9<- A
891    cmp     r0, #0                      @ is object null?
892    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
893    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
894    FETCH(r3, 1)                        @ r3<- CCCC
895    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
896    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
897    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
898    cmp     r1, #0                      @ have we resolved this before?
899    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
900.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
901    cmp     r0, r1                      @ same class (trivial success)?
902    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
903    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
904
905/* ------------------------------ */
906    .balign 64
907.L_OP_ARRAY_LENGTH: /* 0x21 */
908/* File: armv5te/OP_ARRAY_LENGTH.S */
909    /*
910     * Return the length of an array.
911     */
912    mov     r1, rINST, lsr #12          @ r1<- B
913    mov     r2, rINST, lsr #8           @ r2<- A+
914    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
915    and     r2, r2, #15                 @ r2<- A
916    cmp     r0, #0                      @ is object null?
917    beq     common_errNullObject        @ yup, fail
918    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
919    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
920    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
921    SET_VREG(r3, r2)                    @ vB<- length
922    GOTO_OPCODE(ip)                     @ jump to next instruction
923
924/* ------------------------------ */
925    .balign 64
926.L_OP_NEW_INSTANCE: /* 0x22 */
927/* File: armv5te/OP_NEW_INSTANCE.S */
928    /*
929     * Create a new instance of a class.
930     */
931    /* new-instance vAA, class@BBBB */
932    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
933    FETCH(r1, 1)                        @ r1<- BBBB
934    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
935    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
936#if defined(WITH_JIT)
937    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
938#endif
939    EXPORT_PC()                         @ req'd for init, resolve, alloc
940    cmp     r0, #0                      @ already resolved?
941    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
942.LOP_NEW_INSTANCE_resolved:   @ r0=class
943    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
944    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
945    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
946.LOP_NEW_INSTANCE_initialized: @ r0=class
947    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
948    bl      dvmAllocObject              @ r0<- new object
949    b       .LOP_NEW_INSTANCE_finish          @ continue
950
951/* ------------------------------ */
952    .balign 64
953.L_OP_NEW_ARRAY: /* 0x23 */
954/* File: armv5te/OP_NEW_ARRAY.S */
955    /*
956     * Allocate an array of objects, specified with the array class
957     * and a count.
958     *
959     * The verifier guarantees that this is an array class, so we don't
960     * check for it here.
961     */
962    /* new-array vA, vB, class@CCCC */
963    mov     r0, rINST, lsr #12          @ r0<- B
964    FETCH(r2, 1)                        @ r2<- CCCC
965    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
966    GET_VREG(r1, r0)                    @ r1<- vB (array length)
967    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
968    cmp     r1, #0                      @ check length
969    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
970    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
971    cmp     r0, #0                      @ already resolved?
972    EXPORT_PC()                         @ req'd for resolve, alloc
973    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
974    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
975
976/* ------------------------------ */
977    .balign 64
978.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
979/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
980    /*
981     * Create a new array with elements filled from registers.
982     *
983     * for: filled-new-array, filled-new-array/range
984     */
985    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
986    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
987    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
988    FETCH(r1, 1)                        @ r1<- BBBB
989    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
990    EXPORT_PC()                         @ need for resolve and alloc
991    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
992    mov     r10, rINST, lsr #8          @ r10<- AA or BA
993    cmp     r0, #0                      @ already resolved?
994    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
9958:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
996    mov     r2, #0                      @ r2<- false
997    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
998    bl      dvmResolveClass             @ r0<- call(clazz, ref)
999    cmp     r0, #0                      @ got null?
1000    beq     common_exceptionThrown      @ yes, handle exception
1001    b       .LOP_FILLED_NEW_ARRAY_continue
1002
1003/* ------------------------------ */
1004    .balign 64
1005.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1006/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1007/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1008    /*
1009     * Create a new array with elements filled from registers.
1010     *
1011     * for: filled-new-array, filled-new-array/range
1012     */
1013    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1014    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1015    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
1016    FETCH(r1, 1)                        @ r1<- BBBB
1017    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1018    EXPORT_PC()                         @ need for resolve and alloc
1019    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1020    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1021    cmp     r0, #0                      @ already resolved?
1022    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
10238:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1024    mov     r2, #0                      @ r2<- false
1025    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1026    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1027    cmp     r0, #0                      @ got null?
1028    beq     common_exceptionThrown      @ yes, handle exception
1029    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1030
1031
1032/* ------------------------------ */
1033    .balign 64
1034.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1035/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1036    /* fill-array-data vAA, +BBBBBBBB */
1037    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1038    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1039    mov     r3, rINST, lsr #8           @ r3<- AA
1040    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1041    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1042    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1043    EXPORT_PC();
1044    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1045    cmp     r0, #0                      @ 0 means an exception is thrown
1046    beq     common_exceptionThrown      @ has exception
1047    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1048    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1049    GOTO_OPCODE(ip)                     @ jump to next instruction
1050
1051/* ------------------------------ */
1052    .balign 64
1053.L_OP_THROW: /* 0x27 */
1054/* File: armv5te/OP_THROW.S */
1055    /*
1056     * Throw an exception object in the current thread.
1057     */
1058    /* throw vAA */
1059    mov     r2, rINST, lsr #8           @ r2<- AA
1060    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1061    EXPORT_PC()                         @ exception handler can throw
1062    cmp     r1, #0                      @ null object?
1063    beq     common_errNullObject        @ yes, throw an NPE instead
1064    @ bypass dvmSetException, just store it
1065    str     r1, [rSELF, #offThread_exception]  @ thread->exception<- obj
1066    b       common_exceptionThrown
1067
1068/* ------------------------------ */
1069    .balign 64
1070.L_OP_GOTO: /* 0x28 */
1071/* File: armv5te/OP_GOTO.S */
1072    /*
1073     * Unconditional branch, 8-bit offset.
1074     *
1075     * The branch distance is a signed code-unit offset, which we need to
1076     * double to get a byte offset.
1077     */
1078    /* goto +AA */
1079    /* tuning: use sbfx for 6t2+ targets */
1080    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1081    movs    r1, r0, asr #24             @ r1<- ssssssAA (sign-extended)
1082    add     r2, r1, r1                  @ r2<- byte offset, set flags
1083       @ If backwards branch refresh rIBASE
1084    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1085    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1086#if defined(WITH_JIT)
1087    ldr     r0, [rSELF, #offThread_pJitProfTable]
1088    bmi     common_testUpdateProfile    @ (r0) check for trace hotness
1089#endif
1090    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1091    GOTO_OPCODE(ip)                     @ jump to next instruction
1092
1093/* ------------------------------ */
1094    .balign 64
1095.L_OP_GOTO_16: /* 0x29 */
1096/* File: armv5te/OP_GOTO_16.S */
1097    /*
1098     * Unconditional branch, 16-bit offset.
1099     *
1100     * The branch distance is a signed code-unit offset, which we need to
1101     * double to get a byte offset.
1102     */
1103    /* goto/16 +AAAA */
1104    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1105    adds    r1, r0, r0                  @ r1<- byte offset, flags set
1106    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1107    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1108#if defined(WITH_JIT)
1109    ldr     r0, [rSELF, #offThread_pJitProfTable]
1110    bmi     common_testUpdateProfile    @ (r0) hot trace head?
1111#endif
1112    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1113    GOTO_OPCODE(ip)                     @ jump to next instruction
1114
1115/* ------------------------------ */
1116    .balign 64
1117.L_OP_GOTO_32: /* 0x2a */
1118/* File: armv5te/OP_GOTO_32.S */
1119    /*
1120     * Unconditional branch, 32-bit offset.
1121     *
1122     * The branch distance is a signed code-unit offset, which we need to
1123     * double to get a byte offset.
1124     *
1125     * Unlike most opcodes, this one is allowed to branch to itself, so
1126     * our "backward branch" test must be "<=0" instead of "<0".  Because
1127     * we need the V bit set, we'll use an adds to convert from Dalvik
1128     * offset to byte offset.
1129     */
1130    /* goto/32 +AAAAAAAA */
1131    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1132    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1133    orr     r0, r0, r1, lsl #16         @ r0<- AAAAaaaa
1134    adds    r1, r0, r0                  @ r1<- byte offset
1135#if defined(WITH_JIT)
1136    ldr     r0, [rSELF, #offThread_pJitProfTable]
1137    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1138    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1139    ble     common_testUpdateProfile    @ (r0) hot trace head?
1140#else
1141    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1142    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1143#endif
1144    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1145    GOTO_OPCODE(ip)                     @ jump to next instruction
1146
1147/* ------------------------------ */
1148    .balign 64
1149.L_OP_PACKED_SWITCH: /* 0x2b */
1150/* File: armv5te/OP_PACKED_SWITCH.S */
1151    /*
1152     * Handle a packed-switch or sparse-switch instruction.  In both cases
1153     * we decode it and hand it off to a helper function.
1154     *
1155     * We don't really expect backward branches in a switch statement, but
1156     * they're perfectly legal, so we check for them here.
1157     *
1158     * When the JIT is present, all targets are considered treated as
1159     * a potential trace heads regardless of branch direction.
1160     *
1161     * for: packed-switch, sparse-switch
1162     */
1163    /* op vAA, +BBBB */
1164    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1165    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1166    mov     r3, rINST, lsr #8           @ r3<- AA
1167    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1168    GET_VREG(r1, r3)                    @ r1<- vAA
1169    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1170    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1171    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1172#if defined(WITH_JIT)
1173    ldr     r0, [rSELF, #offThread_pJitProfTable]
1174    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1175    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1176    cmp     r0, #0
1177    bne     common_updateProfile
1178#else
1179    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1180    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1181#endif
1182    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1183    GOTO_OPCODE(ip)                     @ jump to next instruction
1184
1185/* ------------------------------ */
1186    .balign 64
1187.L_OP_SPARSE_SWITCH: /* 0x2c */
1188/* File: armv5te/OP_SPARSE_SWITCH.S */
1189/* File: armv5te/OP_PACKED_SWITCH.S */
1190    /*
1191     * Handle a packed-switch or sparse-switch instruction.  In both cases
1192     * we decode it and hand it off to a helper function.
1193     *
1194     * We don't really expect backward branches in a switch statement, but
1195     * they're perfectly legal, so we check for them here.
1196     *
1197     * When the JIT is present, all targets are considered treated as
1198     * a potential trace heads regardless of branch direction.
1199     *
1200     * for: packed-switch, sparse-switch
1201     */
1202    /* op vAA, +BBBB */
1203    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1204    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1205    mov     r3, rINST, lsr #8           @ r3<- AA
1206    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1207    GET_VREG(r1, r3)                    @ r1<- vAA
1208    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1209    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1210    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1211#if defined(WITH_JIT)
1212    ldr     r0, [rSELF, #offThread_pJitProfTable]
1213    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1214    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1215    cmp     r0, #0
1216    bne     common_updateProfile
1217#else
1218    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1219    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1220#endif
1221    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1222    GOTO_OPCODE(ip)                     @ jump to next instruction
1223
1224
1225/* ------------------------------ */
1226    .balign 64
1227.L_OP_CMPL_FLOAT: /* 0x2d */
1228/* File: arm-vfp/OP_CMPL_FLOAT.S */
1229    /*
1230     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1231     * destination register based on the results of the comparison.
1232     *
1233     * int compare(x, y) {
1234     *     if (x == y) {
1235     *         return 0;
1236     *     } else if (x > y) {
1237     *         return 1;
1238     *     } else if (x < y) {
1239     *         return -1;
1240     *     } else {
1241     *         return -1;
1242     *     }
1243     * }
1244     */
1245    /* op vAA, vBB, vCC */
1246    FETCH(r0, 1)                        @ r0<- CCBB
1247    mov     r9, rINST, lsr #8           @ r9<- AA
1248    and     r2, r0, #255                @ r2<- BB
1249    mov     r3, r0, lsr #8              @ r3<- CC
1250    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1251    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1252    flds    s0, [r2]                    @ s0<- vBB
1253    flds    s1, [r3]                    @ s1<- vCC
1254    fcmpes  s0, s1                      @ compare (vBB, vCC)
1255    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1256    mvn     r0, #0                      @ r0<- -1 (default)
1257    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1258    fmstat                              @ export status flags
1259    movgt   r0, #1                      @ (greater than) r1<- 1
1260    moveq   r0, #0                      @ (equal) r1<- 0
1261    b       .LOP_CMPL_FLOAT_finish          @ argh
1262
1263
1264/* ------------------------------ */
1265    .balign 64
1266.L_OP_CMPG_FLOAT: /* 0x2e */
1267/* File: arm-vfp/OP_CMPG_FLOAT.S */
1268    /*
1269     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1270     * destination register based on the results of the comparison.
1271     *
1272     * int compare(x, y) {
1273     *     if (x == y) {
1274     *         return 0;
1275     *     } else if (x < y) {
1276     *         return -1;
1277     *     } else if (x > y) {
1278     *         return 1;
1279     *     } else {
1280     *         return 1;
1281     *     }
1282     * }
1283     */
1284    /* op vAA, vBB, vCC */
1285    FETCH(r0, 1)                        @ r0<- CCBB
1286    mov     r9, rINST, lsr #8           @ r9<- AA
1287    and     r2, r0, #255                @ r2<- BB
1288    mov     r3, r0, lsr #8              @ r3<- CC
1289    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1290    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1291    flds    s0, [r2]                    @ s0<- vBB
1292    flds    s1, [r3]                    @ s1<- vCC
1293    fcmpes  s0, s1                      @ compare (vBB, vCC)
1294    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1295    mov     r0, #1                      @ r0<- 1 (default)
1296    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1297    fmstat                              @ export status flags
1298    mvnmi   r0, #0                      @ (less than) r1<- -1
1299    moveq   r0, #0                      @ (equal) r1<- 0
1300    b       .LOP_CMPG_FLOAT_finish          @ argh
1301
1302
1303/* ------------------------------ */
1304    .balign 64
1305.L_OP_CMPL_DOUBLE: /* 0x2f */
1306/* File: arm-vfp/OP_CMPL_DOUBLE.S */
1307    /*
1308     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1309     * destination register based on the results of the comparison.
1310     *
1311     * int compare(x, y) {
1312     *     if (x == y) {
1313     *         return 0;
1314     *     } else if (x > y) {
1315     *         return 1;
1316     *     } else if (x < y) {
1317     *         return -1;
1318     *     } else {
1319     *         return -1;
1320     *     }
1321     * }
1322     */
1323    /* op vAA, vBB, vCC */
1324    FETCH(r0, 1)                        @ r0<- CCBB
1325    mov     r9, rINST, lsr #8           @ r9<- AA
1326    and     r2, r0, #255                @ r2<- BB
1327    mov     r3, r0, lsr #8              @ r3<- CC
1328    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1329    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1330    fldd    d0, [r2]                    @ d0<- vBB
1331    fldd    d1, [r3]                    @ d1<- vCC
1332    fcmped  d0, d1                      @ compare (vBB, vCC)
1333    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1334    mvn     r0, #0                      @ r0<- -1 (default)
1335    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1336    fmstat                              @ export status flags
1337    movgt   r0, #1                      @ (greater than) r1<- 1
1338    moveq   r0, #0                      @ (equal) r1<- 0
1339    b       .LOP_CMPL_DOUBLE_finish          @ argh
1340
1341
1342/* ------------------------------ */
1343    .balign 64
1344.L_OP_CMPG_DOUBLE: /* 0x30 */
1345/* File: arm-vfp/OP_CMPG_DOUBLE.S */
1346    /*
1347     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1348     * destination register based on the results of the comparison.
1349     *
1350     * int compare(x, y) {
1351     *     if (x == y) {
1352     *         return 0;
1353     *     } else if (x < y) {
1354     *         return -1;
1355     *     } else if (x > y) {
1356     *         return 1;
1357     *     } else {
1358     *         return 1;
1359     *     }
1360     * }
1361     */
1362    /* op vAA, vBB, vCC */
1363    FETCH(r0, 1)                        @ r0<- CCBB
1364    mov     r9, rINST, lsr #8           @ r9<- AA
1365    and     r2, r0, #255                @ r2<- BB
1366    mov     r3, r0, lsr #8              @ r3<- CC
1367    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1368    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1369    fldd    d0, [r2]                    @ d0<- vBB
1370    fldd    d1, [r3]                    @ d1<- vCC
1371    fcmped  d0, d1                      @ compare (vBB, vCC)
1372    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1373    mov     r0, #1                      @ r0<- 1 (default)
1374    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1375    fmstat                              @ export status flags
1376    mvnmi   r0, #0                      @ (less than) r1<- -1
1377    moveq   r0, #0                      @ (equal) r1<- 0
1378    b       .LOP_CMPG_DOUBLE_finish          @ argh
1379
1380
1381/* ------------------------------ */
1382    .balign 64
1383.L_OP_CMP_LONG: /* 0x31 */
1384/* File: armv5te/OP_CMP_LONG.S */
1385    /*
1386     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1387     * register based on the results of the comparison.
1388     *
1389     * We load the full values with LDM, but in practice many values could
1390     * be resolved by only looking at the high word.  This could be made
1391     * faster or slower by splitting the LDM into a pair of LDRs.
1392     *
1393     * If we just wanted to set condition flags, we could do this:
1394     *  subs    ip, r0, r2
1395     *  sbcs    ip, r1, r3
1396     *  subeqs  ip, r0, r2
1397     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1398     * integer value, which we can do with 2 conditional mov/mvn instructions
1399     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1400     * us a constant 5-cycle path plus a branch at the end to the
1401     * instruction epilogue code.  The multi-compare approach below needs
1402     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1403     * in the worst case (the 64-bit values are equal).
1404     */
1405    /* cmp-long vAA, vBB, vCC */
1406    FETCH(r0, 1)                        @ r0<- CCBB
1407    mov     r9, rINST, lsr #8           @ r9<- AA
1408    and     r2, r0, #255                @ r2<- BB
1409    mov     r3, r0, lsr #8              @ r3<- CC
1410    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1411    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1412    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1413    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1414    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1415    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1416    bgt     .LOP_CMP_LONG_greater
1417    subs    r1, r0, r2                  @ r1<- r0 - r2
1418    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1419    bne     .LOP_CMP_LONG_less
1420    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1421
1422/* ------------------------------ */
1423    .balign 64
1424.L_OP_IF_EQ: /* 0x32 */
1425/* File: armv5te/OP_IF_EQ.S */
1426/* File: armv5te/bincmp.S */
1427    /*
1428     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1429     * fragment that specifies the *reverse* comparison to perform, e.g.
1430     * for "if-le" you would use "gt".
1431     *
1432     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1433     */
1434    /* if-cmp vA, vB, +CCCC */
1435    mov     r0, rINST, lsr #8           @ r0<- A+
1436    mov     r1, rINST, lsr #12          @ r1<- B
1437    and     r0, r0, #15
1438    GET_VREG(r3, r1)                    @ r3<- vB
1439    GET_VREG(r2, r0)                    @ r2<- vA
1440    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1441    cmp     r2, r3                      @ compare (vA, vB)
1442    movne r1, #2                 @ r1<- BYTE branch dist for not-taken
1443    adds    r2, r1, r1                  @ convert to bytes, check sign
1444    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1445#if defined(WITH_JIT)
1446    ldr     r0, [rSELF, #offThread_pJitProfTable]
1447    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1448    cmp     r0,#0
1449    bne     common_updateProfile
1450#else
1451    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1452#endif
1453    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1454    GOTO_OPCODE(ip)                     @ jump to next instruction
1455
1456
1457/* ------------------------------ */
1458    .balign 64
1459.L_OP_IF_NE: /* 0x33 */
1460/* File: armv5te/OP_IF_NE.S */
1461/* File: armv5te/bincmp.S */
1462    /*
1463     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1464     * fragment that specifies the *reverse* comparison to perform, e.g.
1465     * for "if-le" you would use "gt".
1466     *
1467     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1468     */
1469    /* if-cmp vA, vB, +CCCC */
1470    mov     r0, rINST, lsr #8           @ r0<- A+
1471    mov     r1, rINST, lsr #12          @ r1<- B
1472    and     r0, r0, #15
1473    GET_VREG(r3, r1)                    @ r3<- vB
1474    GET_VREG(r2, r0)                    @ r2<- vA
1475    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1476    cmp     r2, r3                      @ compare (vA, vB)
1477    moveq r1, #2                 @ r1<- BYTE branch dist for not-taken
1478    adds    r2, r1, r1                  @ convert to bytes, check sign
1479    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1480#if defined(WITH_JIT)
1481    ldr     r0, [rSELF, #offThread_pJitProfTable]
1482    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1483    cmp     r0,#0
1484    bne     common_updateProfile
1485#else
1486    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1487#endif
1488    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1489    GOTO_OPCODE(ip)                     @ jump to next instruction
1490
1491
1492/* ------------------------------ */
1493    .balign 64
1494.L_OP_IF_LT: /* 0x34 */
1495/* File: armv5te/OP_IF_LT.S */
1496/* File: armv5te/bincmp.S */
1497    /*
1498     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1499     * fragment that specifies the *reverse* comparison to perform, e.g.
1500     * for "if-le" you would use "gt".
1501     *
1502     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1503     */
1504    /* if-cmp vA, vB, +CCCC */
1505    mov     r0, rINST, lsr #8           @ r0<- A+
1506    mov     r1, rINST, lsr #12          @ r1<- B
1507    and     r0, r0, #15
1508    GET_VREG(r3, r1)                    @ r3<- vB
1509    GET_VREG(r2, r0)                    @ r2<- vA
1510    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1511    cmp     r2, r3                      @ compare (vA, vB)
1512    movge r1, #2                 @ r1<- BYTE branch dist for not-taken
1513    adds    r2, r1, r1                  @ convert to bytes, check sign
1514    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1515#if defined(WITH_JIT)
1516    ldr     r0, [rSELF, #offThread_pJitProfTable]
1517    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1518    cmp     r0,#0
1519    bne     common_updateProfile
1520#else
1521    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1522#endif
1523    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1524    GOTO_OPCODE(ip)                     @ jump to next instruction
1525
1526
1527/* ------------------------------ */
1528    .balign 64
1529.L_OP_IF_GE: /* 0x35 */
1530/* File: armv5te/OP_IF_GE.S */
1531/* File: armv5te/bincmp.S */
1532    /*
1533     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1534     * fragment that specifies the *reverse* comparison to perform, e.g.
1535     * for "if-le" you would use "gt".
1536     *
1537     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1538     */
1539    /* if-cmp vA, vB, +CCCC */
1540    mov     r0, rINST, lsr #8           @ r0<- A+
1541    mov     r1, rINST, lsr #12          @ r1<- B
1542    and     r0, r0, #15
1543    GET_VREG(r3, r1)                    @ r3<- vB
1544    GET_VREG(r2, r0)                    @ r2<- vA
1545    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1546    cmp     r2, r3                      @ compare (vA, vB)
1547    movlt r1, #2                 @ r1<- BYTE branch dist for not-taken
1548    adds    r2, r1, r1                  @ convert to bytes, check sign
1549    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1550#if defined(WITH_JIT)
1551    ldr     r0, [rSELF, #offThread_pJitProfTable]
1552    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1553    cmp     r0,#0
1554    bne     common_updateProfile
1555#else
1556    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1557#endif
1558    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1559    GOTO_OPCODE(ip)                     @ jump to next instruction
1560
1561
1562/* ------------------------------ */
1563    .balign 64
1564.L_OP_IF_GT: /* 0x36 */
1565/* File: armv5te/OP_IF_GT.S */
1566/* File: armv5te/bincmp.S */
1567    /*
1568     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1569     * fragment that specifies the *reverse* comparison to perform, e.g.
1570     * for "if-le" you would use "gt".
1571     *
1572     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1573     */
1574    /* if-cmp vA, vB, +CCCC */
1575    mov     r0, rINST, lsr #8           @ r0<- A+
1576    mov     r1, rINST, lsr #12          @ r1<- B
1577    and     r0, r0, #15
1578    GET_VREG(r3, r1)                    @ r3<- vB
1579    GET_VREG(r2, r0)                    @ r2<- vA
1580    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1581    cmp     r2, r3                      @ compare (vA, vB)
1582    movle r1, #2                 @ r1<- BYTE branch dist for not-taken
1583    adds    r2, r1, r1                  @ convert to bytes, check sign
1584    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1585#if defined(WITH_JIT)
1586    ldr     r0, [rSELF, #offThread_pJitProfTable]
1587    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1588    cmp     r0,#0
1589    bne     common_updateProfile
1590#else
1591    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1592#endif
1593    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1594    GOTO_OPCODE(ip)                     @ jump to next instruction
1595
1596
1597/* ------------------------------ */
1598    .balign 64
1599.L_OP_IF_LE: /* 0x37 */
1600/* File: armv5te/OP_IF_LE.S */
1601/* File: armv5te/bincmp.S */
1602    /*
1603     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1604     * fragment that specifies the *reverse* comparison to perform, e.g.
1605     * for "if-le" you would use "gt".
1606     *
1607     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1608     */
1609    /* if-cmp vA, vB, +CCCC */
1610    mov     r0, rINST, lsr #8           @ r0<- A+
1611    mov     r1, rINST, lsr #12          @ r1<- B
1612    and     r0, r0, #15
1613    GET_VREG(r3, r1)                    @ r3<- vB
1614    GET_VREG(r2, r0)                    @ r2<- vA
1615    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1616    cmp     r2, r3                      @ compare (vA, vB)
1617    movgt r1, #2                 @ r1<- BYTE branch dist for not-taken
1618    adds    r2, r1, r1                  @ convert to bytes, check sign
1619    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1620#if defined(WITH_JIT)
1621    ldr     r0, [rSELF, #offThread_pJitProfTable]
1622    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1623    cmp     r0,#0
1624    bne     common_updateProfile
1625#else
1626    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1627#endif
1628    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1629    GOTO_OPCODE(ip)                     @ jump to next instruction
1630
1631
1632/* ------------------------------ */
1633    .balign 64
1634.L_OP_IF_EQZ: /* 0x38 */
1635/* File: armv5te/OP_IF_EQZ.S */
1636/* File: armv5te/zcmp.S */
1637    /*
1638     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1639     * fragment that specifies the *reverse* comparison to perform, e.g.
1640     * for "if-le" you would use "gt".
1641     *
1642     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1643     */
1644    /* if-cmp vAA, +BBBB */
1645    mov     r0, rINST, lsr #8           @ r0<- AA
1646    GET_VREG(r2, r0)                    @ r2<- vAA
1647    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1648    cmp     r2, #0                      @ compare (vA, 0)
1649    movne r1, #2                 @ r1<- inst branch dist for not-taken
1650    adds    r1, r1, r1                  @ convert to bytes & set flags
1651    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1652#if defined(WITH_JIT)
1653    ldr     r0, [rSELF, #offThread_pJitProfTable]
1654    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1655    cmp     r0,#0
1656    bne     common_updateProfile        @ test for JIT off at target
1657#else
1658    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1659#endif
1660    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1661    GOTO_OPCODE(ip)                     @ jump to next instruction
1662
1663
1664/* ------------------------------ */
1665    .balign 64
1666.L_OP_IF_NEZ: /* 0x39 */
1667/* File: armv5te/OP_IF_NEZ.S */
1668/* File: armv5te/zcmp.S */
1669    /*
1670     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1671     * fragment that specifies the *reverse* comparison to perform, e.g.
1672     * for "if-le" you would use "gt".
1673     *
1674     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1675     */
1676    /* if-cmp vAA, +BBBB */
1677    mov     r0, rINST, lsr #8           @ r0<- AA
1678    GET_VREG(r2, r0)                    @ r2<- vAA
1679    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1680    cmp     r2, #0                      @ compare (vA, 0)
1681    moveq r1, #2                 @ r1<- inst branch dist for not-taken
1682    adds    r1, r1, r1                  @ convert to bytes & set flags
1683    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1684#if defined(WITH_JIT)
1685    ldr     r0, [rSELF, #offThread_pJitProfTable]
1686    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1687    cmp     r0,#0
1688    bne     common_updateProfile        @ test for JIT off at target
1689#else
1690    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1691#endif
1692    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1693    GOTO_OPCODE(ip)                     @ jump to next instruction
1694
1695
1696/* ------------------------------ */
1697    .balign 64
1698.L_OP_IF_LTZ: /* 0x3a */
1699/* File: armv5te/OP_IF_LTZ.S */
1700/* File: armv5te/zcmp.S */
1701    /*
1702     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1703     * fragment that specifies the *reverse* comparison to perform, e.g.
1704     * for "if-le" you would use "gt".
1705     *
1706     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1707     */
1708    /* if-cmp vAA, +BBBB */
1709    mov     r0, rINST, lsr #8           @ r0<- AA
1710    GET_VREG(r2, r0)                    @ r2<- vAA
1711    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1712    cmp     r2, #0                      @ compare (vA, 0)
1713    movge r1, #2                 @ r1<- inst branch dist for not-taken
1714    adds    r1, r1, r1                  @ convert to bytes & set flags
1715    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1716#if defined(WITH_JIT)
1717    ldr     r0, [rSELF, #offThread_pJitProfTable]
1718    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1719    cmp     r0,#0
1720    bne     common_updateProfile        @ test for JIT off at target
1721#else
1722    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1723#endif
1724    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1725    GOTO_OPCODE(ip)                     @ jump to next instruction
1726
1727
1728/* ------------------------------ */
1729    .balign 64
1730.L_OP_IF_GEZ: /* 0x3b */
1731/* File: armv5te/OP_IF_GEZ.S */
1732/* File: armv5te/zcmp.S */
1733    /*
1734     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1735     * fragment that specifies the *reverse* comparison to perform, e.g.
1736     * for "if-le" you would use "gt".
1737     *
1738     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1739     */
1740    /* if-cmp vAA, +BBBB */
1741    mov     r0, rINST, lsr #8           @ r0<- AA
1742    GET_VREG(r2, r0)                    @ r2<- vAA
1743    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1744    cmp     r2, #0                      @ compare (vA, 0)
1745    movlt r1, #2                 @ r1<- inst branch dist for not-taken
1746    adds    r1, r1, r1                  @ convert to bytes & set flags
1747    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1748#if defined(WITH_JIT)
1749    ldr     r0, [rSELF, #offThread_pJitProfTable]
1750    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1751    cmp     r0,#0
1752    bne     common_updateProfile        @ test for JIT off at target
1753#else
1754    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1755#endif
1756    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1757    GOTO_OPCODE(ip)                     @ jump to next instruction
1758
1759
1760/* ------------------------------ */
1761    .balign 64
1762.L_OP_IF_GTZ: /* 0x3c */
1763/* File: armv5te/OP_IF_GTZ.S */
1764/* File: armv5te/zcmp.S */
1765    /*
1766     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1767     * fragment that specifies the *reverse* comparison to perform, e.g.
1768     * for "if-le" you would use "gt".
1769     *
1770     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1771     */
1772    /* if-cmp vAA, +BBBB */
1773    mov     r0, rINST, lsr #8           @ r0<- AA
1774    GET_VREG(r2, r0)                    @ r2<- vAA
1775    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1776    cmp     r2, #0                      @ compare (vA, 0)
1777    movle r1, #2                 @ r1<- inst branch dist for not-taken
1778    adds    r1, r1, r1                  @ convert to bytes & set flags
1779    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1780#if defined(WITH_JIT)
1781    ldr     r0, [rSELF, #offThread_pJitProfTable]
1782    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1783    cmp     r0,#0
1784    bne     common_updateProfile        @ test for JIT off at target
1785#else
1786    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1787#endif
1788    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1789    GOTO_OPCODE(ip)                     @ jump to next instruction
1790
1791
1792/* ------------------------------ */
1793    .balign 64
1794.L_OP_IF_LEZ: /* 0x3d */
1795/* File: armv5te/OP_IF_LEZ.S */
1796/* File: armv5te/zcmp.S */
1797    /*
1798     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1799     * fragment that specifies the *reverse* comparison to perform, e.g.
1800     * for "if-le" you would use "gt".
1801     *
1802     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1803     */
1804    /* if-cmp vAA, +BBBB */
1805    mov     r0, rINST, lsr #8           @ r0<- AA
1806    GET_VREG(r2, r0)                    @ r2<- vAA
1807    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1808    cmp     r2, #0                      @ compare (vA, 0)
1809    movgt r1, #2                 @ r1<- inst branch dist for not-taken
1810    adds    r1, r1, r1                  @ convert to bytes & set flags
1811    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1812#if defined(WITH_JIT)
1813    ldr     r0, [rSELF, #offThread_pJitProfTable]
1814    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1815    cmp     r0,#0
1816    bne     common_updateProfile        @ test for JIT off at target
1817#else
1818    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1819#endif
1820    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1821    GOTO_OPCODE(ip)                     @ jump to next instruction
1822
1823
1824/* ------------------------------ */
1825    .balign 64
1826.L_OP_UNUSED_3E: /* 0x3e */
1827/* File: armv5te/OP_UNUSED_3E.S */
1828/* File: armv5te/unused.S */
1829    bl      common_abort
1830
1831
1832/* ------------------------------ */
1833    .balign 64
1834.L_OP_UNUSED_3F: /* 0x3f */
1835/* File: armv5te/OP_UNUSED_3F.S */
1836/* File: armv5te/unused.S */
1837    bl      common_abort
1838
1839
1840/* ------------------------------ */
1841    .balign 64
1842.L_OP_UNUSED_40: /* 0x40 */
1843/* File: armv5te/OP_UNUSED_40.S */
1844/* File: armv5te/unused.S */
1845    bl      common_abort
1846
1847
1848/* ------------------------------ */
1849    .balign 64
1850.L_OP_UNUSED_41: /* 0x41 */
1851/* File: armv5te/OP_UNUSED_41.S */
1852/* File: armv5te/unused.S */
1853    bl      common_abort
1854
1855
1856/* ------------------------------ */
1857    .balign 64
1858.L_OP_UNUSED_42: /* 0x42 */
1859/* File: armv5te/OP_UNUSED_42.S */
1860/* File: armv5te/unused.S */
1861    bl      common_abort
1862
1863
1864/* ------------------------------ */
1865    .balign 64
1866.L_OP_UNUSED_43: /* 0x43 */
1867/* File: armv5te/OP_UNUSED_43.S */
1868/* File: armv5te/unused.S */
1869    bl      common_abort
1870
1871
1872/* ------------------------------ */
1873    .balign 64
1874.L_OP_AGET: /* 0x44 */
1875/* File: armv5te/OP_AGET.S */
1876    /*
1877     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1878     *
1879     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1880     * instructions.  We use a pair of FETCH_Bs instead.
1881     *
1882     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1883     */
1884    /* op vAA, vBB, vCC */
1885    FETCH_B(r2, 1, 0)                   @ r2<- BB
1886    mov     r9, rINST, lsr #8           @ r9<- AA
1887    FETCH_B(r3, 1, 1)                   @ r3<- CC
1888    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1889    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1890    cmp     r0, #0                      @ null array object?
1891    beq     common_errNullObject        @ yes, bail
1892    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1893    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1894    cmp     r1, r3                      @ compare unsigned index, length
1895    bcs     common_errArrayIndex        @ index >= length, bail
1896    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1897    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1898    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1899    SET_VREG(r2, r9)                    @ vAA<- r2
1900    GOTO_OPCODE(ip)                     @ jump to next instruction
1901
1902/* ------------------------------ */
1903    .balign 64
1904.L_OP_AGET_WIDE: /* 0x45 */
1905/* File: armv5te/OP_AGET_WIDE.S */
1906    /*
1907     * Array get, 64 bits.  vAA <- vBB[vCC].
1908     *
1909     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
1910     */
1911    /* aget-wide vAA, vBB, vCC */
1912    FETCH(r0, 1)                        @ r0<- CCBB
1913    mov     r9, rINST, lsr #8           @ r9<- AA
1914    and     r2, r0, #255                @ r2<- BB
1915    mov     r3, r0, lsr #8              @ r3<- CC
1916    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1917    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1918    cmp     r0, #0                      @ null array object?
1919    beq     common_errNullObject        @ yes, bail
1920    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1921    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
1922    cmp     r1, r3                      @ compare unsigned index, length
1923    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
1924    b       common_errArrayIndex        @ index >= length, bail
1925    @ May want to swap the order of these two branches depending on how the
1926    @ branch prediction (if any) handles conditional forward branches vs.
1927    @ unconditional forward branches.
1928
1929/* ------------------------------ */
1930    .balign 64
1931.L_OP_AGET_OBJECT: /* 0x46 */
1932/* File: armv5te/OP_AGET_OBJECT.S */
1933/* File: armv5te/OP_AGET.S */
1934    /*
1935     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1936     *
1937     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1938     * instructions.  We use a pair of FETCH_Bs instead.
1939     *
1940     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1941     */
1942    /* op vAA, vBB, vCC */
1943    FETCH_B(r2, 1, 0)                   @ r2<- BB
1944    mov     r9, rINST, lsr #8           @ r9<- AA
1945    FETCH_B(r3, 1, 1)                   @ r3<- CC
1946    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1947    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1948    cmp     r0, #0                      @ null array object?
1949    beq     common_errNullObject        @ yes, bail
1950    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1951    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1952    cmp     r1, r3                      @ compare unsigned index, length
1953    bcs     common_errArrayIndex        @ index >= length, bail
1954    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1955    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1956    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1957    SET_VREG(r2, r9)                    @ vAA<- r2
1958    GOTO_OPCODE(ip)                     @ jump to next instruction
1959
1960
1961/* ------------------------------ */
1962    .balign 64
1963.L_OP_AGET_BOOLEAN: /* 0x47 */
1964/* File: armv5te/OP_AGET_BOOLEAN.S */
1965/* File: armv5te/OP_AGET.S */
1966    /*
1967     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1968     *
1969     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1970     * instructions.  We use a pair of FETCH_Bs instead.
1971     *
1972     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1973     */
1974    /* op vAA, vBB, vCC */
1975    FETCH_B(r2, 1, 0)                   @ r2<- BB
1976    mov     r9, rINST, lsr #8           @ r9<- AA
1977    FETCH_B(r3, 1, 1)                   @ r3<- CC
1978    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1979    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1980    cmp     r0, #0                      @ null array object?
1981    beq     common_errNullObject        @ yes, bail
1982    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1983    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
1984    cmp     r1, r3                      @ compare unsigned index, length
1985    bcs     common_errArrayIndex        @ index >= length, bail
1986    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1987    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1988    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1989    SET_VREG(r2, r9)                    @ vAA<- r2
1990    GOTO_OPCODE(ip)                     @ jump to next instruction
1991
1992
1993/* ------------------------------ */
1994    .balign 64
1995.L_OP_AGET_BYTE: /* 0x48 */
1996/* File: armv5te/OP_AGET_BYTE.S */
1997/* File: armv5te/OP_AGET.S */
1998    /*
1999     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2000     *
2001     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2002     * instructions.  We use a pair of FETCH_Bs instead.
2003     *
2004     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2005     */
2006    /* op vAA, vBB, vCC */
2007    FETCH_B(r2, 1, 0)                   @ r2<- BB
2008    mov     r9, rINST, lsr #8           @ r9<- AA
2009    FETCH_B(r3, 1, 1)                   @ r3<- CC
2010    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2011    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2012    cmp     r0, #0                      @ null array object?
2013    beq     common_errNullObject        @ yes, bail
2014    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2015    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2016    cmp     r1, r3                      @ compare unsigned index, length
2017    bcs     common_errArrayIndex        @ index >= length, bail
2018    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2019    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2020    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2021    SET_VREG(r2, r9)                    @ vAA<- r2
2022    GOTO_OPCODE(ip)                     @ jump to next instruction
2023
2024
2025/* ------------------------------ */
2026    .balign 64
2027.L_OP_AGET_CHAR: /* 0x49 */
2028/* File: armv5te/OP_AGET_CHAR.S */
2029/* File: armv5te/OP_AGET.S */
2030    /*
2031     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2032     *
2033     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2034     * instructions.  We use a pair of FETCH_Bs instead.
2035     *
2036     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2037     */
2038    /* op vAA, vBB, vCC */
2039    FETCH_B(r2, 1, 0)                   @ r2<- BB
2040    mov     r9, rINST, lsr #8           @ r9<- AA
2041    FETCH_B(r3, 1, 1)                   @ r3<- CC
2042    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2043    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2044    cmp     r0, #0                      @ null array object?
2045    beq     common_errNullObject        @ yes, bail
2046    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2047    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2048    cmp     r1, r3                      @ compare unsigned index, length
2049    bcs     common_errArrayIndex        @ index >= length, bail
2050    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2051    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2052    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2053    SET_VREG(r2, r9)                    @ vAA<- r2
2054    GOTO_OPCODE(ip)                     @ jump to next instruction
2055
2056
2057/* ------------------------------ */
2058    .balign 64
2059.L_OP_AGET_SHORT: /* 0x4a */
2060/* File: armv5te/OP_AGET_SHORT.S */
2061/* File: armv5te/OP_AGET.S */
2062    /*
2063     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2064     *
2065     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2066     * instructions.  We use a pair of FETCH_Bs instead.
2067     *
2068     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2069     */
2070    /* op vAA, vBB, vCC */
2071    FETCH_B(r2, 1, 0)                   @ r2<- BB
2072    mov     r9, rINST, lsr #8           @ r9<- AA
2073    FETCH_B(r3, 1, 1)                   @ r3<- CC
2074    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2075    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2076    cmp     r0, #0                      @ null array object?
2077    beq     common_errNullObject        @ yes, bail
2078    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2079    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2080    cmp     r1, r3                      @ compare unsigned index, length
2081    bcs     common_errArrayIndex        @ index >= length, bail
2082    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2083    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2084    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2085    SET_VREG(r2, r9)                    @ vAA<- r2
2086    GOTO_OPCODE(ip)                     @ jump to next instruction
2087
2088
2089/* ------------------------------ */
2090    .balign 64
2091.L_OP_APUT: /* 0x4b */
2092/* File: armv5te/OP_APUT.S */
2093    /*
2094     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2095     *
2096     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2097     * instructions.  We use a pair of FETCH_Bs instead.
2098     *
2099     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2100     */
2101    /* op vAA, vBB, vCC */
2102    FETCH_B(r2, 1, 0)                   @ r2<- BB
2103    mov     r9, rINST, lsr #8           @ r9<- AA
2104    FETCH_B(r3, 1, 1)                   @ r3<- CC
2105    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2106    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2107    cmp     r0, #0                      @ null array object?
2108    beq     common_errNullObject        @ yes, bail
2109    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2110    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2111    cmp     r1, r3                      @ compare unsigned index, length
2112    bcs     common_errArrayIndex        @ index >= length, bail
2113    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2114    GET_VREG(r2, r9)                    @ r2<- vAA
2115    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2116    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2117    GOTO_OPCODE(ip)                     @ jump to next instruction
2118
2119/* ------------------------------ */
2120    .balign 64
2121.L_OP_APUT_WIDE: /* 0x4c */
2122/* File: armv5te/OP_APUT_WIDE.S */
2123    /*
2124     * Array put, 64 bits.  vBB[vCC] <- vAA.
2125     *
2126     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2127     */
2128    /* aput-wide vAA, vBB, vCC */
2129    FETCH(r0, 1)                        @ r0<- CCBB
2130    mov     r9, rINST, lsr #8           @ r9<- AA
2131    and     r2, r0, #255                @ r2<- BB
2132    mov     r3, r0, lsr #8              @ r3<- CC
2133    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2134    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2135    cmp     r0, #0                      @ null array object?
2136    beq     common_errNullObject        @ yes, bail
2137    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2138    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2139    cmp     r1, r3                      @ compare unsigned index, length
2140    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2141    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2142    b       common_errArrayIndex        @ index >= length, bail
2143    @ May want to swap the order of these two branches depending on how the
2144    @ branch prediction (if any) handles conditional forward branches vs.
2145    @ unconditional forward branches.
2146
2147/* ------------------------------ */
2148    .balign 64
2149.L_OP_APUT_OBJECT: /* 0x4d */
2150/* File: armv5te/OP_APUT_OBJECT.S */
2151    /*
2152     * Store an object into an array.  vBB[vCC] <- vAA.
2153     */
2154    /* op vAA, vBB, vCC */
2155    FETCH(r0, 1)                        @ r0<- CCBB
2156    mov     r9, rINST, lsr #8           @ r9<- AA
2157    and     r2, r0, #255                @ r2<- BB
2158    mov     r3, r0, lsr #8              @ r3<- CC
2159    GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
2160    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2161    cmp     rINST, #0                   @ null array object?
2162    GET_VREG(r9, r9)                    @ r9<- vAA
2163    beq     common_errNullObject        @ yes, bail
2164    ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
2165    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
2166    cmp     r1, r3                      @ compare unsigned index, length
2167    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2168    b       common_errArrayIndex        @ index >= length, bail
2169
2170
2171/* ------------------------------ */
2172    .balign 64
2173.L_OP_APUT_BOOLEAN: /* 0x4e */
2174/* File: armv5te/OP_APUT_BOOLEAN.S */
2175/* File: armv5te/OP_APUT.S */
2176    /*
2177     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2178     *
2179     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2180     * instructions.  We use a pair of FETCH_Bs instead.
2181     *
2182     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2183     */
2184    /* op vAA, vBB, vCC */
2185    FETCH_B(r2, 1, 0)                   @ r2<- BB
2186    mov     r9, rINST, lsr #8           @ r9<- AA
2187    FETCH_B(r3, 1, 1)                   @ r3<- CC
2188    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2189    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2190    cmp     r0, #0                      @ null array object?
2191    beq     common_errNullObject        @ yes, bail
2192    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2193    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2194    cmp     r1, r3                      @ compare unsigned index, length
2195    bcs     common_errArrayIndex        @ index >= length, bail
2196    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2197    GET_VREG(r2, r9)                    @ r2<- vAA
2198    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2199    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2200    GOTO_OPCODE(ip)                     @ jump to next instruction
2201
2202
2203/* ------------------------------ */
2204    .balign 64
2205.L_OP_APUT_BYTE: /* 0x4f */
2206/* File: armv5te/OP_APUT_BYTE.S */
2207/* File: armv5te/OP_APUT.S */
2208    /*
2209     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2210     *
2211     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2212     * instructions.  We use a pair of FETCH_Bs instead.
2213     *
2214     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2215     */
2216    /* op vAA, vBB, vCC */
2217    FETCH_B(r2, 1, 0)                   @ r2<- BB
2218    mov     r9, rINST, lsr #8           @ r9<- AA
2219    FETCH_B(r3, 1, 1)                   @ r3<- CC
2220    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2221    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2222    cmp     r0, #0                      @ null array object?
2223    beq     common_errNullObject        @ yes, bail
2224    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2225    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2226    cmp     r1, r3                      @ compare unsigned index, length
2227    bcs     common_errArrayIndex        @ index >= length, bail
2228    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2229    GET_VREG(r2, r9)                    @ r2<- vAA
2230    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2231    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2232    GOTO_OPCODE(ip)                     @ jump to next instruction
2233
2234
2235/* ------------------------------ */
2236    .balign 64
2237.L_OP_APUT_CHAR: /* 0x50 */
2238/* File: armv5te/OP_APUT_CHAR.S */
2239/* File: armv5te/OP_APUT.S */
2240    /*
2241     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2242     *
2243     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2244     * instructions.  We use a pair of FETCH_Bs instead.
2245     *
2246     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2247     */
2248    /* op vAA, vBB, vCC */
2249    FETCH_B(r2, 1, 0)                   @ r2<- BB
2250    mov     r9, rINST, lsr #8           @ r9<- AA
2251    FETCH_B(r3, 1, 1)                   @ r3<- CC
2252    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2253    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2254    cmp     r0, #0                      @ null array object?
2255    beq     common_errNullObject        @ yes, bail
2256    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2257    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2258    cmp     r1, r3                      @ compare unsigned index, length
2259    bcs     common_errArrayIndex        @ index >= length, bail
2260    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2261    GET_VREG(r2, r9)                    @ r2<- vAA
2262    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2263    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2264    GOTO_OPCODE(ip)                     @ jump to next instruction
2265
2266
2267/* ------------------------------ */
2268    .balign 64
2269.L_OP_APUT_SHORT: /* 0x51 */
2270/* File: armv5te/OP_APUT_SHORT.S */
2271/* File: armv5te/OP_APUT.S */
2272    /*
2273     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2274     *
2275     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2276     * instructions.  We use a pair of FETCH_Bs instead.
2277     *
2278     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2279     */
2280    /* op vAA, vBB, vCC */
2281    FETCH_B(r2, 1, 0)                   @ r2<- BB
2282    mov     r9, rINST, lsr #8           @ r9<- AA
2283    FETCH_B(r3, 1, 1)                   @ r3<- CC
2284    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2285    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2286    cmp     r0, #0                      @ null array object?
2287    beq     common_errNullObject        @ yes, bail
2288    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2289    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2290    cmp     r1, r3                      @ compare unsigned index, length
2291    bcs     common_errArrayIndex        @ index >= length, bail
2292    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2293    GET_VREG(r2, r9)                    @ r2<- vAA
2294    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2295    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2296    GOTO_OPCODE(ip)                     @ jump to next instruction
2297
2298
2299/* ------------------------------ */
2300    .balign 64
2301.L_OP_IGET: /* 0x52 */
2302/* File: armv5te/OP_IGET.S */
2303    /*
2304     * General 32-bit instance field get.
2305     *
2306     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2307     */
2308    /* op vA, vB, field@CCCC */
2309    mov     r0, rINST, lsr #12          @ r0<- B
2310    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2311    FETCH(r1, 1)                        @ r1<- field ref CCCC
2312    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2313    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2314    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2315    cmp     r0, #0                      @ is resolved entry null?
2316    bne     .LOP_IGET_finish          @ no, already resolved
23178:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2318    EXPORT_PC()                         @ resolve() could throw
2319    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2320    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2321    cmp     r0, #0
2322    bne     .LOP_IGET_finish
2323    b       common_exceptionThrown
2324
2325/* ------------------------------ */
2326    .balign 64
2327.L_OP_IGET_WIDE: /* 0x53 */
2328/* File: armv5te/OP_IGET_WIDE.S */
2329    /*
2330     * Wide 32-bit instance field get.
2331     */
2332    /* iget-wide vA, vB, field@CCCC */
2333    mov     r0, rINST, lsr #12          @ r0<- B
2334    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2335    FETCH(r1, 1)                        @ r1<- field ref CCCC
2336    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2337    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2338    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2339    cmp     r0, #0                      @ is resolved entry null?
2340    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
23418:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2342    EXPORT_PC()                         @ resolve() could throw
2343    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2344    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2345    cmp     r0, #0
2346    bne     .LOP_IGET_WIDE_finish
2347    b       common_exceptionThrown
2348
2349/* ------------------------------ */
2350    .balign 64
2351.L_OP_IGET_OBJECT: /* 0x54 */
2352/* File: armv5te/OP_IGET_OBJECT.S */
2353/* File: armv5te/OP_IGET.S */
2354    /*
2355     * General 32-bit instance field get.
2356     *
2357     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2358     */
2359    /* op vA, vB, field@CCCC */
2360    mov     r0, rINST, lsr #12          @ r0<- B
2361    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2362    FETCH(r1, 1)                        @ r1<- field ref CCCC
2363    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2364    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2365    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2366    cmp     r0, #0                      @ is resolved entry null?
2367    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
23688:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2369    EXPORT_PC()                         @ resolve() could throw
2370    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2371    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2372    cmp     r0, #0
2373    bne     .LOP_IGET_OBJECT_finish
2374    b       common_exceptionThrown
2375
2376
2377/* ------------------------------ */
2378    .balign 64
2379.L_OP_IGET_BOOLEAN: /* 0x55 */
2380/* File: armv5te/OP_IGET_BOOLEAN.S */
2381@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2382/* File: armv5te/OP_IGET.S */
2383    /*
2384     * General 32-bit instance field get.
2385     *
2386     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2387     */
2388    /* op vA, vB, field@CCCC */
2389    mov     r0, rINST, lsr #12          @ r0<- B
2390    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2391    FETCH(r1, 1)                        @ r1<- field ref CCCC
2392    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2393    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2394    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2395    cmp     r0, #0                      @ is resolved entry null?
2396    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
23978:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2398    EXPORT_PC()                         @ resolve() could throw
2399    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2400    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2401    cmp     r0, #0
2402    bne     .LOP_IGET_BOOLEAN_finish
2403    b       common_exceptionThrown
2404
2405
2406/* ------------------------------ */
2407    .balign 64
2408.L_OP_IGET_BYTE: /* 0x56 */
2409/* File: armv5te/OP_IGET_BYTE.S */
2410@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2411/* File: armv5te/OP_IGET.S */
2412    /*
2413     * General 32-bit instance field get.
2414     *
2415     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2416     */
2417    /* op vA, vB, field@CCCC */
2418    mov     r0, rINST, lsr #12          @ r0<- B
2419    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2420    FETCH(r1, 1)                        @ r1<- field ref CCCC
2421    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2422    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2423    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2424    cmp     r0, #0                      @ is resolved entry null?
2425    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
24268:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2427    EXPORT_PC()                         @ resolve() could throw
2428    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2429    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2430    cmp     r0, #0
2431    bne     .LOP_IGET_BYTE_finish
2432    b       common_exceptionThrown
2433
2434
2435/* ------------------------------ */
2436    .balign 64
2437.L_OP_IGET_CHAR: /* 0x57 */
2438/* File: armv5te/OP_IGET_CHAR.S */
2439@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2440/* File: armv5te/OP_IGET.S */
2441    /*
2442     * General 32-bit instance field get.
2443     *
2444     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2445     */
2446    /* op vA, vB, field@CCCC */
2447    mov     r0, rINST, lsr #12          @ r0<- B
2448    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2449    FETCH(r1, 1)                        @ r1<- field ref CCCC
2450    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2451    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2452    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2453    cmp     r0, #0                      @ is resolved entry null?
2454    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
24558:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2456    EXPORT_PC()                         @ resolve() could throw
2457    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2458    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2459    cmp     r0, #0
2460    bne     .LOP_IGET_CHAR_finish
2461    b       common_exceptionThrown
2462
2463
2464/* ------------------------------ */
2465    .balign 64
2466.L_OP_IGET_SHORT: /* 0x58 */
2467/* File: armv5te/OP_IGET_SHORT.S */
2468@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2469/* File: armv5te/OP_IGET.S */
2470    /*
2471     * General 32-bit instance field get.
2472     *
2473     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2474     */
2475    /* op vA, vB, field@CCCC */
2476    mov     r0, rINST, lsr #12          @ r0<- B
2477    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2478    FETCH(r1, 1)                        @ r1<- field ref CCCC
2479    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2480    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2481    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2482    cmp     r0, #0                      @ is resolved entry null?
2483    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
24848:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2485    EXPORT_PC()                         @ resolve() could throw
2486    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2487    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2488    cmp     r0, #0
2489    bne     .LOP_IGET_SHORT_finish
2490    b       common_exceptionThrown
2491
2492
2493/* ------------------------------ */
2494    .balign 64
2495.L_OP_IPUT: /* 0x59 */
2496/* File: armv5te/OP_IPUT.S */
2497    /*
2498     * General 32-bit instance field put.
2499     *
2500     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2501     */
2502    /* op vA, vB, field@CCCC */
2503    mov     r0, rINST, lsr #12          @ r0<- B
2504    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2505    FETCH(r1, 1)                        @ r1<- field ref CCCC
2506    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2507    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2508    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2509    cmp     r0, #0                      @ is resolved entry null?
2510    bne     .LOP_IPUT_finish          @ no, already resolved
25118:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2512    EXPORT_PC()                         @ resolve() could throw
2513    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2514    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2515    cmp     r0, #0                      @ success?
2516    bne     .LOP_IPUT_finish          @ yes, finish up
2517    b       common_exceptionThrown
2518
2519/* ------------------------------ */
2520    .balign 64
2521.L_OP_IPUT_WIDE: /* 0x5a */
2522/* File: armv5te/OP_IPUT_WIDE.S */
2523    /* iput-wide vA, vB, field@CCCC */
2524    mov     r0, rINST, lsr #12          @ r0<- B
2525    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2526    FETCH(r1, 1)                        @ r1<- field ref CCCC
2527    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2528    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2529    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2530    cmp     r0, #0                      @ is resolved entry null?
2531    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
25328:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2533    EXPORT_PC()                         @ resolve() could throw
2534    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2535    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2536    cmp     r0, #0                      @ success?
2537    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2538    b       common_exceptionThrown
2539
2540/* ------------------------------ */
2541    .balign 64
2542.L_OP_IPUT_OBJECT: /* 0x5b */
2543/* File: armv5te/OP_IPUT_OBJECT.S */
2544    /*
2545     * 32-bit instance field put.
2546     *
2547     * for: iput-object, iput-object-volatile
2548     */
2549    /* op vA, vB, field@CCCC */
2550    mov     r0, rINST, lsr #12          @ r0<- B
2551    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2552    FETCH(r1, 1)                        @ r1<- field ref CCCC
2553    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2554    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2555    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2556    cmp     r0, #0                      @ is resolved entry null?
2557    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
25588:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2559    EXPORT_PC()                         @ resolve() could throw
2560    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2561    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2562    cmp     r0, #0                      @ success?
2563    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2564    b       common_exceptionThrown
2565
2566/* ------------------------------ */
2567    .balign 64
2568.L_OP_IPUT_BOOLEAN: /* 0x5c */
2569/* File: armv5te/OP_IPUT_BOOLEAN.S */
2570@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2571/* File: armv5te/OP_IPUT.S */
2572    /*
2573     * General 32-bit instance field put.
2574     *
2575     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2576     */
2577    /* op vA, vB, field@CCCC */
2578    mov     r0, rINST, lsr #12          @ r0<- B
2579    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2580    FETCH(r1, 1)                        @ r1<- field ref CCCC
2581    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2582    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2583    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2584    cmp     r0, #0                      @ is resolved entry null?
2585    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
25868:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2587    EXPORT_PC()                         @ resolve() could throw
2588    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2589    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2590    cmp     r0, #0                      @ success?
2591    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2592    b       common_exceptionThrown
2593
2594
2595/* ------------------------------ */
2596    .balign 64
2597.L_OP_IPUT_BYTE: /* 0x5d */
2598/* File: armv5te/OP_IPUT_BYTE.S */
2599@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2600/* File: armv5te/OP_IPUT.S */
2601    /*
2602     * General 32-bit instance field put.
2603     *
2604     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2605     */
2606    /* op vA, vB, field@CCCC */
2607    mov     r0, rINST, lsr #12          @ r0<- B
2608    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2609    FETCH(r1, 1)                        @ r1<- field ref CCCC
2610    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2611    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2612    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2613    cmp     r0, #0                      @ is resolved entry null?
2614    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
26158:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2616    EXPORT_PC()                         @ resolve() could throw
2617    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2618    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2619    cmp     r0, #0                      @ success?
2620    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2621    b       common_exceptionThrown
2622
2623
2624/* ------------------------------ */
2625    .balign 64
2626.L_OP_IPUT_CHAR: /* 0x5e */
2627/* File: armv5te/OP_IPUT_CHAR.S */
2628@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2629/* File: armv5te/OP_IPUT.S */
2630    /*
2631     * General 32-bit instance field put.
2632     *
2633     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2634     */
2635    /* op vA, vB, field@CCCC */
2636    mov     r0, rINST, lsr #12          @ r0<- B
2637    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2638    FETCH(r1, 1)                        @ r1<- field ref CCCC
2639    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2640    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2641    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2642    cmp     r0, #0                      @ is resolved entry null?
2643    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
26448:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2645    EXPORT_PC()                         @ resolve() could throw
2646    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2647    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2648    cmp     r0, #0                      @ success?
2649    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2650    b       common_exceptionThrown
2651
2652
2653/* ------------------------------ */
2654    .balign 64
2655.L_OP_IPUT_SHORT: /* 0x5f */
2656/* File: armv5te/OP_IPUT_SHORT.S */
2657@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2658/* File: armv5te/OP_IPUT.S */
2659    /*
2660     * General 32-bit instance field put.
2661     *
2662     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2663     */
2664    /* op vA, vB, field@CCCC */
2665    mov     r0, rINST, lsr #12          @ r0<- B
2666    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2667    FETCH(r1, 1)                        @ r1<- field ref CCCC
2668    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2669    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2670    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2671    cmp     r0, #0                      @ is resolved entry null?
2672    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
26738:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2674    EXPORT_PC()                         @ resolve() could throw
2675    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2676    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2677    cmp     r0, #0                      @ success?
2678    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2679    b       common_exceptionThrown
2680
2681
2682/* ------------------------------ */
2683    .balign 64
2684.L_OP_SGET: /* 0x60 */
2685/* File: armv5te/OP_SGET.S */
2686    /*
2687     * General 32-bit SGET handler.
2688     *
2689     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2690     */
2691    /* op vAA, field@BBBB */
2692    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2693    FETCH(r1, 1)                        @ r1<- field ref BBBB
2694    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2695    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2696    cmp     r0, #0                      @ is resolved entry null?
2697    beq     .LOP_SGET_resolve         @ yes, do resolve
2698.LOP_SGET_finish: @ field ptr in r0
2699    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2700    @ no-op                             @ acquiring load
2701    mov     r2, rINST, lsr #8           @ r2<- AA
2702    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2703    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2704    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2705    GOTO_OPCODE(ip)                     @ jump to next instruction
2706
2707/* ------------------------------ */
2708    .balign 64
2709.L_OP_SGET_WIDE: /* 0x61 */
2710/* File: armv5te/OP_SGET_WIDE.S */
2711    /*
2712     * 64-bit SGET handler.
2713     */
2714    /* sget-wide vAA, field@BBBB */
2715    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2716    FETCH(r1, 1)                        @ r1<- field ref BBBB
2717    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2718    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2719    cmp     r0, #0                      @ is resolved entry null?
2720    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2721.LOP_SGET_WIDE_finish:
2722    mov     r9, rINST, lsr #8           @ r9<- AA
2723    .if 0
2724    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2725    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
2726    .else
2727    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2728    .endif
2729    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2730    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2731    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2732    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2733    GOTO_OPCODE(ip)                     @ jump to next instruction
2734
2735/* ------------------------------ */
2736    .balign 64
2737.L_OP_SGET_OBJECT: /* 0x62 */
2738/* File: armv5te/OP_SGET_OBJECT.S */
2739/* File: armv5te/OP_SGET.S */
2740    /*
2741     * General 32-bit SGET handler.
2742     *
2743     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2744     */
2745    /* op vAA, field@BBBB */
2746    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2747    FETCH(r1, 1)                        @ r1<- field ref BBBB
2748    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2749    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2750    cmp     r0, #0                      @ is resolved entry null?
2751    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2752.LOP_SGET_OBJECT_finish: @ field ptr in r0
2753    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2754    @ no-op                             @ acquiring load
2755    mov     r2, rINST, lsr #8           @ r2<- AA
2756    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2757    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2758    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2759    GOTO_OPCODE(ip)                     @ jump to next instruction
2760
2761
2762/* ------------------------------ */
2763    .balign 64
2764.L_OP_SGET_BOOLEAN: /* 0x63 */
2765/* File: armv5te/OP_SGET_BOOLEAN.S */
2766/* File: armv5te/OP_SGET.S */
2767    /*
2768     * General 32-bit SGET handler.
2769     *
2770     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2771     */
2772    /* op vAA, field@BBBB */
2773    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2774    FETCH(r1, 1)                        @ r1<- field ref BBBB
2775    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2776    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2777    cmp     r0, #0                      @ is resolved entry null?
2778    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2779.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2780    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2781    @ no-op                             @ acquiring load
2782    mov     r2, rINST, lsr #8           @ r2<- AA
2783    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2784    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2785    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2786    GOTO_OPCODE(ip)                     @ jump to next instruction
2787
2788
2789/* ------------------------------ */
2790    .balign 64
2791.L_OP_SGET_BYTE: /* 0x64 */
2792/* File: armv5te/OP_SGET_BYTE.S */
2793/* File: armv5te/OP_SGET.S */
2794    /*
2795     * General 32-bit SGET handler.
2796     *
2797     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2798     */
2799    /* op vAA, field@BBBB */
2800    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2801    FETCH(r1, 1)                        @ r1<- field ref BBBB
2802    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2803    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2804    cmp     r0, #0                      @ is resolved entry null?
2805    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2806.LOP_SGET_BYTE_finish: @ field ptr in r0
2807    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2808    @ no-op                             @ acquiring load
2809    mov     r2, rINST, lsr #8           @ r2<- AA
2810    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2811    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2812    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2813    GOTO_OPCODE(ip)                     @ jump to next instruction
2814
2815
2816/* ------------------------------ */
2817    .balign 64
2818.L_OP_SGET_CHAR: /* 0x65 */
2819/* File: armv5te/OP_SGET_CHAR.S */
2820/* File: armv5te/OP_SGET.S */
2821    /*
2822     * General 32-bit SGET handler.
2823     *
2824     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2825     */
2826    /* op vAA, field@BBBB */
2827    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2828    FETCH(r1, 1)                        @ r1<- field ref BBBB
2829    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2830    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2831    cmp     r0, #0                      @ is resolved entry null?
2832    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2833.LOP_SGET_CHAR_finish: @ field ptr in r0
2834    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2835    @ no-op                             @ acquiring load
2836    mov     r2, rINST, lsr #8           @ r2<- AA
2837    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2838    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2839    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2840    GOTO_OPCODE(ip)                     @ jump to next instruction
2841
2842
2843/* ------------------------------ */
2844    .balign 64
2845.L_OP_SGET_SHORT: /* 0x66 */
2846/* File: armv5te/OP_SGET_SHORT.S */
2847/* File: armv5te/OP_SGET.S */
2848    /*
2849     * General 32-bit SGET handler.
2850     *
2851     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2852     */
2853    /* op vAA, field@BBBB */
2854    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2855    FETCH(r1, 1)                        @ r1<- field ref BBBB
2856    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2857    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2858    cmp     r0, #0                      @ is resolved entry null?
2859    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
2860.LOP_SGET_SHORT_finish: @ field ptr in r0
2861    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2862    @ no-op                             @ acquiring load
2863    mov     r2, rINST, lsr #8           @ r2<- AA
2864    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2865    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2866    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2867    GOTO_OPCODE(ip)                     @ jump to next instruction
2868
2869
2870/* ------------------------------ */
2871    .balign 64
2872.L_OP_SPUT: /* 0x67 */
2873/* File: armv5te/OP_SPUT.S */
2874    /*
2875     * General 32-bit SPUT handler.
2876     *
2877     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2878     */
2879    /* op vAA, field@BBBB */
2880    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2881    FETCH(r1, 1)                        @ r1<- field ref BBBB
2882    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2883    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2884    cmp     r0, #0                      @ is resolved entry null?
2885    beq     .LOP_SPUT_resolve         @ yes, do resolve
2886.LOP_SPUT_finish:   @ field ptr in r0
2887    mov     r2, rINST, lsr #8           @ r2<- AA
2888    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2889    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2890    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2891    @ no-op                             @ releasing store
2892    str     r1, [r0, #offStaticField_value] @ field<- vAA
2893    GOTO_OPCODE(ip)                     @ jump to next instruction
2894
2895/* ------------------------------ */
2896    .balign 64
2897.L_OP_SPUT_WIDE: /* 0x68 */
2898/* File: armv5te/OP_SPUT_WIDE.S */
2899    /*
2900     * 64-bit SPUT handler.
2901     */
2902    /* sput-wide vAA, field@BBBB */
2903    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
2904    FETCH(r1, 1)                        @ r1<- field ref BBBB
2905    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2906    mov     r9, rINST, lsr #8           @ r9<- AA
2907    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
2908    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2909    cmp     r2, #0                      @ is resolved entry null?
2910    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
2911.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
2912    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2913    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
2914    GET_INST_OPCODE(r10)                @ extract opcode from rINST
2915    .if 0
2916    add     r2, r2, #offStaticField_value @ r2<- pointer to data
2917    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
2918    .else
2919    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
2920    .endif
2921    GOTO_OPCODE(r10)                    @ jump to next instruction
2922
2923/* ------------------------------ */
2924    .balign 64
2925.L_OP_SPUT_OBJECT: /* 0x69 */
2926/* File: armv5te/OP_SPUT_OBJECT.S */
2927    /*
2928     * 32-bit SPUT handler for objects
2929     *
2930     * for: sput-object, sput-object-volatile
2931     */
2932    /* op vAA, field@BBBB */
2933    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2934    FETCH(r1, 1)                        @ r1<- field ref BBBB
2935    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2936    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2937    cmp     r0, #0                      @ is resolved entry null?
2938    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
2939.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
2940    mov     r2, rINST, lsr #8           @ r2<- AA
2941    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2942    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2943    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
2944    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
2945    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2946    @ no-op                             @ releasing store
2947    b       .LOP_SPUT_OBJECT_end
2948
2949/* ------------------------------ */
2950    .balign 64
2951.L_OP_SPUT_BOOLEAN: /* 0x6a */
2952/* File: armv5te/OP_SPUT_BOOLEAN.S */
2953/* File: armv5te/OP_SPUT.S */
2954    /*
2955     * General 32-bit SPUT handler.
2956     *
2957     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2958     */
2959    /* op vAA, field@BBBB */
2960    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2961    FETCH(r1, 1)                        @ r1<- field ref BBBB
2962    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2963    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2964    cmp     r0, #0                      @ is resolved entry null?
2965    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
2966.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
2967    mov     r2, rINST, lsr #8           @ r2<- AA
2968    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2969    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2970    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2971    @ no-op                             @ releasing store
2972    str     r1, [r0, #offStaticField_value] @ field<- vAA
2973    GOTO_OPCODE(ip)                     @ jump to next instruction
2974
2975
2976/* ------------------------------ */
2977    .balign 64
2978.L_OP_SPUT_BYTE: /* 0x6b */
2979/* File: armv5te/OP_SPUT_BYTE.S */
2980/* File: armv5te/OP_SPUT.S */
2981    /*
2982     * General 32-bit SPUT handler.
2983     *
2984     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2985     */
2986    /* op vAA, field@BBBB */
2987    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2988    FETCH(r1, 1)                        @ r1<- field ref BBBB
2989    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2990    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2991    cmp     r0, #0                      @ is resolved entry null?
2992    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
2993.LOP_SPUT_BYTE_finish:   @ field ptr in r0
2994    mov     r2, rINST, lsr #8           @ r2<- AA
2995    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2996    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2997    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2998    @ no-op                             @ releasing store
2999    str     r1, [r0, #offStaticField_value] @ field<- vAA
3000    GOTO_OPCODE(ip)                     @ jump to next instruction
3001
3002
3003/* ------------------------------ */
3004    .balign 64
3005.L_OP_SPUT_CHAR: /* 0x6c */
3006/* File: armv5te/OP_SPUT_CHAR.S */
3007/* File: armv5te/OP_SPUT.S */
3008    /*
3009     * General 32-bit SPUT handler.
3010     *
3011     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3012     */
3013    /* op vAA, field@BBBB */
3014    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3015    FETCH(r1, 1)                        @ r1<- field ref BBBB
3016    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3017    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3018    cmp     r0, #0                      @ is resolved entry null?
3019    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3020.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3021    mov     r2, rINST, lsr #8           @ r2<- AA
3022    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3023    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3024    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3025    @ no-op                             @ releasing store
3026    str     r1, [r0, #offStaticField_value] @ field<- vAA
3027    GOTO_OPCODE(ip)                     @ jump to next instruction
3028
3029
3030/* ------------------------------ */
3031    .balign 64
3032.L_OP_SPUT_SHORT: /* 0x6d */
3033/* File: armv5te/OP_SPUT_SHORT.S */
3034/* File: armv5te/OP_SPUT.S */
3035    /*
3036     * General 32-bit SPUT handler.
3037     *
3038     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3039     */
3040    /* op vAA, field@BBBB */
3041    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3042    FETCH(r1, 1)                        @ r1<- field ref BBBB
3043    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3044    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3045    cmp     r0, #0                      @ is resolved entry null?
3046    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3047.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3048    mov     r2, rINST, lsr #8           @ r2<- AA
3049    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3050    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3051    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3052    @ no-op                             @ releasing store
3053    str     r1, [r0, #offStaticField_value] @ field<- vAA
3054    GOTO_OPCODE(ip)                     @ jump to next instruction
3055
3056
3057/* ------------------------------ */
3058    .balign 64
3059.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3060/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3061    /*
3062     * Handle a virtual method call.
3063     *
3064     * for: invoke-virtual, invoke-virtual/range
3065     */
3066    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3067    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3068    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3069    FETCH(r1, 1)                        @ r1<- BBBB
3070    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3071    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3072    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3073    .if     (!0)
3074    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3075    .endif
3076    cmp     r0, #0                      @ already resolved?
3077    EXPORT_PC()                         @ must export for invoke
3078    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3079    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3080    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3081    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3082    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3083    cmp     r0, #0                      @ got null?
3084    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3085    b       common_exceptionThrown      @ yes, handle exception
3086
3087/* ------------------------------ */
3088    .balign 64
3089.L_OP_INVOKE_SUPER: /* 0x6f */
3090/* File: armv5te/OP_INVOKE_SUPER.S */
3091    /*
3092     * Handle a "super" method call.
3093     *
3094     * for: invoke-super, invoke-super/range
3095     */
3096    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3097    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3098    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3099    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3100    .if     (!0)
3101    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3102    .endif
3103    FETCH(r1, 1)                        @ r1<- BBBB
3104    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3105    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3106    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3107    cmp     r9, #0                      @ null "this"?
3108    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3109    beq     common_errNullObject        @ null "this", throw exception
3110    cmp     r0, #0                      @ already resolved?
3111    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3112    EXPORT_PC()                         @ must export for invoke
3113    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3114    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3115
3116/* ------------------------------ */
3117    .balign 64
3118.L_OP_INVOKE_DIRECT: /* 0x70 */
3119/* File: armv5te/OP_INVOKE_DIRECT.S */
3120    /*
3121     * Handle a direct method call.
3122     *
3123     * (We could defer the "is 'this' pointer null" test to the common
3124     * method invocation code, and use a flag to indicate that static
3125     * calls don't count.  If we do this as part of copying the arguments
3126     * out we could avoiding loading the first arg twice.)
3127     *
3128     * for: invoke-direct, invoke-direct/range
3129     */
3130    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3131    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3132    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3133    FETCH(r1, 1)                        @ r1<- BBBB
3134    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3135    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3136    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3137    .if     (!0)
3138    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3139    .endif
3140    cmp     r0, #0                      @ already resolved?
3141    EXPORT_PC()                         @ must export for invoke
3142    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3143    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3144.LOP_INVOKE_DIRECT_finish:
3145    cmp     r9, #0                      @ null "this" ref?
3146    bne     common_invokeMethodNoRange   @ r0=method, r9="this"
3147    b       common_errNullObject        @ yes, throw exception
3148
3149/* ------------------------------ */
3150    .balign 64
3151.L_OP_INVOKE_STATIC: /* 0x71 */
3152/* File: armv5te/OP_INVOKE_STATIC.S */
3153    /*
3154     * Handle a static method call.
3155     *
3156     * for: invoke-static, invoke-static/range
3157     */
3158    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3159    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3160    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3161    FETCH(r1, 1)                        @ r1<- BBBB
3162    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3163    mov     r9, #0                      @ null "this" in delay slot
3164    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3165#if defined(WITH_JIT)
3166    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3167#endif
3168    cmp     r0, #0                      @ already resolved?
3169    EXPORT_PC()                         @ must export for invoke
3170    bne     common_invokeMethodNoRange @ yes, continue on
3171    b       .LOP_INVOKE_STATIC_resolve
3172
3173/* ------------------------------ */
3174    .balign 64
3175.L_OP_INVOKE_INTERFACE: /* 0x72 */
3176/* File: armv5te/OP_INVOKE_INTERFACE.S */
3177    /*
3178     * Handle an interface method call.
3179     *
3180     * for: invoke-interface, invoke-interface/range
3181     */
3182    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3183    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3184    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3185    FETCH(r1, 1)                        @ r1<- BBBB
3186    .if     (!0)
3187    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3188    .endif
3189    EXPORT_PC()                         @ must export for invoke
3190    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3191    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3192    cmp     r9, #0                      @ null obj?
3193    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3194    beq     common_errNullObject        @ yes, fail
3195    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3196    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3197    cmp     r0, #0                      @ failed?
3198    beq     common_exceptionThrown      @ yes, handle exception
3199    b       common_invokeMethodNoRange @ (r0=method, r9="this")
3200
3201/* ------------------------------ */
3202    .balign 64
3203.L_OP_UNUSED_73: /* 0x73 */
3204/* File: armv5te/OP_UNUSED_73.S */
3205/* File: armv5te/unused.S */
3206    bl      common_abort
3207
3208
3209/* ------------------------------ */
3210    .balign 64
3211.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3212/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3213/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3214    /*
3215     * Handle a virtual method call.
3216     *
3217     * for: invoke-virtual, invoke-virtual/range
3218     */
3219    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3220    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3221    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3222    FETCH(r1, 1)                        @ r1<- BBBB
3223    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3224    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3225    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3226    .if     (!1)
3227    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3228    .endif
3229    cmp     r0, #0                      @ already resolved?
3230    EXPORT_PC()                         @ must export for invoke
3231    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3232    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3233    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3234    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3235    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3236    cmp     r0, #0                      @ got null?
3237    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3238    b       common_exceptionThrown      @ yes, handle exception
3239
3240
3241/* ------------------------------ */
3242    .balign 64
3243.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3244/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3245/* File: armv5te/OP_INVOKE_SUPER.S */
3246    /*
3247     * Handle a "super" method call.
3248     *
3249     * for: invoke-super, invoke-super/range
3250     */
3251    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3252    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3253    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3254    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3255    .if     (!1)
3256    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3257    .endif
3258    FETCH(r1, 1)                        @ r1<- BBBB
3259    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3260    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3261    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3262    cmp     r9, #0                      @ null "this"?
3263    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3264    beq     common_errNullObject        @ null "this", throw exception
3265    cmp     r0, #0                      @ already resolved?
3266    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3267    EXPORT_PC()                         @ must export for invoke
3268    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3269    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3270
3271
3272/* ------------------------------ */
3273    .balign 64
3274.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3275/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3276/* File: armv5te/OP_INVOKE_DIRECT.S */
3277    /*
3278     * Handle a direct method call.
3279     *
3280     * (We could defer the "is 'this' pointer null" test to the common
3281     * method invocation code, and use a flag to indicate that static
3282     * calls don't count.  If we do this as part of copying the arguments
3283     * out we could avoiding loading the first arg twice.)
3284     *
3285     * for: invoke-direct, invoke-direct/range
3286     */
3287    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3288    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3289    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3290    FETCH(r1, 1)                        @ r1<- BBBB
3291    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3292    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3293    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3294    .if     (!1)
3295    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3296    .endif
3297    cmp     r0, #0                      @ already resolved?
3298    EXPORT_PC()                         @ must export for invoke
3299    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3300    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3301.LOP_INVOKE_DIRECT_RANGE_finish:
3302    cmp     r9, #0                      @ null "this" ref?
3303    bne     common_invokeMethodRange   @ r0=method, r9="this"
3304    b       common_errNullObject        @ yes, throw exception
3305
3306
3307/* ------------------------------ */
3308    .balign 64
3309.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3310/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3311/* File: armv5te/OP_INVOKE_STATIC.S */
3312    /*
3313     * Handle a static method call.
3314     *
3315     * for: invoke-static, invoke-static/range
3316     */
3317    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3318    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3319    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3320    FETCH(r1, 1)                        @ r1<- BBBB
3321    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3322    mov     r9, #0                      @ null "this" in delay slot
3323    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3324#if defined(WITH_JIT)
3325    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3326#endif
3327    cmp     r0, #0                      @ already resolved?
3328    EXPORT_PC()                         @ must export for invoke
3329    bne     common_invokeMethodRange @ yes, continue on
3330    b       .LOP_INVOKE_STATIC_RANGE_resolve
3331
3332
3333/* ------------------------------ */
3334    .balign 64
3335.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3336/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3337/* File: armv5te/OP_INVOKE_INTERFACE.S */
3338    /*
3339     * Handle an interface method call.
3340     *
3341     * for: invoke-interface, invoke-interface/range
3342     */
3343    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3344    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3345    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3346    FETCH(r1, 1)                        @ r1<- BBBB
3347    .if     (!1)
3348    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3349    .endif
3350    EXPORT_PC()                         @ must export for invoke
3351    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3352    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3353    cmp     r9, #0                      @ null obj?
3354    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3355    beq     common_errNullObject        @ yes, fail
3356    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3357    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3358    cmp     r0, #0                      @ failed?
3359    beq     common_exceptionThrown      @ yes, handle exception
3360    b       common_invokeMethodRange @ (r0=method, r9="this")
3361
3362
3363/* ------------------------------ */
3364    .balign 64
3365.L_OP_UNUSED_79: /* 0x79 */
3366/* File: armv5te/OP_UNUSED_79.S */
3367/* File: armv5te/unused.S */
3368    bl      common_abort
3369
3370
3371/* ------------------------------ */
3372    .balign 64
3373.L_OP_UNUSED_7A: /* 0x7a */
3374/* File: armv5te/OP_UNUSED_7A.S */
3375/* File: armv5te/unused.S */
3376    bl      common_abort
3377
3378
3379/* ------------------------------ */
3380    .balign 64
3381.L_OP_NEG_INT: /* 0x7b */
3382/* File: armv5te/OP_NEG_INT.S */
3383/* File: armv5te/unop.S */
3384    /*
3385     * Generic 32-bit unary operation.  Provide an "instr" line that
3386     * specifies an instruction that performs "result = op r0".
3387     * This could be an ARM instruction or a function call.
3388     *
3389     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3390     *      int-to-byte, int-to-char, int-to-short
3391     */
3392    /* unop vA, vB */
3393    mov     r3, rINST, lsr #12          @ r3<- B
3394    mov     r9, rINST, lsr #8           @ r9<- A+
3395    GET_VREG(r0, r3)                    @ r0<- vB
3396    and     r9, r9, #15
3397                               @ optional op; may set condition codes
3398    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3399    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3400    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3401    SET_VREG(r0, r9)                    @ vAA<- r0
3402    GOTO_OPCODE(ip)                     @ jump to next instruction
3403    /* 9-10 instructions */
3404
3405
3406/* ------------------------------ */
3407    .balign 64
3408.L_OP_NOT_INT: /* 0x7c */
3409/* File: armv5te/OP_NOT_INT.S */
3410/* File: armv5te/unop.S */
3411    /*
3412     * Generic 32-bit unary operation.  Provide an "instr" line that
3413     * specifies an instruction that performs "result = op r0".
3414     * This could be an ARM instruction or a function call.
3415     *
3416     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3417     *      int-to-byte, int-to-char, int-to-short
3418     */
3419    /* unop vA, vB */
3420    mov     r3, rINST, lsr #12          @ r3<- B
3421    mov     r9, rINST, lsr #8           @ r9<- A+
3422    GET_VREG(r0, r3)                    @ r0<- vB
3423    and     r9, r9, #15
3424                               @ optional op; may set condition codes
3425    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3426    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3427    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3428    SET_VREG(r0, r9)                    @ vAA<- r0
3429    GOTO_OPCODE(ip)                     @ jump to next instruction
3430    /* 9-10 instructions */
3431
3432
3433/* ------------------------------ */
3434    .balign 64
3435.L_OP_NEG_LONG: /* 0x7d */
3436/* File: armv5te/OP_NEG_LONG.S */
3437/* File: armv5te/unopWide.S */
3438    /*
3439     * Generic 64-bit unary operation.  Provide an "instr" line that
3440     * specifies an instruction that performs "result = op r0/r1".
3441     * This could be an ARM instruction or a function call.
3442     *
3443     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3444     */
3445    /* unop vA, vB */
3446    mov     r9, rINST, lsr #8           @ r9<- A+
3447    mov     r3, rINST, lsr #12          @ r3<- B
3448    and     r9, r9, #15
3449    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3450    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3451    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3452    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3453    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3454    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3455    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3456    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3457    GOTO_OPCODE(ip)                     @ jump to next instruction
3458    /* 12-13 instructions */
3459
3460
3461/* ------------------------------ */
3462    .balign 64
3463.L_OP_NOT_LONG: /* 0x7e */
3464/* File: armv5te/OP_NOT_LONG.S */
3465/* File: armv5te/unopWide.S */
3466    /*
3467     * Generic 64-bit unary operation.  Provide an "instr" line that
3468     * specifies an instruction that performs "result = op r0/r1".
3469     * This could be an ARM instruction or a function call.
3470     *
3471     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3472     */
3473    /* unop vA, vB */
3474    mov     r9, rINST, lsr #8           @ r9<- A+
3475    mov     r3, rINST, lsr #12          @ r3<- B
3476    and     r9, r9, #15
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    /* 12-13 instructions */
3487
3488
3489/* ------------------------------ */
3490    .balign 64
3491.L_OP_NEG_FLOAT: /* 0x7f */
3492/* File: armv5te/OP_NEG_FLOAT.S */
3493/* File: armv5te/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    mov     r9, rINST, lsr #8           @ r9<- A+
3505    GET_VREG(r0, r3)                    @ r0<- vB
3506    and     r9, r9, #15
3507                               @ optional op; may set condition codes
3508    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3509    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3510    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3511    SET_VREG(r0, r9)                    @ vAA<- r0
3512    GOTO_OPCODE(ip)                     @ jump to next instruction
3513    /* 9-10 instructions */
3514
3515
3516/* ------------------------------ */
3517    .balign 64
3518.L_OP_NEG_DOUBLE: /* 0x80 */
3519/* File: armv5te/OP_NEG_DOUBLE.S */
3520/* File: armv5te/unopWide.S */
3521    /*
3522     * Generic 64-bit unary operation.  Provide an "instr" line that
3523     * specifies an instruction that performs "result = op r0/r1".
3524     * This could be an ARM instruction or a function call.
3525     *
3526     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3527     */
3528    /* unop vA, vB */
3529    mov     r9, rINST, lsr #8           @ r9<- A+
3530    mov     r3, rINST, lsr #12          @ r3<- B
3531    and     r9, r9, #15
3532    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3533    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3534    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3535    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3536                               @ optional op; may set condition codes
3537    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3538    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3539    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3540    GOTO_OPCODE(ip)                     @ jump to next instruction
3541    /* 12-13 instructions */
3542
3543
3544/* ------------------------------ */
3545    .balign 64
3546.L_OP_INT_TO_LONG: /* 0x81 */
3547/* File: armv5te/OP_INT_TO_LONG.S */
3548/* File: armv5te/unopWider.S */
3549    /*
3550     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3551     * that specifies an instruction that performs "result = op r0", where
3552     * "result" is a 64-bit quantity in r0/r1.
3553     *
3554     * For: int-to-long, int-to-double, float-to-long, float-to-double
3555     */
3556    /* unop vA, vB */
3557    mov     r9, rINST, lsr #8           @ r9<- A+
3558    mov     r3, rINST, lsr #12          @ r3<- B
3559    and     r9, r9, #15
3560    GET_VREG(r0, r3)                    @ r0<- vB
3561    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3562                               @ optional op; may set condition codes
3563    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3564    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3565    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3566    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3567    GOTO_OPCODE(ip)                     @ jump to next instruction
3568    /* 10-11 instructions */
3569
3570
3571/* ------------------------------ */
3572    .balign 64
3573.L_OP_INT_TO_FLOAT: /* 0x82 */
3574/* File: arm-vfp/OP_INT_TO_FLOAT.S */
3575/* File: arm-vfp/funop.S */
3576    /*
3577     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3578     * line that specifies an instruction that performs "s1 = op s0".
3579     *
3580     * for: int-to-float, float-to-int
3581     */
3582    /* unop vA, vB */
3583    mov     r3, rINST, lsr #12          @ r3<- B
3584    mov     r9, rINST, lsr #8           @ r9<- A+
3585    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3586    flds    s0, [r3]                    @ s0<- vB
3587    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3588    and     r9, r9, #15                 @ r9<- A
3589    fsitos  s1, s0                              @ s1<- op
3590    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3591    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3592    fsts    s1, [r9]                    @ vA<- s1
3593    GOTO_OPCODE(ip)                     @ jump to next instruction
3594
3595
3596/* ------------------------------ */
3597    .balign 64
3598.L_OP_INT_TO_DOUBLE: /* 0x83 */
3599/* File: arm-vfp/OP_INT_TO_DOUBLE.S */
3600/* File: arm-vfp/funopWider.S */
3601    /*
3602     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3603     * "instr" line that specifies an instruction that performs "d0 = op s0".
3604     *
3605     * For: int-to-double, float-to-double
3606     */
3607    /* unop vA, vB */
3608    mov     r3, rINST, lsr #12          @ r3<- B
3609    mov     r9, rINST, lsr #8           @ r9<- A+
3610    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3611    flds    s0, [r3]                    @ s0<- vB
3612    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3613    and     r9, r9, #15                 @ r9<- A
3614    fsitod  d0, s0                              @ d0<- op
3615    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3616    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3617    fstd    d0, [r9]                    @ vA<- d0
3618    GOTO_OPCODE(ip)                     @ jump to next instruction
3619
3620
3621/* ------------------------------ */
3622    .balign 64
3623.L_OP_LONG_TO_INT: /* 0x84 */
3624/* File: armv5te/OP_LONG_TO_INT.S */
3625/* we ignore the high word, making this equivalent to a 32-bit reg move */
3626/* File: armv5te/OP_MOVE.S */
3627    /* for move, move-object, long-to-int */
3628    /* op vA, vB */
3629    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3630    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3631    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3632    GET_VREG(r2, r1)                    @ r2<- fp[B]
3633    and     r0, r0, #15
3634    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3635    SET_VREG(r2, r0)                    @ fp[A]<- r2
3636    GOTO_OPCODE(ip)                     @ execute next instruction
3637
3638
3639/* ------------------------------ */
3640    .balign 64
3641.L_OP_LONG_TO_FLOAT: /* 0x85 */
3642/* File: armv5te/OP_LONG_TO_FLOAT.S */
3643/* File: armv5te/unopNarrower.S */
3644    /*
3645     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3646     * that specifies an instruction that performs "result = op r0/r1", where
3647     * "result" is a 32-bit quantity in r0.
3648     *
3649     * For: long-to-float, double-to-int, double-to-float
3650     *
3651     * (This would work for long-to-int, but that instruction is actually
3652     * an exact match for OP_MOVE.)
3653     */
3654    /* unop vA, vB */
3655    mov     r3, rINST, lsr #12          @ r3<- B
3656    mov     r9, rINST, lsr #8           @ r9<- A+
3657    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3658    and     r9, r9, #15
3659    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3660    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3661                               @ optional op; may set condition codes
3662    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3663    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3664    SET_VREG(r0, r9)                    @ vA<- r0
3665    GOTO_OPCODE(ip)                     @ jump to next instruction
3666    /* 10-11 instructions */
3667
3668
3669/* ------------------------------ */
3670    .balign 64
3671.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3672/* File: armv5te/OP_LONG_TO_DOUBLE.S */
3673/* File: armv5te/unopWide.S */
3674    /*
3675     * Generic 64-bit unary operation.  Provide an "instr" line that
3676     * specifies an instruction that performs "result = op r0/r1".
3677     * This could be an ARM instruction or a function call.
3678     *
3679     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3680     */
3681    /* unop vA, vB */
3682    mov     r9, rINST, lsr #8           @ r9<- A+
3683    mov     r3, rINST, lsr #12          @ r3<- B
3684    and     r9, r9, #15
3685    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3686    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3687    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3688    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3689                               @ optional op; may set condition codes
3690    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3691    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3692    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3693    GOTO_OPCODE(ip)                     @ jump to next instruction
3694    /* 12-13 instructions */
3695
3696
3697/* ------------------------------ */
3698    .balign 64
3699.L_OP_FLOAT_TO_INT: /* 0x87 */
3700/* File: arm-vfp/OP_FLOAT_TO_INT.S */
3701/* File: arm-vfp/funop.S */
3702    /*
3703     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3704     * line that specifies an instruction that performs "s1 = op s0".
3705     *
3706     * for: int-to-float, float-to-int
3707     */
3708    /* unop vA, vB */
3709    mov     r3, rINST, lsr #12          @ r3<- B
3710    mov     r9, rINST, lsr #8           @ r9<- A+
3711    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3712    flds    s0, [r3]                    @ s0<- vB
3713    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3714    and     r9, r9, #15                 @ r9<- A
3715    ftosizs s1, s0                              @ s1<- op
3716    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3717    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3718    fsts    s1, [r9]                    @ vA<- s1
3719    GOTO_OPCODE(ip)                     @ jump to next instruction
3720
3721
3722/* ------------------------------ */
3723    .balign 64
3724.L_OP_FLOAT_TO_LONG: /* 0x88 */
3725/* File: armv5te/OP_FLOAT_TO_LONG.S */
3726@include "armv5te/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3727/* File: armv5te/unopWider.S */
3728    /*
3729     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3730     * that specifies an instruction that performs "result = op r0", where
3731     * "result" is a 64-bit quantity in r0/r1.
3732     *
3733     * For: int-to-long, int-to-double, float-to-long, float-to-double
3734     */
3735    /* unop vA, vB */
3736    mov     r9, rINST, lsr #8           @ r9<- A+
3737    mov     r3, rINST, lsr #12          @ r3<- B
3738    and     r9, r9, #15
3739    GET_VREG(r0, r3)                    @ r0<- vB
3740    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3741                               @ optional op; may set condition codes
3742    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3743    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3744    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3745    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3746    GOTO_OPCODE(ip)                     @ jump to next instruction
3747    /* 10-11 instructions */
3748
3749
3750
3751/* ------------------------------ */
3752    .balign 64
3753.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3754/* File: arm-vfp/OP_FLOAT_TO_DOUBLE.S */
3755/* File: arm-vfp/funopWider.S */
3756    /*
3757     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3758     * "instr" line that specifies an instruction that performs "d0 = op s0".
3759     *
3760     * For: int-to-double, float-to-double
3761     */
3762    /* unop vA, vB */
3763    mov     r3, rINST, lsr #12          @ r3<- B
3764    mov     r9, rINST, lsr #8           @ r9<- A+
3765    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3766    flds    s0, [r3]                    @ s0<- vB
3767    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3768    and     r9, r9, #15                 @ r9<- A
3769    fcvtds  d0, s0                              @ d0<- op
3770    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3771    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3772    fstd    d0, [r9]                    @ vA<- d0
3773    GOTO_OPCODE(ip)                     @ jump to next instruction
3774
3775
3776/* ------------------------------ */
3777    .balign 64
3778.L_OP_DOUBLE_TO_INT: /* 0x8a */
3779/* File: arm-vfp/OP_DOUBLE_TO_INT.S */
3780/* File: arm-vfp/funopNarrower.S */
3781    /*
3782     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3783     * "instr" line that specifies an instruction that performs "s0 = op d0".
3784     *
3785     * For: double-to-int, double-to-float
3786     */
3787    /* unop vA, vB */
3788    mov     r3, rINST, lsr #12          @ r3<- B
3789    mov     r9, rINST, lsr #8           @ r9<- A+
3790    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3791    fldd    d0, [r3]                    @ d0<- vB
3792    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3793    and     r9, r9, #15                 @ r9<- A
3794    ftosizd  s0, d0                              @ s0<- op
3795    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3796    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3797    fsts    s0, [r9]                    @ vA<- s0
3798    GOTO_OPCODE(ip)                     @ jump to next instruction
3799
3800
3801/* ------------------------------ */
3802    .balign 64
3803.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3804/* File: armv5te/OP_DOUBLE_TO_LONG.S */
3805@include "armv5te/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
3806/* File: armv5te/unopWide.S */
3807    /*
3808     * Generic 64-bit unary operation.  Provide an "instr" line that
3809     * specifies an instruction that performs "result = op r0/r1".
3810     * This could be an ARM instruction or a function call.
3811     *
3812     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3813     */
3814    /* unop vA, vB */
3815    mov     r9, rINST, lsr #8           @ r9<- A+
3816    mov     r3, rINST, lsr #12          @ r3<- B
3817    and     r9, r9, #15
3818    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3819    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3820    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3821    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3822                               @ optional op; may set condition codes
3823    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
3824    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3825    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3826    GOTO_OPCODE(ip)                     @ jump to next instruction
3827    /* 12-13 instructions */
3828
3829
3830
3831/* ------------------------------ */
3832    .balign 64
3833.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3834/* File: arm-vfp/OP_DOUBLE_TO_FLOAT.S */
3835/* File: arm-vfp/funopNarrower.S */
3836    /*
3837     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3838     * "instr" line that specifies an instruction that performs "s0 = op d0".
3839     *
3840     * For: double-to-int, double-to-float
3841     */
3842    /* unop vA, vB */
3843    mov     r3, rINST, lsr #12          @ r3<- B
3844    mov     r9, rINST, lsr #8           @ r9<- A+
3845    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3846    fldd    d0, [r3]                    @ d0<- vB
3847    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3848    and     r9, r9, #15                 @ r9<- A
3849    fcvtsd  s0, d0                              @ s0<- op
3850    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3851    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3852    fsts    s0, [r9]                    @ vA<- s0
3853    GOTO_OPCODE(ip)                     @ jump to next instruction
3854
3855
3856/* ------------------------------ */
3857    .balign 64
3858.L_OP_INT_TO_BYTE: /* 0x8d */
3859/* File: armv5te/OP_INT_TO_BYTE.S */
3860/* File: armv5te/unop.S */
3861    /*
3862     * Generic 32-bit unary operation.  Provide an "instr" line that
3863     * specifies an instruction that performs "result = op r0".
3864     * This could be an ARM instruction or a function call.
3865     *
3866     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3867     *      int-to-byte, int-to-char, int-to-short
3868     */
3869    /* unop vA, vB */
3870    mov     r3, rINST, lsr #12          @ r3<- B
3871    mov     r9, rINST, lsr #8           @ r9<- A+
3872    GET_VREG(r0, r3)                    @ r0<- vB
3873    and     r9, r9, #15
3874    mov     r0, r0, asl #24                           @ optional op; may set condition codes
3875    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3876    mov     r0, r0, asr #24                              @ r0<- op, r0-r3 changed
3877    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3878    SET_VREG(r0, r9)                    @ vAA<- r0
3879    GOTO_OPCODE(ip)                     @ jump to next instruction
3880    /* 9-10 instructions */
3881
3882
3883/* ------------------------------ */
3884    .balign 64
3885.L_OP_INT_TO_CHAR: /* 0x8e */
3886/* File: armv5te/OP_INT_TO_CHAR.S */
3887/* File: armv5te/unop.S */
3888    /*
3889     * Generic 32-bit unary operation.  Provide an "instr" line that
3890     * specifies an instruction that performs "result = op r0".
3891     * This could be an ARM instruction or a function call.
3892     *
3893     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3894     *      int-to-byte, int-to-char, int-to-short
3895     */
3896    /* unop vA, vB */
3897    mov     r3, rINST, lsr #12          @ r3<- B
3898    mov     r9, rINST, lsr #8           @ r9<- A+
3899    GET_VREG(r0, r3)                    @ r0<- vB
3900    and     r9, r9, #15
3901    mov     r0, r0, asl #16                           @ optional op; may set condition codes
3902    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3903    mov     r0, r0, lsr #16                              @ r0<- op, r0-r3 changed
3904    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3905    SET_VREG(r0, r9)                    @ vAA<- r0
3906    GOTO_OPCODE(ip)                     @ jump to next instruction
3907    /* 9-10 instructions */
3908
3909
3910/* ------------------------------ */
3911    .balign 64
3912.L_OP_INT_TO_SHORT: /* 0x8f */
3913/* File: armv5te/OP_INT_TO_SHORT.S */
3914/* File: armv5te/unop.S */
3915    /*
3916     * Generic 32-bit unary operation.  Provide an "instr" line that
3917     * specifies an instruction that performs "result = op r0".
3918     * This could be an ARM instruction or a function call.
3919     *
3920     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3921     *      int-to-byte, int-to-char, int-to-short
3922     */
3923    /* unop vA, vB */
3924    mov     r3, rINST, lsr #12          @ r3<- B
3925    mov     r9, rINST, lsr #8           @ r9<- A+
3926    GET_VREG(r0, r3)                    @ r0<- vB
3927    and     r9, r9, #15
3928    mov     r0, r0, asl #16                           @ optional op; may set condition codes
3929    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3930    mov     r0, r0, asr #16                              @ r0<- op, r0-r3 changed
3931    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3932    SET_VREG(r0, r9)                    @ vAA<- r0
3933    GOTO_OPCODE(ip)                     @ jump to next instruction
3934    /* 9-10 instructions */
3935
3936
3937/* ------------------------------ */
3938    .balign 64
3939.L_OP_ADD_INT: /* 0x90 */
3940/* File: armv5te/OP_ADD_INT.S */
3941/* File: armv5te/binop.S */
3942    /*
3943     * Generic 32-bit binary operation.  Provide an "instr" line that
3944     * specifies an instruction that performs "result = r0 op r1".
3945     * This could be an ARM instruction or a function call.  (If the result
3946     * comes back in a register other than r0, you can override "result".)
3947     *
3948     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3949     * vCC (r1).  Useful for integer division and modulus.  Note that we
3950     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3951     * handles it correctly.
3952     *
3953     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3954     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3955     *      mul-float, div-float, rem-float
3956     */
3957    /* binop vAA, vBB, vCC */
3958    FETCH(r0, 1)                        @ r0<- CCBB
3959    mov     r9, rINST, lsr #8           @ r9<- AA
3960    mov     r3, r0, lsr #8              @ r3<- CC
3961    and     r2, r0, #255                @ r2<- BB
3962    GET_VREG(r1, r3)                    @ r1<- vCC
3963    GET_VREG(r0, r2)                    @ r0<- vBB
3964    .if 0
3965    cmp     r1, #0                      @ is second operand zero?
3966    beq     common_errDivideByZero
3967    .endif
3968
3969    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3970                               @ optional op; may set condition codes
3971    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
3972    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3973    SET_VREG(r0, r9)               @ vAA<- r0
3974    GOTO_OPCODE(ip)                     @ jump to next instruction
3975    /* 11-14 instructions */
3976
3977
3978/* ------------------------------ */
3979    .balign 64
3980.L_OP_SUB_INT: /* 0x91 */
3981/* File: armv5te/OP_SUB_INT.S */
3982/* File: armv5te/binop.S */
3983    /*
3984     * Generic 32-bit binary operation.  Provide an "instr" line that
3985     * specifies an instruction that performs "result = r0 op r1".
3986     * This could be an ARM instruction or a function call.  (If the result
3987     * comes back in a register other than r0, you can override "result".)
3988     *
3989     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3990     * vCC (r1).  Useful for integer division and modulus.  Note that we
3991     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3992     * handles it correctly.
3993     *
3994     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3995     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3996     *      mul-float, div-float, rem-float
3997     */
3998    /* binop vAA, vBB, vCC */
3999    FETCH(r0, 1)                        @ r0<- CCBB
4000    mov     r9, rINST, lsr #8           @ r9<- AA
4001    mov     r3, r0, lsr #8              @ r3<- CC
4002    and     r2, r0, #255                @ r2<- BB
4003    GET_VREG(r1, r3)                    @ r1<- vCC
4004    GET_VREG(r0, r2)                    @ r0<- vBB
4005    .if 0
4006    cmp     r1, #0                      @ is second operand zero?
4007    beq     common_errDivideByZero
4008    .endif
4009
4010    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4011                               @ optional op; may set condition codes
4012    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4013    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4014    SET_VREG(r0, r9)               @ vAA<- r0
4015    GOTO_OPCODE(ip)                     @ jump to next instruction
4016    /* 11-14 instructions */
4017
4018
4019/* ------------------------------ */
4020    .balign 64
4021.L_OP_MUL_INT: /* 0x92 */
4022/* File: armv5te/OP_MUL_INT.S */
4023/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4024/* File: armv5te/binop.S */
4025    /*
4026     * Generic 32-bit binary operation.  Provide an "instr" line that
4027     * specifies an instruction that performs "result = r0 op r1".
4028     * This could be an ARM instruction or a function call.  (If the result
4029     * comes back in a register other than r0, you can override "result".)
4030     *
4031     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4032     * vCC (r1).  Useful for integer division and modulus.  Note that we
4033     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4034     * handles it correctly.
4035     *
4036     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4037     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4038     *      mul-float, div-float, rem-float
4039     */
4040    /* binop vAA, vBB, vCC */
4041    FETCH(r0, 1)                        @ r0<- CCBB
4042    mov     r9, rINST, lsr #8           @ r9<- AA
4043    mov     r3, r0, lsr #8              @ r3<- CC
4044    and     r2, r0, #255                @ r2<- BB
4045    GET_VREG(r1, r3)                    @ r1<- vCC
4046    GET_VREG(r0, r2)                    @ r0<- vBB
4047    .if 0
4048    cmp     r1, #0                      @ is second operand zero?
4049    beq     common_errDivideByZero
4050    .endif
4051
4052    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4053                               @ optional op; may set condition codes
4054    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4055    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4056    SET_VREG(r0, r9)               @ vAA<- r0
4057    GOTO_OPCODE(ip)                     @ jump to next instruction
4058    /* 11-14 instructions */
4059
4060
4061/* ------------------------------ */
4062    .balign 64
4063.L_OP_DIV_INT: /* 0x93 */
4064/* File: armv5te/OP_DIV_INT.S */
4065/* File: armv5te/binop.S */
4066    /*
4067     * Generic 32-bit binary operation.  Provide an "instr" line that
4068     * specifies an instruction that performs "result = r0 op r1".
4069     * This could be an ARM instruction or a function call.  (If the result
4070     * comes back in a register other than r0, you can override "result".)
4071     *
4072     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4073     * vCC (r1).  Useful for integer division and modulus.  Note that we
4074     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4075     * handles it correctly.
4076     *
4077     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4078     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4079     *      mul-float, div-float, rem-float
4080     */
4081    /* binop vAA, vBB, vCC */
4082    FETCH(r0, 1)                        @ r0<- CCBB
4083    mov     r9, rINST, lsr #8           @ r9<- AA
4084    mov     r3, r0, lsr #8              @ r3<- CC
4085    and     r2, r0, #255                @ r2<- BB
4086    GET_VREG(r1, r3)                    @ r1<- vCC
4087    GET_VREG(r0, r2)                    @ r0<- vBB
4088    .if 1
4089    cmp     r1, #0                      @ is second operand zero?
4090    beq     common_errDivideByZero
4091    .endif
4092
4093    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4094                               @ optional op; may set condition codes
4095    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4096    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4097    SET_VREG(r0, r9)               @ vAA<- r0
4098    GOTO_OPCODE(ip)                     @ jump to next instruction
4099    /* 11-14 instructions */
4100
4101
4102/* ------------------------------ */
4103    .balign 64
4104.L_OP_REM_INT: /* 0x94 */
4105/* File: armv5te/OP_REM_INT.S */
4106/* idivmod returns quotient in r0 and remainder in r1 */
4107/* File: armv5te/binop.S */
4108    /*
4109     * Generic 32-bit binary operation.  Provide an "instr" line that
4110     * specifies an instruction that performs "result = r0 op r1".
4111     * This could be an ARM instruction or a function call.  (If the result
4112     * comes back in a register other than r0, you can override "result".)
4113     *
4114     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4115     * vCC (r1).  Useful for integer division and modulus.  Note that we
4116     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4117     * handles it correctly.
4118     *
4119     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4120     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4121     *      mul-float, div-float, rem-float
4122     */
4123    /* binop vAA, vBB, vCC */
4124    FETCH(r0, 1)                        @ r0<- CCBB
4125    mov     r9, rINST, lsr #8           @ r9<- AA
4126    mov     r3, r0, lsr #8              @ r3<- CC
4127    and     r2, r0, #255                @ r2<- BB
4128    GET_VREG(r1, r3)                    @ r1<- vCC
4129    GET_VREG(r0, r2)                    @ r0<- vBB
4130    .if 1
4131    cmp     r1, #0                      @ is second operand zero?
4132    beq     common_errDivideByZero
4133    .endif
4134
4135    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4136                               @ optional op; may set condition codes
4137    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4138    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4139    SET_VREG(r1, r9)               @ vAA<- r1
4140    GOTO_OPCODE(ip)                     @ jump to next instruction
4141    /* 11-14 instructions */
4142
4143
4144/* ------------------------------ */
4145    .balign 64
4146.L_OP_AND_INT: /* 0x95 */
4147/* File: armv5te/OP_AND_INT.S */
4148/* File: armv5te/binop.S */
4149    /*
4150     * Generic 32-bit binary operation.  Provide an "instr" line that
4151     * specifies an instruction that performs "result = r0 op r1".
4152     * This could be an ARM instruction or a function call.  (If the result
4153     * comes back in a register other than r0, you can override "result".)
4154     *
4155     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4156     * vCC (r1).  Useful for integer division and modulus.  Note that we
4157     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4158     * handles it correctly.
4159     *
4160     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4161     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4162     *      mul-float, div-float, rem-float
4163     */
4164    /* binop vAA, vBB, vCC */
4165    FETCH(r0, 1)                        @ r0<- CCBB
4166    mov     r9, rINST, lsr #8           @ r9<- AA
4167    mov     r3, r0, lsr #8              @ r3<- CC
4168    and     r2, r0, #255                @ r2<- BB
4169    GET_VREG(r1, r3)                    @ r1<- vCC
4170    GET_VREG(r0, r2)                    @ r0<- vBB
4171    .if 0
4172    cmp     r1, #0                      @ is second operand zero?
4173    beq     common_errDivideByZero
4174    .endif
4175
4176    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4177                               @ optional op; may set condition codes
4178    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4179    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4180    SET_VREG(r0, r9)               @ vAA<- r0
4181    GOTO_OPCODE(ip)                     @ jump to next instruction
4182    /* 11-14 instructions */
4183
4184
4185/* ------------------------------ */
4186    .balign 64
4187.L_OP_OR_INT: /* 0x96 */
4188/* File: armv5te/OP_OR_INT.S */
4189/* File: armv5te/binop.S */
4190    /*
4191     * Generic 32-bit binary operation.  Provide an "instr" line that
4192     * specifies an instruction that performs "result = r0 op r1".
4193     * This could be an ARM instruction or a function call.  (If the result
4194     * comes back in a register other than r0, you can override "result".)
4195     *
4196     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4197     * vCC (r1).  Useful for integer division and modulus.  Note that we
4198     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4199     * handles it correctly.
4200     *
4201     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4202     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4203     *      mul-float, div-float, rem-float
4204     */
4205    /* binop vAA, vBB, vCC */
4206    FETCH(r0, 1)                        @ r0<- CCBB
4207    mov     r9, rINST, lsr #8           @ r9<- AA
4208    mov     r3, r0, lsr #8              @ r3<- CC
4209    and     r2, r0, #255                @ r2<- BB
4210    GET_VREG(r1, r3)                    @ r1<- vCC
4211    GET_VREG(r0, r2)                    @ r0<- vBB
4212    .if 0
4213    cmp     r1, #0                      @ is second operand zero?
4214    beq     common_errDivideByZero
4215    .endif
4216
4217    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4218                               @ optional op; may set condition codes
4219    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4220    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4221    SET_VREG(r0, r9)               @ vAA<- r0
4222    GOTO_OPCODE(ip)                     @ jump to next instruction
4223    /* 11-14 instructions */
4224
4225
4226/* ------------------------------ */
4227    .balign 64
4228.L_OP_XOR_INT: /* 0x97 */
4229/* File: armv5te/OP_XOR_INT.S */
4230/* File: armv5te/binop.S */
4231    /*
4232     * Generic 32-bit binary operation.  Provide an "instr" line that
4233     * specifies an instruction that performs "result = r0 op r1".
4234     * This could be an ARM instruction or a function call.  (If the result
4235     * comes back in a register other than r0, you can override "result".)
4236     *
4237     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4238     * vCC (r1).  Useful for integer division and modulus.  Note that we
4239     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4240     * handles it correctly.
4241     *
4242     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4243     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4244     *      mul-float, div-float, rem-float
4245     */
4246    /* binop vAA, vBB, vCC */
4247    FETCH(r0, 1)                        @ r0<- CCBB
4248    mov     r9, rINST, lsr #8           @ r9<- AA
4249    mov     r3, r0, lsr #8              @ r3<- CC
4250    and     r2, r0, #255                @ r2<- BB
4251    GET_VREG(r1, r3)                    @ r1<- vCC
4252    GET_VREG(r0, r2)                    @ r0<- vBB
4253    .if 0
4254    cmp     r1, #0                      @ is second operand zero?
4255    beq     common_errDivideByZero
4256    .endif
4257
4258    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4259                               @ optional op; may set condition codes
4260    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4261    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4262    SET_VREG(r0, r9)               @ vAA<- r0
4263    GOTO_OPCODE(ip)                     @ jump to next instruction
4264    /* 11-14 instructions */
4265
4266
4267/* ------------------------------ */
4268    .balign 64
4269.L_OP_SHL_INT: /* 0x98 */
4270/* File: armv5te/OP_SHL_INT.S */
4271/* File: armv5te/binop.S */
4272    /*
4273     * Generic 32-bit binary operation.  Provide an "instr" line that
4274     * specifies an instruction that performs "result = r0 op r1".
4275     * This could be an ARM instruction or a function call.  (If the result
4276     * comes back in a register other than r0, you can override "result".)
4277     *
4278     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4279     * vCC (r1).  Useful for integer division and modulus.  Note that we
4280     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4281     * handles it correctly.
4282     *
4283     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4284     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4285     *      mul-float, div-float, rem-float
4286     */
4287    /* binop vAA, vBB, vCC */
4288    FETCH(r0, 1)                        @ r0<- CCBB
4289    mov     r9, rINST, lsr #8           @ r9<- AA
4290    mov     r3, r0, lsr #8              @ r3<- CC
4291    and     r2, r0, #255                @ r2<- BB
4292    GET_VREG(r1, r3)                    @ r1<- vCC
4293    GET_VREG(r0, r2)                    @ r0<- vBB
4294    .if 0
4295    cmp     r1, #0                      @ is second operand zero?
4296    beq     common_errDivideByZero
4297    .endif
4298
4299    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4300    and     r1, r1, #31                           @ optional op; may set condition codes
4301    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4302    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4303    SET_VREG(r0, r9)               @ vAA<- r0
4304    GOTO_OPCODE(ip)                     @ jump to next instruction
4305    /* 11-14 instructions */
4306
4307
4308/* ------------------------------ */
4309    .balign 64
4310.L_OP_SHR_INT: /* 0x99 */
4311/* File: armv5te/OP_SHR_INT.S */
4312/* File: armv5te/binop.S */
4313    /*
4314     * Generic 32-bit binary operation.  Provide an "instr" line that
4315     * specifies an instruction that performs "result = r0 op r1".
4316     * This could be an ARM instruction or a function call.  (If the result
4317     * comes back in a register other than r0, you can override "result".)
4318     *
4319     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4320     * vCC (r1).  Useful for integer division and modulus.  Note that we
4321     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4322     * handles it correctly.
4323     *
4324     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4325     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4326     *      mul-float, div-float, rem-float
4327     */
4328    /* binop vAA, vBB, vCC */
4329    FETCH(r0, 1)                        @ r0<- CCBB
4330    mov     r9, rINST, lsr #8           @ r9<- AA
4331    mov     r3, r0, lsr #8              @ r3<- CC
4332    and     r2, r0, #255                @ r2<- BB
4333    GET_VREG(r1, r3)                    @ r1<- vCC
4334    GET_VREG(r0, r2)                    @ r0<- vBB
4335    .if 0
4336    cmp     r1, #0                      @ is second operand zero?
4337    beq     common_errDivideByZero
4338    .endif
4339
4340    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4341    and     r1, r1, #31                           @ optional op; may set condition codes
4342    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4343    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4344    SET_VREG(r0, r9)               @ vAA<- r0
4345    GOTO_OPCODE(ip)                     @ jump to next instruction
4346    /* 11-14 instructions */
4347
4348
4349/* ------------------------------ */
4350    .balign 64
4351.L_OP_USHR_INT: /* 0x9a */
4352/* File: armv5te/OP_USHR_INT.S */
4353/* File: armv5te/binop.S */
4354    /*
4355     * Generic 32-bit binary operation.  Provide an "instr" line that
4356     * specifies an instruction that performs "result = r0 op r1".
4357     * This could be an ARM instruction or a function call.  (If the result
4358     * comes back in a register other than r0, you can override "result".)
4359     *
4360     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4361     * vCC (r1).  Useful for integer division and modulus.  Note that we
4362     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4363     * handles it correctly.
4364     *
4365     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4366     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4367     *      mul-float, div-float, rem-float
4368     */
4369    /* binop vAA, vBB, vCC */
4370    FETCH(r0, 1)                        @ r0<- CCBB
4371    mov     r9, rINST, lsr #8           @ r9<- AA
4372    mov     r3, r0, lsr #8              @ r3<- CC
4373    and     r2, r0, #255                @ r2<- BB
4374    GET_VREG(r1, r3)                    @ r1<- vCC
4375    GET_VREG(r0, r2)                    @ r0<- vBB
4376    .if 0
4377    cmp     r1, #0                      @ is second operand zero?
4378    beq     common_errDivideByZero
4379    .endif
4380
4381    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4382    and     r1, r1, #31                           @ optional op; may set condition codes
4383    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4384    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4385    SET_VREG(r0, r9)               @ vAA<- r0
4386    GOTO_OPCODE(ip)                     @ jump to next instruction
4387    /* 11-14 instructions */
4388
4389
4390/* ------------------------------ */
4391    .balign 64
4392.L_OP_ADD_LONG: /* 0x9b */
4393/* File: armv5te/OP_ADD_LONG.S */
4394/* File: armv5te/binopWide.S */
4395    /*
4396     * Generic 64-bit binary operation.  Provide an "instr" line that
4397     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4398     * This could be an ARM instruction or a function call.  (If the result
4399     * comes back in a register other than r0, you can override "result".)
4400     *
4401     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4402     * vCC (r1).  Useful for integer division and modulus.
4403     *
4404     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4405     *      xor-long, add-double, sub-double, mul-double, div-double,
4406     *      rem-double
4407     *
4408     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4409     */
4410    /* binop vAA, vBB, vCC */
4411    FETCH(r0, 1)                        @ r0<- CCBB
4412    mov     r9, rINST, lsr #8           @ r9<- AA
4413    and     r2, r0, #255                @ r2<- BB
4414    mov     r3, r0, lsr #8              @ r3<- CC
4415    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4416    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4417    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4418    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4419    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4420    .if 0
4421    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4422    beq     common_errDivideByZero
4423    .endif
4424    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4425
4426    adds    r0, r0, r2                           @ optional op; may set condition codes
4427    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4428    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4429    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4430    GOTO_OPCODE(ip)                     @ jump to next instruction
4431    /* 14-17 instructions */
4432
4433
4434/* ------------------------------ */
4435    .balign 64
4436.L_OP_SUB_LONG: /* 0x9c */
4437/* File: armv5te/OP_SUB_LONG.S */
4438/* File: armv5te/binopWide.S */
4439    /*
4440     * Generic 64-bit binary operation.  Provide an "instr" line that
4441     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4442     * This could be an ARM instruction or a function call.  (If the result
4443     * comes back in a register other than r0, you can override "result".)
4444     *
4445     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4446     * vCC (r1).  Useful for integer division and modulus.
4447     *
4448     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4449     *      xor-long, add-double, sub-double, mul-double, div-double,
4450     *      rem-double
4451     *
4452     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4453     */
4454    /* binop vAA, vBB, vCC */
4455    FETCH(r0, 1)                        @ r0<- CCBB
4456    mov     r9, rINST, lsr #8           @ r9<- AA
4457    and     r2, r0, #255                @ r2<- BB
4458    mov     r3, r0, lsr #8              @ r3<- CC
4459    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4460    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4461    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4462    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4463    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4464    .if 0
4465    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4466    beq     common_errDivideByZero
4467    .endif
4468    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4469
4470    subs    r0, r0, r2                           @ optional op; may set condition codes
4471    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4472    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4473    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4474    GOTO_OPCODE(ip)                     @ jump to next instruction
4475    /* 14-17 instructions */
4476
4477
4478/* ------------------------------ */
4479    .balign 64
4480.L_OP_MUL_LONG: /* 0x9d */
4481/* File: armv5te/OP_MUL_LONG.S */
4482    /*
4483     * Signed 64-bit integer multiply.
4484     *
4485     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4486     *        WX
4487     *      x YZ
4488     *  --------
4489     *     ZW ZX
4490     *  YW YX
4491     *
4492     * The low word of the result holds ZX, the high word holds
4493     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4494     * it doesn't fit in the low 64 bits.
4495     *
4496     * Unlike most ARM math operations, multiply instructions have
4497     * restrictions on using the same register more than once (Rd and Rm
4498     * cannot be the same).
4499     */
4500    /* mul-long vAA, vBB, vCC */
4501    FETCH(r0, 1)                        @ r0<- CCBB
4502    and     r2, r0, #255                @ r2<- BB
4503    mov     r3, r0, lsr #8              @ r3<- CC
4504    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4505    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4506    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4507    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4508    mul     ip, r2, r1                  @  ip<- ZxW
4509    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4510    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4511    mov     r0, rINST, lsr #8           @ r0<- AA
4512    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4513    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4514    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4515    b       .LOP_MUL_LONG_finish
4516
4517/* ------------------------------ */
4518    .balign 64
4519.L_OP_DIV_LONG: /* 0x9e */
4520/* File: armv5te/OP_DIV_LONG.S */
4521/* File: armv5te/binopWide.S */
4522    /*
4523     * Generic 64-bit binary operation.  Provide an "instr" line that
4524     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4525     * This could be an ARM instruction or a function call.  (If the result
4526     * comes back in a register other than r0, you can override "result".)
4527     *
4528     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4529     * vCC (r1).  Useful for integer division and modulus.
4530     *
4531     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4532     *      xor-long, add-double, sub-double, mul-double, div-double,
4533     *      rem-double
4534     *
4535     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4536     */
4537    /* binop vAA, vBB, vCC */
4538    FETCH(r0, 1)                        @ r0<- CCBB
4539    mov     r9, rINST, lsr #8           @ r9<- AA
4540    and     r2, r0, #255                @ r2<- BB
4541    mov     r3, r0, lsr #8              @ r3<- CC
4542    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4543    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4544    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4545    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4546    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4547    .if 1
4548    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4549    beq     common_errDivideByZero
4550    .endif
4551    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4552
4553                               @ optional op; may set condition codes
4554    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4555    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4556    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4557    GOTO_OPCODE(ip)                     @ jump to next instruction
4558    /* 14-17 instructions */
4559
4560
4561/* ------------------------------ */
4562    .balign 64
4563.L_OP_REM_LONG: /* 0x9f */
4564/* File: armv5te/OP_REM_LONG.S */
4565/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4566/* File: armv5te/binopWide.S */
4567    /*
4568     * Generic 64-bit binary operation.  Provide an "instr" line that
4569     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4570     * This could be an ARM instruction or a function call.  (If the result
4571     * comes back in a register other than r0, you can override "result".)
4572     *
4573     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4574     * vCC (r1).  Useful for integer division and modulus.
4575     *
4576     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4577     *      xor-long, add-double, sub-double, mul-double, div-double,
4578     *      rem-double
4579     *
4580     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4581     */
4582    /* binop vAA, vBB, vCC */
4583    FETCH(r0, 1)                        @ r0<- CCBB
4584    mov     r9, rINST, lsr #8           @ r9<- AA
4585    and     r2, r0, #255                @ r2<- BB
4586    mov     r3, r0, lsr #8              @ r3<- CC
4587    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4588    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4589    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4590    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4591    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4592    .if 1
4593    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4594    beq     common_errDivideByZero
4595    .endif
4596    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4597
4598                               @ optional op; may set condition codes
4599    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4600    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4601    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4602    GOTO_OPCODE(ip)                     @ jump to next instruction
4603    /* 14-17 instructions */
4604
4605
4606/* ------------------------------ */
4607    .balign 64
4608.L_OP_AND_LONG: /* 0xa0 */
4609/* File: armv5te/OP_AND_LONG.S */
4610/* File: armv5te/binopWide.S */
4611    /*
4612     * Generic 64-bit binary operation.  Provide an "instr" line that
4613     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4614     * This could be an ARM instruction or a function call.  (If the result
4615     * comes back in a register other than r0, you can override "result".)
4616     *
4617     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4618     * vCC (r1).  Useful for integer division and modulus.
4619     *
4620     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4621     *      xor-long, add-double, sub-double, mul-double, div-double,
4622     *      rem-double
4623     *
4624     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4625     */
4626    /* binop vAA, vBB, vCC */
4627    FETCH(r0, 1)                        @ r0<- CCBB
4628    mov     r9, rINST, lsr #8           @ r9<- AA
4629    and     r2, r0, #255                @ r2<- BB
4630    mov     r3, r0, lsr #8              @ r3<- CC
4631    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4632    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4633    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4634    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4635    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4636    .if 0
4637    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4638    beq     common_errDivideByZero
4639    .endif
4640    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4641
4642    and     r0, r0, r2                           @ optional op; may set condition codes
4643    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4644    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4645    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4646    GOTO_OPCODE(ip)                     @ jump to next instruction
4647    /* 14-17 instructions */
4648
4649
4650/* ------------------------------ */
4651    .balign 64
4652.L_OP_OR_LONG: /* 0xa1 */
4653/* File: armv5te/OP_OR_LONG.S */
4654/* File: armv5te/binopWide.S */
4655    /*
4656     * Generic 64-bit binary operation.  Provide an "instr" line that
4657     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4658     * This could be an ARM instruction or a function call.  (If the result
4659     * comes back in a register other than r0, you can override "result".)
4660     *
4661     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4662     * vCC (r1).  Useful for integer division and modulus.
4663     *
4664     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4665     *      xor-long, add-double, sub-double, mul-double, div-double,
4666     *      rem-double
4667     *
4668     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4669     */
4670    /* binop vAA, vBB, vCC */
4671    FETCH(r0, 1)                        @ r0<- CCBB
4672    mov     r9, rINST, lsr #8           @ r9<- AA
4673    and     r2, r0, #255                @ r2<- BB
4674    mov     r3, r0, lsr #8              @ r3<- CC
4675    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4676    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4677    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4678    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4679    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4680    .if 0
4681    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4682    beq     common_errDivideByZero
4683    .endif
4684    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4685
4686    orr     r0, r0, r2                           @ optional op; may set condition codes
4687    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4688    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4689    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4690    GOTO_OPCODE(ip)                     @ jump to next instruction
4691    /* 14-17 instructions */
4692
4693
4694/* ------------------------------ */
4695    .balign 64
4696.L_OP_XOR_LONG: /* 0xa2 */
4697/* File: armv5te/OP_XOR_LONG.S */
4698/* File: armv5te/binopWide.S */
4699    /*
4700     * Generic 64-bit binary operation.  Provide an "instr" line that
4701     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4702     * This could be an ARM instruction or a function call.  (If the result
4703     * comes back in a register other than r0, you can override "result".)
4704     *
4705     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4706     * vCC (r1).  Useful for integer division and modulus.
4707     *
4708     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4709     *      xor-long, add-double, sub-double, mul-double, div-double,
4710     *      rem-double
4711     *
4712     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4713     */
4714    /* binop vAA, vBB, vCC */
4715    FETCH(r0, 1)                        @ r0<- CCBB
4716    mov     r9, rINST, lsr #8           @ r9<- AA
4717    and     r2, r0, #255                @ r2<- BB
4718    mov     r3, r0, lsr #8              @ r3<- CC
4719    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4720    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4721    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4722    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4723    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4724    .if 0
4725    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4726    beq     common_errDivideByZero
4727    .endif
4728    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4729
4730    eor     r0, r0, r2                           @ optional op; may set condition codes
4731    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4732    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4733    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4734    GOTO_OPCODE(ip)                     @ jump to next instruction
4735    /* 14-17 instructions */
4736
4737
4738/* ------------------------------ */
4739    .balign 64
4740.L_OP_SHL_LONG: /* 0xa3 */
4741/* File: armv5te/OP_SHL_LONG.S */
4742    /*
4743     * Long integer shift.  This is different from the generic 32/64-bit
4744     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4745     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4746     * 6 bits of the shift distance.
4747     */
4748    /* shl-long vAA, vBB, vCC */
4749    FETCH(r0, 1)                        @ r0<- CCBB
4750    mov     r9, rINST, lsr #8           @ r9<- AA
4751    and     r3, r0, #255                @ r3<- BB
4752    mov     r0, r0, lsr #8              @ r0<- CC
4753    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4754    GET_VREG(r2, r0)                    @ r2<- vCC
4755    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4756    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4757    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4758
4759    mov     r1, r1, asl r2              @  r1<- r1 << r2
4760    rsb     r3, r2, #32                 @  r3<- 32 - r2
4761    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
4762    subs    ip, r2, #32                 @  ip<- r2 - 32
4763    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
4764    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4765    b       .LOP_SHL_LONG_finish
4766
4767/* ------------------------------ */
4768    .balign 64
4769.L_OP_SHR_LONG: /* 0xa4 */
4770/* File: armv5te/OP_SHR_LONG.S */
4771    /*
4772     * Long integer shift.  This is different from the generic 32/64-bit
4773     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4774     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4775     * 6 bits of the shift distance.
4776     */
4777    /* shr-long vAA, vBB, vCC */
4778    FETCH(r0, 1)                        @ r0<- CCBB
4779    mov     r9, rINST, lsr #8           @ r9<- AA
4780    and     r3, r0, #255                @ r3<- BB
4781    mov     r0, r0, lsr #8              @ r0<- CC
4782    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4783    GET_VREG(r2, r0)                    @ r2<- vCC
4784    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4785    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4786    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4787
4788    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4789    rsb     r3, r2, #32                 @  r3<- 32 - r2
4790    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4791    subs    ip, r2, #32                 @  ip<- r2 - 32
4792    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
4793    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4794    b       .LOP_SHR_LONG_finish
4795
4796/* ------------------------------ */
4797    .balign 64
4798.L_OP_USHR_LONG: /* 0xa5 */
4799/* File: armv5te/OP_USHR_LONG.S */
4800    /*
4801     * Long integer shift.  This is different from the generic 32/64-bit
4802     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4803     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4804     * 6 bits of the shift distance.
4805     */
4806    /* ushr-long vAA, vBB, vCC */
4807    FETCH(r0, 1)                        @ r0<- CCBB
4808    mov     r9, rINST, lsr #8           @ r9<- AA
4809    and     r3, r0, #255                @ r3<- BB
4810    mov     r0, r0, lsr #8              @ r0<- CC
4811    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4812    GET_VREG(r2, r0)                    @ r2<- vCC
4813    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4814    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4815    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4816
4817    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4818    rsb     r3, r2, #32                 @  r3<- 32 - r2
4819    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4820    subs    ip, r2, #32                 @  ip<- r2 - 32
4821    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
4822    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4823    b       .LOP_USHR_LONG_finish
4824
4825/* ------------------------------ */
4826    .balign 64
4827.L_OP_ADD_FLOAT: /* 0xa6 */
4828/* File: arm-vfp/OP_ADD_FLOAT.S */
4829/* File: arm-vfp/fbinop.S */
4830    /*
4831     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4832     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4833     * use the "softfp" ABI, this must be an instruction, not a function call.
4834     *
4835     * For: add-float, sub-float, mul-float, div-float
4836     */
4837    /* floatop vAA, vBB, vCC */
4838    FETCH(r0, 1)                        @ r0<- CCBB
4839    mov     r9, rINST, lsr #8           @ r9<- AA
4840    mov     r3, r0, lsr #8              @ r3<- CC
4841    and     r2, r0, #255                @ r2<- BB
4842    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4843    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4844    flds    s1, [r3]                    @ s1<- vCC
4845    flds    s0, [r2]                    @ s0<- vBB
4846
4847    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4848    fadds   s2, s0, s1                              @ s2<- op
4849    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4850    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4851    fsts    s2, [r9]                    @ vAA<- s2
4852    GOTO_OPCODE(ip)                     @ jump to next instruction
4853
4854
4855/* ------------------------------ */
4856    .balign 64
4857.L_OP_SUB_FLOAT: /* 0xa7 */
4858/* File: arm-vfp/OP_SUB_FLOAT.S */
4859/* File: arm-vfp/fbinop.S */
4860    /*
4861     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4862     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4863     * use the "softfp" ABI, this must be an instruction, not a function call.
4864     *
4865     * For: add-float, sub-float, mul-float, div-float
4866     */
4867    /* floatop vAA, vBB, vCC */
4868    FETCH(r0, 1)                        @ r0<- CCBB
4869    mov     r9, rINST, lsr #8           @ r9<- AA
4870    mov     r3, r0, lsr #8              @ r3<- CC
4871    and     r2, r0, #255                @ r2<- BB
4872    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4873    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4874    flds    s1, [r3]                    @ s1<- vCC
4875    flds    s0, [r2]                    @ s0<- vBB
4876
4877    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4878    fsubs   s2, s0, s1                              @ s2<- op
4879    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4880    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4881    fsts    s2, [r9]                    @ vAA<- s2
4882    GOTO_OPCODE(ip)                     @ jump to next instruction
4883
4884
4885/* ------------------------------ */
4886    .balign 64
4887.L_OP_MUL_FLOAT: /* 0xa8 */
4888/* File: arm-vfp/OP_MUL_FLOAT.S */
4889/* File: arm-vfp/fbinop.S */
4890    /*
4891     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4892     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4893     * use the "softfp" ABI, this must be an instruction, not a function call.
4894     *
4895     * For: add-float, sub-float, mul-float, div-float
4896     */
4897    /* floatop vAA, vBB, vCC */
4898    FETCH(r0, 1)                        @ r0<- CCBB
4899    mov     r9, rINST, lsr #8           @ r9<- AA
4900    mov     r3, r0, lsr #8              @ r3<- CC
4901    and     r2, r0, #255                @ r2<- BB
4902    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4903    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4904    flds    s1, [r3]                    @ s1<- vCC
4905    flds    s0, [r2]                    @ s0<- vBB
4906
4907    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4908    fmuls   s2, s0, s1                              @ s2<- op
4909    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4910    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4911    fsts    s2, [r9]                    @ vAA<- s2
4912    GOTO_OPCODE(ip)                     @ jump to next instruction
4913
4914
4915/* ------------------------------ */
4916    .balign 64
4917.L_OP_DIV_FLOAT: /* 0xa9 */
4918/* File: arm-vfp/OP_DIV_FLOAT.S */
4919/* File: arm-vfp/fbinop.S */
4920    /*
4921     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4922     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4923     * use the "softfp" ABI, this must be an instruction, not a function call.
4924     *
4925     * For: add-float, sub-float, mul-float, div-float
4926     */
4927    /* floatop vAA, vBB, vCC */
4928    FETCH(r0, 1)                        @ r0<- CCBB
4929    mov     r9, rINST, lsr #8           @ r9<- AA
4930    mov     r3, r0, lsr #8              @ r3<- CC
4931    and     r2, r0, #255                @ r2<- BB
4932    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4933    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4934    flds    s1, [r3]                    @ s1<- vCC
4935    flds    s0, [r2]                    @ s0<- vBB
4936
4937    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4938    fdivs   s2, s0, s1                              @ s2<- op
4939    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4940    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4941    fsts    s2, [r9]                    @ vAA<- s2
4942    GOTO_OPCODE(ip)                     @ jump to next instruction
4943
4944
4945/* ------------------------------ */
4946    .balign 64
4947.L_OP_REM_FLOAT: /* 0xaa */
4948/* File: armv5te/OP_REM_FLOAT.S */
4949/* EABI doesn't define a float remainder function, but libm does */
4950/* File: armv5te/binop.S */
4951    /*
4952     * Generic 32-bit binary operation.  Provide an "instr" line that
4953     * specifies an instruction that performs "result = r0 op r1".
4954     * This could be an ARM instruction or a function call.  (If the result
4955     * comes back in a register other than r0, you can override "result".)
4956     *
4957     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4958     * vCC (r1).  Useful for integer division and modulus.  Note that we
4959     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4960     * handles it correctly.
4961     *
4962     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4963     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4964     *      mul-float, div-float, rem-float
4965     */
4966    /* binop vAA, vBB, vCC */
4967    FETCH(r0, 1)                        @ r0<- CCBB
4968    mov     r9, rINST, lsr #8           @ r9<- AA
4969    mov     r3, r0, lsr #8              @ r3<- CC
4970    and     r2, r0, #255                @ r2<- BB
4971    GET_VREG(r1, r3)                    @ r1<- vCC
4972    GET_VREG(r0, r2)                    @ r0<- vBB
4973    .if 0
4974    cmp     r1, #0                      @ is second operand zero?
4975    beq     common_errDivideByZero
4976    .endif
4977
4978    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4979                               @ optional op; may set condition codes
4980    bl      fmodf                              @ r0<- op, r0-r3 changed
4981    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4982    SET_VREG(r0, r9)               @ vAA<- r0
4983    GOTO_OPCODE(ip)                     @ jump to next instruction
4984    /* 11-14 instructions */
4985
4986
4987/* ------------------------------ */
4988    .balign 64
4989.L_OP_ADD_DOUBLE: /* 0xab */
4990/* File: arm-vfp/OP_ADD_DOUBLE.S */
4991/* File: arm-vfp/fbinopWide.S */
4992    /*
4993     * Generic 64-bit double-precision floating point binary operation.
4994     * Provide an "instr" line that specifies an instruction that performs
4995     * "d2 = d0 op d1".
4996     *
4997     * for: add-double, sub-double, mul-double, div-double
4998     */
4999    /* doubleop vAA, vBB, vCC */
5000    FETCH(r0, 1)                        @ r0<- CCBB
5001    mov     r9, rINST, lsr #8           @ r9<- AA
5002    mov     r3, r0, lsr #8              @ r3<- CC
5003    and     r2, r0, #255                @ r2<- BB
5004    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5005    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5006    fldd    d1, [r3]                    @ d1<- vCC
5007    fldd    d0, [r2]                    @ d0<- vBB
5008
5009    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5010    faddd   d2, d0, d1                              @ s2<- op
5011    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5012    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5013    fstd    d2, [r9]                    @ vAA<- d2
5014    GOTO_OPCODE(ip)                     @ jump to next instruction
5015
5016
5017/* ------------------------------ */
5018    .balign 64
5019.L_OP_SUB_DOUBLE: /* 0xac */
5020/* File: arm-vfp/OP_SUB_DOUBLE.S */
5021/* File: arm-vfp/fbinopWide.S */
5022    /*
5023     * Generic 64-bit double-precision floating point binary operation.
5024     * Provide an "instr" line that specifies an instruction that performs
5025     * "d2 = d0 op d1".
5026     *
5027     * for: add-double, sub-double, mul-double, div-double
5028     */
5029    /* doubleop vAA, vBB, vCC */
5030    FETCH(r0, 1)                        @ r0<- CCBB
5031    mov     r9, rINST, lsr #8           @ r9<- AA
5032    mov     r3, r0, lsr #8              @ r3<- CC
5033    and     r2, r0, #255                @ r2<- BB
5034    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5035    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5036    fldd    d1, [r3]                    @ d1<- vCC
5037    fldd    d0, [r2]                    @ d0<- vBB
5038
5039    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5040    fsubd   d2, d0, d1                              @ s2<- op
5041    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5042    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5043    fstd    d2, [r9]                    @ vAA<- d2
5044    GOTO_OPCODE(ip)                     @ jump to next instruction
5045
5046
5047/* ------------------------------ */
5048    .balign 64
5049.L_OP_MUL_DOUBLE: /* 0xad */
5050/* File: arm-vfp/OP_MUL_DOUBLE.S */
5051/* File: arm-vfp/fbinopWide.S */
5052    /*
5053     * Generic 64-bit double-precision floating point binary operation.
5054     * Provide an "instr" line that specifies an instruction that performs
5055     * "d2 = d0 op d1".
5056     *
5057     * for: add-double, sub-double, mul-double, div-double
5058     */
5059    /* doubleop vAA, vBB, vCC */
5060    FETCH(r0, 1)                        @ r0<- CCBB
5061    mov     r9, rINST, lsr #8           @ r9<- AA
5062    mov     r3, r0, lsr #8              @ r3<- CC
5063    and     r2, r0, #255                @ r2<- BB
5064    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5065    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5066    fldd    d1, [r3]                    @ d1<- vCC
5067    fldd    d0, [r2]                    @ d0<- vBB
5068
5069    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5070    fmuld   d2, d0, d1                              @ s2<- op
5071    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5072    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5073    fstd    d2, [r9]                    @ vAA<- d2
5074    GOTO_OPCODE(ip)                     @ jump to next instruction
5075
5076
5077/* ------------------------------ */
5078    .balign 64
5079.L_OP_DIV_DOUBLE: /* 0xae */
5080/* File: arm-vfp/OP_DIV_DOUBLE.S */
5081/* File: arm-vfp/fbinopWide.S */
5082    /*
5083     * Generic 64-bit double-precision floating point binary operation.
5084     * Provide an "instr" line that specifies an instruction that performs
5085     * "d2 = d0 op d1".
5086     *
5087     * for: add-double, sub-double, mul-double, div-double
5088     */
5089    /* doubleop vAA, vBB, vCC */
5090    FETCH(r0, 1)                        @ r0<- CCBB
5091    mov     r9, rINST, lsr #8           @ r9<- AA
5092    mov     r3, r0, lsr #8              @ r3<- CC
5093    and     r2, r0, #255                @ r2<- BB
5094    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5095    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5096    fldd    d1, [r3]                    @ d1<- vCC
5097    fldd    d0, [r2]                    @ d0<- vBB
5098
5099    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5100    fdivd   d2, d0, d1                              @ s2<- op
5101    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5102    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5103    fstd    d2, [r9]                    @ vAA<- d2
5104    GOTO_OPCODE(ip)                     @ jump to next instruction
5105
5106
5107/* ------------------------------ */
5108    .balign 64
5109.L_OP_REM_DOUBLE: /* 0xaf */
5110/* File: armv5te/OP_REM_DOUBLE.S */
5111/* EABI doesn't define a double remainder function, but libm does */
5112/* File: armv5te/binopWide.S */
5113    /*
5114     * Generic 64-bit binary operation.  Provide an "instr" line that
5115     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5116     * This could be an ARM instruction or a function call.  (If the result
5117     * comes back in a register other than r0, you can override "result".)
5118     *
5119     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5120     * vCC (r1).  Useful for integer division and modulus.
5121     *
5122     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5123     *      xor-long, add-double, sub-double, mul-double, div-double,
5124     *      rem-double
5125     *
5126     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5127     */
5128    /* binop vAA, vBB, vCC */
5129    FETCH(r0, 1)                        @ r0<- CCBB
5130    mov     r9, rINST, lsr #8           @ r9<- AA
5131    and     r2, r0, #255                @ r2<- BB
5132    mov     r3, r0, lsr #8              @ r3<- CC
5133    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5134    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5135    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5136    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5137    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5138    .if 0
5139    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5140    beq     common_errDivideByZero
5141    .endif
5142    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5143
5144                               @ optional op; may set condition codes
5145    bl      fmod                              @ result<- op, r0-r3 changed
5146    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5147    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5148    GOTO_OPCODE(ip)                     @ jump to next instruction
5149    /* 14-17 instructions */
5150
5151
5152/* ------------------------------ */
5153    .balign 64
5154.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5155/* File: armv5te/OP_ADD_INT_2ADDR.S */
5156/* File: armv5te/binop2addr.S */
5157    /*
5158     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5159     * that specifies an instruction that performs "result = r0 op r1".
5160     * This could be an ARM instruction or a function call.  (If the result
5161     * comes back in a register other than r0, you can override "result".)
5162     *
5163     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5164     * vCC (r1).  Useful for integer division and modulus.
5165     *
5166     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5167     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5168     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5169     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5170     */
5171    /* binop/2addr vA, vB */
5172    mov     r9, rINST, lsr #8           @ r9<- A+
5173    mov     r3, rINST, lsr #12          @ r3<- B
5174    and     r9, r9, #15
5175    GET_VREG(r1, r3)                    @ r1<- vB
5176    GET_VREG(r0, r9)                    @ r0<- vA
5177    .if 0
5178    cmp     r1, #0                      @ is second operand zero?
5179    beq     common_errDivideByZero
5180    .endif
5181    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5182
5183                               @ optional op; may set condition codes
5184    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5185    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5186    SET_VREG(r0, r9)               @ vAA<- r0
5187    GOTO_OPCODE(ip)                     @ jump to next instruction
5188    /* 10-13 instructions */
5189
5190
5191/* ------------------------------ */
5192    .balign 64
5193.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5194/* File: armv5te/OP_SUB_INT_2ADDR.S */
5195/* File: armv5te/binop2addr.S */
5196    /*
5197     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5198     * that specifies an instruction that performs "result = r0 op r1".
5199     * This could be an ARM instruction or a function call.  (If the result
5200     * comes back in a register other than r0, you can override "result".)
5201     *
5202     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5203     * vCC (r1).  Useful for integer division and modulus.
5204     *
5205     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5206     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5207     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5208     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5209     */
5210    /* binop/2addr vA, vB */
5211    mov     r9, rINST, lsr #8           @ r9<- A+
5212    mov     r3, rINST, lsr #12          @ r3<- B
5213    and     r9, r9, #15
5214    GET_VREG(r1, r3)                    @ r1<- vB
5215    GET_VREG(r0, r9)                    @ r0<- vA
5216    .if 0
5217    cmp     r1, #0                      @ is second operand zero?
5218    beq     common_errDivideByZero
5219    .endif
5220    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5221
5222                               @ optional op; may set condition codes
5223    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5224    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5225    SET_VREG(r0, r9)               @ vAA<- r0
5226    GOTO_OPCODE(ip)                     @ jump to next instruction
5227    /* 10-13 instructions */
5228
5229
5230/* ------------------------------ */
5231    .balign 64
5232.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5233/* File: armv5te/OP_MUL_INT_2ADDR.S */
5234/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5235/* File: armv5te/binop2addr.S */
5236    /*
5237     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5238     * that specifies an instruction that performs "result = r0 op r1".
5239     * This could be an ARM instruction or a function call.  (If the result
5240     * comes back in a register other than r0, you can override "result".)
5241     *
5242     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5243     * vCC (r1).  Useful for integer division and modulus.
5244     *
5245     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5246     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5247     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5248     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5249     */
5250    /* binop/2addr vA, vB */
5251    mov     r9, rINST, lsr #8           @ r9<- A+
5252    mov     r3, rINST, lsr #12          @ r3<- B
5253    and     r9, r9, #15
5254    GET_VREG(r1, r3)                    @ r1<- vB
5255    GET_VREG(r0, r9)                    @ r0<- vA
5256    .if 0
5257    cmp     r1, #0                      @ is second operand zero?
5258    beq     common_errDivideByZero
5259    .endif
5260    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5261
5262                               @ optional op; may set condition codes
5263    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5264    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5265    SET_VREG(r0, r9)               @ vAA<- r0
5266    GOTO_OPCODE(ip)                     @ jump to next instruction
5267    /* 10-13 instructions */
5268
5269
5270/* ------------------------------ */
5271    .balign 64
5272.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5273/* File: armv5te/OP_DIV_INT_2ADDR.S */
5274/* File: armv5te/binop2addr.S */
5275    /*
5276     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5277     * that specifies an instruction that performs "result = r0 op r1".
5278     * This could be an ARM instruction or a function call.  (If the result
5279     * comes back in a register other than r0, you can override "result".)
5280     *
5281     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5282     * vCC (r1).  Useful for integer division and modulus.
5283     *
5284     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5285     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5286     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5287     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5288     */
5289    /* binop/2addr vA, vB */
5290    mov     r9, rINST, lsr #8           @ r9<- A+
5291    mov     r3, rINST, lsr #12          @ r3<- B
5292    and     r9, r9, #15
5293    GET_VREG(r1, r3)                    @ r1<- vB
5294    GET_VREG(r0, r9)                    @ r0<- vA
5295    .if 1
5296    cmp     r1, #0                      @ is second operand zero?
5297    beq     common_errDivideByZero
5298    .endif
5299    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5300
5301                               @ optional op; may set condition codes
5302    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5303    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5304    SET_VREG(r0, r9)               @ vAA<- r0
5305    GOTO_OPCODE(ip)                     @ jump to next instruction
5306    /* 10-13 instructions */
5307
5308
5309/* ------------------------------ */
5310    .balign 64
5311.L_OP_REM_INT_2ADDR: /* 0xb4 */
5312/* File: armv5te/OP_REM_INT_2ADDR.S */
5313/* idivmod returns quotient in r0 and remainder in r1 */
5314/* File: armv5te/binop2addr.S */
5315    /*
5316     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5317     * that specifies an instruction that performs "result = r0 op r1".
5318     * This could be an ARM instruction or a function call.  (If the result
5319     * comes back in a register other than r0, you can override "result".)
5320     *
5321     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5322     * vCC (r1).  Useful for integer division and modulus.
5323     *
5324     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5325     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5326     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5327     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5328     */
5329    /* binop/2addr vA, vB */
5330    mov     r9, rINST, lsr #8           @ r9<- A+
5331    mov     r3, rINST, lsr #12          @ r3<- B
5332    and     r9, r9, #15
5333    GET_VREG(r1, r3)                    @ r1<- vB
5334    GET_VREG(r0, r9)                    @ r0<- vA
5335    .if 1
5336    cmp     r1, #0                      @ is second operand zero?
5337    beq     common_errDivideByZero
5338    .endif
5339    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5340
5341                               @ optional op; may set condition codes
5342    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5343    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5344    SET_VREG(r1, r9)               @ vAA<- r1
5345    GOTO_OPCODE(ip)                     @ jump to next instruction
5346    /* 10-13 instructions */
5347
5348
5349/* ------------------------------ */
5350    .balign 64
5351.L_OP_AND_INT_2ADDR: /* 0xb5 */
5352/* File: armv5te/OP_AND_INT_2ADDR.S */
5353/* File: armv5te/binop2addr.S */
5354    /*
5355     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5356     * that specifies an instruction that performs "result = r0 op r1".
5357     * This could be an ARM instruction or a function call.  (If the result
5358     * comes back in a register other than r0, you can override "result".)
5359     *
5360     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5361     * vCC (r1).  Useful for integer division and modulus.
5362     *
5363     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5364     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5365     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5366     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5367     */
5368    /* binop/2addr vA, vB */
5369    mov     r9, rINST, lsr #8           @ r9<- A+
5370    mov     r3, rINST, lsr #12          @ r3<- B
5371    and     r9, r9, #15
5372    GET_VREG(r1, r3)                    @ r1<- vB
5373    GET_VREG(r0, r9)                    @ r0<- vA
5374    .if 0
5375    cmp     r1, #0                      @ is second operand zero?
5376    beq     common_errDivideByZero
5377    .endif
5378    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5379
5380                               @ optional op; may set condition codes
5381    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5382    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5383    SET_VREG(r0, r9)               @ vAA<- r0
5384    GOTO_OPCODE(ip)                     @ jump to next instruction
5385    /* 10-13 instructions */
5386
5387
5388/* ------------------------------ */
5389    .balign 64
5390.L_OP_OR_INT_2ADDR: /* 0xb6 */
5391/* File: armv5te/OP_OR_INT_2ADDR.S */
5392/* File: armv5te/binop2addr.S */
5393    /*
5394     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5395     * that specifies an instruction that performs "result = r0 op r1".
5396     * This could be an ARM instruction or a function call.  (If the result
5397     * comes back in a register other than r0, you can override "result".)
5398     *
5399     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5400     * vCC (r1).  Useful for integer division and modulus.
5401     *
5402     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5403     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5404     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5405     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5406     */
5407    /* binop/2addr vA, vB */
5408    mov     r9, rINST, lsr #8           @ r9<- A+
5409    mov     r3, rINST, lsr #12          @ r3<- B
5410    and     r9, r9, #15
5411    GET_VREG(r1, r3)                    @ r1<- vB
5412    GET_VREG(r0, r9)                    @ r0<- vA
5413    .if 0
5414    cmp     r1, #0                      @ is second operand zero?
5415    beq     common_errDivideByZero
5416    .endif
5417    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5418
5419                               @ optional op; may set condition codes
5420    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5421    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5422    SET_VREG(r0, r9)               @ vAA<- r0
5423    GOTO_OPCODE(ip)                     @ jump to next instruction
5424    /* 10-13 instructions */
5425
5426
5427/* ------------------------------ */
5428    .balign 64
5429.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5430/* File: armv5te/OP_XOR_INT_2ADDR.S */
5431/* File: armv5te/binop2addr.S */
5432    /*
5433     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5434     * that specifies an instruction that performs "result = r0 op r1".
5435     * This could be an ARM instruction or a function call.  (If the result
5436     * comes back in a register other than r0, you can override "result".)
5437     *
5438     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5439     * vCC (r1).  Useful for integer division and modulus.
5440     *
5441     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5442     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5443     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5444     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5445     */
5446    /* binop/2addr vA, vB */
5447    mov     r9, rINST, lsr #8           @ r9<- A+
5448    mov     r3, rINST, lsr #12          @ r3<- B
5449    and     r9, r9, #15
5450    GET_VREG(r1, r3)                    @ r1<- vB
5451    GET_VREG(r0, r9)                    @ r0<- vA
5452    .if 0
5453    cmp     r1, #0                      @ is second operand zero?
5454    beq     common_errDivideByZero
5455    .endif
5456    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5457
5458                               @ optional op; may set condition codes
5459    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5460    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5461    SET_VREG(r0, r9)               @ vAA<- r0
5462    GOTO_OPCODE(ip)                     @ jump to next instruction
5463    /* 10-13 instructions */
5464
5465
5466/* ------------------------------ */
5467    .balign 64
5468.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5469/* File: armv5te/OP_SHL_INT_2ADDR.S */
5470/* File: armv5te/binop2addr.S */
5471    /*
5472     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5473     * that specifies an instruction that performs "result = r0 op r1".
5474     * This could be an ARM instruction or a function call.  (If the result
5475     * comes back in a register other than r0, you can override "result".)
5476     *
5477     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5478     * vCC (r1).  Useful for integer division and modulus.
5479     *
5480     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5481     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5482     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5483     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5484     */
5485    /* binop/2addr vA, vB */
5486    mov     r9, rINST, lsr #8           @ r9<- A+
5487    mov     r3, rINST, lsr #12          @ r3<- B
5488    and     r9, r9, #15
5489    GET_VREG(r1, r3)                    @ r1<- vB
5490    GET_VREG(r0, r9)                    @ r0<- vA
5491    .if 0
5492    cmp     r1, #0                      @ is second operand zero?
5493    beq     common_errDivideByZero
5494    .endif
5495    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5496
5497    and     r1, r1, #31                           @ optional op; may set condition codes
5498    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5499    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5500    SET_VREG(r0, r9)               @ vAA<- r0
5501    GOTO_OPCODE(ip)                     @ jump to next instruction
5502    /* 10-13 instructions */
5503
5504
5505/* ------------------------------ */
5506    .balign 64
5507.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5508/* File: armv5te/OP_SHR_INT_2ADDR.S */
5509/* File: armv5te/binop2addr.S */
5510    /*
5511     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5512     * that specifies an instruction that performs "result = r0 op r1".
5513     * This could be an ARM instruction or a function call.  (If the result
5514     * comes back in a register other than r0, you can override "result".)
5515     *
5516     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5517     * vCC (r1).  Useful for integer division and modulus.
5518     *
5519     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5520     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5521     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5522     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5523     */
5524    /* binop/2addr vA, vB */
5525    mov     r9, rINST, lsr #8           @ r9<- A+
5526    mov     r3, rINST, lsr #12          @ r3<- B
5527    and     r9, r9, #15
5528    GET_VREG(r1, r3)                    @ r1<- vB
5529    GET_VREG(r0, r9)                    @ r0<- vA
5530    .if 0
5531    cmp     r1, #0                      @ is second operand zero?
5532    beq     common_errDivideByZero
5533    .endif
5534    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5535
5536    and     r1, r1, #31                           @ optional op; may set condition codes
5537    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5538    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5539    SET_VREG(r0, r9)               @ vAA<- r0
5540    GOTO_OPCODE(ip)                     @ jump to next instruction
5541    /* 10-13 instructions */
5542
5543
5544/* ------------------------------ */
5545    .balign 64
5546.L_OP_USHR_INT_2ADDR: /* 0xba */
5547/* File: armv5te/OP_USHR_INT_2ADDR.S */
5548/* File: armv5te/binop2addr.S */
5549    /*
5550     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5551     * that specifies an instruction that performs "result = r0 op r1".
5552     * This could be an ARM instruction or a function call.  (If the result
5553     * comes back in a register other than r0, you can override "result".)
5554     *
5555     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5556     * vCC (r1).  Useful for integer division and modulus.
5557     *
5558     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5559     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5560     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5561     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5562     */
5563    /* binop/2addr vA, vB */
5564    mov     r9, rINST, lsr #8           @ r9<- A+
5565    mov     r3, rINST, lsr #12          @ r3<- B
5566    and     r9, r9, #15
5567    GET_VREG(r1, r3)                    @ r1<- vB
5568    GET_VREG(r0, r9)                    @ r0<- vA
5569    .if 0
5570    cmp     r1, #0                      @ is second operand zero?
5571    beq     common_errDivideByZero
5572    .endif
5573    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5574
5575    and     r1, r1, #31                           @ optional op; may set condition codes
5576    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5577    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5578    SET_VREG(r0, r9)               @ vAA<- r0
5579    GOTO_OPCODE(ip)                     @ jump to next instruction
5580    /* 10-13 instructions */
5581
5582
5583/* ------------------------------ */
5584    .balign 64
5585.L_OP_ADD_LONG_2ADDR: /* 0xbb */
5586/* File: armv5te/OP_ADD_LONG_2ADDR.S */
5587/* File: armv5te/binopWide2addr.S */
5588    /*
5589     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5590     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5591     * This could be an ARM instruction or a function call.  (If the result
5592     * comes back in a register other than r0, you can override "result".)
5593     *
5594     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5595     * vCC (r1).  Useful for integer division and modulus.
5596     *
5597     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5598     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5599     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5600     *      rem-double/2addr
5601     */
5602    /* binop/2addr vA, vB */
5603    mov     r9, rINST, lsr #8           @ r9<- A+
5604    mov     r1, rINST, lsr #12          @ r1<- B
5605    and     r9, r9, #15
5606    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5607    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5608    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5609    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5610    .if 0
5611    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5612    beq     common_errDivideByZero
5613    .endif
5614    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5615
5616    adds    r0, r0, r2                           @ optional op; may set condition codes
5617    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5618    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5619    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5620    GOTO_OPCODE(ip)                     @ jump to next instruction
5621    /* 12-15 instructions */
5622
5623
5624/* ------------------------------ */
5625    .balign 64
5626.L_OP_SUB_LONG_2ADDR: /* 0xbc */
5627/* File: armv5te/OP_SUB_LONG_2ADDR.S */
5628/* File: armv5te/binopWide2addr.S */
5629    /*
5630     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5631     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5632     * This could be an ARM instruction or a function call.  (If the result
5633     * comes back in a register other than r0, you can override "result".)
5634     *
5635     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5636     * vCC (r1).  Useful for integer division and modulus.
5637     *
5638     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5639     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5640     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5641     *      rem-double/2addr
5642     */
5643    /* binop/2addr vA, vB */
5644    mov     r9, rINST, lsr #8           @ r9<- A+
5645    mov     r1, rINST, lsr #12          @ r1<- B
5646    and     r9, r9, #15
5647    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5648    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5649    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5650    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5651    .if 0
5652    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5653    beq     common_errDivideByZero
5654    .endif
5655    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5656
5657    subs    r0, r0, r2                           @ optional op; may set condition codes
5658    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5659    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5660    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5661    GOTO_OPCODE(ip)                     @ jump to next instruction
5662    /* 12-15 instructions */
5663
5664
5665/* ------------------------------ */
5666    .balign 64
5667.L_OP_MUL_LONG_2ADDR: /* 0xbd */
5668/* File: armv5te/OP_MUL_LONG_2ADDR.S */
5669    /*
5670     * Signed 64-bit integer multiply, "/2addr" version.
5671     *
5672     * See OP_MUL_LONG for an explanation.
5673     *
5674     * We get a little tight on registers, so to avoid looking up &fp[A]
5675     * again we stuff it into rINST.
5676     */
5677    /* mul-long/2addr vA, vB */
5678    mov     r9, rINST, lsr #8           @ r9<- A+
5679    mov     r1, rINST, lsr #12          @ r1<- B
5680    and     r9, r9, #15
5681    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5682    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
5683    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5684    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
5685    mul     ip, r2, r1                  @  ip<- ZxW
5686    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
5687    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
5688    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
5689    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5690    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
5691    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5692    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
5693    GOTO_OPCODE(ip)                     @ jump to next instruction
5694
5695/* ------------------------------ */
5696    .balign 64
5697.L_OP_DIV_LONG_2ADDR: /* 0xbe */
5698/* File: armv5te/OP_DIV_LONG_2ADDR.S */
5699/* File: armv5te/binopWide2addr.S */
5700    /*
5701     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5702     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5703     * This could be an ARM instruction or a function call.  (If the result
5704     * comes back in a register other than r0, you can override "result".)
5705     *
5706     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5707     * vCC (r1).  Useful for integer division and modulus.
5708     *
5709     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5710     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5711     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5712     *      rem-double/2addr
5713     */
5714    /* binop/2addr vA, vB */
5715    mov     r9, rINST, lsr #8           @ r9<- A+
5716    mov     r1, rINST, lsr #12          @ r1<- B
5717    and     r9, r9, #15
5718    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5719    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5720    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5721    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5722    .if 1
5723    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5724    beq     common_errDivideByZero
5725    .endif
5726    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5727
5728                               @ optional op; may set condition codes
5729    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5730    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5731    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5732    GOTO_OPCODE(ip)                     @ jump to next instruction
5733    /* 12-15 instructions */
5734
5735
5736/* ------------------------------ */
5737    .balign 64
5738.L_OP_REM_LONG_2ADDR: /* 0xbf */
5739/* File: armv5te/OP_REM_LONG_2ADDR.S */
5740/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5741/* File: armv5te/binopWide2addr.S */
5742    /*
5743     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5744     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5745     * This could be an ARM instruction or a function call.  (If the result
5746     * comes back in a register other than r0, you can override "result".)
5747     *
5748     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5749     * vCC (r1).  Useful for integer division and modulus.
5750     *
5751     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5752     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5753     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5754     *      rem-double/2addr
5755     */
5756    /* binop/2addr vA, vB */
5757    mov     r9, rINST, lsr #8           @ r9<- A+
5758    mov     r1, rINST, lsr #12          @ r1<- B
5759    and     r9, r9, #15
5760    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5761    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5762    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5763    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5764    .if 1
5765    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5766    beq     common_errDivideByZero
5767    .endif
5768    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5769
5770                               @ optional op; may set condition codes
5771    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5772    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5773    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
5774    GOTO_OPCODE(ip)                     @ jump to next instruction
5775    /* 12-15 instructions */
5776
5777
5778/* ------------------------------ */
5779    .balign 64
5780.L_OP_AND_LONG_2ADDR: /* 0xc0 */
5781/* File: armv5te/OP_AND_LONG_2ADDR.S */
5782/* File: armv5te/binopWide2addr.S */
5783    /*
5784     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5785     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5786     * This could be an ARM instruction or a function call.  (If the result
5787     * comes back in a register other than r0, you can override "result".)
5788     *
5789     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5790     * vCC (r1).  Useful for integer division and modulus.
5791     *
5792     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5793     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5794     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5795     *      rem-double/2addr
5796     */
5797    /* binop/2addr vA, vB */
5798    mov     r9, rINST, lsr #8           @ r9<- A+
5799    mov     r1, rINST, lsr #12          @ r1<- B
5800    and     r9, r9, #15
5801    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5802    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5803    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5804    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5805    .if 0
5806    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5807    beq     common_errDivideByZero
5808    .endif
5809    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5810
5811    and     r0, r0, r2                           @ optional op; may set condition codes
5812    and     r1, r1, r3                              @ result<- op, r0-r3 changed
5813    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5814    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5815    GOTO_OPCODE(ip)                     @ jump to next instruction
5816    /* 12-15 instructions */
5817
5818
5819/* ------------------------------ */
5820    .balign 64
5821.L_OP_OR_LONG_2ADDR: /* 0xc1 */
5822/* File: armv5te/OP_OR_LONG_2ADDR.S */
5823/* File: armv5te/binopWide2addr.S */
5824    /*
5825     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5826     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5827     * This could be an ARM instruction or a function call.  (If the result
5828     * comes back in a register other than r0, you can override "result".)
5829     *
5830     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5831     * vCC (r1).  Useful for integer division and modulus.
5832     *
5833     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5834     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5835     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5836     *      rem-double/2addr
5837     */
5838    /* binop/2addr vA, vB */
5839    mov     r9, rINST, lsr #8           @ r9<- A+
5840    mov     r1, rINST, lsr #12          @ r1<- B
5841    and     r9, r9, #15
5842    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5843    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5844    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5845    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5846    .if 0
5847    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5848    beq     common_errDivideByZero
5849    .endif
5850    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5851
5852    orr     r0, r0, r2                           @ optional op; may set condition codes
5853    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
5854    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5855    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5856    GOTO_OPCODE(ip)                     @ jump to next instruction
5857    /* 12-15 instructions */
5858
5859
5860/* ------------------------------ */
5861    .balign 64
5862.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
5863/* File: armv5te/OP_XOR_LONG_2ADDR.S */
5864/* File: armv5te/binopWide2addr.S */
5865    /*
5866     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5867     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5868     * This could be an ARM instruction or a function call.  (If the result
5869     * comes back in a register other than r0, you can override "result".)
5870     *
5871     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5872     * vCC (r1).  Useful for integer division and modulus.
5873     *
5874     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5875     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5876     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5877     *      rem-double/2addr
5878     */
5879    /* binop/2addr vA, vB */
5880    mov     r9, rINST, lsr #8           @ r9<- A+
5881    mov     r1, rINST, lsr #12          @ r1<- B
5882    and     r9, r9, #15
5883    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5884    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5885    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5886    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5887    .if 0
5888    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5889    beq     common_errDivideByZero
5890    .endif
5891    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5892
5893    eor     r0, r0, r2                           @ optional op; may set condition codes
5894    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
5895    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5896    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5897    GOTO_OPCODE(ip)                     @ jump to next instruction
5898    /* 12-15 instructions */
5899
5900
5901/* ------------------------------ */
5902    .balign 64
5903.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
5904/* File: armv5te/OP_SHL_LONG_2ADDR.S */
5905    /*
5906     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5907     * 32-bit shift distance.
5908     */
5909    /* shl-long/2addr vA, vB */
5910    mov     r9, rINST, lsr #8           @ r9<- A+
5911    mov     r3, rINST, lsr #12          @ r3<- B
5912    and     r9, r9, #15
5913    GET_VREG(r2, r3)                    @ r2<- vB
5914    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5915    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5916    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5917
5918    mov     r1, r1, asl r2              @  r1<- r1 << r2
5919    rsb     r3, r2, #32                 @  r3<- 32 - r2
5920    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
5921    subs    ip, r2, #32                 @  ip<- r2 - 32
5922    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5923    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
5924    mov     r0, r0, asl r2              @  r0<- r0 << r2
5925    b       .LOP_SHL_LONG_2ADDR_finish
5926
5927/* ------------------------------ */
5928    .balign 64
5929.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
5930/* File: armv5te/OP_SHR_LONG_2ADDR.S */
5931    /*
5932     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5933     * 32-bit shift distance.
5934     */
5935    /* shr-long/2addr vA, vB */
5936    mov     r9, rINST, lsr #8           @ r9<- A+
5937    mov     r3, rINST, lsr #12          @ r3<- B
5938    and     r9, r9, #15
5939    GET_VREG(r2, r3)                    @ r2<- vB
5940    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5941    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5942    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5943
5944    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5945    rsb     r3, r2, #32                 @  r3<- 32 - r2
5946    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5947    subs    ip, r2, #32                 @  ip<- r2 - 32
5948    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5949    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
5950    mov     r1, r1, asr r2              @  r1<- r1 >> r2
5951    b       .LOP_SHR_LONG_2ADDR_finish
5952
5953/* ------------------------------ */
5954    .balign 64
5955.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
5956/* File: armv5te/OP_USHR_LONG_2ADDR.S */
5957    /*
5958     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5959     * 32-bit shift distance.
5960     */
5961    /* ushr-long/2addr vA, vB */
5962    mov     r9, rINST, lsr #8           @ r9<- A+
5963    mov     r3, rINST, lsr #12          @ r3<- B
5964    and     r9, r9, #15
5965    GET_VREG(r2, r3)                    @ r2<- vB
5966    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5967    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5968    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5969
5970    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5971    rsb     r3, r2, #32                 @  r3<- 32 - r2
5972    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5973    subs    ip, r2, #32                 @  ip<- r2 - 32
5974    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5975    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
5976    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
5977    b       .LOP_USHR_LONG_2ADDR_finish
5978
5979/* ------------------------------ */
5980    .balign 64
5981.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
5982/* File: arm-vfp/OP_ADD_FLOAT_2ADDR.S */
5983/* File: arm-vfp/fbinop2addr.S */
5984    /*
5985     * Generic 32-bit floating point "/2addr" binary operation.  Provide
5986     * an "instr" line that specifies an instruction that performs
5987     * "s2 = s0 op s1".
5988     *
5989     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5990     */
5991    /* binop/2addr vA, vB */
5992    mov     r3, rINST, lsr #12          @ r3<- B
5993    mov     r9, rINST, lsr #8           @ r9<- A+
5994    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
5995    and     r9, r9, #15                 @ r9<- A
5996    flds    s1, [r3]                    @ s1<- vB
5997    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
5998    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5999    flds    s0, [r9]                    @ s0<- vA
6000
6001    fadds   s2, s0, s1                              @ s2<- op
6002    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6003    fsts    s2, [r9]                    @ vAA<- s2
6004    GOTO_OPCODE(ip)                     @ jump to next instruction
6005
6006
6007/* ------------------------------ */
6008    .balign 64
6009.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6010/* File: arm-vfp/OP_SUB_FLOAT_2ADDR.S */
6011/* File: arm-vfp/fbinop2addr.S */
6012    /*
6013     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6014     * an "instr" line that specifies an instruction that performs
6015     * "s2 = s0 op s1".
6016     *
6017     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6018     */
6019    /* binop/2addr vA, vB */
6020    mov     r3, rINST, lsr #12          @ r3<- B
6021    mov     r9, rINST, lsr #8           @ r9<- A+
6022    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6023    and     r9, r9, #15                 @ r9<- A
6024    flds    s1, [r3]                    @ s1<- vB
6025    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6026    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6027    flds    s0, [r9]                    @ s0<- vA
6028
6029    fsubs   s2, s0, s1                              @ s2<- op
6030    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6031    fsts    s2, [r9]                    @ vAA<- s2
6032    GOTO_OPCODE(ip)                     @ jump to next instruction
6033
6034
6035/* ------------------------------ */
6036    .balign 64
6037.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6038/* File: arm-vfp/OP_MUL_FLOAT_2ADDR.S */
6039/* File: arm-vfp/fbinop2addr.S */
6040    /*
6041     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6042     * an "instr" line that specifies an instruction that performs
6043     * "s2 = s0 op s1".
6044     *
6045     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6046     */
6047    /* binop/2addr vA, vB */
6048    mov     r3, rINST, lsr #12          @ r3<- B
6049    mov     r9, rINST, lsr #8           @ r9<- A+
6050    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6051    and     r9, r9, #15                 @ r9<- A
6052    flds    s1, [r3]                    @ s1<- vB
6053    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6054    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6055    flds    s0, [r9]                    @ s0<- vA
6056
6057    fmuls   s2, s0, s1                              @ s2<- op
6058    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6059    fsts    s2, [r9]                    @ vAA<- s2
6060    GOTO_OPCODE(ip)                     @ jump to next instruction
6061
6062
6063/* ------------------------------ */
6064    .balign 64
6065.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6066/* File: arm-vfp/OP_DIV_FLOAT_2ADDR.S */
6067/* File: arm-vfp/fbinop2addr.S */
6068    /*
6069     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6070     * an "instr" line that specifies an instruction that performs
6071     * "s2 = s0 op s1".
6072     *
6073     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6074     */
6075    /* binop/2addr vA, vB */
6076    mov     r3, rINST, lsr #12          @ r3<- B
6077    mov     r9, rINST, lsr #8           @ r9<- A+
6078    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6079    and     r9, r9, #15                 @ r9<- A
6080    flds    s1, [r3]                    @ s1<- vB
6081    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6082    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6083    flds    s0, [r9]                    @ s0<- vA
6084
6085    fdivs   s2, s0, s1                              @ s2<- op
6086    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6087    fsts    s2, [r9]                    @ vAA<- s2
6088    GOTO_OPCODE(ip)                     @ jump to next instruction
6089
6090
6091/* ------------------------------ */
6092    .balign 64
6093.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6094/* File: armv5te/OP_REM_FLOAT_2ADDR.S */
6095/* EABI doesn't define a float remainder function, but libm does */
6096/* File: armv5te/binop2addr.S */
6097    /*
6098     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6099     * that specifies an instruction that performs "result = r0 op r1".
6100     * This could be an ARM instruction or a function call.  (If the result
6101     * comes back in a register other than r0, you can override "result".)
6102     *
6103     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6104     * vCC (r1).  Useful for integer division and modulus.
6105     *
6106     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6107     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6108     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6109     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6110     */
6111    /* binop/2addr vA, vB */
6112    mov     r9, rINST, lsr #8           @ r9<- A+
6113    mov     r3, rINST, lsr #12          @ r3<- B
6114    and     r9, r9, #15
6115    GET_VREG(r1, r3)                    @ r1<- vB
6116    GET_VREG(r0, r9)                    @ r0<- vA
6117    .if 0
6118    cmp     r1, #0                      @ is second operand zero?
6119    beq     common_errDivideByZero
6120    .endif
6121    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6122
6123                               @ optional op; may set condition codes
6124    bl      fmodf                              @ r0<- op, r0-r3 changed
6125    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6126    SET_VREG(r0, r9)               @ vAA<- r0
6127    GOTO_OPCODE(ip)                     @ jump to next instruction
6128    /* 10-13 instructions */
6129
6130
6131/* ------------------------------ */
6132    .balign 64
6133.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6134/* File: arm-vfp/OP_ADD_DOUBLE_2ADDR.S */
6135/* File: arm-vfp/fbinopWide2addr.S */
6136    /*
6137     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6138     * an "instr" line that specifies an instruction that performs
6139     * "d2 = d0 op d1".
6140     *
6141     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6142     *      div-double/2addr
6143     */
6144    /* binop/2addr vA, vB */
6145    mov     r3, rINST, lsr #12          @ r3<- B
6146    mov     r9, rINST, lsr #8           @ r9<- A+
6147    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6148    and     r9, r9, #15                 @ r9<- A
6149    fldd    d1, [r3]                    @ d1<- vB
6150    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6151    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6152    fldd    d0, [r9]                    @ d0<- vA
6153
6154    faddd   d2, d0, d1                              @ d2<- op
6155    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6156    fstd    d2, [r9]                    @ vAA<- d2
6157    GOTO_OPCODE(ip)                     @ jump to next instruction
6158
6159
6160/* ------------------------------ */
6161    .balign 64
6162.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6163/* File: arm-vfp/OP_SUB_DOUBLE_2ADDR.S */
6164/* File: arm-vfp/fbinopWide2addr.S */
6165    /*
6166     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6167     * an "instr" line that specifies an instruction that performs
6168     * "d2 = d0 op d1".
6169     *
6170     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6171     *      div-double/2addr
6172     */
6173    /* binop/2addr vA, vB */
6174    mov     r3, rINST, lsr #12          @ r3<- B
6175    mov     r9, rINST, lsr #8           @ r9<- A+
6176    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6177    and     r9, r9, #15                 @ r9<- A
6178    fldd    d1, [r3]                    @ d1<- vB
6179    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6180    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6181    fldd    d0, [r9]                    @ d0<- vA
6182
6183    fsubd   d2, d0, d1                              @ d2<- op
6184    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6185    fstd    d2, [r9]                    @ vAA<- d2
6186    GOTO_OPCODE(ip)                     @ jump to next instruction
6187
6188
6189/* ------------------------------ */
6190    .balign 64
6191.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6192/* File: arm-vfp/OP_MUL_DOUBLE_2ADDR.S */
6193/* File: arm-vfp/fbinopWide2addr.S */
6194    /*
6195     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6196     * an "instr" line that specifies an instruction that performs
6197     * "d2 = d0 op d1".
6198     *
6199     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6200     *      div-double/2addr
6201     */
6202    /* binop/2addr vA, vB */
6203    mov     r3, rINST, lsr #12          @ r3<- B
6204    mov     r9, rINST, lsr #8           @ r9<- A+
6205    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6206    and     r9, r9, #15                 @ r9<- A
6207    fldd    d1, [r3]                    @ d1<- vB
6208    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6209    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6210    fldd    d0, [r9]                    @ d0<- vA
6211
6212    fmuld   d2, d0, d1                              @ d2<- op
6213    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6214    fstd    d2, [r9]                    @ vAA<- d2
6215    GOTO_OPCODE(ip)                     @ jump to next instruction
6216
6217
6218/* ------------------------------ */
6219    .balign 64
6220.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6221/* File: arm-vfp/OP_DIV_DOUBLE_2ADDR.S */
6222/* File: arm-vfp/fbinopWide2addr.S */
6223    /*
6224     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6225     * an "instr" line that specifies an instruction that performs
6226     * "d2 = d0 op d1".
6227     *
6228     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6229     *      div-double/2addr
6230     */
6231    /* binop/2addr vA, vB */
6232    mov     r3, rINST, lsr #12          @ r3<- B
6233    mov     r9, rINST, lsr #8           @ r9<- A+
6234    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6235    and     r9, r9, #15                 @ r9<- A
6236    fldd    d1, [r3]                    @ d1<- vB
6237    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6238    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6239    fldd    d0, [r9]                    @ d0<- vA
6240
6241    fdivd   d2, d0, d1                              @ d2<- op
6242    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6243    fstd    d2, [r9]                    @ vAA<- d2
6244    GOTO_OPCODE(ip)                     @ jump to next instruction
6245
6246
6247/* ------------------------------ */
6248    .balign 64
6249.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6250/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */
6251/* EABI doesn't define a double remainder function, but libm does */
6252/* File: armv5te/binopWide2addr.S */
6253    /*
6254     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6255     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6256     * This could be an ARM instruction or a function call.  (If the result
6257     * comes back in a register other than r0, you can override "result".)
6258     *
6259     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6260     * vCC (r1).  Useful for integer division and modulus.
6261     *
6262     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6263     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6264     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6265     *      rem-double/2addr
6266     */
6267    /* binop/2addr vA, vB */
6268    mov     r9, rINST, lsr #8           @ r9<- A+
6269    mov     r1, rINST, lsr #12          @ r1<- B
6270    and     r9, r9, #15
6271    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6272    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6273    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6274    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6275    .if 0
6276    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6277    beq     common_errDivideByZero
6278    .endif
6279    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6280
6281                               @ optional op; may set condition codes
6282    bl      fmod                              @ result<- op, r0-r3 changed
6283    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6284    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6285    GOTO_OPCODE(ip)                     @ jump to next instruction
6286    /* 12-15 instructions */
6287
6288
6289/* ------------------------------ */
6290    .balign 64
6291.L_OP_ADD_INT_LIT16: /* 0xd0 */
6292/* File: armv5te/OP_ADD_INT_LIT16.S */
6293/* File: armv5te/binopLit16.S */
6294    /*
6295     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6296     * that specifies an instruction that performs "result = r0 op r1".
6297     * This could be an ARM instruction or a function call.  (If the result
6298     * comes back in a register other than r0, you can override "result".)
6299     *
6300     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6301     * vCC (r1).  Useful for integer division and modulus.
6302     *
6303     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6304     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6305     */
6306    /* binop/lit16 vA, vB, #+CCCC */
6307    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6308    mov     r2, rINST, lsr #12          @ r2<- B
6309    mov     r9, rINST, lsr #8           @ r9<- A+
6310    GET_VREG(r0, r2)                    @ r0<- vB
6311    and     r9, r9, #15
6312    .if 0
6313    cmp     r1, #0                      @ is second operand zero?
6314    beq     common_errDivideByZero
6315    .endif
6316    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6317
6318    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6319    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6320    SET_VREG(r0, r9)               @ vAA<- r0
6321    GOTO_OPCODE(ip)                     @ jump to next instruction
6322    /* 10-13 instructions */
6323
6324
6325/* ------------------------------ */
6326    .balign 64
6327.L_OP_RSUB_INT: /* 0xd1 */
6328/* File: armv5te/OP_RSUB_INT.S */
6329/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6330/* File: armv5te/binopLit16.S */
6331    /*
6332     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6333     * that specifies an instruction that performs "result = r0 op r1".
6334     * This could be an ARM instruction or a function call.  (If the result
6335     * comes back in a register other than r0, you can override "result".)
6336     *
6337     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6338     * vCC (r1).  Useful for integer division and modulus.
6339     *
6340     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6341     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6342     */
6343    /* binop/lit16 vA, vB, #+CCCC */
6344    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6345    mov     r2, rINST, lsr #12          @ r2<- B
6346    mov     r9, rINST, lsr #8           @ r9<- A+
6347    GET_VREG(r0, r2)                    @ r0<- vB
6348    and     r9, r9, #15
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    rsb     r0, r0, r1                              @ 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_MUL_INT_LIT16: /* 0xd2 */
6365/* File: armv5te/OP_MUL_INT_LIT16.S */
6366/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6367/* File: armv5te/binopLit16.S */
6368    /*
6369     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6370     * that specifies an instruction that performs "result = r0 op r1".
6371     * This could be an ARM instruction or a function call.  (If the result
6372     * comes back in a register other than r0, you can override "result".)
6373     *
6374     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6375     * vCC (r1).  Useful for integer division and modulus.
6376     *
6377     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6378     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6379     */
6380    /* binop/lit16 vA, vB, #+CCCC */
6381    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6382    mov     r2, rINST, lsr #12          @ r2<- B
6383    mov     r9, rINST, lsr #8           @ r9<- A+
6384    GET_VREG(r0, r2)                    @ r0<- vB
6385    and     r9, r9, #15
6386    .if 0
6387    cmp     r1, #0                      @ is second operand zero?
6388    beq     common_errDivideByZero
6389    .endif
6390    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6391
6392    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6393    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6394    SET_VREG(r0, r9)               @ vAA<- r0
6395    GOTO_OPCODE(ip)                     @ jump to next instruction
6396    /* 10-13 instructions */
6397
6398
6399/* ------------------------------ */
6400    .balign 64
6401.L_OP_DIV_INT_LIT16: /* 0xd3 */
6402/* File: armv5te/OP_DIV_INT_LIT16.S */
6403/* File: armv5te/binopLit16.S */
6404    /*
6405     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6406     * that specifies an instruction that performs "result = r0 op r1".
6407     * This could be an ARM instruction or a function call.  (If the result
6408     * comes back in a register other than r0, you can override "result".)
6409     *
6410     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6411     * vCC (r1).  Useful for integer division and modulus.
6412     *
6413     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6414     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6415     */
6416    /* binop/lit16 vA, vB, #+CCCC */
6417    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6418    mov     r2, rINST, lsr #12          @ r2<- B
6419    mov     r9, rINST, lsr #8           @ r9<- A+
6420    GET_VREG(r0, r2)                    @ r0<- vB
6421    and     r9, r9, #15
6422    .if 1
6423    cmp     r1, #0                      @ is second operand zero?
6424    beq     common_errDivideByZero
6425    .endif
6426    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6427
6428    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6429    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6430    SET_VREG(r0, r9)               @ vAA<- r0
6431    GOTO_OPCODE(ip)                     @ jump to next instruction
6432    /* 10-13 instructions */
6433
6434
6435/* ------------------------------ */
6436    .balign 64
6437.L_OP_REM_INT_LIT16: /* 0xd4 */
6438/* File: armv5te/OP_REM_INT_LIT16.S */
6439/* idivmod returns quotient in r0 and remainder in r1 */
6440/* File: armv5te/binopLit16.S */
6441    /*
6442     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6443     * that specifies an instruction that performs "result = r0 op r1".
6444     * This could be an ARM instruction or a function call.  (If the result
6445     * comes back in a register other than r0, you can override "result".)
6446     *
6447     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6448     * vCC (r1).  Useful for integer division and modulus.
6449     *
6450     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6451     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6452     */
6453    /* binop/lit16 vA, vB, #+CCCC */
6454    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6455    mov     r2, rINST, lsr #12          @ r2<- B
6456    mov     r9, rINST, lsr #8           @ r9<- A+
6457    GET_VREG(r0, r2)                    @ r0<- vB
6458    and     r9, r9, #15
6459    .if 1
6460    cmp     r1, #0                      @ is second operand zero?
6461    beq     common_errDivideByZero
6462    .endif
6463    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6464
6465    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6466    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6467    SET_VREG(r1, r9)               @ vAA<- r1
6468    GOTO_OPCODE(ip)                     @ jump to next instruction
6469    /* 10-13 instructions */
6470
6471
6472/* ------------------------------ */
6473    .balign 64
6474.L_OP_AND_INT_LIT16: /* 0xd5 */
6475/* File: armv5te/OP_AND_INT_LIT16.S */
6476/* File: armv5te/binopLit16.S */
6477    /*
6478     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6479     * that specifies an instruction that performs "result = r0 op r1".
6480     * This could be an ARM instruction or a function call.  (If the result
6481     * comes back in a register other than r0, you can override "result".)
6482     *
6483     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6484     * vCC (r1).  Useful for integer division and modulus.
6485     *
6486     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6487     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6488     */
6489    /* binop/lit16 vA, vB, #+CCCC */
6490    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6491    mov     r2, rINST, lsr #12          @ r2<- B
6492    mov     r9, rINST, lsr #8           @ r9<- A+
6493    GET_VREG(r0, r2)                    @ r0<- vB
6494    and     r9, r9, #15
6495    .if 0
6496    cmp     r1, #0                      @ is second operand zero?
6497    beq     common_errDivideByZero
6498    .endif
6499    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6500
6501    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6502    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6503    SET_VREG(r0, r9)               @ vAA<- r0
6504    GOTO_OPCODE(ip)                     @ jump to next instruction
6505    /* 10-13 instructions */
6506
6507
6508/* ------------------------------ */
6509    .balign 64
6510.L_OP_OR_INT_LIT16: /* 0xd6 */
6511/* File: armv5te/OP_OR_INT_LIT16.S */
6512/* File: armv5te/binopLit16.S */
6513    /*
6514     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6515     * that specifies an instruction that performs "result = r0 op r1".
6516     * This could be an ARM instruction or a function call.  (If the result
6517     * comes back in a register other than r0, you can override "result".)
6518     *
6519     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6520     * vCC (r1).  Useful for integer division and modulus.
6521     *
6522     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6523     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6524     */
6525    /* binop/lit16 vA, vB, #+CCCC */
6526    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6527    mov     r2, rINST, lsr #12          @ r2<- B
6528    mov     r9, rINST, lsr #8           @ r9<- A+
6529    GET_VREG(r0, r2)                    @ r0<- vB
6530    and     r9, r9, #15
6531    .if 0
6532    cmp     r1, #0                      @ is second operand zero?
6533    beq     common_errDivideByZero
6534    .endif
6535    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6536
6537    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6538    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6539    SET_VREG(r0, r9)               @ vAA<- r0
6540    GOTO_OPCODE(ip)                     @ jump to next instruction
6541    /* 10-13 instructions */
6542
6543
6544/* ------------------------------ */
6545    .balign 64
6546.L_OP_XOR_INT_LIT16: /* 0xd7 */
6547/* File: armv5te/OP_XOR_INT_LIT16.S */
6548/* File: armv5te/binopLit16.S */
6549    /*
6550     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6551     * that specifies an instruction that performs "result = r0 op r1".
6552     * This could be an ARM instruction or a function call.  (If the result
6553     * comes back in a register other than r0, you can override "result".)
6554     *
6555     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6556     * vCC (r1).  Useful for integer division and modulus.
6557     *
6558     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6559     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6560     */
6561    /* binop/lit16 vA, vB, #+CCCC */
6562    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6563    mov     r2, rINST, lsr #12          @ r2<- B
6564    mov     r9, rINST, lsr #8           @ r9<- A+
6565    GET_VREG(r0, r2)                    @ r0<- vB
6566    and     r9, r9, #15
6567    .if 0
6568    cmp     r1, #0                      @ is second operand zero?
6569    beq     common_errDivideByZero
6570    .endif
6571    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6572
6573    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6574    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6575    SET_VREG(r0, r9)               @ vAA<- r0
6576    GOTO_OPCODE(ip)                     @ jump to next instruction
6577    /* 10-13 instructions */
6578
6579
6580/* ------------------------------ */
6581    .balign 64
6582.L_OP_ADD_INT_LIT8: /* 0xd8 */
6583/* File: armv5te/OP_ADD_INT_LIT8.S */
6584/* File: armv5te/binopLit8.S */
6585    /*
6586     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6587     * that specifies an instruction that performs "result = r0 op r1".
6588     * This could be an ARM instruction or a function call.  (If the result
6589     * comes back in a register other than r0, you can override "result".)
6590     *
6591     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6592     * vCC (r1).  Useful for integer division and modulus.
6593     *
6594     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6595     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6596     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6597     */
6598    /* binop/lit8 vAA, vBB, #+CC */
6599    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6600    mov     r9, rINST, lsr #8           @ r9<- AA
6601    and     r2, r3, #255                @ r2<- BB
6602    GET_VREG(r0, r2)                    @ r0<- vBB
6603    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6604    .if 0
6605    @cmp     r1, #0                      @ is second operand zero?
6606    beq     common_errDivideByZero
6607    .endif
6608    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6609
6610                               @ optional op; may set condition codes
6611    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6612    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6613    SET_VREG(r0, r9)               @ vAA<- r0
6614    GOTO_OPCODE(ip)                     @ jump to next instruction
6615    /* 10-12 instructions */
6616
6617
6618/* ------------------------------ */
6619    .balign 64
6620.L_OP_RSUB_INT_LIT8: /* 0xd9 */
6621/* File: armv5te/OP_RSUB_INT_LIT8.S */
6622/* File: armv5te/binopLit8.S */
6623    /*
6624     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6625     * that specifies an instruction that performs "result = r0 op r1".
6626     * This could be an ARM instruction or a function call.  (If the result
6627     * comes back in a register other than r0, you can override "result".)
6628     *
6629     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6630     * vCC (r1).  Useful for integer division and modulus.
6631     *
6632     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6633     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6634     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6635     */
6636    /* binop/lit8 vAA, vBB, #+CC */
6637    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6638    mov     r9, rINST, lsr #8           @ r9<- AA
6639    and     r2, r3, #255                @ r2<- BB
6640    GET_VREG(r0, r2)                    @ r0<- vBB
6641    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6642    .if 0
6643    @cmp     r1, #0                      @ is second operand zero?
6644    beq     common_errDivideByZero
6645    .endif
6646    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6647
6648                               @ optional op; may set condition codes
6649    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6650    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6651    SET_VREG(r0, r9)               @ vAA<- r0
6652    GOTO_OPCODE(ip)                     @ jump to next instruction
6653    /* 10-12 instructions */
6654
6655
6656/* ------------------------------ */
6657    .balign 64
6658.L_OP_MUL_INT_LIT8: /* 0xda */
6659/* File: armv5te/OP_MUL_INT_LIT8.S */
6660/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6661/* File: armv5te/binopLit8.S */
6662    /*
6663     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6664     * that specifies an instruction that performs "result = r0 op r1".
6665     * This could be an ARM instruction or a function call.  (If the result
6666     * comes back in a register other than r0, you can override "result".)
6667     *
6668     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6669     * vCC (r1).  Useful for integer division and modulus.
6670     *
6671     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6672     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6673     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6674     */
6675    /* binop/lit8 vAA, vBB, #+CC */
6676    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6677    mov     r9, rINST, lsr #8           @ r9<- AA
6678    and     r2, r3, #255                @ r2<- BB
6679    GET_VREG(r0, r2)                    @ r0<- vBB
6680    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6681    .if 0
6682    @cmp     r1, #0                      @ is second operand zero?
6683    beq     common_errDivideByZero
6684    .endif
6685    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6686
6687                               @ optional op; may set condition codes
6688    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6689    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6690    SET_VREG(r0, r9)               @ vAA<- r0
6691    GOTO_OPCODE(ip)                     @ jump to next instruction
6692    /* 10-12 instructions */
6693
6694
6695/* ------------------------------ */
6696    .balign 64
6697.L_OP_DIV_INT_LIT8: /* 0xdb */
6698/* File: armv5te/OP_DIV_INT_LIT8.S */
6699/* File: armv5te/binopLit8.S */
6700    /*
6701     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6702     * that specifies an instruction that performs "result = r0 op r1".
6703     * This could be an ARM instruction or a function call.  (If the result
6704     * comes back in a register other than r0, you can override "result".)
6705     *
6706     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6707     * vCC (r1).  Useful for integer division and modulus.
6708     *
6709     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6710     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6711     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6712     */
6713    /* binop/lit8 vAA, vBB, #+CC */
6714    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6715    mov     r9, rINST, lsr #8           @ r9<- AA
6716    and     r2, r3, #255                @ r2<- BB
6717    GET_VREG(r0, r2)                    @ r0<- vBB
6718    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6719    .if 1
6720    @cmp     r1, #0                      @ is second operand zero?
6721    beq     common_errDivideByZero
6722    .endif
6723    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6724
6725                               @ optional op; may set condition codes
6726    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6727    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6728    SET_VREG(r0, r9)               @ vAA<- r0
6729    GOTO_OPCODE(ip)                     @ jump to next instruction
6730    /* 10-12 instructions */
6731
6732
6733/* ------------------------------ */
6734    .balign 64
6735.L_OP_REM_INT_LIT8: /* 0xdc */
6736/* File: armv5te/OP_REM_INT_LIT8.S */
6737/* idivmod returns quotient in r0 and remainder in r1 */
6738/* File: armv5te/binopLit8.S */
6739    /*
6740     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6741     * that specifies an instruction that performs "result = r0 op r1".
6742     * This could be an ARM instruction or a function call.  (If the result
6743     * comes back in a register other than r0, you can override "result".)
6744     *
6745     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6746     * vCC (r1).  Useful for integer division and modulus.
6747     *
6748     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6749     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6750     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6751     */
6752    /* binop/lit8 vAA, vBB, #+CC */
6753    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6754    mov     r9, rINST, lsr #8           @ r9<- AA
6755    and     r2, r3, #255                @ r2<- BB
6756    GET_VREG(r0, r2)                    @ r0<- vBB
6757    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6758    .if 1
6759    @cmp     r1, #0                      @ is second operand zero?
6760    beq     common_errDivideByZero
6761    .endif
6762    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6763
6764                               @ optional op; may set condition codes
6765    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6766    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6767    SET_VREG(r1, r9)               @ vAA<- r1
6768    GOTO_OPCODE(ip)                     @ jump to next instruction
6769    /* 10-12 instructions */
6770
6771
6772/* ------------------------------ */
6773    .balign 64
6774.L_OP_AND_INT_LIT8: /* 0xdd */
6775/* File: armv5te/OP_AND_INT_LIT8.S */
6776/* File: armv5te/binopLit8.S */
6777    /*
6778     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6779     * that specifies an instruction that performs "result = r0 op r1".
6780     * This could be an ARM instruction or a function call.  (If the result
6781     * comes back in a register other than r0, you can override "result".)
6782     *
6783     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6784     * vCC (r1).  Useful for integer division and modulus.
6785     *
6786     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6787     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6788     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6789     */
6790    /* binop/lit8 vAA, vBB, #+CC */
6791    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6792    mov     r9, rINST, lsr #8           @ r9<- AA
6793    and     r2, r3, #255                @ r2<- BB
6794    GET_VREG(r0, r2)                    @ r0<- vBB
6795    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6796    .if 0
6797    @cmp     r1, #0                      @ is second operand zero?
6798    beq     common_errDivideByZero
6799    .endif
6800    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6801
6802                               @ optional op; may set condition codes
6803    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6804    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6805    SET_VREG(r0, r9)               @ vAA<- r0
6806    GOTO_OPCODE(ip)                     @ jump to next instruction
6807    /* 10-12 instructions */
6808
6809
6810/* ------------------------------ */
6811    .balign 64
6812.L_OP_OR_INT_LIT8: /* 0xde */
6813/* File: armv5te/OP_OR_INT_LIT8.S */
6814/* File: armv5te/binopLit8.S */
6815    /*
6816     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6817     * that specifies an instruction that performs "result = r0 op r1".
6818     * This could be an ARM instruction or a function call.  (If the result
6819     * comes back in a register other than r0, you can override "result".)
6820     *
6821     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6822     * vCC (r1).  Useful for integer division and modulus.
6823     *
6824     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6825     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6826     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6827     */
6828    /* binop/lit8 vAA, vBB, #+CC */
6829    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6830    mov     r9, rINST, lsr #8           @ r9<- AA
6831    and     r2, r3, #255                @ r2<- BB
6832    GET_VREG(r0, r2)                    @ r0<- vBB
6833    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6834    .if 0
6835    @cmp     r1, #0                      @ is second operand zero?
6836    beq     common_errDivideByZero
6837    .endif
6838    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6839
6840                               @ optional op; may set condition codes
6841    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6842    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6843    SET_VREG(r0, r9)               @ vAA<- r0
6844    GOTO_OPCODE(ip)                     @ jump to next instruction
6845    /* 10-12 instructions */
6846
6847
6848/* ------------------------------ */
6849    .balign 64
6850.L_OP_XOR_INT_LIT8: /* 0xdf */
6851/* File: armv5te/OP_XOR_INT_LIT8.S */
6852/* File: armv5te/binopLit8.S */
6853    /*
6854     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6855     * that specifies an instruction that performs "result = r0 op r1".
6856     * This could be an ARM instruction or a function call.  (If the result
6857     * comes back in a register other than r0, you can override "result".)
6858     *
6859     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6860     * vCC (r1).  Useful for integer division and modulus.
6861     *
6862     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6863     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6864     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6865     */
6866    /* binop/lit8 vAA, vBB, #+CC */
6867    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6868    mov     r9, rINST, lsr #8           @ r9<- AA
6869    and     r2, r3, #255                @ r2<- BB
6870    GET_VREG(r0, r2)                    @ r0<- vBB
6871    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6872    .if 0
6873    @cmp     r1, #0                      @ is second operand zero?
6874    beq     common_errDivideByZero
6875    .endif
6876    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6877
6878                               @ optional op; may set condition codes
6879    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6880    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6881    SET_VREG(r0, r9)               @ vAA<- r0
6882    GOTO_OPCODE(ip)                     @ jump to next instruction
6883    /* 10-12 instructions */
6884
6885
6886/* ------------------------------ */
6887    .balign 64
6888.L_OP_SHL_INT_LIT8: /* 0xe0 */
6889/* File: armv5te/OP_SHL_INT_LIT8.S */
6890/* File: armv5te/binopLit8.S */
6891    /*
6892     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6893     * that specifies an instruction that performs "result = r0 op r1".
6894     * This could be an ARM instruction or a function call.  (If the result
6895     * comes back in a register other than r0, you can override "result".)
6896     *
6897     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6898     * vCC (r1).  Useful for integer division and modulus.
6899     *
6900     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6901     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6902     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6903     */
6904    /* binop/lit8 vAA, vBB, #+CC */
6905    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6906    mov     r9, rINST, lsr #8           @ r9<- AA
6907    and     r2, r3, #255                @ r2<- BB
6908    GET_VREG(r0, r2)                    @ r0<- vBB
6909    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6910    .if 0
6911    @cmp     r1, #0                      @ is second operand zero?
6912    beq     common_errDivideByZero
6913    .endif
6914    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6915
6916    and     r1, r1, #31                           @ optional op; may set condition codes
6917    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
6918    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6919    SET_VREG(r0, r9)               @ vAA<- r0
6920    GOTO_OPCODE(ip)                     @ jump to next instruction
6921    /* 10-12 instructions */
6922
6923
6924/* ------------------------------ */
6925    .balign 64
6926.L_OP_SHR_INT_LIT8: /* 0xe1 */
6927/* File: armv5te/OP_SHR_INT_LIT8.S */
6928/* File: armv5te/binopLit8.S */
6929    /*
6930     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6931     * that specifies an instruction that performs "result = r0 op r1".
6932     * This could be an ARM instruction or a function call.  (If the result
6933     * comes back in a register other than r0, you can override "result".)
6934     *
6935     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6936     * vCC (r1).  Useful for integer division and modulus.
6937     *
6938     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6939     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6940     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6941     */
6942    /* binop/lit8 vAA, vBB, #+CC */
6943    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6944    mov     r9, rINST, lsr #8           @ r9<- AA
6945    and     r2, r3, #255                @ r2<- BB
6946    GET_VREG(r0, r2)                    @ r0<- vBB
6947    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6948    .if 0
6949    @cmp     r1, #0                      @ is second operand zero?
6950    beq     common_errDivideByZero
6951    .endif
6952    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6953
6954    and     r1, r1, #31                           @ optional op; may set condition codes
6955    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
6956    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6957    SET_VREG(r0, r9)               @ vAA<- r0
6958    GOTO_OPCODE(ip)                     @ jump to next instruction
6959    /* 10-12 instructions */
6960
6961
6962/* ------------------------------ */
6963    .balign 64
6964.L_OP_USHR_INT_LIT8: /* 0xe2 */
6965/* File: armv5te/OP_USHR_INT_LIT8.S */
6966/* File: armv5te/binopLit8.S */
6967    /*
6968     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6969     * that specifies an instruction that performs "result = r0 op r1".
6970     * This could be an ARM instruction or a function call.  (If the result
6971     * comes back in a register other than r0, you can override "result".)
6972     *
6973     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6974     * vCC (r1).  Useful for integer division and modulus.
6975     *
6976     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6977     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6978     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6979     */
6980    /* binop/lit8 vAA, vBB, #+CC */
6981    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6982    mov     r9, rINST, lsr #8           @ r9<- AA
6983    and     r2, r3, #255                @ r2<- BB
6984    GET_VREG(r0, r2)                    @ r0<- vBB
6985    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6986    .if 0
6987    @cmp     r1, #0                      @ is second operand zero?
6988    beq     common_errDivideByZero
6989    .endif
6990    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6991
6992    and     r1, r1, #31                           @ optional op; may set condition codes
6993    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
6994    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6995    SET_VREG(r0, r9)               @ vAA<- r0
6996    GOTO_OPCODE(ip)                     @ jump to next instruction
6997    /* 10-12 instructions */
6998
6999
7000/* ------------------------------ */
7001    .balign 64
7002.L_OP_IGET_VOLATILE: /* 0xe3 */
7003/* File: armv5te/OP_IGET_VOLATILE.S */
7004/* File: armv5te/OP_IGET.S */
7005    /*
7006     * General 32-bit instance field get.
7007     *
7008     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7009     */
7010    /* op vA, vB, field@CCCC */
7011    mov     r0, rINST, lsr #12          @ r0<- B
7012    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7013    FETCH(r1, 1)                        @ r1<- field ref CCCC
7014    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7015    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7016    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7017    cmp     r0, #0                      @ is resolved entry null?
7018    bne     .LOP_IGET_VOLATILE_finish          @ no, already resolved
70198:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7020    EXPORT_PC()                         @ resolve() could throw
7021    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7022    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7023    cmp     r0, #0
7024    bne     .LOP_IGET_VOLATILE_finish
7025    b       common_exceptionThrown
7026
7027
7028/* ------------------------------ */
7029    .balign 64
7030.L_OP_IPUT_VOLATILE: /* 0xe4 */
7031/* File: armv5te/OP_IPUT_VOLATILE.S */
7032/* File: armv5te/OP_IPUT.S */
7033    /*
7034     * General 32-bit instance field put.
7035     *
7036     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
7037     */
7038    /* op vA, vB, field@CCCC */
7039    mov     r0, rINST, lsr #12          @ r0<- B
7040    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7041    FETCH(r1, 1)                        @ r1<- field ref CCCC
7042    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7043    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7044    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7045    cmp     r0, #0                      @ is resolved entry null?
7046    bne     .LOP_IPUT_VOLATILE_finish          @ no, already resolved
70478:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7048    EXPORT_PC()                         @ resolve() could throw
7049    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7050    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7051    cmp     r0, #0                      @ success?
7052    bne     .LOP_IPUT_VOLATILE_finish          @ yes, finish up
7053    b       common_exceptionThrown
7054
7055
7056/* ------------------------------ */
7057    .balign 64
7058.L_OP_SGET_VOLATILE: /* 0xe5 */
7059/* File: armv5te/OP_SGET_VOLATILE.S */
7060/* File: armv5te/OP_SGET.S */
7061    /*
7062     * General 32-bit SGET handler.
7063     *
7064     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7065     */
7066    /* op vAA, field@BBBB */
7067    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7068    FETCH(r1, 1)                        @ r1<- field ref BBBB
7069    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7070    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7071    cmp     r0, #0                      @ is resolved entry null?
7072    beq     .LOP_SGET_VOLATILE_resolve         @ yes, do resolve
7073.LOP_SGET_VOLATILE_finish: @ field ptr in r0
7074    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7075    SMP_DMB                            @ acquiring load
7076    mov     r2, rINST, lsr #8           @ r2<- AA
7077    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7078    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7079    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7080    GOTO_OPCODE(ip)                     @ jump to next instruction
7081
7082
7083/* ------------------------------ */
7084    .balign 64
7085.L_OP_SPUT_VOLATILE: /* 0xe6 */
7086/* File: armv5te/OP_SPUT_VOLATILE.S */
7087/* File: armv5te/OP_SPUT.S */
7088    /*
7089     * General 32-bit SPUT handler.
7090     *
7091     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
7092     */
7093    /* op vAA, field@BBBB */
7094    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7095    FETCH(r1, 1)                        @ r1<- field ref BBBB
7096    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7097    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7098    cmp     r0, #0                      @ is resolved entry null?
7099    beq     .LOP_SPUT_VOLATILE_resolve         @ yes, do resolve
7100.LOP_SPUT_VOLATILE_finish:   @ field ptr in r0
7101    mov     r2, rINST, lsr #8           @ r2<- AA
7102    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7103    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7104    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7105    SMP_DMB                            @ releasing store
7106    str     r1, [r0, #offStaticField_value] @ field<- vAA
7107    GOTO_OPCODE(ip)                     @ jump to next instruction
7108
7109
7110/* ------------------------------ */
7111    .balign 64
7112.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
7113/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */
7114/* File: armv5te/OP_IGET.S */
7115    /*
7116     * General 32-bit instance field get.
7117     *
7118     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7119     */
7120    /* op vA, vB, field@CCCC */
7121    mov     r0, rINST, lsr #12          @ r0<- B
7122    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7123    FETCH(r1, 1)                        @ r1<- field ref CCCC
7124    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7125    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7126    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7127    cmp     r0, #0                      @ is resolved entry null?
7128    bne     .LOP_IGET_OBJECT_VOLATILE_finish          @ no, already resolved
71298:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7130    EXPORT_PC()                         @ resolve() could throw
7131    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7132    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7133    cmp     r0, #0
7134    bne     .LOP_IGET_OBJECT_VOLATILE_finish
7135    b       common_exceptionThrown
7136
7137
7138/* ------------------------------ */
7139    .balign 64
7140.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
7141/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */
7142/* File: armv5te/OP_IGET_WIDE.S */
7143    /*
7144     * Wide 32-bit instance field get.
7145     */
7146    /* iget-wide vA, vB, field@CCCC */
7147    mov     r0, rINST, lsr #12          @ r0<- B
7148    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7149    FETCH(r1, 1)                        @ r1<- field ref CCCC
7150    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7151    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7152    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7153    cmp     r0, #0                      @ is resolved entry null?
7154    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
71558:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7156    EXPORT_PC()                         @ resolve() could throw
7157    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7158    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7159    cmp     r0, #0
7160    bne     .LOP_IGET_WIDE_VOLATILE_finish
7161    b       common_exceptionThrown
7162
7163
7164/* ------------------------------ */
7165    .balign 64
7166.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
7167/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */
7168/* File: armv5te/OP_IPUT_WIDE.S */
7169    /* iput-wide vA, vB, field@CCCC */
7170    mov     r0, rINST, lsr #12          @ r0<- B
7171    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7172    FETCH(r1, 1)                        @ r1<- field ref CCCC
7173    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7174    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7175    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7176    cmp     r0, #0                      @ is resolved entry null?
7177    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
71788:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7179    EXPORT_PC()                         @ resolve() could throw
7180    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7181    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7182    cmp     r0, #0                      @ success?
7183    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
7184    b       common_exceptionThrown
7185
7186
7187/* ------------------------------ */
7188    .balign 64
7189.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
7190/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */
7191/* File: armv5te/OP_SGET_WIDE.S */
7192    /*
7193     * 64-bit SGET handler.
7194     */
7195    /* sget-wide vAA, field@BBBB */
7196    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7197    FETCH(r1, 1)                        @ r1<- field ref BBBB
7198    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7199    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7200    cmp     r0, #0                      @ is resolved entry null?
7201    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
7202.LOP_SGET_WIDE_VOLATILE_finish:
7203    mov     r9, rINST, lsr #8           @ r9<- AA
7204    .if 1
7205    add     r0, r0, #offStaticField_value @ r0<- pointer to data
7206    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
7207    .else
7208    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
7209    .endif
7210    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7211    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7212    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
7213    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7214    GOTO_OPCODE(ip)                     @ jump to next instruction
7215
7216
7217/* ------------------------------ */
7218    .balign 64
7219.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
7220/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */
7221/* File: armv5te/OP_SPUT_WIDE.S */
7222    /*
7223     * 64-bit SPUT handler.
7224     */
7225    /* sput-wide vAA, field@BBBB */
7226    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
7227    FETCH(r1, 1)                        @ r1<- field ref BBBB
7228    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7229    mov     r9, rINST, lsr #8           @ r9<- AA
7230    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
7231    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7232    cmp     r2, #0                      @ is resolved entry null?
7233    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7234.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
7235    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7236    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7237    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7238    .if 1
7239    add     r2, r2, #offStaticField_value @ r2<- pointer to data
7240    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
7241    .else
7242    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
7243    .endif
7244    GOTO_OPCODE(r10)                    @ jump to next instruction
7245
7246
7247/* ------------------------------ */
7248    .balign 64
7249.L_OP_BREAKPOINT: /* 0xec */
7250/* File: armv5te/OP_BREAKPOINT.S */
7251    /*
7252     * Breakpoint handler.
7253     *
7254     * Restart this instruction with the original opcode.  By
7255     * the time we get here, the breakpoint will have already been
7256     * handled.
7257     */
7258    mov     r0, rPC
7259    bl      dvmGetOriginalOpcode        @ (rPC)
7260    FETCH(rINST, 0)                     @ reload OP_BREAKPOINT + rest of inst
7261    and     rINST, #0xff00
7262    orr     rINST, rINST, r0
7263    GOTO_OPCODE(r0)
7264
7265/* ------------------------------ */
7266    .balign 64
7267.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
7268/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
7269    /*
7270     * Handle a throw-verification-error instruction.  This throws an
7271     * exception for an error discovered during verification.  The
7272     * exception is indicated by AA, with some detail provided by BBBB.
7273     */
7274    /* op AA, ref@BBBB */
7275    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
7276    FETCH(r2, 1)                        @ r2<- BBBB
7277    EXPORT_PC()                         @ export the PC
7278    mov     r1, rINST, lsr #8           @ r1<- AA
7279    bl      dvmThrowVerificationError   @ always throws
7280    b       common_exceptionThrown      @ handle exception
7281
7282/* ------------------------------ */
7283    .balign 64
7284.L_OP_EXECUTE_INLINE: /* 0xee */
7285/* File: armv5te/OP_EXECUTE_INLINE.S */
7286    /*
7287     * Execute a "native inline" instruction.
7288     *
7289     * We need to call an InlineOp4Func:
7290     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7291     *
7292     * The first four args are in r0-r3, pointer to return value storage
7293     * is on the stack.  The function's return value is a flag that tells
7294     * us if an exception was thrown.
7295     *
7296     * TUNING: could maintain two tables, pointer in Thread and
7297     * swap if profiler/debuggger active.
7298     */
7299    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7300    ldrh    r2, [rSELF, #offThread_subMode]
7301    FETCH(r10, 1)                       @ r10<- BBBB
7302    EXPORT_PC()                         @ can throw
7303    ands    r2, #kSubModeDebugProfile   @ Any going on?
7304    bne     .LOP_EXECUTE_INLINE_debugmode       @ yes - take slow path
7305.LOP_EXECUTE_INLINE_resume:
7306    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7307    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7308    mov     r0, rINST, lsr #12          @ r0<- B
7309    str     r1, [sp]                    @ push &self->retval
7310    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7311    add     sp, sp, #8                  @ pop stack
7312    cmp     r0, #0                      @ test boolean result of inline
7313    beq     common_exceptionThrown      @ returned false, handle exception
7314    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7315    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7316    GOTO_OPCODE(ip)                     @ jump to next instruction
7317
7318/* ------------------------------ */
7319    .balign 64
7320.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7321/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7322    /*
7323     * Execute a "native inline" instruction, using "/range" semantics.
7324     * Same idea as execute-inline, but we get the args differently.
7325     *
7326     * We need to call an InlineOp4Func:
7327     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7328     *
7329     * The first four args are in r0-r3, pointer to return value storage
7330     * is on the stack.  The function's return value is a flag that tells
7331     * us if an exception was thrown.
7332     */
7333    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7334    ldrh    r2, [rSELF, #offThread_subMode]
7335    FETCH(r10, 1)                       @ r10<- BBBB
7336    EXPORT_PC()                         @ can throw
7337    ands    r2, #kSubModeDebugProfile   @ Any going on?
7338    bne     .LOP_EXECUTE_INLINE_RANGE_debugmode       @ yes - take slow path
7339.LOP_EXECUTE_INLINE_RANGE_resume:
7340    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7341    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7342    mov     r0, rINST, lsr #8           @ r0<- AA
7343    str     r1, [sp]                    @ push &self->retval
7344    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7345    add     sp, sp, #8                  @ pop stack
7346    cmp     r0, #0                      @ test boolean result of inline
7347    beq     common_exceptionThrown      @ returned false, handle exception
7348    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7349    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7350    GOTO_OPCODE(ip)                     @ jump to next instruction
7351
7352/* ------------------------------ */
7353    .balign 64
7354.L_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
7355/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
7356    /*
7357     * Invoke Object.<init> on an object.  In practice we know that
7358     * Object's nullary constructor doesn't do anything, so we just
7359     * skip it unless a debugger is active.
7360     */
7361    FETCH(r1, 2)                  @ r1<- CCCC
7362    GET_VREG(r0, r1)                    @ r0<- "this" ptr
7363    cmp     r0, #0                      @ check for NULL
7364    beq     common_errNullObject        @ export PC and throw NPE
7365    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
7366    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
7367    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
7368    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_setFinal        @ yes, go
7369.LOP_INVOKE_OBJECT_INIT_RANGE_finish:
7370    ldrh    r1, [rSELF, #offThread_subMode]
7371    ands    r1, #kSubModeDebuggerActive @ debugger active?
7372    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_debugger        @ Yes - skip optimization
7373    FETCH_ADVANCE_INST(2+1)       @ advance to next instr, load rINST
7374    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7375    GOTO_OPCODE(ip)                     @ execute it
7376
7377/* ------------------------------ */
7378    .balign 64
7379.L_OP_RETURN_VOID_BARRIER: /* 0xf1 */
7380/* File: armv5te/OP_RETURN_VOID_BARRIER.S */
7381    SMP_DMB_ST
7382    b       common_returnFromMethod
7383
7384/* ------------------------------ */
7385    .balign 64
7386.L_OP_IGET_QUICK: /* 0xf2 */
7387/* File: armv5te/OP_IGET_QUICK.S */
7388    /* For: iget-quick, iget-object-quick */
7389    /* op vA, vB, offset@CCCC */
7390    mov     r2, rINST, lsr #12          @ r2<- B
7391    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7392    FETCH(r1, 1)                        @ r1<- field byte offset
7393    cmp     r3, #0                      @ check object for null
7394    mov     r2, rINST, lsr #8           @ r2<- A(+)
7395    beq     common_errNullObject        @ object was null
7396    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7397    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7398    and     r2, r2, #15
7399    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7400    SET_VREG(r0, r2)                    @ fp[A]<- r0
7401    GOTO_OPCODE(ip)                     @ jump to next instruction
7402
7403/* ------------------------------ */
7404    .balign 64
7405.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7406/* File: armv5te/OP_IGET_WIDE_QUICK.S */
7407    /* iget-wide-quick vA, vB, offset@CCCC */
7408    mov     r2, rINST, lsr #12          @ r2<- B
7409    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7410    FETCH(ip, 1)                        @ ip<- field byte offset
7411    cmp     r3, #0                      @ check object for null
7412    mov     r2, rINST, lsr #8           @ r2<- A(+)
7413    beq     common_errNullObject        @ object was null
7414    ldrd    r0, [r3, ip]                @ r0<- obj.field (64 bits, aligned)
7415    and     r2, r2, #15
7416    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7417    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7418    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7419    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7420    GOTO_OPCODE(ip)                     @ jump to next instruction
7421
7422/* ------------------------------ */
7423    .balign 64
7424.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7425/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7426/* File: armv5te/OP_IGET_QUICK.S */
7427    /* For: iget-quick, iget-object-quick */
7428    /* op vA, vB, offset@CCCC */
7429    mov     r2, rINST, lsr #12          @ r2<- B
7430    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7431    FETCH(r1, 1)                        @ r1<- field byte offset
7432    cmp     r3, #0                      @ check object for null
7433    mov     r2, rINST, lsr #8           @ r2<- A(+)
7434    beq     common_errNullObject        @ object was null
7435    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7436    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7437    and     r2, r2, #15
7438    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7439    SET_VREG(r0, r2)                    @ fp[A]<- r0
7440    GOTO_OPCODE(ip)                     @ jump to next instruction
7441
7442
7443/* ------------------------------ */
7444    .balign 64
7445.L_OP_IPUT_QUICK: /* 0xf5 */
7446/* File: armv5te/OP_IPUT_QUICK.S */
7447    /* For: iput-quick */
7448    /* op vA, vB, offset@CCCC */
7449    mov     r2, rINST, lsr #12          @ r2<- B
7450    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7451    FETCH(r1, 1)                        @ r1<- field byte offset
7452    cmp     r3, #0                      @ check object for null
7453    mov     r2, rINST, lsr #8           @ r2<- A(+)
7454    beq     common_errNullObject        @ object was null
7455    and     r2, r2, #15
7456    GET_VREG(r0, r2)                    @ r0<- fp[A]
7457    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7458    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7459    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7460    GOTO_OPCODE(ip)                     @ jump to next instruction
7461
7462/* ------------------------------ */
7463    .balign 64
7464.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7465/* File: armv5te/OP_IPUT_WIDE_QUICK.S */
7466    /* iput-wide-quick vA, vB, offset@CCCC */
7467    mov     r0, rINST, lsr #8           @ r0<- A(+)
7468    mov     r1, rINST, lsr #12          @ r1<- B
7469    and     r0, r0, #15
7470    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7471    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7472    cmp     r2, #0                      @ check object for null
7473    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7474    beq     common_errNullObject        @ object was null
7475    FETCH(r3, 1)                        @ r3<- field byte offset
7476    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7477    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7478    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7479    GOTO_OPCODE(ip)                     @ jump to next instruction
7480
7481/* ------------------------------ */
7482    .balign 64
7483.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7484/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7485    /* For: iput-object-quick */
7486    /* op vA, vB, offset@CCCC */
7487    mov     r2, rINST, lsr #12          @ r2<- B
7488    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7489    FETCH(r1, 1)                        @ r1<- field byte offset
7490    cmp     r3, #0                      @ check object for null
7491    mov     r2, rINST, lsr #8           @ r2<- A(+)
7492    beq     common_errNullObject        @ object was null
7493    and     r2, r2, #15
7494    GET_VREG(r0, r2)                    @ r0<- fp[A]
7495    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7496    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7497    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7498    cmp     r0, #0
7499    strneb  r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
7500    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7501    GOTO_OPCODE(ip)                     @ jump to next instruction
7502
7503/* ------------------------------ */
7504    .balign 64
7505.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7506/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7507    /*
7508     * Handle an optimized virtual method call.
7509     *
7510     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7511     */
7512    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7513    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7514    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7515    FETCH(r1, 1)                        @ r1<- BBBB
7516    .if     (!0)
7517    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7518    .endif
7519    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7520    cmp     r9, #0                      @ is "this" null?
7521    beq     common_errNullObject        @ null "this", throw exception
7522    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7523    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7524    EXPORT_PC()                         @ invoke must export
7525    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7526    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7527
7528/* ------------------------------ */
7529    .balign 64
7530.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7531/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7532/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7533    /*
7534     * Handle an optimized virtual method call.
7535     *
7536     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7537     */
7538    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7539    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7540    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7541    FETCH(r1, 1)                        @ r1<- BBBB
7542    .if     (!1)
7543    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7544    .endif
7545    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7546    cmp     r9, #0                      @ is "this" null?
7547    beq     common_errNullObject        @ null "this", throw exception
7548    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7549    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7550    EXPORT_PC()                         @ invoke must export
7551    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7552    bl      common_invokeMethodRange @ (r0=method, r9="this")
7553
7554
7555/* ------------------------------ */
7556    .balign 64
7557.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7558/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7559    /*
7560     * Handle an optimized "super" method call.
7561     *
7562     * for: [opt] invoke-super-quick, invoke-super-quick/range
7563     */
7564    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7565    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7566    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7567    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7568    .if     (!0)
7569    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7570    .endif
7571    FETCH(r1, 1)                        @ r1<- BBBB
7572    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7573    EXPORT_PC()                         @ must export for invoke
7574    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7575    GET_VREG(r9, r10)                   @ r9<- "this"
7576    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7577    cmp     r9, #0                      @ null "this" ref?
7578    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7579    beq     common_errNullObject        @ "this" is null, throw exception
7580    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7581
7582/* ------------------------------ */
7583    .balign 64
7584.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7585/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
7586/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7587    /*
7588     * Handle an optimized "super" method call.
7589     *
7590     * for: [opt] invoke-super-quick, invoke-super-quick/range
7591     */
7592    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7593    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7594    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7595    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7596    .if     (!1)
7597    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7598    .endif
7599    FETCH(r1, 1)                        @ r1<- BBBB
7600    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7601    EXPORT_PC()                         @ must export for invoke
7602    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7603    GET_VREG(r9, r10)                   @ r9<- "this"
7604    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7605    cmp     r9, #0                      @ null "this" ref?
7606    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7607    beq     common_errNullObject        @ "this" is null, throw exception
7608    bl      common_invokeMethodRange @ (r0=method, r9="this")
7609
7610
7611/* ------------------------------ */
7612    .balign 64
7613.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
7614/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */
7615/* File: armv5te/OP_IPUT_OBJECT.S */
7616    /*
7617     * 32-bit instance field put.
7618     *
7619     * for: iput-object, iput-object-volatile
7620     */
7621    /* op vA, vB, field@CCCC */
7622    mov     r0, rINST, lsr #12          @ r0<- B
7623    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7624    FETCH(r1, 1)                        @ r1<- field ref CCCC
7625    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7626    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7627    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7628    cmp     r0, #0                      @ is resolved entry null?
7629    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ no, already resolved
76308:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7631    EXPORT_PC()                         @ resolve() could throw
7632    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7633    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7634    cmp     r0, #0                      @ success?
7635    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ yes, finish up
7636    b       common_exceptionThrown
7637
7638
7639/* ------------------------------ */
7640    .balign 64
7641.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
7642/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */
7643/* File: armv5te/OP_SGET.S */
7644    /*
7645     * General 32-bit SGET handler.
7646     *
7647     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7648     */
7649    /* op vAA, field@BBBB */
7650    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7651    FETCH(r1, 1)                        @ r1<- field ref BBBB
7652    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7653    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7654    cmp     r0, #0                      @ is resolved entry null?
7655    beq     .LOP_SGET_OBJECT_VOLATILE_resolve         @ yes, do resolve
7656.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0
7657    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7658    SMP_DMB                            @ acquiring load
7659    mov     r2, rINST, lsr #8           @ r2<- AA
7660    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7661    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7662    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7663    GOTO_OPCODE(ip)                     @ jump to next instruction
7664
7665
7666/* ------------------------------ */
7667    .balign 64
7668.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
7669/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */
7670/* File: armv5te/OP_SPUT_OBJECT.S */
7671    /*
7672     * 32-bit SPUT handler for objects
7673     *
7674     * for: sput-object, sput-object-volatile
7675     */
7676    /* op vAA, field@BBBB */
7677    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7678    FETCH(r1, 1)                        @ r1<- field ref BBBB
7679    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7680    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7681    cmp     r0, #0                      @ is resolved entry null?
7682    beq     .LOP_SPUT_OBJECT_VOLATILE_resolve         @ yes, do resolve
7683.LOP_SPUT_OBJECT_VOLATILE_finish:   @ field ptr in r0
7684    mov     r2, rINST, lsr #8           @ r2<- AA
7685    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7686    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7687    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7688    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
7689    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7690    SMP_DMB                            @ releasing store
7691    b       .LOP_SPUT_OBJECT_VOLATILE_end
7692
7693
7694/* ------------------------------ */
7695    .balign 64
7696.L_OP_DISPATCH_FF: /* 0xff */
7697/* File: armv5te/OP_DISPATCH_FF.S */
7698    mov     ip, rINST, lsr #8           @ ip<- extended opcode
7699    add     ip, ip, #256                @ add offset for extended opcodes
7700    GOTO_OPCODE(ip)                     @ go to proper extended handler
7701
7702
7703/* ------------------------------ */
7704    .balign 64
7705.L_OP_CONST_CLASS_JUMBO: /* 0x100 */
7706/* File: armv5te/OP_CONST_CLASS_JUMBO.S */
7707    /* const-class/jumbo vBBBB, Class@AAAAAAAA */
7708    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7709    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<-self>methodClassDex
7710    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7711    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
7712    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7713    FETCH(r9, 3)                        @ r9<- BBBB
7714    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[AAAAaaaa]
7715    cmp     r0, #0                      @ not yet resolved?
7716    beq     .LOP_CONST_CLASS_JUMBO_resolve
7717    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
7718    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7719    SET_VREG(r0, r9)                    @ vBBBB<- r0
7720    GOTO_OPCODE(ip)                     @ jump to next instruction
7721
7722/* ------------------------------ */
7723    .balign 64
7724.L_OP_CHECK_CAST_JUMBO: /* 0x101 */
7725/* File: armv5te/OP_CHECK_CAST_JUMBO.S */
7726    /*
7727     * Check to see if a cast from one class to another is allowed.
7728     */
7729    /* check-cast/jumbo vBBBB, class@AAAAAAAA */
7730    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7731    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7732    FETCH(r3, 3)                        @ r3<- BBBB
7733    orr     r2, r0, r2, lsl #16         @ r2<- AAAAaaaa
7734    GET_VREG(r9, r3)                    @ r9<- object
7735    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
7736    cmp     r9, #0                      @ is object null?
7737    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
7738    beq     .LOP_CHECK_CAST_JUMBO_okay            @ null obj, cast always succeeds
7739    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
7740    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
7741    cmp     r1, #0                      @ have we resolved this before?
7742    beq     .LOP_CHECK_CAST_JUMBO_resolve         @ not resolved, do it now
7743.LOP_CHECK_CAST_JUMBO_resolved:
7744    cmp     r0, r1                      @ same class (trivial success)?
7745    bne     .LOP_CHECK_CAST_JUMBO_fullcheck       @ no, do full check
7746    b       .LOP_CHECK_CAST_JUMBO_okay            @ yes, finish up
7747
7748/* ------------------------------ */
7749    .balign 64
7750.L_OP_INSTANCE_OF_JUMBO: /* 0x102 */
7751/* File: armv5te/OP_INSTANCE_OF_JUMBO.S */
7752    /*
7753     * Check to see if an object reference is an instance of a class.
7754     *
7755     * Most common situation is a non-null object, being compared against
7756     * an already-resolved class.
7757     *
7758     * TODO: convert most of this into a common subroutine, shared with
7759     *       OP_INSTANCE_OF.S.
7760     */
7761    /* instance-of/jumbo vBBBB, vCCCC, class@AAAAAAAA */
7762    FETCH(r3, 4)                        @ r3<- vCCCC
7763    FETCH(r9, 3)                        @ r9<- vBBBB
7764    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
7765    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
7766    cmp     r0, #0                      @ is object null?
7767    beq     .LOP_INSTANCE_OF_JUMBO_store           @ null obj, not an instance, store r0
7768    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7769    FETCH(r3, 2)                        @ r3<- AAAA (hi)
7770    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
7771    orr     r3, r1, r3, lsl #16         @ r3<- AAAAaaaa
7772    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
7773    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
7774    cmp     r1, #0                      @ have we resolved this before?
7775    beq     .LOP_INSTANCE_OF_JUMBO_resolve         @ not resolved, do it now
7776    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ resolved, continue
7777
7778/* ------------------------------ */
7779    .balign 64
7780.L_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
7781/* File: armv5te/OP_NEW_INSTANCE_JUMBO.S */
7782    /*
7783     * Create a new instance of a class.
7784     */
7785    /* new-instance/jumbo vBBBB, class@AAAAAAAA */
7786    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7787    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7788    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7789    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7790    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7791    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
7792#if defined(WITH_JIT)
7793    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
7794#endif
7795    EXPORT_PC()                         @ req'd for init, resolve, alloc
7796    cmp     r0, #0                      @ already resolved?
7797    beq     .LOP_NEW_INSTANCE_JUMBO_resolve         @ no, resolve it now
7798.LOP_NEW_INSTANCE_JUMBO_resolved:   @ r0=class
7799    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
7800    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
7801    bne     .LOP_NEW_INSTANCE_JUMBO_needinit        @ no, init class now
7802.LOP_NEW_INSTANCE_JUMBO_initialized: @ r0=class
7803    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
7804    bl      dvmAllocObject              @ r0<- new object
7805    b       .LOP_NEW_INSTANCE_JUMBO_finish          @ continue
7806
7807/* ------------------------------ */
7808    .balign 64
7809.L_OP_NEW_ARRAY_JUMBO: /* 0x104 */
7810/* File: armv5te/OP_NEW_ARRAY_JUMBO.S */
7811    /*
7812     * Allocate an array of objects, specified with the array class
7813     * and a count.
7814     *
7815     * The verifier guarantees that this is an array class, so we don't
7816     * check for it here.
7817     */
7818    /* new-array/jumbo vBBBB, vCCCC, class@AAAAAAAA */
7819    FETCH(r2, 1)                        @ r2<- aaaa (lo)
7820    FETCH(r3, 2)                        @ r3<- AAAA (hi)
7821    FETCH(r0, 4)                        @ r0<- vCCCC
7822    orr     r2, r2, r3, lsl #16         @ r2<- AAAAaaaa
7823    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7824    GET_VREG(r1, r0)                    @ r1<- vCCCC (array length)
7825    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7826    cmp     r1, #0                      @ check length
7827    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
7828    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
7829    cmp     r0, #0                      @ already resolved?
7830    EXPORT_PC()                         @ req'd for resolve, alloc
7831    bne     .LOP_NEW_ARRAY_JUMBO_finish          @ resolved, continue
7832    b       .LOP_NEW_ARRAY_JUMBO_resolve         @ do resolve now
7833
7834/* ------------------------------ */
7835    .balign 64
7836.L_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
7837/* File: armv5te/OP_FILLED_NEW_ARRAY_JUMBO.S */
7838    /*
7839     * Create a new array with elements filled from registers.
7840     *
7841     * TODO: convert most of this into a common subroutine, shared with
7842     *       OP_FILLED_NEW_ARRAY.S.
7843     */
7844    /* filled-new-array/jumbo {vCCCC..v(CCCC+BBBB-1)}, type@AAAAAAAA */
7845    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7846    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7847    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7848    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7849    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7850    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
7851    EXPORT_PC()                         @ need for resolve and alloc
7852    cmp     r0, #0                      @ already resolved?
7853    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_continue        @ yes, continue on
78548:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
7855    mov     r2, #0                      @ r2<- false
7856    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
7857    bl      dvmResolveClass             @ r0<- call(clazz, ref)
7858    cmp     r0, #0                      @ got null?
7859    beq     common_exceptionThrown      @ yes, handle exception
7860    b       .LOP_FILLED_NEW_ARRAY_JUMBO_continue
7861
7862/* ------------------------------ */
7863    .balign 64
7864.L_OP_IGET_JUMBO: /* 0x106 */
7865/* File: armv5te/OP_IGET_JUMBO.S */
7866    /*
7867     * Jumbo 32-bit instance field get.
7868     *
7869     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7870     *      iget-char/jumbo, iget-short/jumbo
7871     */
7872    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7873    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7874    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7875    FETCH(r0, 4)                        @ r0<- CCCC
7876    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7877    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7878    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7879    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7880    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7881    cmp     r0, #0                      @ is resolved entry null?
7882    bne     .LOP_IGET_JUMBO_finish          @ no, already resolved
78838:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7884    EXPORT_PC()                         @ resolve() could throw
7885    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7886    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7887    b       .LOP_IGET_JUMBO_resolved        @ resolved, continue
7888
7889/* ------------------------------ */
7890    .balign 64
7891.L_OP_IGET_WIDE_JUMBO: /* 0x107 */
7892/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
7893    /*
7894     * Jumbo 64-bit instance field get.
7895     */
7896    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
7897    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7898    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7899    FETCH(r0, 4)                        @ r0<- CCCC
7900    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7901    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7902    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7903    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7904    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7905    cmp     r0, #0                      @ is resolved entry null?
7906    bne     .LOP_IGET_WIDE_JUMBO_finish          @ no, already resolved
7907    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7908    EXPORT_PC()                         @ resolve() could throw
7909    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7910    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7911    b       .LOP_IGET_WIDE_JUMBO_resolved        @ resolved, continue
7912
7913/* ------------------------------ */
7914    .balign 64
7915.L_OP_IGET_OBJECT_JUMBO: /* 0x108 */
7916/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
7917/* File: armv5te/OP_IGET_JUMBO.S */
7918    /*
7919     * Jumbo 32-bit instance field get.
7920     *
7921     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7922     *      iget-char/jumbo, iget-short/jumbo
7923     */
7924    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7925    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7926    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7927    FETCH(r0, 4)                        @ r0<- CCCC
7928    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7929    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7930    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7931    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7932    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7933    cmp     r0, #0                      @ is resolved entry null?
7934    bne     .LOP_IGET_OBJECT_JUMBO_finish          @ no, already resolved
79358:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7936    EXPORT_PC()                         @ resolve() could throw
7937    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7938    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7939    b       .LOP_IGET_OBJECT_JUMBO_resolved        @ resolved, continue
7940
7941
7942/* ------------------------------ */
7943    .balign 64
7944.L_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
7945/* File: armv5te/OP_IGET_BOOLEAN_JUMBO.S */
7946@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrb", "sqnum":"1" }
7947/* File: armv5te/OP_IGET_JUMBO.S */
7948    /*
7949     * Jumbo 32-bit instance field get.
7950     *
7951     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7952     *      iget-char/jumbo, iget-short/jumbo
7953     */
7954    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7955    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7956    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7957    FETCH(r0, 4)                        @ r0<- CCCC
7958    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7959    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7960    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7961    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7962    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7963    cmp     r0, #0                      @ is resolved entry null?
7964    bne     .LOP_IGET_BOOLEAN_JUMBO_finish          @ no, already resolved
79658:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7966    EXPORT_PC()                         @ resolve() could throw
7967    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7968    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7969    b       .LOP_IGET_BOOLEAN_JUMBO_resolved        @ resolved, continue
7970
7971
7972/* ------------------------------ */
7973    .balign 64
7974.L_OP_IGET_BYTE_JUMBO: /* 0x10a */
7975/* File: armv5te/OP_IGET_BYTE_JUMBO.S */
7976@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsb", "sqnum":"2" }
7977/* File: armv5te/OP_IGET_JUMBO.S */
7978    /*
7979     * Jumbo 32-bit instance field get.
7980     *
7981     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7982     *      iget-char/jumbo, iget-short/jumbo
7983     */
7984    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7985    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7986    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7987    FETCH(r0, 4)                        @ r0<- CCCC
7988    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7989    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7990    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7991    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7992    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7993    cmp     r0, #0                      @ is resolved entry null?
7994    bne     .LOP_IGET_BYTE_JUMBO_finish          @ no, already resolved
79958:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7996    EXPORT_PC()                         @ resolve() could throw
7997    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7998    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7999    b       .LOP_IGET_BYTE_JUMBO_resolved        @ resolved, continue
8000
8001
8002/* ------------------------------ */
8003    .balign 64
8004.L_OP_IGET_CHAR_JUMBO: /* 0x10b */
8005/* File: armv5te/OP_IGET_CHAR_JUMBO.S */
8006@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrh", "sqnum":"3" }
8007/* File: armv5te/OP_IGET_JUMBO.S */
8008    /*
8009     * Jumbo 32-bit instance field get.
8010     *
8011     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8012     *      iget-char/jumbo, iget-short/jumbo
8013     */
8014    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8015    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8016    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8017    FETCH(r0, 4)                        @ r0<- CCCC
8018    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8019    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8020    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8021    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8022    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8023    cmp     r0, #0                      @ is resolved entry null?
8024    bne     .LOP_IGET_CHAR_JUMBO_finish          @ no, already resolved
80258:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8026    EXPORT_PC()                         @ resolve() could throw
8027    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8028    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8029    b       .LOP_IGET_CHAR_JUMBO_resolved        @ resolved, continue
8030
8031
8032/* ------------------------------ */
8033    .balign 64
8034.L_OP_IGET_SHORT_JUMBO: /* 0x10c */
8035/* File: armv5te/OP_IGET_SHORT_JUMBO.S */
8036@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsh", "sqnum":"4" }
8037/* File: armv5te/OP_IGET_JUMBO.S */
8038    /*
8039     * Jumbo 32-bit instance field get.
8040     *
8041     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8042     *      iget-char/jumbo, iget-short/jumbo
8043     */
8044    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8045    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8046    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8047    FETCH(r0, 4)                        @ r0<- CCCC
8048    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8049    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8050    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8051    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8052    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8053    cmp     r0, #0                      @ is resolved entry null?
8054    bne     .LOP_IGET_SHORT_JUMBO_finish          @ no, already resolved
80558:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8056    EXPORT_PC()                         @ resolve() could throw
8057    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8058    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8059    b       .LOP_IGET_SHORT_JUMBO_resolved        @ resolved, continue
8060
8061
8062/* ------------------------------ */
8063    .balign 64
8064.L_OP_IPUT_JUMBO: /* 0x10d */
8065/* File: armv5te/OP_IPUT_JUMBO.S */
8066    /*
8067     * Jumbo 32-bit instance field put.
8068     *
8069     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8070     *      iput-short/jumbo
8071     */
8072    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8073    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8074    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8075    FETCH(r0, 4)                        @ r0<- CCCC
8076    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8077    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8078    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8079    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8080    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8081    cmp     r0, #0                      @ is resolved entry null?
8082    bne     .LOP_IPUT_JUMBO_finish          @ no, already resolved
80838:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8084    EXPORT_PC()                         @ resolve() could throw
8085    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8086    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8087    b       .LOP_IPUT_JUMBO_resolved        @ resolved, continue
8088
8089/* ------------------------------ */
8090    .balign 64
8091.L_OP_IPUT_WIDE_JUMBO: /* 0x10e */
8092/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
8093    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8094    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8095    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8096    FETCH(r0, 4)                        @ r0<- CCCC
8097    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8098    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8099    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
8100    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
8101    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8102    cmp     r0, #0                      @ is resolved entry null?
8103    bne     .LOP_IPUT_WIDE_JUMBO_finish          @ no, already resolved
81048:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
8105    EXPORT_PC()                         @ resolve() could throw
8106    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8107    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8108    b       .LOP_IPUT_WIDE_JUMBO_resolved        @ resolved, continue
8109
8110/* ------------------------------ */
8111    .balign 64
8112.L_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
8113/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
8114    /*
8115     * Jumbo 32-bit instance field put.
8116     */
8117    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8118    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8119    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8120    FETCH(r0, 4)                        @ r0<- CCCC
8121    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8122    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8123    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8124    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8125    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8126    cmp     r0, #0                      @ is resolved entry null?
8127    bne     .LOP_IPUT_OBJECT_JUMBO_finish          @ no, already resolved
81288:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8129    EXPORT_PC()                         @ resolve() could throw
8130    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8131    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8132    b       .LOP_IPUT_OBJECT_JUMBO_resolved        @ resolved, continue
8133
8134/* ------------------------------ */
8135    .balign 64
8136.L_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
8137/* File: armv5te/OP_IPUT_BOOLEAN_JUMBO.S */
8138@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"1" }
8139/* File: armv5te/OP_IPUT_JUMBO.S */
8140    /*
8141     * Jumbo 32-bit instance field put.
8142     *
8143     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8144     *      iput-short/jumbo
8145     */
8146    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8147    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8148    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8149    FETCH(r0, 4)                        @ r0<- CCCC
8150    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8151    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8152    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8153    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8154    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8155    cmp     r0, #0                      @ is resolved entry null?
8156    bne     .LOP_IPUT_BOOLEAN_JUMBO_finish          @ no, already resolved
81578:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8158    EXPORT_PC()                         @ resolve() could throw
8159    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8160    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8161    b       .LOP_IPUT_BOOLEAN_JUMBO_resolved        @ resolved, continue
8162
8163
8164/* ------------------------------ */
8165    .balign 64
8166.L_OP_IPUT_BYTE_JUMBO: /* 0x111 */
8167/* File: armv5te/OP_IPUT_BYTE_JUMBO.S */
8168@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"2" }
8169/* File: armv5te/OP_IPUT_JUMBO.S */
8170    /*
8171     * Jumbo 32-bit instance field put.
8172     *
8173     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8174     *      iput-short/jumbo
8175     */
8176    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8177    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8178    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8179    FETCH(r0, 4)                        @ r0<- CCCC
8180    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8181    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8182    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8183    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8184    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8185    cmp     r0, #0                      @ is resolved entry null?
8186    bne     .LOP_IPUT_BYTE_JUMBO_finish          @ no, already resolved
81878:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8188    EXPORT_PC()                         @ resolve() could throw
8189    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8190    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8191    b       .LOP_IPUT_BYTE_JUMBO_resolved        @ resolved, continue
8192
8193
8194/* ------------------------------ */
8195    .balign 64
8196.L_OP_IPUT_CHAR_JUMBO: /* 0x112 */
8197/* File: armv5te/OP_IPUT_CHAR_JUMBO.S */
8198@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"3" }
8199/* File: armv5te/OP_IPUT_JUMBO.S */
8200    /*
8201     * Jumbo 32-bit instance field put.
8202     *
8203     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8204     *      iput-short/jumbo
8205     */
8206    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8207    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8208    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8209    FETCH(r0, 4)                        @ r0<- CCCC
8210    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8211    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8212    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8213    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8214    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8215    cmp     r0, #0                      @ is resolved entry null?
8216    bne     .LOP_IPUT_CHAR_JUMBO_finish          @ no, already resolved
82178:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8218    EXPORT_PC()                         @ resolve() could throw
8219    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8220    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8221    b       .LOP_IPUT_CHAR_JUMBO_resolved        @ resolved, continue
8222
8223
8224/* ------------------------------ */
8225    .balign 64
8226.L_OP_IPUT_SHORT_JUMBO: /* 0x113 */
8227/* File: armv5te/OP_IPUT_SHORT_JUMBO.S */
8228@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"4" }
8229/* File: armv5te/OP_IPUT_JUMBO.S */
8230    /*
8231     * Jumbo 32-bit instance field put.
8232     *
8233     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8234     *      iput-short/jumbo
8235     */
8236    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8237    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8238    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8239    FETCH(r0, 4)                        @ r0<- CCCC
8240    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8241    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8242    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8243    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8244    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8245    cmp     r0, #0                      @ is resolved entry null?
8246    bne     .LOP_IPUT_SHORT_JUMBO_finish          @ no, already resolved
82478:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8248    EXPORT_PC()                         @ resolve() could throw
8249    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8250    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8251    b       .LOP_IPUT_SHORT_JUMBO_resolved        @ resolved, continue
8252
8253
8254/* ------------------------------ */
8255    .balign 64
8256.L_OP_SGET_JUMBO: /* 0x114 */
8257/* File: armv5te/OP_SGET_JUMBO.S */
8258    /*
8259     * Jumbo 32-bit SGET handler.
8260     *
8261     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8262     *      sget-char/jumbo, sget-short/jumbo
8263     */
8264    /* exop vBBBB, field@AAAAAAAA */
8265    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8266    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8267    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8268    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8269    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8270    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8271    cmp     r0, #0                      @ is resolved entry null?
8272    beq     .LOP_SGET_JUMBO_resolve         @ yes, do resolve
8273.LOP_SGET_JUMBO_finish: @ field ptr in r0
8274    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8275    @ no-op                             @ acquiring load
8276    FETCH(r2, 3)                        @ r2<- BBBB
8277    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8278    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8279    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8280    GOTO_OPCODE(ip)                     @ jump to next instruction
8281
8282/* ------------------------------ */
8283    .balign 64
8284.L_OP_SGET_WIDE_JUMBO: /* 0x115 */
8285/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
8286    /*
8287     * Jumbo 64-bit SGET handler.
8288     */
8289    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
8290    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8291    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8292    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8293    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
8294    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8295    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
8296    cmp     r0, #0                      @ is resolved entry null?
8297    beq     .LOP_SGET_WIDE_JUMBO_resolve         @ yes, do resolve
8298.LOP_SGET_WIDE_JUMBO_finish:
8299    FETCH(r9, 3)                        @ r9<- BBBB
8300    .if 0
8301    add     r0, r0, #offStaticField_value @ r0<- pointer to data
8302    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
8303    .else
8304    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
8305    .endif
8306    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8307    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8308    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
8309    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8310    GOTO_OPCODE(ip)                     @ jump to next instruction
8311
8312/* ------------------------------ */
8313    .balign 64
8314.L_OP_SGET_OBJECT_JUMBO: /* 0x116 */
8315/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
8316/* File: armv5te/OP_SGET_JUMBO.S */
8317    /*
8318     * Jumbo 32-bit SGET handler.
8319     *
8320     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8321     *      sget-char/jumbo, sget-short/jumbo
8322     */
8323    /* exop vBBBB, field@AAAAAAAA */
8324    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8325    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8326    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8327    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8328    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8329    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8330    cmp     r0, #0                      @ is resolved entry null?
8331    beq     .LOP_SGET_OBJECT_JUMBO_resolve         @ yes, do resolve
8332.LOP_SGET_OBJECT_JUMBO_finish: @ field ptr in r0
8333    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8334    @ no-op                             @ acquiring load
8335    FETCH(r2, 3)                        @ r2<- BBBB
8336    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8337    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8338    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8339    GOTO_OPCODE(ip)                     @ jump to next instruction
8340
8341
8342/* ------------------------------ */
8343    .balign 64
8344.L_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
8345/* File: armv5te/OP_SGET_BOOLEAN_JUMBO.S */
8346/* File: armv5te/OP_SGET_JUMBO.S */
8347    /*
8348     * Jumbo 32-bit SGET handler.
8349     *
8350     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8351     *      sget-char/jumbo, sget-short/jumbo
8352     */
8353    /* exop vBBBB, field@AAAAAAAA */
8354    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8355    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8356    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8357    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8358    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8359    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8360    cmp     r0, #0                      @ is resolved entry null?
8361    beq     .LOP_SGET_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8362.LOP_SGET_BOOLEAN_JUMBO_finish: @ field ptr in r0
8363    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8364    @ no-op                             @ acquiring load
8365    FETCH(r2, 3)                        @ r2<- BBBB
8366    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8367    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8368    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8369    GOTO_OPCODE(ip)                     @ jump to next instruction
8370
8371
8372/* ------------------------------ */
8373    .balign 64
8374.L_OP_SGET_BYTE_JUMBO: /* 0x118 */
8375/* File: armv5te/OP_SGET_BYTE_JUMBO.S */
8376/* File: armv5te/OP_SGET_JUMBO.S */
8377    /*
8378     * Jumbo 32-bit SGET handler.
8379     *
8380     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8381     *      sget-char/jumbo, sget-short/jumbo
8382     */
8383    /* exop vBBBB, field@AAAAAAAA */
8384    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8385    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8386    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8387    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8388    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8389    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8390    cmp     r0, #0                      @ is resolved entry null?
8391    beq     .LOP_SGET_BYTE_JUMBO_resolve         @ yes, do resolve
8392.LOP_SGET_BYTE_JUMBO_finish: @ field ptr in r0
8393    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8394    @ no-op                             @ acquiring load
8395    FETCH(r2, 3)                        @ r2<- BBBB
8396    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8397    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8398    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8399    GOTO_OPCODE(ip)                     @ jump to next instruction
8400
8401
8402/* ------------------------------ */
8403    .balign 64
8404.L_OP_SGET_CHAR_JUMBO: /* 0x119 */
8405/* File: armv5te/OP_SGET_CHAR_JUMBO.S */
8406/* File: armv5te/OP_SGET_JUMBO.S */
8407    /*
8408     * Jumbo 32-bit SGET handler.
8409     *
8410     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8411     *      sget-char/jumbo, sget-short/jumbo
8412     */
8413    /* exop vBBBB, field@AAAAAAAA */
8414    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8415    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8416    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8417    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8418    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8419    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8420    cmp     r0, #0                      @ is resolved entry null?
8421    beq     .LOP_SGET_CHAR_JUMBO_resolve         @ yes, do resolve
8422.LOP_SGET_CHAR_JUMBO_finish: @ field ptr in r0
8423    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8424    @ no-op                             @ acquiring load
8425    FETCH(r2, 3)                        @ r2<- BBBB
8426    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8427    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8428    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8429    GOTO_OPCODE(ip)                     @ jump to next instruction
8430
8431
8432/* ------------------------------ */
8433    .balign 64
8434.L_OP_SGET_SHORT_JUMBO: /* 0x11a */
8435/* File: armv5te/OP_SGET_SHORT_JUMBO.S */
8436/* File: armv5te/OP_SGET_JUMBO.S */
8437    /*
8438     * Jumbo 32-bit SGET handler.
8439     *
8440     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8441     *      sget-char/jumbo, sget-short/jumbo
8442     */
8443    /* exop vBBBB, field@AAAAAAAA */
8444    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8445    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8446    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8447    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8448    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8449    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8450    cmp     r0, #0                      @ is resolved entry null?
8451    beq     .LOP_SGET_SHORT_JUMBO_resolve         @ yes, do resolve
8452.LOP_SGET_SHORT_JUMBO_finish: @ field ptr in r0
8453    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8454    @ no-op                             @ acquiring load
8455    FETCH(r2, 3)                        @ r2<- BBBB
8456    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8457    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8458    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8459    GOTO_OPCODE(ip)                     @ jump to next instruction
8460
8461
8462/* ------------------------------ */
8463    .balign 64
8464.L_OP_SPUT_JUMBO: /* 0x11b */
8465/* File: armv5te/OP_SPUT_JUMBO.S */
8466    /*
8467     * Jumbo 32-bit SPUT handler.
8468     *
8469     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8470     *      sput-short/jumbo
8471     */
8472    /* exop vBBBB, field@AAAAAAAA */
8473    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8474    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8475    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8476    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8477    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8478    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8479    cmp     r0, #0                      @ is resolved entry null?
8480    beq     .LOP_SPUT_JUMBO_resolve         @ yes, do resolve
8481.LOP_SPUT_JUMBO_finish:   @ field ptr in r0
8482    FETCH(r2, 3)                        @ r2<- BBBB
8483    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8484    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8485    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8486    @ no-op                             @ releasing store
8487    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8488    GOTO_OPCODE(ip)                     @ jump to next instruction
8489
8490/* ------------------------------ */
8491    .balign 64
8492.L_OP_SPUT_WIDE_JUMBO: /* 0x11c */
8493/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
8494    /*
8495     * Jumbo 64-bit SPUT handler.
8496     */
8497    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
8498    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
8499    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8500    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8501    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8502    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8503    FETCH(r9, 3)                        @ r9<- BBBB
8504    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
8505    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8506    cmp     r2, #0                      @ is resolved entry null?
8507    beq     .LOP_SPUT_WIDE_JUMBO_resolve         @ yes, do resolve
8508.LOP_SPUT_WIDE_JUMBO_finish: @ field ptr in r2, BBBB in r9
8509    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8510    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
8511    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8512    .if 0
8513    add     r2, r2, #offStaticField_value @ r2<- pointer to data
8514    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
8515    .else
8516    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
8517    .endif
8518    GOTO_OPCODE(r10)                    @ jump to next instruction
8519
8520/* ------------------------------ */
8521    .balign 64
8522.L_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
8523/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
8524    /*
8525     * Jumbo 32-bit SPUT handler for objects
8526     */
8527    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
8528    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8529    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8530    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8531    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8532    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8533    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8534    cmp     r0, #0                      @ is resolved entry null?
8535    beq     .LOP_SPUT_OBJECT_JUMBO_resolve         @ yes, do resolve
8536.LOP_SPUT_OBJECT_JUMBO_finish:   @ field ptr in r0
8537    FETCH(r2, 3)                        @ r2<- BBBB
8538    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8539    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8540    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8541    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
8542    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8543    @ no-op                             @ releasing store
8544    b       .LOP_SPUT_OBJECT_JUMBO_end
8545
8546/* ------------------------------ */
8547    .balign 64
8548.L_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
8549/* File: armv5te/OP_SPUT_BOOLEAN_JUMBO.S */
8550/* File: armv5te/OP_SPUT_JUMBO.S */
8551    /*
8552     * Jumbo 32-bit SPUT handler.
8553     *
8554     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8555     *      sput-short/jumbo
8556     */
8557    /* exop vBBBB, field@AAAAAAAA */
8558    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8559    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8560    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8561    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8562    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8563    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8564    cmp     r0, #0                      @ is resolved entry null?
8565    beq     .LOP_SPUT_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8566.LOP_SPUT_BOOLEAN_JUMBO_finish:   @ field ptr in r0
8567    FETCH(r2, 3)                        @ r2<- BBBB
8568    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8569    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8570    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8571    @ no-op                             @ releasing store
8572    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8573    GOTO_OPCODE(ip)                     @ jump to next instruction
8574
8575
8576/* ------------------------------ */
8577    .balign 64
8578.L_OP_SPUT_BYTE_JUMBO: /* 0x11f */
8579/* File: armv5te/OP_SPUT_BYTE_JUMBO.S */
8580/* File: armv5te/OP_SPUT_JUMBO.S */
8581    /*
8582     * Jumbo 32-bit SPUT handler.
8583     *
8584     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8585     *      sput-short/jumbo
8586     */
8587    /* exop vBBBB, field@AAAAAAAA */
8588    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8589    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8590    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8591    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8592    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8593    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8594    cmp     r0, #0                      @ is resolved entry null?
8595    beq     .LOP_SPUT_BYTE_JUMBO_resolve         @ yes, do resolve
8596.LOP_SPUT_BYTE_JUMBO_finish:   @ field ptr in r0
8597    FETCH(r2, 3)                        @ r2<- BBBB
8598    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8599    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8600    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8601    @ no-op                             @ releasing store
8602    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8603    GOTO_OPCODE(ip)                     @ jump to next instruction
8604
8605
8606/* ------------------------------ */
8607    .balign 64
8608.L_OP_SPUT_CHAR_JUMBO: /* 0x120 */
8609/* File: armv5te/OP_SPUT_CHAR_JUMBO.S */
8610/* File: armv5te/OP_SPUT_JUMBO.S */
8611    /*
8612     * Jumbo 32-bit SPUT handler.
8613     *
8614     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8615     *      sput-short/jumbo
8616     */
8617    /* exop vBBBB, field@AAAAAAAA */
8618    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8619    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8620    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8621    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8622    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8623    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8624    cmp     r0, #0                      @ is resolved entry null?
8625    beq     .LOP_SPUT_CHAR_JUMBO_resolve         @ yes, do resolve
8626.LOP_SPUT_CHAR_JUMBO_finish:   @ field ptr in r0
8627    FETCH(r2, 3)                        @ r2<- BBBB
8628    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8629    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8630    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8631    @ no-op                             @ releasing store
8632    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8633    GOTO_OPCODE(ip)                     @ jump to next instruction
8634
8635
8636/* ------------------------------ */
8637    .balign 64
8638.L_OP_SPUT_SHORT_JUMBO: /* 0x121 */
8639/* File: armv5te/OP_SPUT_SHORT_JUMBO.S */
8640/* File: armv5te/OP_SPUT_JUMBO.S */
8641    /*
8642     * Jumbo 32-bit SPUT handler.
8643     *
8644     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8645     *      sput-short/jumbo
8646     */
8647    /* exop vBBBB, field@AAAAAAAA */
8648    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8649    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8650    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8651    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8652    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8653    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8654    cmp     r0, #0                      @ is resolved entry null?
8655    beq     .LOP_SPUT_SHORT_JUMBO_resolve         @ yes, do resolve
8656.LOP_SPUT_SHORT_JUMBO_finish:   @ field ptr in r0
8657    FETCH(r2, 3)                        @ r2<- BBBB
8658    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8659    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8660    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8661    @ no-op                             @ releasing store
8662    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8663    GOTO_OPCODE(ip)                     @ jump to next instruction
8664
8665
8666/* ------------------------------ */
8667    .balign 64
8668.L_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
8669/* File: armv5te/OP_INVOKE_VIRTUAL_JUMBO.S */
8670    /*
8671     * Handle a virtual method call.
8672     */
8673    /* invoke-virtual/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8674    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8675    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8676    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8677    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8678    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8679    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
8680    cmp     r0, #0                      @ already resolved?
8681    EXPORT_PC()                         @ must export for invoke
8682    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ yes, continue on
8683    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
8684    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8685    mov     r2, #METHOD_VIRTUAL         @ resolver method type
8686    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
8687    cmp     r0, #0                      @ got null?
8688    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ no, continue
8689    b       common_exceptionThrown      @ yes, handle exception
8690
8691/* ------------------------------ */
8692    .balign 64
8693.L_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
8694/* File: armv5te/OP_INVOKE_SUPER_JUMBO.S */
8695    /*
8696     * Handle a "super" method call.
8697     */
8698    /* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8699    FETCH(r10, 4)                       @ r10<- CCCC
8700    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8701    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8702    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8703    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8704    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8705    GET_VREG(r9, r10)                   @ r9<- "this" ptr
8706    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
8707    cmp     r9, #0                      @ null "this"?
8708    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
8709    beq     common_errNullObject        @ null "this", throw exception
8710    cmp     r0, #0                      @ already resolved?
8711    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
8712    EXPORT_PC()                         @ must export for invoke
8713    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ resolved, continue on
8714    b       .LOP_INVOKE_SUPER_JUMBO_resolve         @ do resolve now
8715
8716/* ------------------------------ */
8717    .balign 64
8718.L_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
8719/* File: armv5te/OP_INVOKE_DIRECT_JUMBO.S */
8720    /*
8721     * Handle a direct method call.
8722     *
8723     * (We could defer the "is 'this' pointer null" test to the common
8724     * method invocation code, and use a flag to indicate that static
8725     * calls don't count.  If we do this as part of copying the arguments
8726     * out we could avoiding loading the first arg twice.)
8727     *
8728     */
8729    /* invoke-direct/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8730    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8731    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8732    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8733    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8734    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8735    FETCH(r10, 4)                       @ r10<- CCCC
8736    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
8737    cmp     r0, #0                      @ already resolved?
8738    EXPORT_PC()                         @ must export for invoke
8739    GET_VREG(r9, r10)                   @ r9<- "this" ptr
8740    beq     .LOP_INVOKE_DIRECT_JUMBO_resolve         @ not resolved, do it now
8741.LOP_INVOKE_DIRECT_JUMBO_finish:
8742    cmp     r9, #0                      @ null "this" ref?
8743    bne     common_invokeMethodJumbo    @ (r0=method, r9="this")
8744    b       common_errNullObject        @ yes, throw exception
8745
8746/* ------------------------------ */
8747    .balign 64
8748.L_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
8749/* File: armv5te/OP_INVOKE_STATIC_JUMBO.S */
8750    /*
8751     * Handle a static method call.
8752     */
8753    /* invoke-static/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8754    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8755    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8756    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8757    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8758    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8759    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
8760#if defined(WITH_JIT)
8761    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
8762#endif
8763    cmp     r0, #0                      @ already resolved?
8764    EXPORT_PC()                         @ must export for invoke
8765    bne     common_invokeMethodJumboNoThis   @ (r0=method)
8766    b       .LOP_INVOKE_STATIC_JUMBO_resolve
8767
8768/* ------------------------------ */
8769    .balign 64
8770.L_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
8771/* File: armv5te/OP_INVOKE_INTERFACE_JUMBO.S */
8772    /*
8773     * Handle an interface method call.
8774     */
8775    /* invoke-interface/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8776    FETCH(r2, 4)                        @ r2<- CCCC
8777    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8778    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8779    EXPORT_PC()                         @ must export for invoke
8780    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8781    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
8782    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
8783    cmp     r9, #0                      @ null obj?
8784    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
8785    beq     common_errNullObject        @ yes, fail
8786    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
8787    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
8788    cmp     r0, #0                      @ failed?
8789    beq     common_exceptionThrown      @ yes, handle exception
8790    b       common_invokeMethodJumbo    @ (r0=method, r9="this")
8791
8792/* ------------------------------ */
8793    .balign 64
8794.L_OP_UNUSED_27FF: /* 0x127 */
8795/* File: armv5te/OP_UNUSED_27FF.S */
8796/* File: armv5te/unused.S */
8797    bl      common_abort
8798
8799
8800/* ------------------------------ */
8801    .balign 64
8802.L_OP_UNUSED_28FF: /* 0x128 */
8803/* File: armv5te/OP_UNUSED_28FF.S */
8804/* File: armv5te/unused.S */
8805    bl      common_abort
8806
8807
8808/* ------------------------------ */
8809    .balign 64
8810.L_OP_UNUSED_29FF: /* 0x129 */
8811/* File: armv5te/OP_UNUSED_29FF.S */
8812/* File: armv5te/unused.S */
8813    bl      common_abort
8814
8815
8816/* ------------------------------ */
8817    .balign 64
8818.L_OP_UNUSED_2AFF: /* 0x12a */
8819/* File: armv5te/OP_UNUSED_2AFF.S */
8820/* File: armv5te/unused.S */
8821    bl      common_abort
8822
8823
8824/* ------------------------------ */
8825    .balign 64
8826.L_OP_UNUSED_2BFF: /* 0x12b */
8827/* File: armv5te/OP_UNUSED_2BFF.S */
8828/* File: armv5te/unused.S */
8829    bl      common_abort
8830
8831
8832/* ------------------------------ */
8833    .balign 64
8834.L_OP_UNUSED_2CFF: /* 0x12c */
8835/* File: armv5te/OP_UNUSED_2CFF.S */
8836/* File: armv5te/unused.S */
8837    bl      common_abort
8838
8839
8840/* ------------------------------ */
8841    .balign 64
8842.L_OP_UNUSED_2DFF: /* 0x12d */
8843/* File: armv5te/OP_UNUSED_2DFF.S */
8844/* File: armv5te/unused.S */
8845    bl      common_abort
8846
8847
8848/* ------------------------------ */
8849    .balign 64
8850.L_OP_UNUSED_2EFF: /* 0x12e */
8851/* File: armv5te/OP_UNUSED_2EFF.S */
8852/* File: armv5te/unused.S */
8853    bl      common_abort
8854
8855
8856/* ------------------------------ */
8857    .balign 64
8858.L_OP_UNUSED_2FFF: /* 0x12f */
8859/* File: armv5te/OP_UNUSED_2FFF.S */
8860/* File: armv5te/unused.S */
8861    bl      common_abort
8862
8863
8864/* ------------------------------ */
8865    .balign 64
8866.L_OP_UNUSED_30FF: /* 0x130 */
8867/* File: armv5te/OP_UNUSED_30FF.S */
8868/* File: armv5te/unused.S */
8869    bl      common_abort
8870
8871
8872/* ------------------------------ */
8873    .balign 64
8874.L_OP_UNUSED_31FF: /* 0x131 */
8875/* File: armv5te/OP_UNUSED_31FF.S */
8876/* File: armv5te/unused.S */
8877    bl      common_abort
8878
8879
8880/* ------------------------------ */
8881    .balign 64
8882.L_OP_UNUSED_32FF: /* 0x132 */
8883/* File: armv5te/OP_UNUSED_32FF.S */
8884/* File: armv5te/unused.S */
8885    bl      common_abort
8886
8887
8888/* ------------------------------ */
8889    .balign 64
8890.L_OP_UNUSED_33FF: /* 0x133 */
8891/* File: armv5te/OP_UNUSED_33FF.S */
8892/* File: armv5te/unused.S */
8893    bl      common_abort
8894
8895
8896/* ------------------------------ */
8897    .balign 64
8898.L_OP_UNUSED_34FF: /* 0x134 */
8899/* File: armv5te/OP_UNUSED_34FF.S */
8900/* File: armv5te/unused.S */
8901    bl      common_abort
8902
8903
8904/* ------------------------------ */
8905    .balign 64
8906.L_OP_UNUSED_35FF: /* 0x135 */
8907/* File: armv5te/OP_UNUSED_35FF.S */
8908/* File: armv5te/unused.S */
8909    bl      common_abort
8910
8911
8912/* ------------------------------ */
8913    .balign 64
8914.L_OP_UNUSED_36FF: /* 0x136 */
8915/* File: armv5te/OP_UNUSED_36FF.S */
8916/* File: armv5te/unused.S */
8917    bl      common_abort
8918
8919
8920/* ------------------------------ */
8921    .balign 64
8922.L_OP_UNUSED_37FF: /* 0x137 */
8923/* File: armv5te/OP_UNUSED_37FF.S */
8924/* File: armv5te/unused.S */
8925    bl      common_abort
8926
8927
8928/* ------------------------------ */
8929    .balign 64
8930.L_OP_UNUSED_38FF: /* 0x138 */
8931/* File: armv5te/OP_UNUSED_38FF.S */
8932/* File: armv5te/unused.S */
8933    bl      common_abort
8934
8935
8936/* ------------------------------ */
8937    .balign 64
8938.L_OP_UNUSED_39FF: /* 0x139 */
8939/* File: armv5te/OP_UNUSED_39FF.S */
8940/* File: armv5te/unused.S */
8941    bl      common_abort
8942
8943
8944/* ------------------------------ */
8945    .balign 64
8946.L_OP_UNUSED_3AFF: /* 0x13a */
8947/* File: armv5te/OP_UNUSED_3AFF.S */
8948/* File: armv5te/unused.S */
8949    bl      common_abort
8950
8951
8952/* ------------------------------ */
8953    .balign 64
8954.L_OP_UNUSED_3BFF: /* 0x13b */
8955/* File: armv5te/OP_UNUSED_3BFF.S */
8956/* File: armv5te/unused.S */
8957    bl      common_abort
8958
8959
8960/* ------------------------------ */
8961    .balign 64
8962.L_OP_UNUSED_3CFF: /* 0x13c */
8963/* File: armv5te/OP_UNUSED_3CFF.S */
8964/* File: armv5te/unused.S */
8965    bl      common_abort
8966
8967
8968/* ------------------------------ */
8969    .balign 64
8970.L_OP_UNUSED_3DFF: /* 0x13d */
8971/* File: armv5te/OP_UNUSED_3DFF.S */
8972/* File: armv5te/unused.S */
8973    bl      common_abort
8974
8975
8976/* ------------------------------ */
8977    .balign 64
8978.L_OP_UNUSED_3EFF: /* 0x13e */
8979/* File: armv5te/OP_UNUSED_3EFF.S */
8980/* File: armv5te/unused.S */
8981    bl      common_abort
8982
8983
8984/* ------------------------------ */
8985    .balign 64
8986.L_OP_UNUSED_3FFF: /* 0x13f */
8987/* File: armv5te/OP_UNUSED_3FFF.S */
8988/* File: armv5te/unused.S */
8989    bl      common_abort
8990
8991
8992/* ------------------------------ */
8993    .balign 64
8994.L_OP_UNUSED_40FF: /* 0x140 */
8995/* File: armv5te/OP_UNUSED_40FF.S */
8996/* File: armv5te/unused.S */
8997    bl      common_abort
8998
8999
9000/* ------------------------------ */
9001    .balign 64
9002.L_OP_UNUSED_41FF: /* 0x141 */
9003/* File: armv5te/OP_UNUSED_41FF.S */
9004/* File: armv5te/unused.S */
9005    bl      common_abort
9006
9007
9008/* ------------------------------ */
9009    .balign 64
9010.L_OP_UNUSED_42FF: /* 0x142 */
9011/* File: armv5te/OP_UNUSED_42FF.S */
9012/* File: armv5te/unused.S */
9013    bl      common_abort
9014
9015
9016/* ------------------------------ */
9017    .balign 64
9018.L_OP_UNUSED_43FF: /* 0x143 */
9019/* File: armv5te/OP_UNUSED_43FF.S */
9020/* File: armv5te/unused.S */
9021    bl      common_abort
9022
9023
9024/* ------------------------------ */
9025    .balign 64
9026.L_OP_UNUSED_44FF: /* 0x144 */
9027/* File: armv5te/OP_UNUSED_44FF.S */
9028/* File: armv5te/unused.S */
9029    bl      common_abort
9030
9031
9032/* ------------------------------ */
9033    .balign 64
9034.L_OP_UNUSED_45FF: /* 0x145 */
9035/* File: armv5te/OP_UNUSED_45FF.S */
9036/* File: armv5te/unused.S */
9037    bl      common_abort
9038
9039
9040/* ------------------------------ */
9041    .balign 64
9042.L_OP_UNUSED_46FF: /* 0x146 */
9043/* File: armv5te/OP_UNUSED_46FF.S */
9044/* File: armv5te/unused.S */
9045    bl      common_abort
9046
9047
9048/* ------------------------------ */
9049    .balign 64
9050.L_OP_UNUSED_47FF: /* 0x147 */
9051/* File: armv5te/OP_UNUSED_47FF.S */
9052/* File: armv5te/unused.S */
9053    bl      common_abort
9054
9055
9056/* ------------------------------ */
9057    .balign 64
9058.L_OP_UNUSED_48FF: /* 0x148 */
9059/* File: armv5te/OP_UNUSED_48FF.S */
9060/* File: armv5te/unused.S */
9061    bl      common_abort
9062
9063
9064/* ------------------------------ */
9065    .balign 64
9066.L_OP_UNUSED_49FF: /* 0x149 */
9067/* File: armv5te/OP_UNUSED_49FF.S */
9068/* File: armv5te/unused.S */
9069    bl      common_abort
9070
9071
9072/* ------------------------------ */
9073    .balign 64
9074.L_OP_UNUSED_4AFF: /* 0x14a */
9075/* File: armv5te/OP_UNUSED_4AFF.S */
9076/* File: armv5te/unused.S */
9077    bl      common_abort
9078
9079
9080/* ------------------------------ */
9081    .balign 64
9082.L_OP_UNUSED_4BFF: /* 0x14b */
9083/* File: armv5te/OP_UNUSED_4BFF.S */
9084/* File: armv5te/unused.S */
9085    bl      common_abort
9086
9087
9088/* ------------------------------ */
9089    .balign 64
9090.L_OP_UNUSED_4CFF: /* 0x14c */
9091/* File: armv5te/OP_UNUSED_4CFF.S */
9092/* File: armv5te/unused.S */
9093    bl      common_abort
9094
9095
9096/* ------------------------------ */
9097    .balign 64
9098.L_OP_UNUSED_4DFF: /* 0x14d */
9099/* File: armv5te/OP_UNUSED_4DFF.S */
9100/* File: armv5te/unused.S */
9101    bl      common_abort
9102
9103
9104/* ------------------------------ */
9105    .balign 64
9106.L_OP_UNUSED_4EFF: /* 0x14e */
9107/* File: armv5te/OP_UNUSED_4EFF.S */
9108/* File: armv5te/unused.S */
9109    bl      common_abort
9110
9111
9112/* ------------------------------ */
9113    .balign 64
9114.L_OP_UNUSED_4FFF: /* 0x14f */
9115/* File: armv5te/OP_UNUSED_4FFF.S */
9116/* File: armv5te/unused.S */
9117    bl      common_abort
9118
9119
9120/* ------------------------------ */
9121    .balign 64
9122.L_OP_UNUSED_50FF: /* 0x150 */
9123/* File: armv5te/OP_UNUSED_50FF.S */
9124/* File: armv5te/unused.S */
9125    bl      common_abort
9126
9127
9128/* ------------------------------ */
9129    .balign 64
9130.L_OP_UNUSED_51FF: /* 0x151 */
9131/* File: armv5te/OP_UNUSED_51FF.S */
9132/* File: armv5te/unused.S */
9133    bl      common_abort
9134
9135
9136/* ------------------------------ */
9137    .balign 64
9138.L_OP_UNUSED_52FF: /* 0x152 */
9139/* File: armv5te/OP_UNUSED_52FF.S */
9140/* File: armv5te/unused.S */
9141    bl      common_abort
9142
9143
9144/* ------------------------------ */
9145    .balign 64
9146.L_OP_UNUSED_53FF: /* 0x153 */
9147/* File: armv5te/OP_UNUSED_53FF.S */
9148/* File: armv5te/unused.S */
9149    bl      common_abort
9150
9151
9152/* ------------------------------ */
9153    .balign 64
9154.L_OP_UNUSED_54FF: /* 0x154 */
9155/* File: armv5te/OP_UNUSED_54FF.S */
9156/* File: armv5te/unused.S */
9157    bl      common_abort
9158
9159
9160/* ------------------------------ */
9161    .balign 64
9162.L_OP_UNUSED_55FF: /* 0x155 */
9163/* File: armv5te/OP_UNUSED_55FF.S */
9164/* File: armv5te/unused.S */
9165    bl      common_abort
9166
9167
9168/* ------------------------------ */
9169    .balign 64
9170.L_OP_UNUSED_56FF: /* 0x156 */
9171/* File: armv5te/OP_UNUSED_56FF.S */
9172/* File: armv5te/unused.S */
9173    bl      common_abort
9174
9175
9176/* ------------------------------ */
9177    .balign 64
9178.L_OP_UNUSED_57FF: /* 0x157 */
9179/* File: armv5te/OP_UNUSED_57FF.S */
9180/* File: armv5te/unused.S */
9181    bl      common_abort
9182
9183
9184/* ------------------------------ */
9185    .balign 64
9186.L_OP_UNUSED_58FF: /* 0x158 */
9187/* File: armv5te/OP_UNUSED_58FF.S */
9188/* File: armv5te/unused.S */
9189    bl      common_abort
9190
9191
9192/* ------------------------------ */
9193    .balign 64
9194.L_OP_UNUSED_59FF: /* 0x159 */
9195/* File: armv5te/OP_UNUSED_59FF.S */
9196/* File: armv5te/unused.S */
9197    bl      common_abort
9198
9199
9200/* ------------------------------ */
9201    .balign 64
9202.L_OP_UNUSED_5AFF: /* 0x15a */
9203/* File: armv5te/OP_UNUSED_5AFF.S */
9204/* File: armv5te/unused.S */
9205    bl      common_abort
9206
9207
9208/* ------------------------------ */
9209    .balign 64
9210.L_OP_UNUSED_5BFF: /* 0x15b */
9211/* File: armv5te/OP_UNUSED_5BFF.S */
9212/* File: armv5te/unused.S */
9213    bl      common_abort
9214
9215
9216/* ------------------------------ */
9217    .balign 64
9218.L_OP_UNUSED_5CFF: /* 0x15c */
9219/* File: armv5te/OP_UNUSED_5CFF.S */
9220/* File: armv5te/unused.S */
9221    bl      common_abort
9222
9223
9224/* ------------------------------ */
9225    .balign 64
9226.L_OP_UNUSED_5DFF: /* 0x15d */
9227/* File: armv5te/OP_UNUSED_5DFF.S */
9228/* File: armv5te/unused.S */
9229    bl      common_abort
9230
9231
9232/* ------------------------------ */
9233    .balign 64
9234.L_OP_UNUSED_5EFF: /* 0x15e */
9235/* File: armv5te/OP_UNUSED_5EFF.S */
9236/* File: armv5te/unused.S */
9237    bl      common_abort
9238
9239
9240/* ------------------------------ */
9241    .balign 64
9242.L_OP_UNUSED_5FFF: /* 0x15f */
9243/* File: armv5te/OP_UNUSED_5FFF.S */
9244/* File: armv5te/unused.S */
9245    bl      common_abort
9246
9247
9248/* ------------------------------ */
9249    .balign 64
9250.L_OP_UNUSED_60FF: /* 0x160 */
9251/* File: armv5te/OP_UNUSED_60FF.S */
9252/* File: armv5te/unused.S */
9253    bl      common_abort
9254
9255
9256/* ------------------------------ */
9257    .balign 64
9258.L_OP_UNUSED_61FF: /* 0x161 */
9259/* File: armv5te/OP_UNUSED_61FF.S */
9260/* File: armv5te/unused.S */
9261    bl      common_abort
9262
9263
9264/* ------------------------------ */
9265    .balign 64
9266.L_OP_UNUSED_62FF: /* 0x162 */
9267/* File: armv5te/OP_UNUSED_62FF.S */
9268/* File: armv5te/unused.S */
9269    bl      common_abort
9270
9271
9272/* ------------------------------ */
9273    .balign 64
9274.L_OP_UNUSED_63FF: /* 0x163 */
9275/* File: armv5te/OP_UNUSED_63FF.S */
9276/* File: armv5te/unused.S */
9277    bl      common_abort
9278
9279
9280/* ------------------------------ */
9281    .balign 64
9282.L_OP_UNUSED_64FF: /* 0x164 */
9283/* File: armv5te/OP_UNUSED_64FF.S */
9284/* File: armv5te/unused.S */
9285    bl      common_abort
9286
9287
9288/* ------------------------------ */
9289    .balign 64
9290.L_OP_UNUSED_65FF: /* 0x165 */
9291/* File: armv5te/OP_UNUSED_65FF.S */
9292/* File: armv5te/unused.S */
9293    bl      common_abort
9294
9295
9296/* ------------------------------ */
9297    .balign 64
9298.L_OP_UNUSED_66FF: /* 0x166 */
9299/* File: armv5te/OP_UNUSED_66FF.S */
9300/* File: armv5te/unused.S */
9301    bl      common_abort
9302
9303
9304/* ------------------------------ */
9305    .balign 64
9306.L_OP_UNUSED_67FF: /* 0x167 */
9307/* File: armv5te/OP_UNUSED_67FF.S */
9308/* File: armv5te/unused.S */
9309    bl      common_abort
9310
9311
9312/* ------------------------------ */
9313    .balign 64
9314.L_OP_UNUSED_68FF: /* 0x168 */
9315/* File: armv5te/OP_UNUSED_68FF.S */
9316/* File: armv5te/unused.S */
9317    bl      common_abort
9318
9319
9320/* ------------------------------ */
9321    .balign 64
9322.L_OP_UNUSED_69FF: /* 0x169 */
9323/* File: armv5te/OP_UNUSED_69FF.S */
9324/* File: armv5te/unused.S */
9325    bl      common_abort
9326
9327
9328/* ------------------------------ */
9329    .balign 64
9330.L_OP_UNUSED_6AFF: /* 0x16a */
9331/* File: armv5te/OP_UNUSED_6AFF.S */
9332/* File: armv5te/unused.S */
9333    bl      common_abort
9334
9335
9336/* ------------------------------ */
9337    .balign 64
9338.L_OP_UNUSED_6BFF: /* 0x16b */
9339/* File: armv5te/OP_UNUSED_6BFF.S */
9340/* File: armv5te/unused.S */
9341    bl      common_abort
9342
9343
9344/* ------------------------------ */
9345    .balign 64
9346.L_OP_UNUSED_6CFF: /* 0x16c */
9347/* File: armv5te/OP_UNUSED_6CFF.S */
9348/* File: armv5te/unused.S */
9349    bl      common_abort
9350
9351
9352/* ------------------------------ */
9353    .balign 64
9354.L_OP_UNUSED_6DFF: /* 0x16d */
9355/* File: armv5te/OP_UNUSED_6DFF.S */
9356/* File: armv5te/unused.S */
9357    bl      common_abort
9358
9359
9360/* ------------------------------ */
9361    .balign 64
9362.L_OP_UNUSED_6EFF: /* 0x16e */
9363/* File: armv5te/OP_UNUSED_6EFF.S */
9364/* File: armv5te/unused.S */
9365    bl      common_abort
9366
9367
9368/* ------------------------------ */
9369    .balign 64
9370.L_OP_UNUSED_6FFF: /* 0x16f */
9371/* File: armv5te/OP_UNUSED_6FFF.S */
9372/* File: armv5te/unused.S */
9373    bl      common_abort
9374
9375
9376/* ------------------------------ */
9377    .balign 64
9378.L_OP_UNUSED_70FF: /* 0x170 */
9379/* File: armv5te/OP_UNUSED_70FF.S */
9380/* File: armv5te/unused.S */
9381    bl      common_abort
9382
9383
9384/* ------------------------------ */
9385    .balign 64
9386.L_OP_UNUSED_71FF: /* 0x171 */
9387/* File: armv5te/OP_UNUSED_71FF.S */
9388/* File: armv5te/unused.S */
9389    bl      common_abort
9390
9391
9392/* ------------------------------ */
9393    .balign 64
9394.L_OP_UNUSED_72FF: /* 0x172 */
9395/* File: armv5te/OP_UNUSED_72FF.S */
9396/* File: armv5te/unused.S */
9397    bl      common_abort
9398
9399
9400/* ------------------------------ */
9401    .balign 64
9402.L_OP_UNUSED_73FF: /* 0x173 */
9403/* File: armv5te/OP_UNUSED_73FF.S */
9404/* File: armv5te/unused.S */
9405    bl      common_abort
9406
9407
9408/* ------------------------------ */
9409    .balign 64
9410.L_OP_UNUSED_74FF: /* 0x174 */
9411/* File: armv5te/OP_UNUSED_74FF.S */
9412/* File: armv5te/unused.S */
9413    bl      common_abort
9414
9415
9416/* ------------------------------ */
9417    .balign 64
9418.L_OP_UNUSED_75FF: /* 0x175 */
9419/* File: armv5te/OP_UNUSED_75FF.S */
9420/* File: armv5te/unused.S */
9421    bl      common_abort
9422
9423
9424/* ------------------------------ */
9425    .balign 64
9426.L_OP_UNUSED_76FF: /* 0x176 */
9427/* File: armv5te/OP_UNUSED_76FF.S */
9428/* File: armv5te/unused.S */
9429    bl      common_abort
9430
9431
9432/* ------------------------------ */
9433    .balign 64
9434.L_OP_UNUSED_77FF: /* 0x177 */
9435/* File: armv5te/OP_UNUSED_77FF.S */
9436/* File: armv5te/unused.S */
9437    bl      common_abort
9438
9439
9440/* ------------------------------ */
9441    .balign 64
9442.L_OP_UNUSED_78FF: /* 0x178 */
9443/* File: armv5te/OP_UNUSED_78FF.S */
9444/* File: armv5te/unused.S */
9445    bl      common_abort
9446
9447
9448/* ------------------------------ */
9449    .balign 64
9450.L_OP_UNUSED_79FF: /* 0x179 */
9451/* File: armv5te/OP_UNUSED_79FF.S */
9452/* File: armv5te/unused.S */
9453    bl      common_abort
9454
9455
9456/* ------------------------------ */
9457    .balign 64
9458.L_OP_UNUSED_7AFF: /* 0x17a */
9459/* File: armv5te/OP_UNUSED_7AFF.S */
9460/* File: armv5te/unused.S */
9461    bl      common_abort
9462
9463
9464/* ------------------------------ */
9465    .balign 64
9466.L_OP_UNUSED_7BFF: /* 0x17b */
9467/* File: armv5te/OP_UNUSED_7BFF.S */
9468/* File: armv5te/unused.S */
9469    bl      common_abort
9470
9471
9472/* ------------------------------ */
9473    .balign 64
9474.L_OP_UNUSED_7CFF: /* 0x17c */
9475/* File: armv5te/OP_UNUSED_7CFF.S */
9476/* File: armv5te/unused.S */
9477    bl      common_abort
9478
9479
9480/* ------------------------------ */
9481    .balign 64
9482.L_OP_UNUSED_7DFF: /* 0x17d */
9483/* File: armv5te/OP_UNUSED_7DFF.S */
9484/* File: armv5te/unused.S */
9485    bl      common_abort
9486
9487
9488/* ------------------------------ */
9489    .balign 64
9490.L_OP_UNUSED_7EFF: /* 0x17e */
9491/* File: armv5te/OP_UNUSED_7EFF.S */
9492/* File: armv5te/unused.S */
9493    bl      common_abort
9494
9495
9496/* ------------------------------ */
9497    .balign 64
9498.L_OP_UNUSED_7FFF: /* 0x17f */
9499/* File: armv5te/OP_UNUSED_7FFF.S */
9500/* File: armv5te/unused.S */
9501    bl      common_abort
9502
9503
9504/* ------------------------------ */
9505    .balign 64
9506.L_OP_UNUSED_80FF: /* 0x180 */
9507/* File: armv5te/OP_UNUSED_80FF.S */
9508/* File: armv5te/unused.S */
9509    bl      common_abort
9510
9511
9512/* ------------------------------ */
9513    .balign 64
9514.L_OP_UNUSED_81FF: /* 0x181 */
9515/* File: armv5te/OP_UNUSED_81FF.S */
9516/* File: armv5te/unused.S */
9517    bl      common_abort
9518
9519
9520/* ------------------------------ */
9521    .balign 64
9522.L_OP_UNUSED_82FF: /* 0x182 */
9523/* File: armv5te/OP_UNUSED_82FF.S */
9524/* File: armv5te/unused.S */
9525    bl      common_abort
9526
9527
9528/* ------------------------------ */
9529    .balign 64
9530.L_OP_UNUSED_83FF: /* 0x183 */
9531/* File: armv5te/OP_UNUSED_83FF.S */
9532/* File: armv5te/unused.S */
9533    bl      common_abort
9534
9535
9536/* ------------------------------ */
9537    .balign 64
9538.L_OP_UNUSED_84FF: /* 0x184 */
9539/* File: armv5te/OP_UNUSED_84FF.S */
9540/* File: armv5te/unused.S */
9541    bl      common_abort
9542
9543
9544/* ------------------------------ */
9545    .balign 64
9546.L_OP_UNUSED_85FF: /* 0x185 */
9547/* File: armv5te/OP_UNUSED_85FF.S */
9548/* File: armv5te/unused.S */
9549    bl      common_abort
9550
9551
9552/* ------------------------------ */
9553    .balign 64
9554.L_OP_UNUSED_86FF: /* 0x186 */
9555/* File: armv5te/OP_UNUSED_86FF.S */
9556/* File: armv5te/unused.S */
9557    bl      common_abort
9558
9559
9560/* ------------------------------ */
9561    .balign 64
9562.L_OP_UNUSED_87FF: /* 0x187 */
9563/* File: armv5te/OP_UNUSED_87FF.S */
9564/* File: armv5te/unused.S */
9565    bl      common_abort
9566
9567
9568/* ------------------------------ */
9569    .balign 64
9570.L_OP_UNUSED_88FF: /* 0x188 */
9571/* File: armv5te/OP_UNUSED_88FF.S */
9572/* File: armv5te/unused.S */
9573    bl      common_abort
9574
9575
9576/* ------------------------------ */
9577    .balign 64
9578.L_OP_UNUSED_89FF: /* 0x189 */
9579/* File: armv5te/OP_UNUSED_89FF.S */
9580/* File: armv5te/unused.S */
9581    bl      common_abort
9582
9583
9584/* ------------------------------ */
9585    .balign 64
9586.L_OP_UNUSED_8AFF: /* 0x18a */
9587/* File: armv5te/OP_UNUSED_8AFF.S */
9588/* File: armv5te/unused.S */
9589    bl      common_abort
9590
9591
9592/* ------------------------------ */
9593    .balign 64
9594.L_OP_UNUSED_8BFF: /* 0x18b */
9595/* File: armv5te/OP_UNUSED_8BFF.S */
9596/* File: armv5te/unused.S */
9597    bl      common_abort
9598
9599
9600/* ------------------------------ */
9601    .balign 64
9602.L_OP_UNUSED_8CFF: /* 0x18c */
9603/* File: armv5te/OP_UNUSED_8CFF.S */
9604/* File: armv5te/unused.S */
9605    bl      common_abort
9606
9607
9608/* ------------------------------ */
9609    .balign 64
9610.L_OP_UNUSED_8DFF: /* 0x18d */
9611/* File: armv5te/OP_UNUSED_8DFF.S */
9612/* File: armv5te/unused.S */
9613    bl      common_abort
9614
9615
9616/* ------------------------------ */
9617    .balign 64
9618.L_OP_UNUSED_8EFF: /* 0x18e */
9619/* File: armv5te/OP_UNUSED_8EFF.S */
9620/* File: armv5te/unused.S */
9621    bl      common_abort
9622
9623
9624/* ------------------------------ */
9625    .balign 64
9626.L_OP_UNUSED_8FFF: /* 0x18f */
9627/* File: armv5te/OP_UNUSED_8FFF.S */
9628/* File: armv5te/unused.S */
9629    bl      common_abort
9630
9631
9632/* ------------------------------ */
9633    .balign 64
9634.L_OP_UNUSED_90FF: /* 0x190 */
9635/* File: armv5te/OP_UNUSED_90FF.S */
9636/* File: armv5te/unused.S */
9637    bl      common_abort
9638
9639
9640/* ------------------------------ */
9641    .balign 64
9642.L_OP_UNUSED_91FF: /* 0x191 */
9643/* File: armv5te/OP_UNUSED_91FF.S */
9644/* File: armv5te/unused.S */
9645    bl      common_abort
9646
9647
9648/* ------------------------------ */
9649    .balign 64
9650.L_OP_UNUSED_92FF: /* 0x192 */
9651/* File: armv5te/OP_UNUSED_92FF.S */
9652/* File: armv5te/unused.S */
9653    bl      common_abort
9654
9655
9656/* ------------------------------ */
9657    .balign 64
9658.L_OP_UNUSED_93FF: /* 0x193 */
9659/* File: armv5te/OP_UNUSED_93FF.S */
9660/* File: armv5te/unused.S */
9661    bl      common_abort
9662
9663
9664/* ------------------------------ */
9665    .balign 64
9666.L_OP_UNUSED_94FF: /* 0x194 */
9667/* File: armv5te/OP_UNUSED_94FF.S */
9668/* File: armv5te/unused.S */
9669    bl      common_abort
9670
9671
9672/* ------------------------------ */
9673    .balign 64
9674.L_OP_UNUSED_95FF: /* 0x195 */
9675/* File: armv5te/OP_UNUSED_95FF.S */
9676/* File: armv5te/unused.S */
9677    bl      common_abort
9678
9679
9680/* ------------------------------ */
9681    .balign 64
9682.L_OP_UNUSED_96FF: /* 0x196 */
9683/* File: armv5te/OP_UNUSED_96FF.S */
9684/* File: armv5te/unused.S */
9685    bl      common_abort
9686
9687
9688/* ------------------------------ */
9689    .balign 64
9690.L_OP_UNUSED_97FF: /* 0x197 */
9691/* File: armv5te/OP_UNUSED_97FF.S */
9692/* File: armv5te/unused.S */
9693    bl      common_abort
9694
9695
9696/* ------------------------------ */
9697    .balign 64
9698.L_OP_UNUSED_98FF: /* 0x198 */
9699/* File: armv5te/OP_UNUSED_98FF.S */
9700/* File: armv5te/unused.S */
9701    bl      common_abort
9702
9703
9704/* ------------------------------ */
9705    .balign 64
9706.L_OP_UNUSED_99FF: /* 0x199 */
9707/* File: armv5te/OP_UNUSED_99FF.S */
9708/* File: armv5te/unused.S */
9709    bl      common_abort
9710
9711
9712/* ------------------------------ */
9713    .balign 64
9714.L_OP_UNUSED_9AFF: /* 0x19a */
9715/* File: armv5te/OP_UNUSED_9AFF.S */
9716/* File: armv5te/unused.S */
9717    bl      common_abort
9718
9719
9720/* ------------------------------ */
9721    .balign 64
9722.L_OP_UNUSED_9BFF: /* 0x19b */
9723/* File: armv5te/OP_UNUSED_9BFF.S */
9724/* File: armv5te/unused.S */
9725    bl      common_abort
9726
9727
9728/* ------------------------------ */
9729    .balign 64
9730.L_OP_UNUSED_9CFF: /* 0x19c */
9731/* File: armv5te/OP_UNUSED_9CFF.S */
9732/* File: armv5te/unused.S */
9733    bl      common_abort
9734
9735
9736/* ------------------------------ */
9737    .balign 64
9738.L_OP_UNUSED_9DFF: /* 0x19d */
9739/* File: armv5te/OP_UNUSED_9DFF.S */
9740/* File: armv5te/unused.S */
9741    bl      common_abort
9742
9743
9744/* ------------------------------ */
9745    .balign 64
9746.L_OP_UNUSED_9EFF: /* 0x19e */
9747/* File: armv5te/OP_UNUSED_9EFF.S */
9748/* File: armv5te/unused.S */
9749    bl      common_abort
9750
9751
9752/* ------------------------------ */
9753    .balign 64
9754.L_OP_UNUSED_9FFF: /* 0x19f */
9755/* File: armv5te/OP_UNUSED_9FFF.S */
9756/* File: armv5te/unused.S */
9757    bl      common_abort
9758
9759
9760/* ------------------------------ */
9761    .balign 64
9762.L_OP_UNUSED_A0FF: /* 0x1a0 */
9763/* File: armv5te/OP_UNUSED_A0FF.S */
9764/* File: armv5te/unused.S */
9765    bl      common_abort
9766
9767
9768/* ------------------------------ */
9769    .balign 64
9770.L_OP_UNUSED_A1FF: /* 0x1a1 */
9771/* File: armv5te/OP_UNUSED_A1FF.S */
9772/* File: armv5te/unused.S */
9773    bl      common_abort
9774
9775
9776/* ------------------------------ */
9777    .balign 64
9778.L_OP_UNUSED_A2FF: /* 0x1a2 */
9779/* File: armv5te/OP_UNUSED_A2FF.S */
9780/* File: armv5te/unused.S */
9781    bl      common_abort
9782
9783
9784/* ------------------------------ */
9785    .balign 64
9786.L_OP_UNUSED_A3FF: /* 0x1a3 */
9787/* File: armv5te/OP_UNUSED_A3FF.S */
9788/* File: armv5te/unused.S */
9789    bl      common_abort
9790
9791
9792/* ------------------------------ */
9793    .balign 64
9794.L_OP_UNUSED_A4FF: /* 0x1a4 */
9795/* File: armv5te/OP_UNUSED_A4FF.S */
9796/* File: armv5te/unused.S */
9797    bl      common_abort
9798
9799
9800/* ------------------------------ */
9801    .balign 64
9802.L_OP_UNUSED_A5FF: /* 0x1a5 */
9803/* File: armv5te/OP_UNUSED_A5FF.S */
9804/* File: armv5te/unused.S */
9805    bl      common_abort
9806
9807
9808/* ------------------------------ */
9809    .balign 64
9810.L_OP_UNUSED_A6FF: /* 0x1a6 */
9811/* File: armv5te/OP_UNUSED_A6FF.S */
9812/* File: armv5te/unused.S */
9813    bl      common_abort
9814
9815
9816/* ------------------------------ */
9817    .balign 64
9818.L_OP_UNUSED_A7FF: /* 0x1a7 */
9819/* File: armv5te/OP_UNUSED_A7FF.S */
9820/* File: armv5te/unused.S */
9821    bl      common_abort
9822
9823
9824/* ------------------------------ */
9825    .balign 64
9826.L_OP_UNUSED_A8FF: /* 0x1a8 */
9827/* File: armv5te/OP_UNUSED_A8FF.S */
9828/* File: armv5te/unused.S */
9829    bl      common_abort
9830
9831
9832/* ------------------------------ */
9833    .balign 64
9834.L_OP_UNUSED_A9FF: /* 0x1a9 */
9835/* File: armv5te/OP_UNUSED_A9FF.S */
9836/* File: armv5te/unused.S */
9837    bl      common_abort
9838
9839
9840/* ------------------------------ */
9841    .balign 64
9842.L_OP_UNUSED_AAFF: /* 0x1aa */
9843/* File: armv5te/OP_UNUSED_AAFF.S */
9844/* File: armv5te/unused.S */
9845    bl      common_abort
9846
9847
9848/* ------------------------------ */
9849    .balign 64
9850.L_OP_UNUSED_ABFF: /* 0x1ab */
9851/* File: armv5te/OP_UNUSED_ABFF.S */
9852/* File: armv5te/unused.S */
9853    bl      common_abort
9854
9855
9856/* ------------------------------ */
9857    .balign 64
9858.L_OP_UNUSED_ACFF: /* 0x1ac */
9859/* File: armv5te/OP_UNUSED_ACFF.S */
9860/* File: armv5te/unused.S */
9861    bl      common_abort
9862
9863
9864/* ------------------------------ */
9865    .balign 64
9866.L_OP_UNUSED_ADFF: /* 0x1ad */
9867/* File: armv5te/OP_UNUSED_ADFF.S */
9868/* File: armv5te/unused.S */
9869    bl      common_abort
9870
9871
9872/* ------------------------------ */
9873    .balign 64
9874.L_OP_UNUSED_AEFF: /* 0x1ae */
9875/* File: armv5te/OP_UNUSED_AEFF.S */
9876/* File: armv5te/unused.S */
9877    bl      common_abort
9878
9879
9880/* ------------------------------ */
9881    .balign 64
9882.L_OP_UNUSED_AFFF: /* 0x1af */
9883/* File: armv5te/OP_UNUSED_AFFF.S */
9884/* File: armv5te/unused.S */
9885    bl      common_abort
9886
9887
9888/* ------------------------------ */
9889    .balign 64
9890.L_OP_UNUSED_B0FF: /* 0x1b0 */
9891/* File: armv5te/OP_UNUSED_B0FF.S */
9892/* File: armv5te/unused.S */
9893    bl      common_abort
9894
9895
9896/* ------------------------------ */
9897    .balign 64
9898.L_OP_UNUSED_B1FF: /* 0x1b1 */
9899/* File: armv5te/OP_UNUSED_B1FF.S */
9900/* File: armv5te/unused.S */
9901    bl      common_abort
9902
9903
9904/* ------------------------------ */
9905    .balign 64
9906.L_OP_UNUSED_B2FF: /* 0x1b2 */
9907/* File: armv5te/OP_UNUSED_B2FF.S */
9908/* File: armv5te/unused.S */
9909    bl      common_abort
9910
9911
9912/* ------------------------------ */
9913    .balign 64
9914.L_OP_UNUSED_B3FF: /* 0x1b3 */
9915/* File: armv5te/OP_UNUSED_B3FF.S */
9916/* File: armv5te/unused.S */
9917    bl      common_abort
9918
9919
9920/* ------------------------------ */
9921    .balign 64
9922.L_OP_UNUSED_B4FF: /* 0x1b4 */
9923/* File: armv5te/OP_UNUSED_B4FF.S */
9924/* File: armv5te/unused.S */
9925    bl      common_abort
9926
9927
9928/* ------------------------------ */
9929    .balign 64
9930.L_OP_UNUSED_B5FF: /* 0x1b5 */
9931/* File: armv5te/OP_UNUSED_B5FF.S */
9932/* File: armv5te/unused.S */
9933    bl      common_abort
9934
9935
9936/* ------------------------------ */
9937    .balign 64
9938.L_OP_UNUSED_B6FF: /* 0x1b6 */
9939/* File: armv5te/OP_UNUSED_B6FF.S */
9940/* File: armv5te/unused.S */
9941    bl      common_abort
9942
9943
9944/* ------------------------------ */
9945    .balign 64
9946.L_OP_UNUSED_B7FF: /* 0x1b7 */
9947/* File: armv5te/OP_UNUSED_B7FF.S */
9948/* File: armv5te/unused.S */
9949    bl      common_abort
9950
9951
9952/* ------------------------------ */
9953    .balign 64
9954.L_OP_UNUSED_B8FF: /* 0x1b8 */
9955/* File: armv5te/OP_UNUSED_B8FF.S */
9956/* File: armv5te/unused.S */
9957    bl      common_abort
9958
9959
9960/* ------------------------------ */
9961    .balign 64
9962.L_OP_UNUSED_B9FF: /* 0x1b9 */
9963/* File: armv5te/OP_UNUSED_B9FF.S */
9964/* File: armv5te/unused.S */
9965    bl      common_abort
9966
9967
9968/* ------------------------------ */
9969    .balign 64
9970.L_OP_UNUSED_BAFF: /* 0x1ba */
9971/* File: armv5te/OP_UNUSED_BAFF.S */
9972/* File: armv5te/unused.S */
9973    bl      common_abort
9974
9975
9976/* ------------------------------ */
9977    .balign 64
9978.L_OP_UNUSED_BBFF: /* 0x1bb */
9979/* File: armv5te/OP_UNUSED_BBFF.S */
9980/* File: armv5te/unused.S */
9981    bl      common_abort
9982
9983
9984/* ------------------------------ */
9985    .balign 64
9986.L_OP_UNUSED_BCFF: /* 0x1bc */
9987/* File: armv5te/OP_UNUSED_BCFF.S */
9988/* File: armv5te/unused.S */
9989    bl      common_abort
9990
9991
9992/* ------------------------------ */
9993    .balign 64
9994.L_OP_UNUSED_BDFF: /* 0x1bd */
9995/* File: armv5te/OP_UNUSED_BDFF.S */
9996/* File: armv5te/unused.S */
9997    bl      common_abort
9998
9999
10000/* ------------------------------ */
10001    .balign 64
10002.L_OP_UNUSED_BEFF: /* 0x1be */
10003/* File: armv5te/OP_UNUSED_BEFF.S */
10004/* File: armv5te/unused.S */
10005    bl      common_abort
10006
10007
10008/* ------------------------------ */
10009    .balign 64
10010.L_OP_UNUSED_BFFF: /* 0x1bf */
10011/* File: armv5te/OP_UNUSED_BFFF.S */
10012/* File: armv5te/unused.S */
10013    bl      common_abort
10014
10015
10016/* ------------------------------ */
10017    .balign 64
10018.L_OP_UNUSED_C0FF: /* 0x1c0 */
10019/* File: armv5te/OP_UNUSED_C0FF.S */
10020/* File: armv5te/unused.S */
10021    bl      common_abort
10022
10023
10024/* ------------------------------ */
10025    .balign 64
10026.L_OP_UNUSED_C1FF: /* 0x1c1 */
10027/* File: armv5te/OP_UNUSED_C1FF.S */
10028/* File: armv5te/unused.S */
10029    bl      common_abort
10030
10031
10032/* ------------------------------ */
10033    .balign 64
10034.L_OP_UNUSED_C2FF: /* 0x1c2 */
10035/* File: armv5te/OP_UNUSED_C2FF.S */
10036/* File: armv5te/unused.S */
10037    bl      common_abort
10038
10039
10040/* ------------------------------ */
10041    .balign 64
10042.L_OP_UNUSED_C3FF: /* 0x1c3 */
10043/* File: armv5te/OP_UNUSED_C3FF.S */
10044/* File: armv5te/unused.S */
10045    bl      common_abort
10046
10047
10048/* ------------------------------ */
10049    .balign 64
10050.L_OP_UNUSED_C4FF: /* 0x1c4 */
10051/* File: armv5te/OP_UNUSED_C4FF.S */
10052/* File: armv5te/unused.S */
10053    bl      common_abort
10054
10055
10056/* ------------------------------ */
10057    .balign 64
10058.L_OP_UNUSED_C5FF: /* 0x1c5 */
10059/* File: armv5te/OP_UNUSED_C5FF.S */
10060/* File: armv5te/unused.S */
10061    bl      common_abort
10062
10063
10064/* ------------------------------ */
10065    .balign 64
10066.L_OP_UNUSED_C6FF: /* 0x1c6 */
10067/* File: armv5te/OP_UNUSED_C6FF.S */
10068/* File: armv5te/unused.S */
10069    bl      common_abort
10070
10071
10072/* ------------------------------ */
10073    .balign 64
10074.L_OP_UNUSED_C7FF: /* 0x1c7 */
10075/* File: armv5te/OP_UNUSED_C7FF.S */
10076/* File: armv5te/unused.S */
10077    bl      common_abort
10078
10079
10080/* ------------------------------ */
10081    .balign 64
10082.L_OP_UNUSED_C8FF: /* 0x1c8 */
10083/* File: armv5te/OP_UNUSED_C8FF.S */
10084/* File: armv5te/unused.S */
10085    bl      common_abort
10086
10087
10088/* ------------------------------ */
10089    .balign 64
10090.L_OP_UNUSED_C9FF: /* 0x1c9 */
10091/* File: armv5te/OP_UNUSED_C9FF.S */
10092/* File: armv5te/unused.S */
10093    bl      common_abort
10094
10095
10096/* ------------------------------ */
10097    .balign 64
10098.L_OP_UNUSED_CAFF: /* 0x1ca */
10099/* File: armv5te/OP_UNUSED_CAFF.S */
10100/* File: armv5te/unused.S */
10101    bl      common_abort
10102
10103
10104/* ------------------------------ */
10105    .balign 64
10106.L_OP_UNUSED_CBFF: /* 0x1cb */
10107/* File: armv5te/OP_UNUSED_CBFF.S */
10108/* File: armv5te/unused.S */
10109    bl      common_abort
10110
10111
10112/* ------------------------------ */
10113    .balign 64
10114.L_OP_UNUSED_CCFF: /* 0x1cc */
10115/* File: armv5te/OP_UNUSED_CCFF.S */
10116/* File: armv5te/unused.S */
10117    bl      common_abort
10118
10119
10120/* ------------------------------ */
10121    .balign 64
10122.L_OP_UNUSED_CDFF: /* 0x1cd */
10123/* File: armv5te/OP_UNUSED_CDFF.S */
10124/* File: armv5te/unused.S */
10125    bl      common_abort
10126
10127
10128/* ------------------------------ */
10129    .balign 64
10130.L_OP_UNUSED_CEFF: /* 0x1ce */
10131/* File: armv5te/OP_UNUSED_CEFF.S */
10132/* File: armv5te/unused.S */
10133    bl      common_abort
10134
10135
10136/* ------------------------------ */
10137    .balign 64
10138.L_OP_UNUSED_CFFF: /* 0x1cf */
10139/* File: armv5te/OP_UNUSED_CFFF.S */
10140/* File: armv5te/unused.S */
10141    bl      common_abort
10142
10143
10144/* ------------------------------ */
10145    .balign 64
10146.L_OP_UNUSED_D0FF: /* 0x1d0 */
10147/* File: armv5te/OP_UNUSED_D0FF.S */
10148/* File: armv5te/unused.S */
10149    bl      common_abort
10150
10151
10152/* ------------------------------ */
10153    .balign 64
10154.L_OP_UNUSED_D1FF: /* 0x1d1 */
10155/* File: armv5te/OP_UNUSED_D1FF.S */
10156/* File: armv5te/unused.S */
10157    bl      common_abort
10158
10159
10160/* ------------------------------ */
10161    .balign 64
10162.L_OP_UNUSED_D2FF: /* 0x1d2 */
10163/* File: armv5te/OP_UNUSED_D2FF.S */
10164/* File: armv5te/unused.S */
10165    bl      common_abort
10166
10167
10168/* ------------------------------ */
10169    .balign 64
10170.L_OP_UNUSED_D3FF: /* 0x1d3 */
10171/* File: armv5te/OP_UNUSED_D3FF.S */
10172/* File: armv5te/unused.S */
10173    bl      common_abort
10174
10175
10176/* ------------------------------ */
10177    .balign 64
10178.L_OP_UNUSED_D4FF: /* 0x1d4 */
10179/* File: armv5te/OP_UNUSED_D4FF.S */
10180/* File: armv5te/unused.S */
10181    bl      common_abort
10182
10183
10184/* ------------------------------ */
10185    .balign 64
10186.L_OP_UNUSED_D5FF: /* 0x1d5 */
10187/* File: armv5te/OP_UNUSED_D5FF.S */
10188/* File: armv5te/unused.S */
10189    bl      common_abort
10190
10191
10192/* ------------------------------ */
10193    .balign 64
10194.L_OP_UNUSED_D6FF: /* 0x1d6 */
10195/* File: armv5te/OP_UNUSED_D6FF.S */
10196/* File: armv5te/unused.S */
10197    bl      common_abort
10198
10199
10200/* ------------------------------ */
10201    .balign 64
10202.L_OP_UNUSED_D7FF: /* 0x1d7 */
10203/* File: armv5te/OP_UNUSED_D7FF.S */
10204/* File: armv5te/unused.S */
10205    bl      common_abort
10206
10207
10208/* ------------------------------ */
10209    .balign 64
10210.L_OP_UNUSED_D8FF: /* 0x1d8 */
10211/* File: armv5te/OP_UNUSED_D8FF.S */
10212/* File: armv5te/unused.S */
10213    bl      common_abort
10214
10215
10216/* ------------------------------ */
10217    .balign 64
10218.L_OP_UNUSED_D9FF: /* 0x1d9 */
10219/* File: armv5te/OP_UNUSED_D9FF.S */
10220/* File: armv5te/unused.S */
10221    bl      common_abort
10222
10223
10224/* ------------------------------ */
10225    .balign 64
10226.L_OP_UNUSED_DAFF: /* 0x1da */
10227/* File: armv5te/OP_UNUSED_DAFF.S */
10228/* File: armv5te/unused.S */
10229    bl      common_abort
10230
10231
10232/* ------------------------------ */
10233    .balign 64
10234.L_OP_UNUSED_DBFF: /* 0x1db */
10235/* File: armv5te/OP_UNUSED_DBFF.S */
10236/* File: armv5te/unused.S */
10237    bl      common_abort
10238
10239
10240/* ------------------------------ */
10241    .balign 64
10242.L_OP_UNUSED_DCFF: /* 0x1dc */
10243/* File: armv5te/OP_UNUSED_DCFF.S */
10244/* File: armv5te/unused.S */
10245    bl      common_abort
10246
10247
10248/* ------------------------------ */
10249    .balign 64
10250.L_OP_UNUSED_DDFF: /* 0x1dd */
10251/* File: armv5te/OP_UNUSED_DDFF.S */
10252/* File: armv5te/unused.S */
10253    bl      common_abort
10254
10255
10256/* ------------------------------ */
10257    .balign 64
10258.L_OP_UNUSED_DEFF: /* 0x1de */
10259/* File: armv5te/OP_UNUSED_DEFF.S */
10260/* File: armv5te/unused.S */
10261    bl      common_abort
10262
10263
10264/* ------------------------------ */
10265    .balign 64
10266.L_OP_UNUSED_DFFF: /* 0x1df */
10267/* File: armv5te/OP_UNUSED_DFFF.S */
10268/* File: armv5te/unused.S */
10269    bl      common_abort
10270
10271
10272/* ------------------------------ */
10273    .balign 64
10274.L_OP_UNUSED_E0FF: /* 0x1e0 */
10275/* File: armv5te/OP_UNUSED_E0FF.S */
10276/* File: armv5te/unused.S */
10277    bl      common_abort
10278
10279
10280/* ------------------------------ */
10281    .balign 64
10282.L_OP_UNUSED_E1FF: /* 0x1e1 */
10283/* File: armv5te/OP_UNUSED_E1FF.S */
10284/* File: armv5te/unused.S */
10285    bl      common_abort
10286
10287
10288/* ------------------------------ */
10289    .balign 64
10290.L_OP_UNUSED_E2FF: /* 0x1e2 */
10291/* File: armv5te/OP_UNUSED_E2FF.S */
10292/* File: armv5te/unused.S */
10293    bl      common_abort
10294
10295
10296/* ------------------------------ */
10297    .balign 64
10298.L_OP_UNUSED_E3FF: /* 0x1e3 */
10299/* File: armv5te/OP_UNUSED_E3FF.S */
10300/* File: armv5te/unused.S */
10301    bl      common_abort
10302
10303
10304/* ------------------------------ */
10305    .balign 64
10306.L_OP_UNUSED_E4FF: /* 0x1e4 */
10307/* File: armv5te/OP_UNUSED_E4FF.S */
10308/* File: armv5te/unused.S */
10309    bl      common_abort
10310
10311
10312/* ------------------------------ */
10313    .balign 64
10314.L_OP_UNUSED_E5FF: /* 0x1e5 */
10315/* File: armv5te/OP_UNUSED_E5FF.S */
10316/* File: armv5te/unused.S */
10317    bl      common_abort
10318
10319
10320/* ------------------------------ */
10321    .balign 64
10322.L_OP_UNUSED_E6FF: /* 0x1e6 */
10323/* File: armv5te/OP_UNUSED_E6FF.S */
10324/* File: armv5te/unused.S */
10325    bl      common_abort
10326
10327
10328/* ------------------------------ */
10329    .balign 64
10330.L_OP_UNUSED_E7FF: /* 0x1e7 */
10331/* File: armv5te/OP_UNUSED_E7FF.S */
10332/* File: armv5te/unused.S */
10333    bl      common_abort
10334
10335
10336/* ------------------------------ */
10337    .balign 64
10338.L_OP_UNUSED_E8FF: /* 0x1e8 */
10339/* File: armv5te/OP_UNUSED_E8FF.S */
10340/* File: armv5te/unused.S */
10341    bl      common_abort
10342
10343
10344/* ------------------------------ */
10345    .balign 64
10346.L_OP_UNUSED_E9FF: /* 0x1e9 */
10347/* File: armv5te/OP_UNUSED_E9FF.S */
10348/* File: armv5te/unused.S */
10349    bl      common_abort
10350
10351
10352/* ------------------------------ */
10353    .balign 64
10354.L_OP_UNUSED_EAFF: /* 0x1ea */
10355/* File: armv5te/OP_UNUSED_EAFF.S */
10356/* File: armv5te/unused.S */
10357    bl      common_abort
10358
10359
10360/* ------------------------------ */
10361    .balign 64
10362.L_OP_UNUSED_EBFF: /* 0x1eb */
10363/* File: armv5te/OP_UNUSED_EBFF.S */
10364/* File: armv5te/unused.S */
10365    bl      common_abort
10366
10367
10368/* ------------------------------ */
10369    .balign 64
10370.L_OP_UNUSED_ECFF: /* 0x1ec */
10371/* File: armv5te/OP_UNUSED_ECFF.S */
10372/* File: armv5te/unused.S */
10373    bl      common_abort
10374
10375
10376/* ------------------------------ */
10377    .balign 64
10378.L_OP_UNUSED_EDFF: /* 0x1ed */
10379/* File: armv5te/OP_UNUSED_EDFF.S */
10380/* File: armv5te/unused.S */
10381    bl      common_abort
10382
10383
10384/* ------------------------------ */
10385    .balign 64
10386.L_OP_UNUSED_EEFF: /* 0x1ee */
10387/* File: armv5te/OP_UNUSED_EEFF.S */
10388/* File: armv5te/unused.S */
10389    bl      common_abort
10390
10391
10392/* ------------------------------ */
10393    .balign 64
10394.L_OP_UNUSED_EFFF: /* 0x1ef */
10395/* File: armv5te/OP_UNUSED_EFFF.S */
10396/* File: armv5te/unused.S */
10397    bl      common_abort
10398
10399
10400/* ------------------------------ */
10401    .balign 64
10402.L_OP_UNUSED_F0FF: /* 0x1f0 */
10403/* File: armv5te/OP_UNUSED_F0FF.S */
10404/* File: armv5te/unused.S */
10405    bl      common_abort
10406
10407
10408/* ------------------------------ */
10409    .balign 64
10410.L_OP_UNUSED_F1FF: /* 0x1f1 */
10411/* File: armv5te/OP_UNUSED_F1FF.S */
10412/* File: armv5te/unused.S */
10413    bl      common_abort
10414
10415
10416/* ------------------------------ */
10417    .balign 64
10418.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
10419/* File: armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S */
10420/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
10421    /*
10422     * Invoke Object.<init> on an object.  In practice we know that
10423     * Object's nullary constructor doesn't do anything, so we just
10424     * skip it unless a debugger is active.
10425     */
10426    FETCH(r1, 4)                  @ r1<- CCCC
10427    GET_VREG(r0, r1)                    @ r0<- "this" ptr
10428    cmp     r0, #0                      @ check for NULL
10429    beq     common_errNullObject        @ export PC and throw NPE
10430    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
10431    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
10432    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
10433    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal        @ yes, go
10434.LOP_INVOKE_OBJECT_INIT_JUMBO_finish:
10435    ldrh    r1, [rSELF, #offThread_subMode]
10436    ands    r1, #kSubModeDebuggerActive @ debugger active?
10437    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_debugger        @ Yes - skip optimization
10438    FETCH_ADVANCE_INST(4+1)       @ advance to next instr, load rINST
10439    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
10440    GOTO_OPCODE(ip)                     @ execute it
10441
10442
10443/* ------------------------------ */
10444    .balign 64
10445.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
10446/* File: armv5te/OP_IGET_VOLATILE_JUMBO.S */
10447/* File: armv5te/OP_IGET_JUMBO.S */
10448    /*
10449     * Jumbo 32-bit instance field get.
10450     *
10451     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10452     *      iget-char/jumbo, iget-short/jumbo
10453     */
10454    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10455    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10456    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10457    FETCH(r0, 4)                        @ r0<- CCCC
10458    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10459    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10460    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10461    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10462    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10463    cmp     r0, #0                      @ is resolved entry null?
10464    bne     .LOP_IGET_VOLATILE_JUMBO_finish          @ no, already resolved
104658:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10466    EXPORT_PC()                         @ resolve() could throw
10467    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10468    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10469    b       .LOP_IGET_VOLATILE_JUMBO_resolved        @ resolved, continue
10470
10471
10472/* ------------------------------ */
10473    .balign 64
10474.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
10475/* File: armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S */
10476/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
10477    /*
10478     * Jumbo 64-bit instance field get.
10479     */
10480    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10481    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10482    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10483    FETCH(r0, 4)                        @ r0<- CCCC
10484    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10485    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10486    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10487    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10488    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10489    cmp     r0, #0                      @ is resolved entry null?
10490    bne     .LOP_IGET_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
10491    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10492    EXPORT_PC()                         @ resolve() could throw
10493    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10494    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10495    b       .LOP_IGET_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10496
10497
10498/* ------------------------------ */
10499    .balign 64
10500.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
10501/* File: armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S */
10502/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
10503/* File: armv5te/OP_IGET_JUMBO.S */
10504    /*
10505     * Jumbo 32-bit instance field get.
10506     *
10507     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10508     *      iget-char/jumbo, iget-short/jumbo
10509     */
10510    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10511    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10512    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10513    FETCH(r0, 4)                        @ r0<- CCCC
10514    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10515    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10516    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10517    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10518    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10519    cmp     r0, #0                      @ is resolved entry null?
10520    bne     .LOP_IGET_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
105218:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10522    EXPORT_PC()                         @ resolve() could throw
10523    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10524    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10525    b       .LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10526
10527
10528
10529/* ------------------------------ */
10530    .balign 64
10531.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
10532/* File: armv5te/OP_IPUT_VOLATILE_JUMBO.S */
10533/* File: armv5te/OP_IPUT_JUMBO.S */
10534    /*
10535     * Jumbo 32-bit instance field put.
10536     *
10537     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
10538     *      iput-short/jumbo
10539     */
10540    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10541    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10542    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10543    FETCH(r0, 4)                        @ r0<- CCCC
10544    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10545    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10546    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10547    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10548    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10549    cmp     r0, #0                      @ is resolved entry null?
10550    bne     .LOP_IPUT_VOLATILE_JUMBO_finish          @ no, already resolved
105518:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10552    EXPORT_PC()                         @ resolve() could throw
10553    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10554    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10555    b       .LOP_IPUT_VOLATILE_JUMBO_resolved        @ resolved, continue
10556
10557
10558/* ------------------------------ */
10559    .balign 64
10560.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
10561/* File: armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S */
10562/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
10563    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10564    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10565    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10566    FETCH(r0, 4)                        @ r0<- CCCC
10567    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10568    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10569    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10570    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
10571    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10572    cmp     r0, #0                      @ is resolved entry null?
10573    bne     .LOP_IPUT_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
105748:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10575    EXPORT_PC()                         @ resolve() could throw
10576    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10577    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10578    b       .LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10579
10580
10581/* ------------------------------ */
10582    .balign 64
10583.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
10584/* File: armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S */
10585/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
10586    /*
10587     * Jumbo 32-bit instance field put.
10588     */
10589    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10590    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10591    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10592    FETCH(r0, 4)                        @ r0<- CCCC
10593    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10594    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10595    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10596    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10597    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10598    cmp     r0, #0                      @ is resolved entry null?
10599    bne     .LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
106008:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10601    EXPORT_PC()                         @ resolve() could throw
10602    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10603    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10604    b       .LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10605
10606
10607/* ------------------------------ */
10608    .balign 64
10609.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
10610/* File: armv5te/OP_SGET_VOLATILE_JUMBO.S */
10611/* File: armv5te/OP_SGET_JUMBO.S */
10612    /*
10613     * Jumbo 32-bit SGET handler.
10614     *
10615     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
10616     *      sget-char/jumbo, sget-short/jumbo
10617     */
10618    /* exop vBBBB, field@AAAAAAAA */
10619    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10620    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10621    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10622    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10623    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10624    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10625    cmp     r0, #0                      @ is resolved entry null?
10626    beq     .LOP_SGET_VOLATILE_JUMBO_resolve         @ yes, do resolve
10627.LOP_SGET_VOLATILE_JUMBO_finish: @ field ptr in r0
10628    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
10629    SMP_DMB                            @ acquiring load
10630    FETCH(r2, 3)                        @ r2<- BBBB
10631    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10632    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
10633    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10634    GOTO_OPCODE(ip)                     @ jump to next instruction
10635
10636
10637/* ------------------------------ */
10638    .balign 64
10639.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
10640/* File: armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S */
10641/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
10642    /*
10643     * Jumbo 64-bit SGET handler.
10644     */
10645    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
10646    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10647    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10648    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10649    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
10650    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10651    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
10652    cmp     r0, #0                      @ is resolved entry null?
10653    beq     .LOP_SGET_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
10654.LOP_SGET_WIDE_VOLATILE_JUMBO_finish:
10655    FETCH(r9, 3)                        @ r9<- BBBB
10656    .if 1
10657    add     r0, r0, #offStaticField_value @ r0<- pointer to data
10658    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
10659    .else
10660    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
10661    .endif
10662    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
10663    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10664    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
10665    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10666    GOTO_OPCODE(ip)                     @ jump to next instruction
10667
10668
10669/* ------------------------------ */
10670    .balign 64
10671.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
10672/* File: armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S */
10673/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
10674/* File: armv5te/OP_SGET_JUMBO.S */
10675    /*
10676     * Jumbo 32-bit SGET handler.
10677     *
10678     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
10679     *      sget-char/jumbo, sget-short/jumbo
10680     */
10681    /* exop vBBBB, field@AAAAAAAA */
10682    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10683    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10684    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10685    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10686    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10687    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10688    cmp     r0, #0                      @ is resolved entry null?
10689    beq     .LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10690.LOP_SGET_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
10691    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
10692    SMP_DMB                            @ acquiring load
10693    FETCH(r2, 3)                        @ r2<- BBBB
10694    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10695    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
10696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10697    GOTO_OPCODE(ip)                     @ jump to next instruction
10698
10699
10700
10701/* ------------------------------ */
10702    .balign 64
10703.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
10704/* File: armv5te/OP_SPUT_VOLATILE_JUMBO.S */
10705/* File: armv5te/OP_SPUT_JUMBO.S */
10706    /*
10707     * Jumbo 32-bit SPUT handler.
10708     *
10709     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
10710     *      sput-short/jumbo
10711     */
10712    /* exop vBBBB, field@AAAAAAAA */
10713    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10714    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10715    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10716    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10717    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10718    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
10719    cmp     r0, #0                      @ is resolved entry null?
10720    beq     .LOP_SPUT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10721.LOP_SPUT_VOLATILE_JUMBO_finish:   @ field ptr in r0
10722    FETCH(r2, 3)                        @ r2<- BBBB
10723    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10724    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
10725    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10726    SMP_DMB                            @ releasing store
10727    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
10728    GOTO_OPCODE(ip)                     @ jump to next instruction
10729
10730
10731/* ------------------------------ */
10732    .balign 64
10733.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
10734/* File: armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S */
10735/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
10736    /*
10737     * Jumbo 64-bit SPUT handler.
10738     */
10739    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
10740    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
10741    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10742    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10743    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10744    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10745    FETCH(r9, 3)                        @ r9<- BBBB
10746    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
10747    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
10748    cmp     r2, #0                      @ is resolved entry null?
10749    beq     .LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
10750.LOP_SPUT_WIDE_VOLATILE_JUMBO_finish: @ field ptr in r2, BBBB in r9
10751    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10752    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
10753    GET_INST_OPCODE(r10)                @ extract opcode from rINST
10754    .if 1
10755    add     r2, r2, #offStaticField_value @ r2<- pointer to data
10756    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
10757    .else
10758    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
10759    .endif
10760    GOTO_OPCODE(r10)                    @ jump to next instruction
10761
10762
10763/* ------------------------------ */
10764    .balign 64
10765.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
10766/* File: armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S */
10767/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
10768    /*
10769     * Jumbo 32-bit SPUT handler for objects
10770     */
10771    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
10772    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10773    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10774    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10775    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10776    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10777    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10778    cmp     r0, #0                      @ is resolved entry null?
10779    beq     .LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10780.LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish:   @ field ptr in r0
10781    FETCH(r2, 3)                        @ r2<- BBBB
10782    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10783    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
10784    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
10785    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
10786    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10787    SMP_DMB                            @ releasing store
10788    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_end
10789
10790
10791/* ------------------------------ */
10792    .balign 64
10793.L_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
10794/* File: armv5te/OP_THROW_VERIFICATION_ERROR_JUMBO.S */
10795    /*
10796     * Handle a jumbo throw-verification-error instruction.  This throws an
10797     * exception for an error discovered during verification.  The
10798     * exception is indicated by BBBB, with some detail provided by AAAAAAAA.
10799     */
10800    /* exop BBBB, Class@AAAAAAAA */
10801    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10802    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10803    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
10804    orr     r2, r1, r2, lsl #16         @ r2<- AAAAaaaa
10805    EXPORT_PC()                         @ export the PC
10806    FETCH(r1, 3)                        @ r1<- BBBB
10807    bl      dvmThrowVerificationError   @ always throws
10808    b       common_exceptionThrown      @ handle exception
10809
10810    .balign 64
10811    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
10812    .global dvmAsmInstructionEnd
10813dvmAsmInstructionEnd:
10814
10815/*
10816 * ===========================================================================
10817 *  Sister implementations
10818 * ===========================================================================
10819 */
10820    .global dvmAsmSisterStart
10821    .type   dvmAsmSisterStart, %function
10822    .text
10823    .balign 4
10824dvmAsmSisterStart:
10825
10826/* continuation for OP_CONST_STRING */
10827
10828    /*
10829     * Continuation if the String has not yet been resolved.
10830     *  r1: BBBB (String ref)
10831     *  r9: target register
10832     */
10833.LOP_CONST_STRING_resolve:
10834    EXPORT_PC()
10835    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10836    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10837    bl      dvmResolveString            @ r0<- String reference
10838    cmp     r0, #0                      @ failed?
10839    beq     common_exceptionThrown      @ yup, handle the exception
10840    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10841    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10842    SET_VREG(r0, r9)                    @ vAA<- r0
10843    GOTO_OPCODE(ip)                     @ jump to next instruction
10844
10845/* continuation for OP_CONST_STRING_JUMBO */
10846
10847    /*
10848     * Continuation if the String has not yet been resolved.
10849     *  r1: BBBBBBBB (String ref)
10850     *  r9: target register
10851     */
10852.LOP_CONST_STRING_JUMBO_resolve:
10853    EXPORT_PC()
10854    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10855    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10856    bl      dvmResolveString            @ r0<- String reference
10857    cmp     r0, #0                      @ failed?
10858    beq     common_exceptionThrown      @ yup, handle the exception
10859    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
10860    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10861    SET_VREG(r0, r9)                    @ vAA<- r0
10862    GOTO_OPCODE(ip)                     @ jump to next instruction
10863
10864/* continuation for OP_CONST_CLASS */
10865
10866    /*
10867     * Continuation if the Class has not yet been resolved.
10868     *  r1: BBBB (Class ref)
10869     *  r9: target register
10870     */
10871.LOP_CONST_CLASS_resolve:
10872    EXPORT_PC()
10873    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10874    mov     r2, #1                      @ r2<- true
10875    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10876    bl      dvmResolveClass             @ r0<- Class reference
10877    cmp     r0, #0                      @ failed?
10878    beq     common_exceptionThrown      @ yup, handle the exception
10879    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10880    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10881    SET_VREG(r0, r9)                    @ vAA<- r0
10882    GOTO_OPCODE(ip)                     @ jump to next instruction
10883
10884/* continuation for OP_CHECK_CAST */
10885
10886    /*
10887     * Trivial test failed, need to perform full check.  This is common.
10888     *  r0 holds obj->clazz
10889     *  r1 holds desired class resolved from BBBB
10890     *  r9 holds object
10891     */
10892.LOP_CHECK_CAST_fullcheck:
10893    mov     r10, r1                     @ avoid ClassObject getting clobbered
10894    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
10895    cmp     r0, #0                      @ failed?
10896    bne     .LOP_CHECK_CAST_okay            @ no, success
10897
10898    @ A cast has failed.  We need to throw a ClassCastException.
10899    EXPORT_PC()                         @ about to throw
10900    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
10901    mov     r1, r10                     @ r1<- desired class
10902    bl      dvmThrowClassCastException
10903    b       common_exceptionThrown
10904
10905    /*
10906     * Resolution required.  This is the least-likely path.
10907     *
10908     *  r2 holds BBBB
10909     *  r9 holds object
10910     */
10911.LOP_CHECK_CAST_resolve:
10912    EXPORT_PC()                         @ resolve() could throw
10913    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
10914    mov     r1, r2                      @ r1<- BBBB
10915    mov     r2, #0                      @ r2<- false
10916    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
10917    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
10918    cmp     r0, #0                      @ got null?
10919    beq     common_exceptionThrown      @ yes, handle exception
10920    mov     r1, r0                      @ r1<- class resolved from BBB
10921    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
10922    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
10923
10924/* continuation for OP_INSTANCE_OF */
10925
10926    /*
10927     * Trivial test failed, need to perform full check.  This is common.
10928     *  r0 holds obj->clazz
10929     *  r1 holds class resolved from BBBB
10930     *  r9 holds A
10931     */
10932.LOP_INSTANCE_OF_fullcheck:
10933    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
10934    @ fall through to OP_INSTANCE_OF_store
10935
10936    /*
10937     * r0 holds boolean result
10938     * r9 holds A
10939     */
10940.LOP_INSTANCE_OF_store:
10941    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10942    SET_VREG(r0, r9)                    @ vA<- r0
10943    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10944    GOTO_OPCODE(ip)                     @ jump to next instruction
10945
10946    /*
10947     * Trivial test succeeded, save and bail.
10948     *  r9 holds A
10949     */
10950.LOP_INSTANCE_OF_trivial:
10951    mov     r0, #1                      @ indicate success
10952    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
10953    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10954    SET_VREG(r0, r9)                    @ vA<- r0
10955    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10956    GOTO_OPCODE(ip)                     @ jump to next instruction
10957
10958    /*
10959     * Resolution required.  This is the least-likely path.
10960     *
10961     *  r3 holds BBBB
10962     *  r9 holds A
10963     */
10964.LOP_INSTANCE_OF_resolve:
10965    EXPORT_PC()                         @ resolve() could throw
10966    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
10967    mov     r1, r3                      @ r1<- BBBB
10968    mov     r2, #1                      @ r2<- true
10969    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10970    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
10971    cmp     r0, #0                      @ got null?
10972    beq     common_exceptionThrown      @ yes, handle exception
10973    mov     r1, r0                      @ r1<- class resolved from BBB
10974    mov     r3, rINST, lsr #12          @ r3<- B
10975    GET_VREG(r0, r3)                    @ r0<- vB (object)
10976    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
10977    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
10978
10979/* continuation for OP_NEW_INSTANCE */
10980
10981    .balign 32                          @ minimize cache lines
10982.LOP_NEW_INSTANCE_finish: @ r0=new object
10983    mov     r3, rINST, lsr #8           @ r3<- AA
10984    cmp     r0, #0                      @ failed?
10985#if defined(WITH_JIT)
10986    /*
10987     * The JIT needs the class to be fully resolved before it can
10988     * include this instruction in a trace.
10989     */
10990    ldrh    r1, [rSELF, #offThread_subMode]
10991    beq     common_exceptionThrown      @ yes, handle the exception
10992    ands    r1, #kSubModeJitTraceBuild  @ under construction?
10993    bne     .LOP_NEW_INSTANCE_jitCheck
10994#else
10995    beq     common_exceptionThrown      @ yes, handle the exception
10996#endif
10997.LOP_NEW_INSTANCE_end:
10998    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10999    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11000    SET_VREG(r0, r3)                    @ vAA<- r0
11001    GOTO_OPCODE(ip)                     @ jump to next instruction
11002
11003#if defined(WITH_JIT)
11004    /*
11005     * Check to see if we need to stop the trace building early.
11006     * r0: new object
11007     * r3: vAA
11008     */
11009.LOP_NEW_INSTANCE_jitCheck:
11010    ldr     r1, [r10]                   @ reload resolved class
11011    cmp     r1, #0                      @ okay?
11012    bne     .LOP_NEW_INSTANCE_end             @ yes, finish
11013    mov     r9, r0                      @ preserve new object
11014    mov     r10, r3                     @ preserve vAA
11015    mov     r0, rSELF
11016    mov     r1, rPC
11017    bl      dvmJitEndTraceSelect        @ (self, pc)
11018    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11019    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11020    SET_VREG(r9, r10)                   @ vAA<- new object
11021    GOTO_OPCODE(ip)                     @ jump to next instruction
11022#endif
11023
11024    /*
11025     * Class initialization required.
11026     *
11027     *  r0 holds class object
11028     */
11029.LOP_NEW_INSTANCE_needinit:
11030    mov     r9, r0                      @ save r0
11031    bl      dvmInitClass                @ initialize class
11032    cmp     r0, #0                      @ check boolean result
11033    mov     r0, r9                      @ restore r0
11034    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
11035    b       common_exceptionThrown      @ failed, deal with init exception
11036
11037    /*
11038     * Resolution required.  This is the least-likely path.
11039     *
11040     *  r1 holds BBBB
11041     */
11042.LOP_NEW_INSTANCE_resolve:
11043    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11044    mov     r2, #0                      @ r2<- false
11045    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11046    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
11047    cmp     r0, #0                      @ got null?
11048    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
11049    b       common_exceptionThrown      @ yes, handle exception
11050
11051/* continuation for OP_NEW_ARRAY */
11052
11053
11054    /*
11055     * Resolve class.  (This is an uncommon case.)
11056     *
11057     *  r1 holds array length
11058     *  r2 holds class ref CCCC
11059     */
11060.LOP_NEW_ARRAY_resolve:
11061    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11062    mov     r9, r1                      @ r9<- length (save)
11063    mov     r1, r2                      @ r1<- CCCC
11064    mov     r2, #0                      @ r2<- false
11065    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11066    bl      dvmResolveClass             @ r0<- call(clazz, ref)
11067    cmp     r0, #0                      @ got null?
11068    mov     r1, r9                      @ r1<- length (restore)
11069    beq     common_exceptionThrown      @ yes, handle exception
11070    @ fall through to OP_NEW_ARRAY_finish
11071
11072    /*
11073     * Finish allocation.
11074     *
11075     *  r0 holds class
11076     *  r1 holds array length
11077     */
11078.LOP_NEW_ARRAY_finish:
11079    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
11080    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
11081    cmp     r0, #0                      @ failed?
11082    mov     r2, rINST, lsr #8           @ r2<- A+
11083    beq     common_exceptionThrown      @ yes, handle the exception
11084    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11085    and     r2, r2, #15                 @ r2<- A
11086    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11087    SET_VREG(r0, r2)                    @ vA<- r0
11088    GOTO_OPCODE(ip)                     @ jump to next instruction
11089
11090/* continuation for OP_FILLED_NEW_ARRAY */
11091
11092    /*
11093     * On entry:
11094     *  r0 holds array class
11095     *  r10 holds AA or BA
11096     */
11097.LOP_FILLED_NEW_ARRAY_continue:
11098    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11099    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11100    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11101    .if     0
11102    mov     r1, r10                     @ r1<- AA (length)
11103    .else
11104    mov     r1, r10, lsr #4             @ r1<- B (length)
11105    .endif
11106    cmp     rINST, #'I'                 @ array of ints?
11107    cmpne   rINST, #'L'                 @ array of objects?
11108    cmpne   rINST, #'['                 @ array of arrays?
11109    mov     r9, r1                      @ save length in r9
11110    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
11111    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11112    cmp     r0, #0                      @ null return?
11113    beq     common_exceptionThrown      @ alloc failed, handle exception
11114
11115    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11116    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11117    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11118    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11119    subs    r9, r9, #1                  @ length--, check for neg
11120    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11121    bmi     2f                          @ was zero, bail
11122
11123    @ copy values from registers into the array
11124    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11125    .if     0
11126    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
111271:  ldr     r3, [r2], #4                @ r3<- *r2++
11128    subs    r9, r9, #1                  @ count--
11129    str     r3, [r0], #4                @ *contents++ = vX
11130    bpl     1b
11131    @ continue at 2
11132    .else
11133    cmp     r9, #4                      @ length was initially 5?
11134    and     r2, r10, #15                @ r2<- A
11135    bne     1f                          @ <= 4 args, branch
11136    GET_VREG(r3, r2)                    @ r3<- vA
11137    sub     r9, r9, #1                  @ count--
11138    str     r3, [r0, #16]               @ contents[4] = vA
111391:  and     r2, r1, #15                 @ r2<- F/E/D/C
11140    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11141    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11142    subs    r9, r9, #1                  @ count--
11143    str     r3, [r0], #4                @ *contents++ = vX
11144    bpl     1b
11145    @ continue at 2
11146    .endif
11147
111482:
11149    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11150    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11151    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11152    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11153    cmp     r1, #'I'                         @ Is int array?
11154    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11155    GOTO_OPCODE(ip)                          @ execute it
11156
11157    /*
11158     * Throw an exception indicating that we have not implemented this
11159     * mode of filled-new-array.
11160     */
11161.LOP_FILLED_NEW_ARRAY_notimpl:
11162    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY
11163    bl      dvmThrowInternalError
11164    b       common_exceptionThrown
11165
11166    /*
11167     * Ideally we'd only define this once, but depending on layout we can
11168     * exceed the range of the load above.
11169     */
11170
11171.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY:
11172    .word   .LstrFilledNewArrayNotImpl
11173
11174/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
11175
11176    /*
11177     * On entry:
11178     *  r0 holds array class
11179     *  r10 holds AA or BA
11180     */
11181.LOP_FILLED_NEW_ARRAY_RANGE_continue:
11182    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11183    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11184    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11185    .if     1
11186    mov     r1, r10                     @ r1<- AA (length)
11187    .else
11188    mov     r1, r10, lsr #4             @ r1<- B (length)
11189    .endif
11190    cmp     rINST, #'I'                 @ array of ints?
11191    cmpne   rINST, #'L'                 @ array of objects?
11192    cmpne   rINST, #'['                 @ array of arrays?
11193    mov     r9, r1                      @ save length in r9
11194    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
11195    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11196    cmp     r0, #0                      @ null return?
11197    beq     common_exceptionThrown      @ alloc failed, handle exception
11198
11199    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11200    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11201    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11202    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11203    subs    r9, r9, #1                  @ length--, check for neg
11204    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11205    bmi     2f                          @ was zero, bail
11206
11207    @ copy values from registers into the array
11208    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11209    .if     1
11210    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
112111:  ldr     r3, [r2], #4                @ r3<- *r2++
11212    subs    r9, r9, #1                  @ count--
11213    str     r3, [r0], #4                @ *contents++ = vX
11214    bpl     1b
11215    @ continue at 2
11216    .else
11217    cmp     r9, #4                      @ length was initially 5?
11218    and     r2, r10, #15                @ r2<- A
11219    bne     1f                          @ <= 4 args, branch
11220    GET_VREG(r3, r2)                    @ r3<- vA
11221    sub     r9, r9, #1                  @ count--
11222    str     r3, [r0, #16]               @ contents[4] = vA
112231:  and     r2, r1, #15                 @ r2<- F/E/D/C
11224    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11225    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11226    subs    r9, r9, #1                  @ count--
11227    str     r3, [r0], #4                @ *contents++ = vX
11228    bpl     1b
11229    @ continue at 2
11230    .endif
11231
112322:
11233    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11234    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11235    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11236    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11237    cmp     r1, #'I'                         @ Is int array?
11238    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11239    GOTO_OPCODE(ip)                          @ execute it
11240
11241    /*
11242     * Throw an exception indicating that we have not implemented this
11243     * mode of filled-new-array.
11244     */
11245.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
11246    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE
11247    bl      dvmThrowInternalError
11248    b       common_exceptionThrown
11249
11250    /*
11251     * Ideally we'd only define this once, but depending on layout we can
11252     * exceed the range of the load above.
11253     */
11254
11255.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE:
11256    .word   .LstrFilledNewArrayNotImpl
11257
11258/* continuation for OP_CMPL_FLOAT */
11259.LOP_CMPL_FLOAT_finish:
11260    SET_VREG(r0, r9)                    @ vAA<- r0
11261    GOTO_OPCODE(ip)                     @ jump to next instruction
11262
11263/* continuation for OP_CMPG_FLOAT */
11264.LOP_CMPG_FLOAT_finish:
11265    SET_VREG(r0, r9)                    @ vAA<- r0
11266    GOTO_OPCODE(ip)                     @ jump to next instruction
11267
11268/* continuation for OP_CMPL_DOUBLE */
11269.LOP_CMPL_DOUBLE_finish:
11270    SET_VREG(r0, r9)                    @ vAA<- r0
11271    GOTO_OPCODE(ip)                     @ jump to next instruction
11272
11273/* continuation for OP_CMPG_DOUBLE */
11274.LOP_CMPG_DOUBLE_finish:
11275    SET_VREG(r0, r9)                    @ vAA<- r0
11276    GOTO_OPCODE(ip)                     @ jump to next instruction
11277
11278/* continuation for OP_CMP_LONG */
11279
11280.LOP_CMP_LONG_less:
11281    mvn     r1, #0                      @ r1<- -1
11282    @ Want to cond code the next mov so we can avoid branch, but don't see it;
11283    @ instead, we just replicate the tail end.
11284    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11285    SET_VREG(r1, r9)                    @ vAA<- r1
11286    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11287    GOTO_OPCODE(ip)                     @ jump to next instruction
11288
11289.LOP_CMP_LONG_greater:
11290    mov     r1, #1                      @ r1<- 1
11291    @ fall through to _finish
11292
11293.LOP_CMP_LONG_finish:
11294    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11295    SET_VREG(r1, r9)                    @ vAA<- r1
11296    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11297    GOTO_OPCODE(ip)                     @ jump to next instruction
11298
11299/* continuation for OP_AGET_WIDE */
11300
11301.LOP_AGET_WIDE_finish:
11302    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11303    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11304    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
11305    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11306    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
11307    GOTO_OPCODE(ip)                     @ jump to next instruction
11308
11309/* continuation for OP_APUT_WIDE */
11310
11311.LOP_APUT_WIDE_finish:
11312    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11313    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
11314    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11315    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11316    GOTO_OPCODE(ip)                     @ jump to next instruction
11317
11318/* continuation for OP_APUT_OBJECT */
11319    /*
11320     * On entry:
11321     *  rINST = vBB (arrayObj)
11322     *  r9 = vAA (obj)
11323     *  r10 = offset into array (vBB + vCC * width)
11324     */
11325.LOP_APUT_OBJECT_finish:
11326    cmp     r9, #0                      @ storing null reference?
11327    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
11328    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
11329    ldr     r1, [rINST, #offObject_clazz]  @ r1<- arrayObj->clazz
11330    bl      dvmCanPutArrayElement       @ test object type vs. array type
11331    cmp     r0, #0                      @ okay?
11332    beq     .LOP_APUT_OBJECT_throw           @ no
11333    mov     r1, rINST                   @ r1<- arrayObj
11334    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11335    ldr     r2, [rSELF, #offThread_cardTable]     @ get biased CT base
11336    add     r10, #offArrayObject_contents   @ r0<- pointer to slot
11337    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11338    str     r9, [r10]                   @ vBB[vCC]<- vAA
11339    strb    r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
11340    GOTO_OPCODE(ip)                     @ jump to next instruction
11341.LOP_APUT_OBJECT_skip_check:
11342    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11343    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11344    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
11345    GOTO_OPCODE(ip)                     @ jump to next instruction
11346.LOP_APUT_OBJECT_throw:
11347    @ The types don't match.  We need to throw an ArrayStoreException.
11348    ldr     r0, [r9, #offObject_clazz]
11349    ldr     r1, [rINST, #offObject_clazz]
11350    EXPORT_PC()
11351    bl      dvmThrowArrayStoreExceptionIncompatibleElement
11352    b       common_exceptionThrown
11353
11354/* continuation for OP_IGET */
11355
11356    /*
11357     * Currently:
11358     *  r0 holds resolved field
11359     *  r9 holds object
11360     */
11361.LOP_IGET_finish:
11362    @bl      common_squeak0
11363    cmp     r9, #0                      @ check object for null
11364    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11365    beq     common_errNullObject        @ object was null
11366    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11367    @ no-op                             @ acquiring load
11368    mov     r2, rINST, lsr #8           @ r2<- A+
11369    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11370    and     r2, r2, #15                 @ r2<- A
11371    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11372    SET_VREG(r0, r2)                    @ fp[A]<- r0
11373    GOTO_OPCODE(ip)                     @ jump to next instruction
11374
11375/* continuation for OP_IGET_WIDE */
11376
11377    /*
11378     * Currently:
11379     *  r0 holds resolved field
11380     *  r9 holds object
11381     */
11382.LOP_IGET_WIDE_finish:
11383    cmp     r9, #0                      @ check object for null
11384    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11385    beq     common_errNullObject        @ object was null
11386    .if     0
11387    add     r0, r9, r3                  @ r0<- address of field
11388    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
11389    .else
11390    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
11391    .endif
11392    mov     r2, rINST, lsr #8           @ r2<- A+
11393    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11394    and     r2, r2, #15                 @ r2<- A
11395    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
11396    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11397    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
11398    GOTO_OPCODE(ip)                     @ jump to next instruction
11399
11400/* continuation for OP_IGET_OBJECT */
11401
11402    /*
11403     * Currently:
11404     *  r0 holds resolved field
11405     *  r9 holds object
11406     */
11407.LOP_IGET_OBJECT_finish:
11408    @bl      common_squeak0
11409    cmp     r9, #0                      @ check object for null
11410    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11411    beq     common_errNullObject        @ object was null
11412    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11413    @ no-op                             @ acquiring load
11414    mov     r2, rINST, lsr #8           @ r2<- A+
11415    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11416    and     r2, r2, #15                 @ r2<- A
11417    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11418    SET_VREG(r0, r2)                    @ fp[A]<- r0
11419    GOTO_OPCODE(ip)                     @ jump to next instruction
11420
11421/* continuation for OP_IGET_BOOLEAN */
11422
11423    /*
11424     * Currently:
11425     *  r0 holds resolved field
11426     *  r9 holds object
11427     */
11428.LOP_IGET_BOOLEAN_finish:
11429    @bl      common_squeak1
11430    cmp     r9, #0                      @ check object for null
11431    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11432    beq     common_errNullObject        @ object was null
11433    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11434    @ no-op                             @ acquiring load
11435    mov     r2, rINST, lsr #8           @ r2<- A+
11436    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11437    and     r2, r2, #15                 @ r2<- A
11438    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11439    SET_VREG(r0, r2)                    @ fp[A]<- r0
11440    GOTO_OPCODE(ip)                     @ jump to next instruction
11441
11442/* continuation for OP_IGET_BYTE */
11443
11444    /*
11445     * Currently:
11446     *  r0 holds resolved field
11447     *  r9 holds object
11448     */
11449.LOP_IGET_BYTE_finish:
11450    @bl      common_squeak2
11451    cmp     r9, #0                      @ check object for null
11452    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11453    beq     common_errNullObject        @ object was null
11454    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11455    @ no-op                             @ acquiring load
11456    mov     r2, rINST, lsr #8           @ r2<- A+
11457    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11458    and     r2, r2, #15                 @ r2<- A
11459    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11460    SET_VREG(r0, r2)                    @ fp[A]<- r0
11461    GOTO_OPCODE(ip)                     @ jump to next instruction
11462
11463/* continuation for OP_IGET_CHAR */
11464
11465    /*
11466     * Currently:
11467     *  r0 holds resolved field
11468     *  r9 holds object
11469     */
11470.LOP_IGET_CHAR_finish:
11471    @bl      common_squeak3
11472    cmp     r9, #0                      @ check object for null
11473    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11474    beq     common_errNullObject        @ object was null
11475    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11476    @ no-op                             @ acquiring load
11477    mov     r2, rINST, lsr #8           @ r2<- A+
11478    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11479    and     r2, r2, #15                 @ r2<- A
11480    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11481    SET_VREG(r0, r2)                    @ fp[A]<- r0
11482    GOTO_OPCODE(ip)                     @ jump to next instruction
11483
11484/* continuation for OP_IGET_SHORT */
11485
11486    /*
11487     * Currently:
11488     *  r0 holds resolved field
11489     *  r9 holds object
11490     */
11491.LOP_IGET_SHORT_finish:
11492    @bl      common_squeak4
11493    cmp     r9, #0                      @ check object for null
11494    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11495    beq     common_errNullObject        @ object was null
11496    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11497    @ no-op                             @ acquiring load
11498    mov     r2, rINST, lsr #8           @ r2<- A+
11499    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11500    and     r2, r2, #15                 @ r2<- A
11501    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11502    SET_VREG(r0, r2)                    @ fp[A]<- r0
11503    GOTO_OPCODE(ip)                     @ jump to next instruction
11504
11505/* continuation for OP_IPUT */
11506
11507    /*
11508     * Currently:
11509     *  r0 holds resolved field
11510     *  r9 holds object
11511     */
11512.LOP_IPUT_finish:
11513    @bl      common_squeak0
11514    mov     r1, rINST, lsr #8           @ r1<- A+
11515    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11516    and     r1, r1, #15                 @ r1<- A
11517    cmp     r9, #0                      @ check object for null
11518    GET_VREG(r0, r1)                    @ r0<- fp[A]
11519    beq     common_errNullObject        @ object was null
11520    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11521    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11522    @ no-op                             @ releasing store
11523    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11524    GOTO_OPCODE(ip)                     @ jump to next instruction
11525
11526/* continuation for OP_IPUT_WIDE */
11527
11528    /*
11529     * Currently:
11530     *  r0 holds resolved field
11531     *  r9 holds object
11532     */
11533.LOP_IPUT_WIDE_finish:
11534    mov     r2, rINST, lsr #8           @ r2<- A+
11535    cmp     r9, #0                      @ check object for null
11536    and     r2, r2, #15                 @ r2<- A
11537    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11538    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
11539    beq     common_errNullObject        @ object was null
11540    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11541    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
11542    GET_INST_OPCODE(r10)                @ extract opcode from rINST
11543    .if     0
11544    add     r2, r9, r3                  @ r2<- target address
11545    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
11546    .else
11547    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
11548    .endif
11549    GOTO_OPCODE(r10)                    @ jump to next instruction
11550
11551/* continuation for OP_IPUT_OBJECT */
11552
11553    /*
11554     * Currently:
11555     *  r0 holds resolved field
11556     *  r9 holds object
11557     */
11558.LOP_IPUT_OBJECT_finish:
11559    @bl      common_squeak0
11560    mov     r1, rINST, lsr #8           @ r1<- A+
11561    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11562    and     r1, r1, #15                 @ r1<- A
11563    cmp     r9, #0                      @ check object for null
11564    GET_VREG(r0, r1)                    @ r0<- fp[A]
11565    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11566    beq     common_errNullObject        @ object was null
11567    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11568    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11569    @ no-op                             @ releasing store
11570    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
11571    cmp     r0, #0                      @ stored a null reference?
11572    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
11573    GOTO_OPCODE(ip)                     @ jump to next instruction
11574
11575/* continuation for OP_IPUT_BOOLEAN */
11576
11577    /*
11578     * Currently:
11579     *  r0 holds resolved field
11580     *  r9 holds object
11581     */
11582.LOP_IPUT_BOOLEAN_finish:
11583    @bl      common_squeak1
11584    mov     r1, rINST, lsr #8           @ r1<- A+
11585    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11586    and     r1, r1, #15                 @ r1<- A
11587    cmp     r9, #0                      @ check object for null
11588    GET_VREG(r0, r1)                    @ r0<- fp[A]
11589    beq     common_errNullObject        @ object was null
11590    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11591    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11592    @ no-op                             @ releasing store
11593    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11594    GOTO_OPCODE(ip)                     @ jump to next instruction
11595
11596/* continuation for OP_IPUT_BYTE */
11597
11598    /*
11599     * Currently:
11600     *  r0 holds resolved field
11601     *  r9 holds object
11602     */
11603.LOP_IPUT_BYTE_finish:
11604    @bl      common_squeak2
11605    mov     r1, rINST, lsr #8           @ r1<- A+
11606    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11607    and     r1, r1, #15                 @ r1<- A
11608    cmp     r9, #0                      @ check object for null
11609    GET_VREG(r0, r1)                    @ r0<- fp[A]
11610    beq     common_errNullObject        @ object was null
11611    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11612    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11613    @ no-op                             @ releasing store
11614    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11615    GOTO_OPCODE(ip)                     @ jump to next instruction
11616
11617/* continuation for OP_IPUT_CHAR */
11618
11619    /*
11620     * Currently:
11621     *  r0 holds resolved field
11622     *  r9 holds object
11623     */
11624.LOP_IPUT_CHAR_finish:
11625    @bl      common_squeak3
11626    mov     r1, rINST, lsr #8           @ r1<- A+
11627    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11628    and     r1, r1, #15                 @ r1<- A
11629    cmp     r9, #0                      @ check object for null
11630    GET_VREG(r0, r1)                    @ r0<- fp[A]
11631    beq     common_errNullObject        @ object was null
11632    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11633    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11634    @ no-op                             @ releasing store
11635    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11636    GOTO_OPCODE(ip)                     @ jump to next instruction
11637
11638/* continuation for OP_IPUT_SHORT */
11639
11640    /*
11641     * Currently:
11642     *  r0 holds resolved field
11643     *  r9 holds object
11644     */
11645.LOP_IPUT_SHORT_finish:
11646    @bl      common_squeak4
11647    mov     r1, rINST, lsr #8           @ r1<- A+
11648    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11649    and     r1, r1, #15                 @ r1<- A
11650    cmp     r9, #0                      @ check object for null
11651    GET_VREG(r0, r1)                    @ r0<- fp[A]
11652    beq     common_errNullObject        @ object was null
11653    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11654    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11655    @ no-op                             @ releasing store
11656    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11657    GOTO_OPCODE(ip)                     @ jump to next instruction
11658
11659/* continuation for OP_SGET */
11660
11661    /*
11662     * Continuation if the field has not yet been resolved.
11663     *  r1:  BBBB field ref
11664     *  r10: dvmDex->pResFields
11665     */
11666.LOP_SGET_resolve:
11667    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11668#if defined(WITH_JIT)
11669    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11670#endif
11671    EXPORT_PC()                         @ resolve() could throw, so export now
11672    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11673    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11674    cmp     r0, #0                      @ success?
11675    beq     common_exceptionThrown      @ no, handle exception
11676#if defined(WITH_JIT)
11677    /*
11678     * If the JIT is actively building a trace we need to make sure
11679     * that the field is fully resolved before including this instruction.
11680     */
11681    bl      common_verifyField
11682#endif
11683    b       .LOP_SGET_finish
11684
11685/* continuation for OP_SGET_WIDE */
11686
11687    /*
11688     * Continuation if the field has not yet been resolved.
11689     *  r1:  BBBB field ref
11690     *  r10: dvmDex->pResFields
11691     *
11692     * Returns StaticField pointer in r0.
11693     */
11694.LOP_SGET_WIDE_resolve:
11695    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11696#if defined(WITH_JIT)
11697    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
11698#endif
11699    EXPORT_PC()                         @ resolve() could throw, so export now
11700    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11701    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11702    cmp     r0, #0                      @ success?
11703    beq     common_exceptionThrown      @ no, handle exception
11704#if defined(WITH_JIT)
11705    /*
11706     * If the JIT is actively building a trace we need to make sure
11707     * that the field is fully resolved before including this instruction.
11708     */
11709    bl      common_verifyField
11710#endif
11711    b       .LOP_SGET_WIDE_finish          @ resume
11712
11713/* continuation for OP_SGET_OBJECT */
11714
11715    /*
11716     * Continuation if the field has not yet been resolved.
11717     *  r1:  BBBB field ref
11718     *  r10: dvmDex->pResFields
11719     */
11720.LOP_SGET_OBJECT_resolve:
11721    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11722#if defined(WITH_JIT)
11723    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11724#endif
11725    EXPORT_PC()                         @ resolve() could throw, so export now
11726    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11727    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11728    cmp     r0, #0                      @ success?
11729    beq     common_exceptionThrown      @ no, handle exception
11730#if defined(WITH_JIT)
11731    /*
11732     * If the JIT is actively building a trace we need to make sure
11733     * that the field is fully resolved before including this instruction.
11734     */
11735    bl      common_verifyField
11736#endif
11737    b       .LOP_SGET_OBJECT_finish
11738
11739/* continuation for OP_SGET_BOOLEAN */
11740
11741    /*
11742     * Continuation if the field has not yet been resolved.
11743     *  r1:  BBBB field ref
11744     *  r10: dvmDex->pResFields
11745     */
11746.LOP_SGET_BOOLEAN_resolve:
11747    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11748#if defined(WITH_JIT)
11749    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11750#endif
11751    EXPORT_PC()                         @ resolve() could throw, so export now
11752    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11753    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11754    cmp     r0, #0                      @ success?
11755    beq     common_exceptionThrown      @ no, handle exception
11756#if defined(WITH_JIT)
11757    /*
11758     * If the JIT is actively building a trace we need to make sure
11759     * that the field is fully resolved before including this instruction.
11760     */
11761    bl      common_verifyField
11762#endif
11763    b       .LOP_SGET_BOOLEAN_finish
11764
11765/* continuation for OP_SGET_BYTE */
11766
11767    /*
11768     * Continuation if the field has not yet been resolved.
11769     *  r1:  BBBB field ref
11770     *  r10: dvmDex->pResFields
11771     */
11772.LOP_SGET_BYTE_resolve:
11773    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11774#if defined(WITH_JIT)
11775    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11776#endif
11777    EXPORT_PC()                         @ resolve() could throw, so export now
11778    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11779    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11780    cmp     r0, #0                      @ success?
11781    beq     common_exceptionThrown      @ no, handle exception
11782#if defined(WITH_JIT)
11783    /*
11784     * If the JIT is actively building a trace we need to make sure
11785     * that the field is fully resolved before including this instruction.
11786     */
11787    bl      common_verifyField
11788#endif
11789    b       .LOP_SGET_BYTE_finish
11790
11791/* continuation for OP_SGET_CHAR */
11792
11793    /*
11794     * Continuation if the field has not yet been resolved.
11795     *  r1:  BBBB field ref
11796     *  r10: dvmDex->pResFields
11797     */
11798.LOP_SGET_CHAR_resolve:
11799    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11800#if defined(WITH_JIT)
11801    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11802#endif
11803    EXPORT_PC()                         @ resolve() could throw, so export now
11804    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11805    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11806    cmp     r0, #0                      @ success?
11807    beq     common_exceptionThrown      @ no, handle exception
11808#if defined(WITH_JIT)
11809    /*
11810     * If the JIT is actively building a trace we need to make sure
11811     * that the field is fully resolved before including this instruction.
11812     */
11813    bl      common_verifyField
11814#endif
11815    b       .LOP_SGET_CHAR_finish
11816
11817/* continuation for OP_SGET_SHORT */
11818
11819    /*
11820     * Continuation if the field has not yet been resolved.
11821     *  r1:  BBBB field ref
11822     *  r10: dvmDex->pResFields
11823     */
11824.LOP_SGET_SHORT_resolve:
11825    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11826#if defined(WITH_JIT)
11827    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11828#endif
11829    EXPORT_PC()                         @ resolve() could throw, so export now
11830    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11831    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11832    cmp     r0, #0                      @ success?
11833    beq     common_exceptionThrown      @ no, handle exception
11834#if defined(WITH_JIT)
11835    /*
11836     * If the JIT is actively building a trace we need to make sure
11837     * that the field is fully resolved before including this instruction.
11838     */
11839    bl      common_verifyField
11840#endif
11841    b       .LOP_SGET_SHORT_finish
11842
11843/* continuation for OP_SPUT */
11844
11845    /*
11846     * Continuation if the field has not yet been resolved.
11847     *  r1:  BBBB field ref
11848     *  r10: dvmDex->pResFields
11849     */
11850.LOP_SPUT_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_finish          @ resume
11868
11869/* continuation for OP_SPUT_WIDE */
11870
11871    /*
11872     * Continuation if the field has not yet been resolved.
11873     *  r1:  BBBB field ref
11874     *  r9:  &fp[AA]
11875     *  r10: dvmDex->pResFields
11876     *
11877     * Returns StaticField pointer in r2.
11878     */
11879.LOP_SPUT_WIDE_resolve:
11880    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11881#if defined(WITH_JIT)
11882    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11883#endif
11884    EXPORT_PC()                         @ resolve() could throw, so export now
11885    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11886    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11887    cmp     r0, #0                      @ success?
11888    mov     r2, r0                      @ copy to r2
11889    beq     common_exceptionThrown      @ no, handle exception
11890#if defined(WITH_JIT)
11891    /*
11892     * If the JIT is actively building a trace we need to make sure
11893     * that the field is fully resolved before including this instruction.
11894     */
11895    bl      common_verifyField
11896#endif
11897    b       .LOP_SPUT_WIDE_finish          @ resume
11898
11899/* continuation for OP_SPUT_OBJECT */
11900
11901
11902.LOP_SPUT_OBJECT_end:
11903    str     r1, [r0, #offStaticField_value]  @ field<- vAA
11904    cmp     r1, #0                      @ stored a null object?
11905    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
11906    GOTO_OPCODE(ip)                     @ jump to next instruction
11907
11908    /* Continuation if the field has not yet been resolved.
11909     * r1:  BBBB field ref
11910     * r10: dvmDex->pResFields
11911     */
11912.LOP_SPUT_OBJECT_resolve:
11913    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11914#if defined(WITH_JIT)
11915    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11916#endif
11917    EXPORT_PC()                         @ resolve() could throw, so export now
11918    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11919    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11920    cmp     r0, #0                      @ success?
11921    beq     common_exceptionThrown      @ no, handle exception
11922#if defined(WITH_JIT)
11923    /*
11924     * If the JIT is actively building a trace we need to make sure
11925     * that the field is fully resolved before including this instruction.
11926     */
11927    bl      common_verifyField
11928#endif
11929    b       .LOP_SPUT_OBJECT_finish          @ resume
11930
11931
11932/* continuation for OP_SPUT_BOOLEAN */
11933
11934    /*
11935     * Continuation if the field has not yet been resolved.
11936     *  r1:  BBBB field ref
11937     *  r10: dvmDex->pResFields
11938     */
11939.LOP_SPUT_BOOLEAN_resolve:
11940    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11941#if defined(WITH_JIT)
11942    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11943#endif
11944    EXPORT_PC()                         @ resolve() could throw, so export now
11945    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11946    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11947    cmp     r0, #0                      @ success?
11948    beq     common_exceptionThrown      @ no, handle exception
11949#if defined(WITH_JIT)
11950    /*
11951     * If the JIT is actively building a trace we need to make sure
11952     * that the field is fully resolved before including this instruction.
11953     */
11954    bl      common_verifyField
11955#endif
11956    b       .LOP_SPUT_BOOLEAN_finish          @ resume
11957
11958/* continuation for OP_SPUT_BYTE */
11959
11960    /*
11961     * Continuation if the field has not yet been resolved.
11962     *  r1:  BBBB field ref
11963     *  r10: dvmDex->pResFields
11964     */
11965.LOP_SPUT_BYTE_resolve:
11966    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11967#if defined(WITH_JIT)
11968    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11969#endif
11970    EXPORT_PC()                         @ resolve() could throw, so export now
11971    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11972    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11973    cmp     r0, #0                      @ success?
11974    beq     common_exceptionThrown      @ no, handle exception
11975#if defined(WITH_JIT)
11976    /*
11977     * If the JIT is actively building a trace we need to make sure
11978     * that the field is fully resolved before including this instruction.
11979     */
11980    bl      common_verifyField
11981#endif
11982    b       .LOP_SPUT_BYTE_finish          @ resume
11983
11984/* continuation for OP_SPUT_CHAR */
11985
11986    /*
11987     * Continuation if the field has not yet been resolved.
11988     *  r1:  BBBB field ref
11989     *  r10: dvmDex->pResFields
11990     */
11991.LOP_SPUT_CHAR_resolve:
11992    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11993#if defined(WITH_JIT)
11994    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11995#endif
11996    EXPORT_PC()                         @ resolve() could throw, so export now
11997    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11998    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11999    cmp     r0, #0                      @ success?
12000    beq     common_exceptionThrown      @ no, handle exception
12001#if defined(WITH_JIT)
12002    /*
12003     * If the JIT is actively building a trace we need to make sure
12004     * that the field is fully resolved before including this instruction.
12005     */
12006    bl      common_verifyField
12007#endif
12008    b       .LOP_SPUT_CHAR_finish          @ resume
12009
12010/* continuation for OP_SPUT_SHORT */
12011
12012    /*
12013     * Continuation if the field has not yet been resolved.
12014     *  r1:  BBBB field ref
12015     *  r10: dvmDex->pResFields
12016     */
12017.LOP_SPUT_SHORT_resolve:
12018    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12019#if defined(WITH_JIT)
12020    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12021#endif
12022    EXPORT_PC()                         @ resolve() could throw, so export now
12023    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12024    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12025    cmp     r0, #0                      @ success?
12026    beq     common_exceptionThrown      @ no, handle exception
12027#if defined(WITH_JIT)
12028    /*
12029     * If the JIT is actively building a trace we need to make sure
12030     * that the field is fully resolved before including this instruction.
12031     */
12032    bl      common_verifyField
12033#endif
12034    b       .LOP_SPUT_SHORT_finish          @ resume
12035
12036/* continuation for OP_INVOKE_VIRTUAL */
12037
12038    /*
12039     * At this point:
12040     *  r0 = resolved base method
12041     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
12042     */
12043.LOP_INVOKE_VIRTUAL_continue:
12044    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12045    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12046    cmp     r9, #0                      @ is "this" null?
12047    beq     common_errNullObject        @ null "this", throw exception
12048    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12049    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12050    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12051    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
12052
12053/* continuation for OP_INVOKE_SUPER */
12054
12055    /*
12056     * At this point:
12057     *  r0 = resolved base method
12058     *  r10 = method->clazz
12059     */
12060.LOP_INVOKE_SUPER_continue:
12061    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12062    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12063    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12064    EXPORT_PC()                         @ must export for invoke
12065    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12066    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
12067    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12068    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12069    bl      common_invokeMethodNoRange @ continue on
12070
12071.LOP_INVOKE_SUPER_resolve:
12072    mov     r0, r10                     @ r0<- method->clazz
12073    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12074    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12075    cmp     r0, #0                      @ got null?
12076    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
12077    b       common_exceptionThrown      @ yes, handle exception
12078
12079    /*
12080     * Throw a NoSuchMethodError with the method name as the message.
12081     *  r0 = resolved base method
12082     */
12083.LOP_INVOKE_SUPER_nsm:
12084    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12085    b       common_errNoSuchMethod
12086
12087/* continuation for OP_INVOKE_DIRECT */
12088
12089    /*
12090     * On entry:
12091     *  r1 = reference (BBBB or CCCC)
12092     *  r10 = "this" register
12093     */
12094.LOP_INVOKE_DIRECT_resolve:
12095    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12096    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12097    mov     r2, #METHOD_DIRECT          @ resolver method type
12098    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12099    cmp     r0, #0                      @ got null?
12100    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
12101    b       common_exceptionThrown      @ yes, handle exception
12102
12103/* continuation for OP_INVOKE_STATIC */
12104
12105
12106.LOP_INVOKE_STATIC_resolve:
12107    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12108    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12109    mov     r2, #METHOD_STATIC          @ resolver method type
12110    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12111    cmp     r0, #0                      @ got null?
12112#if defined(WITH_JIT)
12113    /*
12114     * Check to see if we're actively building a trace.  If so,
12115     * we need to keep this instruction out of it.
12116     * r10: &resolved_methodToCall
12117     */
12118    ldrh    r2, [rSELF, #offThread_subMode]
12119    beq     common_exceptionThrown            @ null, handle exception
12120    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12121    beq     common_invokeMethodNoRange     @ no (r0=method, r9="this")
12122    ldr     r1, [r10]                         @ reload resolved method
12123    cmp     r1, #0                            @ finished resolving?
12124    bne     common_invokeMethodNoRange     @ yes (r0=method, r9="this")
12125    mov     r10, r0                           @ preserve method
12126    mov     r0, rSELF
12127    mov     r1, rPC
12128    bl      dvmJitEndTraceSelect              @ (self, pc)
12129    mov     r0, r10
12130    b       common_invokeMethodNoRange     @ whew, finally!
12131#else
12132    bne     common_invokeMethodNoRange     @ (r0=method, r9="this")
12133    b       common_exceptionThrown            @ yes, handle exception
12134#endif
12135
12136/* continuation for OP_INVOKE_VIRTUAL_RANGE */
12137
12138    /*
12139     * At this point:
12140     *  r0 = resolved base method
12141     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
12142     */
12143.LOP_INVOKE_VIRTUAL_RANGE_continue:
12144    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12145    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12146    cmp     r9, #0                      @ is "this" null?
12147    beq     common_errNullObject        @ null "this", throw exception
12148    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12149    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12150    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12151    bl      common_invokeMethodRange @ (r0=method, r9="this")
12152
12153/* continuation for OP_INVOKE_SUPER_RANGE */
12154
12155    /*
12156     * At this point:
12157     *  r0 = resolved base method
12158     *  r10 = method->clazz
12159     */
12160.LOP_INVOKE_SUPER_RANGE_continue:
12161    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12162    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12163    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12164    EXPORT_PC()                         @ must export for invoke
12165    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12166    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
12167    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12168    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12169    bl      common_invokeMethodRange @ continue on
12170
12171.LOP_INVOKE_SUPER_RANGE_resolve:
12172    mov     r0, r10                     @ r0<- method->clazz
12173    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12174    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12175    cmp     r0, #0                      @ got null?
12176    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
12177    b       common_exceptionThrown      @ yes, handle exception
12178
12179    /*
12180     * Throw a NoSuchMethodError with the method name as the message.
12181     *  r0 = resolved base method
12182     */
12183.LOP_INVOKE_SUPER_RANGE_nsm:
12184    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12185    b       common_errNoSuchMethod
12186
12187/* continuation for OP_INVOKE_DIRECT_RANGE */
12188
12189    /*
12190     * On entry:
12191     *  r1 = reference (BBBB or CCCC)
12192     *  r10 = "this" register
12193     */
12194.LOP_INVOKE_DIRECT_RANGE_resolve:
12195    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12196    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12197    mov     r2, #METHOD_DIRECT          @ resolver method type
12198    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12199    cmp     r0, #0                      @ got null?
12200    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
12201    b       common_exceptionThrown      @ yes, handle exception
12202
12203/* continuation for OP_INVOKE_STATIC_RANGE */
12204
12205
12206.LOP_INVOKE_STATIC_RANGE_resolve:
12207    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12208    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12209    mov     r2, #METHOD_STATIC          @ resolver method type
12210    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12211    cmp     r0, #0                      @ got null?
12212#if defined(WITH_JIT)
12213    /*
12214     * Check to see if we're actively building a trace.  If so,
12215     * we need to keep this instruction out of it.
12216     * r10: &resolved_methodToCall
12217     */
12218    ldrh    r2, [rSELF, #offThread_subMode]
12219    beq     common_exceptionThrown            @ null, handle exception
12220    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12221    beq     common_invokeMethodRange     @ no (r0=method, r9="this")
12222    ldr     r1, [r10]                         @ reload resolved method
12223    cmp     r1, #0                            @ finished resolving?
12224    bne     common_invokeMethodRange     @ yes (r0=method, r9="this")
12225    mov     r10, r0                           @ preserve method
12226    mov     r0, rSELF
12227    mov     r1, rPC
12228    bl      dvmJitEndTraceSelect              @ (self, pc)
12229    mov     r0, r10
12230    b       common_invokeMethodRange     @ whew, finally!
12231#else
12232    bne     common_invokeMethodRange     @ (r0=method, r9="this")
12233    b       common_exceptionThrown            @ yes, handle exception
12234#endif
12235
12236/* continuation for OP_FLOAT_TO_LONG */
12237/*
12238 * Convert the float in r0 to a long in r0/r1.
12239 *
12240 * We have to clip values to long min/max per the specification.  The
12241 * expected common case is a "reasonable" value that converts directly
12242 * to modest integer.  The EABI convert function isn't doing this for us.
12243 */
12244f2l_doconv:
12245    stmfd   sp!, {r4, lr}
12246    mov     r1, #0x5f000000             @ (float)maxlong
12247    mov     r4, r0
12248    bl      __aeabi_fcmpge              @ is arg >= maxlong?
12249    cmp     r0, #0                      @ nonzero == yes
12250    mvnne   r0, #0                      @ return maxlong (7fffffff)
12251    mvnne   r1, #0x80000000
12252    ldmnefd sp!, {r4, pc}
12253
12254    mov     r0, r4                      @ recover arg
12255    mov     r1, #0xdf000000             @ (float)minlong
12256    bl      __aeabi_fcmple              @ is arg <= minlong?
12257    cmp     r0, #0                      @ nonzero == yes
12258    movne   r0, #0                      @ return minlong (80000000)
12259    movne   r1, #0x80000000
12260    ldmnefd sp!, {r4, pc}
12261
12262    mov     r0, r4                      @ recover arg
12263    mov     r1, r4
12264    bl      __aeabi_fcmpeq              @ is arg == self?
12265    cmp     r0, #0                      @ zero == no
12266    moveq   r1, #0                      @ return zero for NaN
12267    ldmeqfd sp!, {r4, pc}
12268
12269    mov     r0, r4                      @ recover arg
12270    bl      __aeabi_f2lz                @ convert float to long
12271    ldmfd   sp!, {r4, pc}
12272
12273/* continuation for OP_DOUBLE_TO_LONG */
12274/*
12275 * Convert the double in r0/r1 to a long in r0/r1.
12276 *
12277 * We have to clip values to long min/max per the specification.  The
12278 * expected common case is a "reasonable" value that converts directly
12279 * to modest integer.  The EABI convert function isn't doing this for us.
12280 */
12281d2l_doconv:
12282    stmfd   sp!, {r4, r5, lr}           @ save regs
12283    mov     r3, #0x43000000             @ maxlong, as a double (high word)
12284    add     r3, #0x00e00000             @  0x43e00000
12285    mov     r2, #0                      @ maxlong, as a double (low word)
12286    sub     sp, sp, #4                  @ align for EABI
12287    mov     r4, r0                      @ save a copy of r0
12288    mov     r5, r1                      @  and r1
12289    bl      __aeabi_dcmpge              @ is arg >= maxlong?
12290    cmp     r0, #0                      @ nonzero == yes
12291    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
12292    mvnne   r1, #0x80000000
12293    bne     1f
12294
12295    mov     r0, r4                      @ recover arg
12296    mov     r1, r5
12297    mov     r3, #0xc3000000             @ minlong, as a double (high word)
12298    add     r3, #0x00e00000             @  0xc3e00000
12299    mov     r2, #0                      @ minlong, as a double (low word)
12300    bl      __aeabi_dcmple              @ is arg <= minlong?
12301    cmp     r0, #0                      @ nonzero == yes
12302    movne   r0, #0                      @ return minlong (8000000000000000)
12303    movne   r1, #0x80000000
12304    bne     1f
12305
12306    mov     r0, r4                      @ recover arg
12307    mov     r1, r5
12308    mov     r2, r4                      @ compare against self
12309    mov     r3, r5
12310    bl      __aeabi_dcmpeq              @ is arg == self?
12311    cmp     r0, #0                      @ zero == no
12312    moveq   r1, #0                      @ return zero for NaN
12313    beq     1f
12314
12315    mov     r0, r4                      @ recover arg
12316    mov     r1, r5
12317    bl      __aeabi_d2lz                @ convert double to long
12318
123191:
12320    add     sp, sp, #4
12321    ldmfd   sp!, {r4, r5, pc}
12322
12323/* continuation for OP_MUL_LONG */
12324
12325.LOP_MUL_LONG_finish:
12326    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12327    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
12328    GOTO_OPCODE(ip)                     @ jump to next instruction
12329
12330/* continuation for OP_SHL_LONG */
12331
12332.LOP_SHL_LONG_finish:
12333    mov     r0, r0, asl r2              @  r0<- r0 << r2
12334    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12335    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12336    GOTO_OPCODE(ip)                     @ jump to next instruction
12337
12338/* continuation for OP_SHR_LONG */
12339
12340.LOP_SHR_LONG_finish:
12341    mov     r1, r1, asr r2              @  r1<- r1 >> r2
12342    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12343    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12344    GOTO_OPCODE(ip)                     @ jump to next instruction
12345
12346/* continuation for OP_USHR_LONG */
12347
12348.LOP_USHR_LONG_finish:
12349    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
12350    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12351    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12352    GOTO_OPCODE(ip)                     @ jump to next instruction
12353
12354/* continuation for OP_SHL_LONG_2ADDR */
12355
12356.LOP_SHL_LONG_2ADDR_finish:
12357    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12358    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12359    GOTO_OPCODE(ip)                     @ jump to next instruction
12360
12361/* continuation for OP_SHR_LONG_2ADDR */
12362
12363.LOP_SHR_LONG_2ADDR_finish:
12364    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12365    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12366    GOTO_OPCODE(ip)                     @ jump to next instruction
12367
12368/* continuation for OP_USHR_LONG_2ADDR */
12369
12370.LOP_USHR_LONG_2ADDR_finish:
12371    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12372    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12373    GOTO_OPCODE(ip)                     @ jump to next instruction
12374
12375/* continuation for OP_IGET_VOLATILE */
12376
12377    /*
12378     * Currently:
12379     *  r0 holds resolved field
12380     *  r9 holds object
12381     */
12382.LOP_IGET_VOLATILE_finish:
12383    @bl      common_squeak0
12384    cmp     r9, #0                      @ check object for null
12385    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12386    beq     common_errNullObject        @ object was null
12387    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12388    SMP_DMB                            @ acquiring load
12389    mov     r2, rINST, lsr #8           @ r2<- A+
12390    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12391    and     r2, r2, #15                 @ r2<- A
12392    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12393    SET_VREG(r0, r2)                    @ fp[A]<- r0
12394    GOTO_OPCODE(ip)                     @ jump to next instruction
12395
12396/* continuation for OP_IPUT_VOLATILE */
12397
12398    /*
12399     * Currently:
12400     *  r0 holds resolved field
12401     *  r9 holds object
12402     */
12403.LOP_IPUT_VOLATILE_finish:
12404    @bl      common_squeak0
12405    mov     r1, rINST, lsr #8           @ r1<- A+
12406    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12407    and     r1, r1, #15                 @ r1<- A
12408    cmp     r9, #0                      @ check object for null
12409    GET_VREG(r0, r1)                    @ r0<- fp[A]
12410    beq     common_errNullObject        @ object was null
12411    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12412    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12413    SMP_DMB                            @ releasing store
12414    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12415    GOTO_OPCODE(ip)                     @ jump to next instruction
12416
12417/* continuation for OP_SGET_VOLATILE */
12418
12419    /*
12420     * Continuation if the field has not yet been resolved.
12421     *  r1:  BBBB field ref
12422     *  r10: dvmDex->pResFields
12423     */
12424.LOP_SGET_VOLATILE_resolve:
12425    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12426#if defined(WITH_JIT)
12427    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12428#endif
12429    EXPORT_PC()                         @ resolve() could throw, so export now
12430    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12431    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12432    cmp     r0, #0                      @ success?
12433    beq     common_exceptionThrown      @ no, handle exception
12434#if defined(WITH_JIT)
12435    /*
12436     * If the JIT is actively building a trace we need to make sure
12437     * that the field is fully resolved before including this instruction.
12438     */
12439    bl      common_verifyField
12440#endif
12441    b       .LOP_SGET_VOLATILE_finish
12442
12443/* continuation for OP_SPUT_VOLATILE */
12444
12445    /*
12446     * Continuation if the field has not yet been resolved.
12447     *  r1:  BBBB field ref
12448     *  r10: dvmDex->pResFields
12449     */
12450.LOP_SPUT_VOLATILE_resolve:
12451    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12452#if defined(WITH_JIT)
12453    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12454#endif
12455    EXPORT_PC()                         @ resolve() could throw, so export now
12456    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12457    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12458    cmp     r0, #0                      @ success?
12459    beq     common_exceptionThrown      @ no, handle exception
12460#if defined(WITH_JIT)
12461    /*
12462     * If the JIT is actively building a trace we need to make sure
12463     * that the field is fully resolved before including this instruction.
12464     */
12465    bl      common_verifyField
12466#endif
12467    b       .LOP_SPUT_VOLATILE_finish          @ resume
12468
12469/* continuation for OP_IGET_OBJECT_VOLATILE */
12470
12471    /*
12472     * Currently:
12473     *  r0 holds resolved field
12474     *  r9 holds object
12475     */
12476.LOP_IGET_OBJECT_VOLATILE_finish:
12477    @bl      common_squeak0
12478    cmp     r9, #0                      @ check object for null
12479    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12480    beq     common_errNullObject        @ object was null
12481    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12482    SMP_DMB                            @ acquiring load
12483    mov     r2, rINST, lsr #8           @ r2<- A+
12484    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12485    and     r2, r2, #15                 @ r2<- A
12486    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12487    SET_VREG(r0, r2)                    @ fp[A]<- r0
12488    GOTO_OPCODE(ip)                     @ jump to next instruction
12489
12490/* continuation for OP_IGET_WIDE_VOLATILE */
12491
12492    /*
12493     * Currently:
12494     *  r0 holds resolved field
12495     *  r9 holds object
12496     */
12497.LOP_IGET_WIDE_VOLATILE_finish:
12498    cmp     r9, #0                      @ check object for null
12499    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12500    beq     common_errNullObject        @ object was null
12501    .if     1
12502    add     r0, r9, r3                  @ r0<- address of field
12503    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
12504    .else
12505    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
12506    .endif
12507    mov     r2, rINST, lsr #8           @ r2<- A+
12508    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12509    and     r2, r2, #15                 @ r2<- A
12510    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
12511    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12512    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
12513    GOTO_OPCODE(ip)                     @ jump to next instruction
12514
12515/* continuation for OP_IPUT_WIDE_VOLATILE */
12516
12517    /*
12518     * Currently:
12519     *  r0 holds resolved field
12520     *  r9 holds object
12521     */
12522.LOP_IPUT_WIDE_VOLATILE_finish:
12523    mov     r2, rINST, lsr #8           @ r2<- A+
12524    cmp     r9, #0                      @ check object for null
12525    and     r2, r2, #15                 @ r2<- A
12526    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12527    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
12528    beq     common_errNullObject        @ object was null
12529    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12530    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
12531    GET_INST_OPCODE(r10)                @ extract opcode from rINST
12532    .if     1
12533    add     r2, r9, r3                  @ r2<- target address
12534    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
12535    .else
12536    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
12537    .endif
12538    GOTO_OPCODE(r10)                    @ jump to next instruction
12539
12540/* continuation for OP_SGET_WIDE_VOLATILE */
12541
12542    /*
12543     * Continuation if the field has not yet been resolved.
12544     *  r1:  BBBB field ref
12545     *  r10: dvmDex->pResFields
12546     *
12547     * Returns StaticField pointer in r0.
12548     */
12549.LOP_SGET_WIDE_VOLATILE_resolve:
12550    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12551#if defined(WITH_JIT)
12552    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
12553#endif
12554    EXPORT_PC()                         @ resolve() could throw, so export now
12555    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12556    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12557    cmp     r0, #0                      @ success?
12558    beq     common_exceptionThrown      @ no, handle exception
12559#if defined(WITH_JIT)
12560    /*
12561     * If the JIT is actively building a trace we need to make sure
12562     * that the field is fully resolved before including this instruction.
12563     */
12564    bl      common_verifyField
12565#endif
12566    b       .LOP_SGET_WIDE_VOLATILE_finish          @ resume
12567
12568/* continuation for OP_SPUT_WIDE_VOLATILE */
12569
12570    /*
12571     * Continuation if the field has not yet been resolved.
12572     *  r1:  BBBB field ref
12573     *  r9:  &fp[AA]
12574     *  r10: dvmDex->pResFields
12575     *
12576     * Returns StaticField pointer in r2.
12577     */
12578.LOP_SPUT_WIDE_VOLATILE_resolve:
12579    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12580#if defined(WITH_JIT)
12581    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12582#endif
12583    EXPORT_PC()                         @ resolve() could throw, so export now
12584    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12585    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12586    cmp     r0, #0                      @ success?
12587    mov     r2, r0                      @ copy to r2
12588    beq     common_exceptionThrown      @ no, handle exception
12589#if defined(WITH_JIT)
12590    /*
12591     * If the JIT is actively building a trace we need to make sure
12592     * that the field is fully resolved before including this instruction.
12593     */
12594    bl      common_verifyField
12595#endif
12596    b       .LOP_SPUT_WIDE_VOLATILE_finish          @ resume
12597
12598/* continuation for OP_EXECUTE_INLINE */
12599
12600    /*
12601     * Extract args, call function.
12602     *  r0 = #of args (0-4)
12603     *  r10 = call index
12604     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
12605     *
12606     * Other ideas:
12607     * - Use a jump table from the main piece to jump directly into the
12608     *   AND/LDR pairs.  Costs a data load, saves a branch.
12609     * - Have five separate pieces that do the loading, so we can work the
12610     *   interleave a little better.  Increases code size.
12611     */
12612.LOP_EXECUTE_INLINE_continue:
12613    rsb     r0, r0, #4                  @ r0<- 4-r0
12614    FETCH(rINST, 2)                     @ rINST<- FEDC
12615    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
12616    bl      common_abort                @ (skipped due to ARM prefetch)
126174:  and     ip, rINST, #0xf000          @ isolate F
12618    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
126193:  and     ip, rINST, #0x0f00          @ isolate E
12620    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
126212:  and     ip, rINST, #0x00f0          @ isolate D
12622    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
126231:  and     ip, rINST, #0x000f          @ isolate C
12624    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
126250:
12626    ldr     rINST, .LOP_EXECUTE_INLINE_table    @ table of InlineOperation
12627    ldr     pc, [rINST, r10, lsl #4]    @ sizeof=16, "func" is first entry
12628    @ (not reached)
12629
12630    /*
12631     * We're debugging or profiling.
12632     * r10: opIndex
12633     */
12634.LOP_EXECUTE_INLINE_debugmode:
12635    mov     r0, r10
12636    bl      dvmResolveInlineNative
12637    cmp     r0, #0                      @ did it resolve?
12638    beq     .LOP_EXECUTE_INLINE_resume          @ no, just move on
12639    mov     r9, r0                      @ remember method
12640    mov     r1, rSELF
12641    bl      dvmFastMethodTraceEnter     @ (method, self)
12642    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
12643    sub     sp, sp, #8                  @ make room for arg, +64 bit align
12644    mov     r0, rINST, lsr #12          @ r0<- B
12645    str     r1, [sp]                    @ push &self->retval
12646    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
12647    mov     rINST, r0                   @ save result of inline
12648    add     sp, sp, #8                  @ pop stack
12649    mov     r0, r9                      @ r0<- method
12650    mov     r1, rSELF
12651    bl      dvmFastNativeMethodTraceExit @ (method, self)
12652    cmp     rINST, #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_table:
12662    .word   gDvmInlineOpsTable
12663
12664/* continuation for OP_EXECUTE_INLINE_RANGE */
12665
12666    /*
12667     * Extract args, call function.
12668     *  r0 = #of args (0-4)
12669     *  r10 = call index
12670     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
12671     */
12672.LOP_EXECUTE_INLINE_RANGE_continue:
12673    rsb     r0, r0, #4                  @ r0<- 4-r0
12674    FETCH(r9, 2)                        @ r9<- CCCC
12675    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
12676    bl      common_abort                @ (skipped due to ARM prefetch)
126774:  add     ip, r9, #3                  @ base+3
12678    GET_VREG(r3, ip)                    @ r3<- vBase[3]
126793:  add     ip, r9, #2                  @ base+2
12680    GET_VREG(r2, ip)                    @ r2<- vBase[2]
126812:  add     ip, r9, #1                  @ base+1
12682    GET_VREG(r1, ip)                    @ r1<- vBase[1]
126831:  add     ip, r9, #0                  @ (nop)
12684    GET_VREG(r0, ip)                    @ r0<- vBase[0]
126850:
12686    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
12687    ldr     pc, [r9, r10, lsl #4]       @ sizeof=16, "func" is first entry
12688    @ (not reached)
12689
12690
12691    /*
12692     * We're debugging or profiling.
12693     * r10: opIndex
12694     */
12695.LOP_EXECUTE_INLINE_RANGE_debugmode:
12696    mov     r0, r10
12697    bl      dvmResolveInlineNative
12698    cmp     r0, #0                      @ did it resolve?
12699    beq     .LOP_EXECUTE_INLINE_RANGE_resume          @ no, just move on
12700    mov     r9, r0                      @ remember method
12701    mov     r1, rSELF
12702    bl      dvmFastMethodTraceEnter     @ (method, self)
12703    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
12704    sub     sp, sp, #8                  @ make room for arg, +64 bit align
12705    mov     r0, rINST, lsr #8           @ r0<- B
12706    mov     rINST, r9                   @ rINST<- method
12707    str     r1, [sp]                    @ push &self->retval
12708    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
12709    mov     r9, r0                      @ save result of inline
12710    add     sp, sp, #8                  @ pop stack
12711    mov     r0, rINST                   @ r0<- method
12712    mov     r1, rSELF
12713    bl      dvmFastNativeMethodTraceExit  @ (method, self)
12714    cmp     r9, #0                      @ test boolean result of inline
12715    beq     common_exceptionThrown      @ returned false, handle exception
12716    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
12717    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12718    GOTO_OPCODE(ip)                     @ jump to next instruction
12719
12720
12721
12722
12723.LOP_EXECUTE_INLINE_RANGE_table:
12724    .word   gDvmInlineOpsTable
12725
12726
12727/* continuation for OP_INVOKE_OBJECT_INIT_RANGE */
12728
12729.LOP_INVOKE_OBJECT_INIT_RANGE_setFinal:
12730    EXPORT_PC()                         @ can throw
12731    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
12732    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
12733    cmp     r0, #0                      @ exception pending?
12734    bne     common_exceptionThrown      @ yes, handle it
12735    b       .LOP_INVOKE_OBJECT_INIT_RANGE_finish
12736
12737    /*
12738     * A debugger is attached, so we need to go ahead and do
12739     * this.  For simplicity, we'll just jump directly to the
12740     * corresponding handler.  Note that we can't use
12741     * rIBASE here because it may be in single-step mode.
12742     * Load the primary table base directly.
12743     */
12744.LOP_INVOKE_OBJECT_INIT_RANGE_debugger:
12745    ldr     r1, [rSELF, #offThread_mainHandlerTable]
12746    .if 0
12747    mov     ip, #OP_INVOKE_DIRECT_JUMBO
12748    .else
12749    mov     ip, #OP_INVOKE_DIRECT_RANGE
12750    .endif
12751    GOTO_OPCODE_BASE(r1,ip)             @ execute it
12752
12753/* continuation for OP_IPUT_OBJECT_VOLATILE */
12754
12755    /*
12756     * Currently:
12757     *  r0 holds resolved field
12758     *  r9 holds object
12759     */
12760.LOP_IPUT_OBJECT_VOLATILE_finish:
12761    @bl      common_squeak0
12762    mov     r1, rINST, lsr #8           @ r1<- A+
12763    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12764    and     r1, r1, #15                 @ r1<- A
12765    cmp     r9, #0                      @ check object for null
12766    GET_VREG(r0, r1)                    @ r0<- fp[A]
12767    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
12768    beq     common_errNullObject        @ object was null
12769    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12770    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12771    SMP_DMB                            @ releasing store
12772    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
12773    cmp     r0, #0                      @ stored a null reference?
12774    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
12775    GOTO_OPCODE(ip)                     @ jump to next instruction
12776
12777/* continuation for OP_SGET_OBJECT_VOLATILE */
12778
12779    /*
12780     * Continuation if the field has not yet been resolved.
12781     *  r1:  BBBB field ref
12782     *  r10: dvmDex->pResFields
12783     */
12784.LOP_SGET_OBJECT_VOLATILE_resolve:
12785    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12786#if defined(WITH_JIT)
12787    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12788#endif
12789    EXPORT_PC()                         @ resolve() could throw, so export now
12790    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12791    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12792    cmp     r0, #0                      @ success?
12793    beq     common_exceptionThrown      @ no, handle exception
12794#if defined(WITH_JIT)
12795    /*
12796     * If the JIT is actively building a trace we need to make sure
12797     * that the field is fully resolved before including this instruction.
12798     */
12799    bl      common_verifyField
12800#endif
12801    b       .LOP_SGET_OBJECT_VOLATILE_finish
12802
12803/* continuation for OP_SPUT_OBJECT_VOLATILE */
12804
12805
12806.LOP_SPUT_OBJECT_VOLATILE_end:
12807    str     r1, [r0, #offStaticField_value]  @ field<- vAA
12808    cmp     r1, #0                      @ stored a null object?
12809    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
12810    GOTO_OPCODE(ip)                     @ jump to next instruction
12811
12812    /* Continuation if the field has not yet been resolved.
12813     * r1:  BBBB field ref
12814     * r10: dvmDex->pResFields
12815     */
12816.LOP_SPUT_OBJECT_VOLATILE_resolve:
12817    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12818#if defined(WITH_JIT)
12819    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12820#endif
12821    EXPORT_PC()                         @ resolve() could throw, so export now
12822    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12823    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12824    cmp     r0, #0                      @ success?
12825    beq     common_exceptionThrown      @ no, handle exception
12826#if defined(WITH_JIT)
12827    /*
12828     * If the JIT is actively building a trace we need to make sure
12829     * that the field is fully resolved before including this instruction.
12830     */
12831    bl      common_verifyField
12832#endif
12833    b       .LOP_SPUT_OBJECT_VOLATILE_finish          @ resume
12834
12835
12836/* continuation for OP_CONST_CLASS_JUMBO */
12837
12838    /*
12839     * Continuation if the Class has not yet been resolved.
12840     *  r1: AAAAAAAA (Class ref)
12841     *  r9: target register
12842     */
12843.LOP_CONST_CLASS_JUMBO_resolve:
12844    EXPORT_PC()
12845    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
12846    mov     r2, #1                      @ r2<- true
12847    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
12848    bl      dvmResolveClass             @ r0<- Class reference
12849    cmp     r0, #0                      @ failed?
12850    beq     common_exceptionThrown      @ yup, handle the exception
12851    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12852    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12853    SET_VREG(r0, r9)                    @ vBBBB<- r0
12854    GOTO_OPCODE(ip)                     @ jump to next instruction
12855
12856/* continuation for OP_CHECK_CAST_JUMBO */
12857
12858    /*
12859     * Trivial test failed, need to perform full check.  This is common.
12860     *  r0 holds obj->clazz
12861     *  r1 holds desired class resolved from AAAAAAAA
12862     *  r9 holds object
12863     */
12864.LOP_CHECK_CAST_JUMBO_fullcheck:
12865    mov     r10, r1                     @ avoid ClassObject getting clobbered
12866    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
12867    cmp     r0, #0                      @ failed?
12868    bne     .LOP_CHECK_CAST_JUMBO_okay            @ no, success
12869
12870    @ A cast has failed.  We need to throw a ClassCastException.
12871    EXPORT_PC()                         @ about to throw
12872    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
12873    mov     r1, r10                     @ r1<- desired class
12874    bl      dvmThrowClassCastException
12875    b       common_exceptionThrown
12876
12877    /*
12878     * Advance PC and get the next opcode.
12879     */
12880.LOP_CHECK_CAST_JUMBO_okay:
12881    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12882    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12883    GOTO_OPCODE(ip)                     @ jump to next instruction
12884
12885    /*
12886     * Resolution required.  This is the least-likely path.
12887     *
12888     *  r2 holds AAAAAAAA
12889     *  r9 holds object
12890     */
12891.LOP_CHECK_CAST_JUMBO_resolve:
12892    EXPORT_PC()                         @ resolve() could throw
12893    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12894    mov     r1, r2                      @ r1<- AAAAAAAA
12895    mov     r2, #0                      @ r2<- false
12896    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12897    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12898    cmp     r0, #0                      @ got null?
12899    beq     common_exceptionThrown      @ yes, handle exception
12900    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
12901    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
12902    b       .LOP_CHECK_CAST_JUMBO_resolved        @ pick up where we left off
12903
12904/* continuation for OP_INSTANCE_OF_JUMBO */
12905
12906    /*
12907     * Class resolved, determine type of check necessary.  This is common.
12908     *  r0 holds obj->clazz
12909     *  r1 holds class resolved from AAAAAAAA
12910     *  r9 holds BBBB
12911     */
12912.LOP_INSTANCE_OF_JUMBO_resolved:
12913    cmp     r0, r1                      @ same class (trivial success)?
12914    beq     .LOP_INSTANCE_OF_JUMBO_trivial         @ yes, trivial finish
12915    @ fall through to OP_INSTANCE_OF_JUMBO_fullcheck
12916
12917    /*
12918     * Trivial test failed, need to perform full check.  This is common.
12919     *  r0 holds obj->clazz
12920     *  r1 holds class resolved from AAAAAAAA
12921     *  r9 holds BBBB
12922     */
12923.LOP_INSTANCE_OF_JUMBO_fullcheck:
12924    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
12925    @ fall through to OP_INSTANCE_OF_JUMBO_store
12926
12927    /*
12928     * r0 holds boolean result
12929     * r9 holds BBBB
12930     */
12931.LOP_INSTANCE_OF_JUMBO_store:
12932    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
12933    SET_VREG(r0, r9)                    @ vBBBB<- r0
12934    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12935    GOTO_OPCODE(ip)                     @ jump to next instruction
12936
12937    /*
12938     * Trivial test succeeded, save and bail.
12939     *  r9 holds BBBB
12940     */
12941.LOP_INSTANCE_OF_JUMBO_trivial:
12942    mov     r0, #1                      @ indicate success
12943    @ could b OP_INSTANCE_OF_JUMBO_store, but copying is faster and cheaper
12944    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
12945    SET_VREG(r0, r9)                    @ vBBBB<- r0
12946    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12947    GOTO_OPCODE(ip)                     @ jump to next instruction
12948
12949    /*
12950     * Resolution required.  This is the least-likely path.
12951     *
12952     *  r3 holds AAAAAAAA
12953     *  r9 holds BBBB
12954     */
12955
12956.LOP_INSTANCE_OF_JUMBO_resolve:
12957    EXPORT_PC()                         @ resolve() could throw
12958    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
12959    mov     r1, r3                      @ r1<- AAAAAAAA
12960    mov     r2, #1                      @ r2<- true
12961    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
12962    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12963    cmp     r0, #0                      @ got null?
12964    beq     common_exceptionThrown      @ yes, handle exception
12965    FETCH(r3, 4)                        @ r3<- vCCCC
12966    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
12967    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
12968    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
12969    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ pick up where we left off
12970
12971/* continuation for OP_NEW_INSTANCE_JUMBO */
12972
12973    .balign 32                          @ minimize cache lines
12974.LOP_NEW_INSTANCE_JUMBO_finish: @ r0=new object
12975    FETCH(r3, 3)                        @ r3<- BBBB
12976    cmp     r0, #0                      @ failed?
12977#if defined(WITH_JIT)
12978    /*
12979     * The JIT needs the class to be fully resolved before it can
12980     * include this instruction in a trace.
12981     */
12982    ldrh    r1, [rSELF, #offThread_subMode]
12983    beq     common_exceptionThrown      @ yes, handle the exception
12984    ands    r1, #kSubModeJitTraceBuild  @ under construction?
12985    bne     .LOP_NEW_INSTANCE_JUMBO_jitCheck
12986#else
12987    beq     common_exceptionThrown      @ yes, handle the exception
12988#endif
12989.LOP_NEW_INSTANCE_JUMBO_end:
12990    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12991    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12992    SET_VREG(r0, r3)                    @ vBBBB<- r0
12993    GOTO_OPCODE(ip)                     @ jump to next instruction
12994
12995#if defined(WITH_JIT)
12996    /*
12997     * Check to see if we need to stop the trace building early.
12998     * r0: new object
12999     * r3: vAA
13000     */
13001.LOP_NEW_INSTANCE_JUMBO_jitCheck:
13002    ldr     r1, [r10]                   @ reload resolved class
13003    cmp     r1, #0                      @ okay?
13004    bne     .LOP_NEW_INSTANCE_JUMBO_end             @ yes, finish
13005    mov     r9, r0                      @ preserve new object
13006    mov     r10, r3                     @ preserve vAA
13007    mov     r0, rSELF
13008    mov     r1, rPC
13009    bl      dvmJitEndTraceSelect        @ (self, pc)
13010    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
13011    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13012    SET_VREG(r9, r10)                   @ vAA<- new object
13013    GOTO_OPCODE(ip)                     @ jump to next instruction
13014#endif
13015
13016    /*
13017     * Class initialization required.
13018     *
13019     *  r0 holds class object
13020     */
13021.LOP_NEW_INSTANCE_JUMBO_needinit:
13022    mov     r9, r0                      @ save r0
13023    bl      dvmInitClass                @ initialize class
13024    cmp     r0, #0                      @ check boolean result
13025    mov     r0, r9                      @ restore r0
13026    bne     .LOP_NEW_INSTANCE_JUMBO_initialized     @ success, continue
13027    b       common_exceptionThrown      @ failed, deal with init exception
13028
13029    /*
13030     * Resolution required.  This is the least-likely path.
13031     *
13032     *  r1 holds AAAAAAAA
13033     */
13034.LOP_NEW_INSTANCE_JUMBO_resolve:
13035    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13036    mov     r2, #0                      @ r2<- false
13037    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13038    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
13039    cmp     r0, #0                      @ got null?
13040    bne     .LOP_NEW_INSTANCE_JUMBO_resolved        @ no, continue
13041    b       common_exceptionThrown      @ yes, handle exception
13042
13043/* continuation for OP_NEW_ARRAY_JUMBO */
13044
13045
13046    /*
13047     * Resolve class.  (This is an uncommon case.)
13048     *
13049     *  r1 holds array length
13050     *  r2 holds class ref AAAAAAAA
13051     */
13052.LOP_NEW_ARRAY_JUMBO_resolve:
13053    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13054    mov     r9, r1                      @ r9<- length (save)
13055    mov     r1, r2                      @ r1<- AAAAAAAA
13056    mov     r2, #0                      @ r2<- false
13057    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13058    bl      dvmResolveClass             @ r0<- call(clazz, ref)
13059    cmp     r0, #0                      @ got null?
13060    mov     r1, r9                      @ r1<- length (restore)
13061    beq     common_exceptionThrown      @ yes, handle exception
13062    @ fall through to OP_NEW_ARRAY_JUMBO_finish
13063
13064    /*
13065     * Finish allocation.
13066     *
13067     *  r0 holds class
13068     *  r1 holds array length
13069     */
13070.LOP_NEW_ARRAY_JUMBO_finish:
13071    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
13072    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
13073    cmp     r0, #0                      @ failed?
13074    FETCH(r2, 3)                        @ r2<- vBBBB
13075    beq     common_exceptionThrown      @ yes, handle the exception
13076    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13077    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13078    SET_VREG(r0, r2)                    @ vBBBB<- r0
13079    GOTO_OPCODE(ip)                     @ jump to next instruction
13080
13081/* continuation for OP_FILLED_NEW_ARRAY_JUMBO */
13082
13083    /*
13084     * On entry:
13085     *  r0 holds array class
13086     */
13087.LOP_FILLED_NEW_ARRAY_JUMBO_continue:
13088    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
13089    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
13090    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
13091    FETCH(r1, 3)                        @ r1<- BBBB (length)
13092    cmp     rINST, #'I'                 @ array of ints?
13093    cmpne   rINST, #'L'                 @ array of objects?
13094    cmpne   rINST, #'['                 @ array of arrays?
13095    mov     r9, r1                      @ save length in r9
13096    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_notimpl         @ no, not handled yet
13097    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
13098    cmp     r0, #0                      @ null return?
13099    beq     common_exceptionThrown      @ alloc failed, handle exception
13100
13101    FETCH(r1, 4)                        @ r1<- CCCC
13102    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
13103    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
13104    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
13105    subs    r9, r9, #1                  @ length--, check for neg
13106    FETCH_ADVANCE_INST(5)               @ advance to next instr, load rINST
13107    bmi     2f                          @ was zero, bail
13108
13109    @ copy values from registers into the array
13110    @ r0=array, r1=CCCC, r9=BBBB (length)
13111    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
131121:  ldr     r3, [r2], #4                @ r3<- *r2++
13113    subs    r9, r9, #1                  @ count--
13114    str     r3, [r0], #4                @ *contents++ = vX
13115    bpl     1b
13116
131172:  ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
13118    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
13119    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13120    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
13121    cmp     r1, #'I'                         @ Is int array?
13122    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
13123    GOTO_OPCODE(ip)                          @ execute it
13124
13125    /*
13126     * Throw an exception indicating that we have not implemented this
13127     * mode of filled-new-array.
13128     */
13129.LOP_FILLED_NEW_ARRAY_JUMBO_notimpl:
13130    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO
13131    bl      dvmThrowInternalError
13132    b       common_exceptionThrown
13133
13134    /*
13135     * Ideally we'd only define this once, but depending on layout we can
13136     * exceed the range of the load above.
13137     */
13138
13139.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO:
13140    .word   .LstrFilledNewArrayNotImpl
13141
13142/* continuation for OP_IGET_JUMBO */
13143
13144    /*
13145     * Currently:
13146     *  r0 holds resolved field
13147     *  r9 holds object
13148     */
13149.LOP_IGET_JUMBO_resolved:
13150    cmp     r0, #0                      @ resolution unsuccessful?
13151    beq     common_exceptionThrown      @ yes, throw exception
13152    @ fall through to OP_IGET_JUMBO_finish
13153
13154    /*
13155     * Currently:
13156     *  r0 holds resolved field
13157     *  r9 holds object
13158     */
13159.LOP_IGET_JUMBO_finish:
13160    @bl      common_squeak0
13161    cmp     r9, #0                      @ check object for null
13162    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13163    beq     common_errNullObject        @ object was null
13164    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13165    @ no-op                             @ acquiring load
13166    FETCH(r2, 3)                        @ r2<- BBBB
13167    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13168    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13169    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13170    GOTO_OPCODE(ip)                     @ jump to next instruction
13171
13172/* continuation for OP_IGET_WIDE_JUMBO */
13173
13174    /*
13175     * Currently:
13176     *  r0 holds resolved field
13177     *  r9 holds object
13178     */
13179.LOP_IGET_WIDE_JUMBO_resolved:
13180    cmp     r0, #0                      @ resolution unsuccessful?
13181    beq     common_exceptionThrown      @ yes, throw exception
13182    @ fall through to OP_IGET_WIDE_JUMBO_finish
13183
13184    /*
13185     * Currently:
13186     *  r0 holds resolved field
13187     *  r9 holds object
13188     */
13189.LOP_IGET_WIDE_JUMBO_finish:
13190    cmp     r9, #0                      @ check object for null
13191    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13192    beq     common_errNullObject        @ object was null
13193    .if     0
13194    add     r0, r9, r3                  @ r0<- address of field
13195    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
13196    .else
13197    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
13198    .endif
13199    FETCH(r2, 3)                        @ r2<- BBBB
13200    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13201    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13202    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13203    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
13204    GOTO_OPCODE(ip)                     @ jump to next instruction
13205
13206/* continuation for OP_IGET_OBJECT_JUMBO */
13207
13208    /*
13209     * Currently:
13210     *  r0 holds resolved field
13211     *  r9 holds object
13212     */
13213.LOP_IGET_OBJECT_JUMBO_resolved:
13214    cmp     r0, #0                      @ resolution unsuccessful?
13215    beq     common_exceptionThrown      @ yes, throw exception
13216    @ fall through to OP_IGET_OBJECT_JUMBO_finish
13217
13218    /*
13219     * Currently:
13220     *  r0 holds resolved field
13221     *  r9 holds object
13222     */
13223.LOP_IGET_OBJECT_JUMBO_finish:
13224    @bl      common_squeak0
13225    cmp     r9, #0                      @ check object for null
13226    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13227    beq     common_errNullObject        @ object was null
13228    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13229    @ no-op                             @ acquiring load
13230    FETCH(r2, 3)                        @ r2<- BBBB
13231    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13232    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13233    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13234    GOTO_OPCODE(ip)                     @ jump to next instruction
13235
13236/* continuation for OP_IGET_BOOLEAN_JUMBO */
13237
13238    /*
13239     * Currently:
13240     *  r0 holds resolved field
13241     *  r9 holds object
13242     */
13243.LOP_IGET_BOOLEAN_JUMBO_resolved:
13244    cmp     r0, #0                      @ resolution unsuccessful?
13245    beq     common_exceptionThrown      @ yes, throw exception
13246    @ fall through to OP_IGET_BOOLEAN_JUMBO_finish
13247
13248    /*
13249     * Currently:
13250     *  r0 holds resolved field
13251     *  r9 holds object
13252     */
13253.LOP_IGET_BOOLEAN_JUMBO_finish:
13254    @bl      common_squeak1
13255    cmp     r9, #0                      @ check object for null
13256    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13257    beq     common_errNullObject        @ object was null
13258    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13259    @ no-op                             @ acquiring load
13260    FETCH(r2, 3)                        @ r2<- BBBB
13261    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13262    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13263    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13264    GOTO_OPCODE(ip)                     @ jump to next instruction
13265
13266/* continuation for OP_IGET_BYTE_JUMBO */
13267
13268    /*
13269     * Currently:
13270     *  r0 holds resolved field
13271     *  r9 holds object
13272     */
13273.LOP_IGET_BYTE_JUMBO_resolved:
13274    cmp     r0, #0                      @ resolution unsuccessful?
13275    beq     common_exceptionThrown      @ yes, throw exception
13276    @ fall through to OP_IGET_BYTE_JUMBO_finish
13277
13278    /*
13279     * Currently:
13280     *  r0 holds resolved field
13281     *  r9 holds object
13282     */
13283.LOP_IGET_BYTE_JUMBO_finish:
13284    @bl      common_squeak2
13285    cmp     r9, #0                      @ check object for null
13286    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13287    beq     common_errNullObject        @ object was null
13288    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13289    @ no-op                             @ acquiring load
13290    FETCH(r2, 3)                        @ r2<- BBBB
13291    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13292    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13293    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13294    GOTO_OPCODE(ip)                     @ jump to next instruction
13295
13296/* continuation for OP_IGET_CHAR_JUMBO */
13297
13298    /*
13299     * Currently:
13300     *  r0 holds resolved field
13301     *  r9 holds object
13302     */
13303.LOP_IGET_CHAR_JUMBO_resolved:
13304    cmp     r0, #0                      @ resolution unsuccessful?
13305    beq     common_exceptionThrown      @ yes, throw exception
13306    @ fall through to OP_IGET_CHAR_JUMBO_finish
13307
13308    /*
13309     * Currently:
13310     *  r0 holds resolved field
13311     *  r9 holds object
13312     */
13313.LOP_IGET_CHAR_JUMBO_finish:
13314    @bl      common_squeak3
13315    cmp     r9, #0                      @ check object for null
13316    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13317    beq     common_errNullObject        @ object was null
13318    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13319    @ no-op                             @ acquiring load
13320    FETCH(r2, 3)                        @ r2<- BBBB
13321    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13322    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13323    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13324    GOTO_OPCODE(ip)                     @ jump to next instruction
13325
13326/* continuation for OP_IGET_SHORT_JUMBO */
13327
13328    /*
13329     * Currently:
13330     *  r0 holds resolved field
13331     *  r9 holds object
13332     */
13333.LOP_IGET_SHORT_JUMBO_resolved:
13334    cmp     r0, #0                      @ resolution unsuccessful?
13335    beq     common_exceptionThrown      @ yes, throw exception
13336    @ fall through to OP_IGET_SHORT_JUMBO_finish
13337
13338    /*
13339     * Currently:
13340     *  r0 holds resolved field
13341     *  r9 holds object
13342     */
13343.LOP_IGET_SHORT_JUMBO_finish:
13344    @bl      common_squeak4
13345    cmp     r9, #0                      @ check object for null
13346    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13347    beq     common_errNullObject        @ object was null
13348    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13349    @ no-op                             @ acquiring load
13350    FETCH(r2, 3)                        @ r2<- BBBB
13351    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13352    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13353    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13354    GOTO_OPCODE(ip)                     @ jump to next instruction
13355
13356/* continuation for OP_IPUT_JUMBO */
13357
13358    /*
13359     * Currently:
13360     *  r0 holds resolved field
13361     *  r9 holds object
13362     */
13363.LOP_IPUT_JUMBO_resolved:
13364     cmp     r0, #0                     @ resolution unsuccessful?
13365     beq     common_exceptionThrown     @ yes, throw exception
13366     @ fall through to OP_IPUT_JUMBO_finish
13367
13368    /*
13369     * Currently:
13370     *  r0 holds resolved field
13371     *  r9 holds object
13372     */
13373.LOP_IPUT_JUMBO_finish:
13374    @bl      common_squeak0
13375    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13376    FETCH(r1, 3)                        @ r1<- BBBB
13377    cmp     r9, #0                      @ check object for null
13378    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13379    beq     common_errNullObject        @ object was null
13380    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13381    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13382    @ no-op                             @ releasing store
13383    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13384    GOTO_OPCODE(ip)                     @ jump to next instruction
13385
13386/* continuation for OP_IPUT_WIDE_JUMBO */
13387
13388    /*
13389     * Currently:
13390     *  r0 holds resolved field
13391     *  r9 holds object
13392     */
13393.LOP_IPUT_WIDE_JUMBO_resolved:
13394     cmp     r0, #0                     @ resolution unsuccessful?
13395     beq     common_exceptionThrown     @ yes, throw exception
13396     @ fall through to OP_IPUT_WIDE_JUMBO_finish
13397
13398    /*
13399     * Currently:
13400     *  r0 holds resolved field
13401     *  r9 holds object
13402     */
13403.LOP_IPUT_WIDE_JUMBO_finish:
13404    cmp     r9, #0                      @ check object for null
13405    FETCH(r2, 3)                        @ r1<- BBBB
13406    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13407    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13408    beq     common_errNullObject        @ object was null
13409    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13410    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
13411    GET_INST_OPCODE(r10)                @ extract opcode from rINST
13412    .if     0
13413    add     r2, r9, r3                  @ r2<- target address
13414    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
13415    .else
13416    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
13417    .endif
13418    GOTO_OPCODE(r10)                    @ jump to next instruction
13419
13420/* continuation for OP_IPUT_OBJECT_JUMBO */
13421
13422    /*
13423     * Currently:
13424     *  r0 holds resolved field
13425     *  r9 holds object
13426     */
13427.LOP_IPUT_OBJECT_JUMBO_resolved:
13428     cmp     r0, #0                     @ resolution unsuccessful?
13429     beq     common_exceptionThrown     @ yes, throw exception
13430     @ fall through to OP_IPUT_OBJECT_JUMBO_finish
13431
13432    /*
13433     * Currently:
13434     *  r0 holds resolved field
13435     *  r9 holds object
13436     */
13437.LOP_IPUT_OBJECT_JUMBO_finish:
13438    @bl      common_squeak0
13439    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13440    FETCH(r1, 3)                        @ r1<- BBBB
13441    cmp     r9, #0                      @ check object for null
13442    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13443    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
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 (32 bits)<- r0
13449    cmp     r0, #0                      @ stored a null reference?
13450    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
13451    GOTO_OPCODE(ip)                     @ jump to next instruction
13452
13453/* continuation for OP_IPUT_BOOLEAN_JUMBO */
13454
13455    /*
13456     * Currently:
13457     *  r0 holds resolved field
13458     *  r9 holds object
13459     */
13460.LOP_IPUT_BOOLEAN_JUMBO_resolved:
13461     cmp     r0, #0                     @ resolution unsuccessful?
13462     beq     common_exceptionThrown     @ yes, throw exception
13463     @ fall through to OP_IPUT_BOOLEAN_JUMBO_finish
13464
13465    /*
13466     * Currently:
13467     *  r0 holds resolved field
13468     *  r9 holds object
13469     */
13470.LOP_IPUT_BOOLEAN_JUMBO_finish:
13471    @bl      common_squeak1
13472    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13473    FETCH(r1, 3)                        @ r1<- BBBB
13474    cmp     r9, #0                      @ check object for null
13475    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13476    beq     common_errNullObject        @ object was null
13477    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13478    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13479    @ no-op                             @ releasing store
13480    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13481    GOTO_OPCODE(ip)                     @ jump to next instruction
13482
13483/* continuation for OP_IPUT_BYTE_JUMBO */
13484
13485    /*
13486     * Currently:
13487     *  r0 holds resolved field
13488     *  r9 holds object
13489     */
13490.LOP_IPUT_BYTE_JUMBO_resolved:
13491     cmp     r0, #0                     @ resolution unsuccessful?
13492     beq     common_exceptionThrown     @ yes, throw exception
13493     @ fall through to OP_IPUT_BYTE_JUMBO_finish
13494
13495    /*
13496     * Currently:
13497     *  r0 holds resolved field
13498     *  r9 holds object
13499     */
13500.LOP_IPUT_BYTE_JUMBO_finish:
13501    @bl      common_squeak2
13502    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13503    FETCH(r1, 3)                        @ r1<- BBBB
13504    cmp     r9, #0                      @ check object for null
13505    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13506    beq     common_errNullObject        @ object was null
13507    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13508    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13509    @ no-op                             @ releasing store
13510    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13511    GOTO_OPCODE(ip)                     @ jump to next instruction
13512
13513/* continuation for OP_IPUT_CHAR_JUMBO */
13514
13515    /*
13516     * Currently:
13517     *  r0 holds resolved field
13518     *  r9 holds object
13519     */
13520.LOP_IPUT_CHAR_JUMBO_resolved:
13521     cmp     r0, #0                     @ resolution unsuccessful?
13522     beq     common_exceptionThrown     @ yes, throw exception
13523     @ fall through to OP_IPUT_CHAR_JUMBO_finish
13524
13525    /*
13526     * Currently:
13527     *  r0 holds resolved field
13528     *  r9 holds object
13529     */
13530.LOP_IPUT_CHAR_JUMBO_finish:
13531    @bl      common_squeak3
13532    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13533    FETCH(r1, 3)                        @ r1<- BBBB
13534    cmp     r9, #0                      @ check object for null
13535    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13536    beq     common_errNullObject        @ object was null
13537    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13538    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13539    @ no-op                             @ releasing store
13540    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13541    GOTO_OPCODE(ip)                     @ jump to next instruction
13542
13543/* continuation for OP_IPUT_SHORT_JUMBO */
13544
13545    /*
13546     * Currently:
13547     *  r0 holds resolved field
13548     *  r9 holds object
13549     */
13550.LOP_IPUT_SHORT_JUMBO_resolved:
13551     cmp     r0, #0                     @ resolution unsuccessful?
13552     beq     common_exceptionThrown     @ yes, throw exception
13553     @ fall through to OP_IPUT_SHORT_JUMBO_finish
13554
13555    /*
13556     * Currently:
13557     *  r0 holds resolved field
13558     *  r9 holds object
13559     */
13560.LOP_IPUT_SHORT_JUMBO_finish:
13561    @bl      common_squeak4
13562    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13563    FETCH(r1, 3)                        @ r1<- BBBB
13564    cmp     r9, #0                      @ check object for null
13565    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13566    beq     common_errNullObject        @ object was null
13567    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13568    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13569    @ no-op                             @ releasing store
13570    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13571    GOTO_OPCODE(ip)                     @ jump to next instruction
13572
13573/* continuation for OP_SGET_JUMBO */
13574
13575    /*
13576     * Continuation if the field has not yet been resolved.
13577     *  r1:  AAAAAAAA field ref
13578     *  r10: dvmDex->pResFields
13579     */
13580.LOP_SGET_JUMBO_resolve:
13581    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13582#if defined(WITH_JIT)
13583    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13584#endif
13585    EXPORT_PC()                         @ resolve() could throw, so export now
13586    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13587    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13588    cmp     r0, #0                      @ success?
13589    beq     common_exceptionThrown      @ no, handle exception
13590#if defined(WITH_JIT)
13591    /*
13592     * If the JIT is actively building a trace we need to make sure
13593     * that the field is fully resolved before including this instruction.
13594     */
13595    bl      common_verifyField
13596#endif
13597    b       .LOP_SGET_JUMBO_finish          @ resume
13598
13599/* continuation for OP_SGET_WIDE_JUMBO */
13600
13601    /*
13602     * Continuation if the field has not yet been resolved.
13603     *  r1: AAAAAAAA field ref
13604     *
13605     * Returns StaticField pointer in r0.
13606     */
13607.LOP_SGET_WIDE_JUMBO_resolve:
13608    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13609    EXPORT_PC()                         @ resolve() could throw, so export now
13610    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13611    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13612    cmp     r0, #0                      @ success?
13613    bne     .LOP_SGET_WIDE_JUMBO_finish          @ yes, finish
13614    b       common_exceptionThrown      @ no, handle exception
13615
13616/* continuation for OP_SGET_OBJECT_JUMBO */
13617
13618    /*
13619     * Continuation if the field has not yet been resolved.
13620     *  r1:  AAAAAAAA field ref
13621     *  r10: dvmDex->pResFields
13622     */
13623.LOP_SGET_OBJECT_JUMBO_resolve:
13624    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13625#if defined(WITH_JIT)
13626    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13627#endif
13628    EXPORT_PC()                         @ resolve() could throw, so export now
13629    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13630    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13631    cmp     r0, #0                      @ success?
13632    beq     common_exceptionThrown      @ no, handle exception
13633#if defined(WITH_JIT)
13634    /*
13635     * If the JIT is actively building a trace we need to make sure
13636     * that the field is fully resolved before including this instruction.
13637     */
13638    bl      common_verifyField
13639#endif
13640    b       .LOP_SGET_OBJECT_JUMBO_finish          @ resume
13641
13642/* continuation for OP_SGET_BOOLEAN_JUMBO */
13643
13644    /*
13645     * Continuation if the field has not yet been resolved.
13646     *  r1:  AAAAAAAA field ref
13647     *  r10: dvmDex->pResFields
13648     */
13649.LOP_SGET_BOOLEAN_JUMBO_resolve:
13650    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13651#if defined(WITH_JIT)
13652    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13653#endif
13654    EXPORT_PC()                         @ resolve() could throw, so export now
13655    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13656    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13657    cmp     r0, #0                      @ success?
13658    beq     common_exceptionThrown      @ no, handle exception
13659#if defined(WITH_JIT)
13660    /*
13661     * If the JIT is actively building a trace we need to make sure
13662     * that the field is fully resolved before including this instruction.
13663     */
13664    bl      common_verifyField
13665#endif
13666    b       .LOP_SGET_BOOLEAN_JUMBO_finish          @ resume
13667
13668/* continuation for OP_SGET_BYTE_JUMBO */
13669
13670    /*
13671     * Continuation if the field has not yet been resolved.
13672     *  r1:  AAAAAAAA field ref
13673     *  r10: dvmDex->pResFields
13674     */
13675.LOP_SGET_BYTE_JUMBO_resolve:
13676    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13677#if defined(WITH_JIT)
13678    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13679#endif
13680    EXPORT_PC()                         @ resolve() could throw, so export now
13681    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13682    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13683    cmp     r0, #0                      @ success?
13684    beq     common_exceptionThrown      @ no, handle exception
13685#if defined(WITH_JIT)
13686    /*
13687     * If the JIT is actively building a trace we need to make sure
13688     * that the field is fully resolved before including this instruction.
13689     */
13690    bl      common_verifyField
13691#endif
13692    b       .LOP_SGET_BYTE_JUMBO_finish          @ resume
13693
13694/* continuation for OP_SGET_CHAR_JUMBO */
13695
13696    /*
13697     * Continuation if the field has not yet been resolved.
13698     *  r1:  AAAAAAAA field ref
13699     *  r10: dvmDex->pResFields
13700     */
13701.LOP_SGET_CHAR_JUMBO_resolve:
13702    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13703#if defined(WITH_JIT)
13704    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13705#endif
13706    EXPORT_PC()                         @ resolve() could throw, so export now
13707    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13708    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13709    cmp     r0, #0                      @ success?
13710    beq     common_exceptionThrown      @ no, handle exception
13711#if defined(WITH_JIT)
13712    /*
13713     * If the JIT is actively building a trace we need to make sure
13714     * that the field is fully resolved before including this instruction.
13715     */
13716    bl      common_verifyField
13717#endif
13718    b       .LOP_SGET_CHAR_JUMBO_finish          @ resume
13719
13720/* continuation for OP_SGET_SHORT_JUMBO */
13721
13722    /*
13723     * Continuation if the field has not yet been resolved.
13724     *  r1:  AAAAAAAA field ref
13725     *  r10: dvmDex->pResFields
13726     */
13727.LOP_SGET_SHORT_JUMBO_resolve:
13728    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13729#if defined(WITH_JIT)
13730    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13731#endif
13732    EXPORT_PC()                         @ resolve() could throw, so export now
13733    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13734    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13735    cmp     r0, #0                      @ success?
13736    beq     common_exceptionThrown      @ no, handle exception
13737#if defined(WITH_JIT)
13738    /*
13739     * If the JIT is actively building a trace we need to make sure
13740     * that the field is fully resolved before including this instruction.
13741     */
13742    bl      common_verifyField
13743#endif
13744    b       .LOP_SGET_SHORT_JUMBO_finish          @ resume
13745
13746/* continuation for OP_SPUT_JUMBO */
13747
13748    /*
13749     * Continuation if the field has not yet been resolved.
13750     *  r1:  AAAAAAAA field ref
13751     *  r10: dvmDex->pResFields
13752     */
13753.LOP_SPUT_JUMBO_resolve:
13754    ldr     r2, [rSELF, #offThread_method]    @ r2<- 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_JUMBO_finish          @ resume
13771
13772/* continuation for OP_SPUT_WIDE_JUMBO */
13773
13774    /*
13775     * Continuation if the field has not yet been resolved.
13776     *  r1:  AAAAAAAA field ref
13777     *  r9:  &fp[BBBB]
13778     *  r10: dvmDex->pResFields
13779     *
13780     * Returns StaticField pointer in r2.
13781     */
13782.LOP_SPUT_WIDE_JUMBO_resolve:
13783    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13784#if defined(WITH_JIT)
13785    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13786#endif
13787    EXPORT_PC()                         @ resolve() could throw, so export now
13788    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13789    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13790    cmp     r0, #0                      @ success?
13791    mov     r2, r0                      @ copy to r2
13792    beq     common_exceptionThrown      @ no, handle exception
13793#if defined(WITH_JIT)
13794    /*
13795     * If the JIT is actively building a trace we need to make sure
13796     * that the field is fully resolved before including this instruction.
13797     */
13798    bl      common_verifyField
13799#endif
13800    b       .LOP_SPUT_WIDE_JUMBO_finish          @ resume
13801
13802/* continuation for OP_SPUT_OBJECT_JUMBO */
13803
13804
13805.LOP_SPUT_OBJECT_JUMBO_end:
13806    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
13807    cmp     r1, #0                      @ stored a null object?
13808    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
13809    GOTO_OPCODE(ip)                     @ jump to next instruction
13810
13811    /* Continuation if the field has not yet been resolved.
13812     * r1:  AAAAaaaa field ref
13813     * r10: dvmDex->pResFields
13814     */
13815.LOP_SPUT_OBJECT_JUMBO_resolve:
13816    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
13817#if defined(WITH_JIT)
13818    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13819#endif
13820    EXPORT_PC()                         @ resolve() could throw, so export now
13821    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13822    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13823    cmp     r0, #0                      @ success?
13824    beq     common_exceptionThrown      @ no, handle exception
13825#if defined(WITH_JIT)
13826    /*
13827     * If the JIT is actively building a trace we need to make sure
13828     * that the field is fully resolved before including this instruction.
13829     */
13830    bl      common_verifyField
13831#endif
13832    b       .LOP_SPUT_OBJECT_JUMBO_finish          @ resume
13833
13834
13835/* continuation for OP_SPUT_BOOLEAN_JUMBO */
13836
13837    /*
13838     * Continuation if the field has not yet been resolved.
13839     *  r1:  AAAAAAAA field ref
13840     *  r10: dvmDex->pResFields
13841     */
13842.LOP_SPUT_BOOLEAN_JUMBO_resolve:
13843    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13844#if defined(WITH_JIT)
13845    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13846#endif
13847    EXPORT_PC()                         @ resolve() could throw, so export now
13848    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13849    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13850    cmp     r0, #0                      @ success?
13851    beq     common_exceptionThrown      @ no, handle exception
13852#if defined(WITH_JIT)
13853    /*
13854     * If the JIT is actively building a trace we need to make sure
13855     * that the field is fully resolved before including this instruction.
13856     */
13857    bl      common_verifyField
13858#endif
13859    b       .LOP_SPUT_BOOLEAN_JUMBO_finish          @ resume
13860
13861/* continuation for OP_SPUT_BYTE_JUMBO */
13862
13863    /*
13864     * Continuation if the field has not yet been resolved.
13865     *  r1:  AAAAAAAA field ref
13866     *  r10: dvmDex->pResFields
13867     */
13868.LOP_SPUT_BYTE_JUMBO_resolve:
13869    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13870#if defined(WITH_JIT)
13871    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13872#endif
13873    EXPORT_PC()                         @ resolve() could throw, so export now
13874    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13875    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13876    cmp     r0, #0                      @ success?
13877    beq     common_exceptionThrown      @ no, handle exception
13878#if defined(WITH_JIT)
13879    /*
13880     * If the JIT is actively building a trace we need to make sure
13881     * that the field is fully resolved before including this instruction.
13882     */
13883    bl      common_verifyField
13884#endif
13885    b       .LOP_SPUT_BYTE_JUMBO_finish          @ resume
13886
13887/* continuation for OP_SPUT_CHAR_JUMBO */
13888
13889    /*
13890     * Continuation if the field has not yet been resolved.
13891     *  r1:  AAAAAAAA field ref
13892     *  r10: dvmDex->pResFields
13893     */
13894.LOP_SPUT_CHAR_JUMBO_resolve:
13895    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13896#if defined(WITH_JIT)
13897    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13898#endif
13899    EXPORT_PC()                         @ resolve() could throw, so export now
13900    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13901    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13902    cmp     r0, #0                      @ success?
13903    beq     common_exceptionThrown      @ no, handle exception
13904#if defined(WITH_JIT)
13905    /*
13906     * If the JIT is actively building a trace we need to make sure
13907     * that the field is fully resolved before including this instruction.
13908     */
13909    bl      common_verifyField
13910#endif
13911    b       .LOP_SPUT_CHAR_JUMBO_finish          @ resume
13912
13913/* continuation for OP_SPUT_SHORT_JUMBO */
13914
13915    /*
13916     * Continuation if the field has not yet been resolved.
13917     *  r1:  AAAAAAAA field ref
13918     *  r10: dvmDex->pResFields
13919     */
13920.LOP_SPUT_SHORT_JUMBO_resolve:
13921    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13922#if defined(WITH_JIT)
13923    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13924#endif
13925    EXPORT_PC()                         @ resolve() could throw, so export now
13926    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13927    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13928    cmp     r0, #0                      @ success?
13929    beq     common_exceptionThrown      @ no, handle exception
13930#if defined(WITH_JIT)
13931    /*
13932     * If the JIT is actively building a trace we need to make sure
13933     * that the field is fully resolved before including this instruction.
13934     */
13935    bl      common_verifyField
13936#endif
13937    b       .LOP_SPUT_SHORT_JUMBO_finish          @ resume
13938
13939/* continuation for OP_INVOKE_VIRTUAL_JUMBO */
13940
13941    /*
13942     * At this point:
13943     *  r0 = resolved base method
13944     */
13945.LOP_INVOKE_VIRTUAL_JUMBO_continue:
13946    FETCH(r10, 4)                       @ r10<- CCCC
13947    GET_VREG(r9, r10)                   @ r9<- "this" ptr
13948    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
13949    cmp     r9, #0                      @ is "this" null?
13950    beq     common_errNullObject        @ null "this", throw exception
13951    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
13952    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
13953    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
13954    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
13955
13956/* continuation for OP_INVOKE_SUPER_JUMBO */
13957
13958    /*
13959     * At this point:
13960     *  r0 = resolved base method
13961     *  r10 = method->clazz
13962     */
13963.LOP_INVOKE_SUPER_JUMBO_continue:
13964    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
13965    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
13966    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
13967    EXPORT_PC()                         @ must export for invoke
13968    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
13969    bcs     .LOP_INVOKE_SUPER_JUMBO_nsm             @ method not present in superclass
13970    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
13971    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
13972    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
13973
13974.LOP_INVOKE_SUPER_JUMBO_resolve:
13975    mov     r0, r10                     @ r0<- method->clazz
13976    mov     r2, #METHOD_VIRTUAL         @ resolver method type
13977    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
13978    cmp     r0, #0                      @ got null?
13979    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ no, continue
13980    b       common_exceptionThrown      @ yes, handle exception
13981
13982    /*
13983     * Throw a NoSuchMethodError with the method name as the message.
13984     *  r0 = resolved base method
13985     */
13986.LOP_INVOKE_SUPER_JUMBO_nsm:
13987    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
13988    b       common_errNoSuchMethod
13989
13990/* continuation for OP_INVOKE_DIRECT_JUMBO */
13991
13992    /*
13993     * On entry:
13994     *  r1 = reference (CCCC)
13995     *  r10 = "this" register
13996     */
13997.LOP_INVOKE_DIRECT_JUMBO_resolve:
13998    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13999    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
14000    mov     r2, #METHOD_DIRECT          @ resolver method type
14001    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14002    cmp     r0, #0                      @ got null?
14003    bne     .LOP_INVOKE_DIRECT_JUMBO_finish          @ no, continue
14004    b       common_exceptionThrown      @ yes, handle exception
14005
14006/* continuation for OP_INVOKE_STATIC_JUMBO */
14007
14008
14009.LOP_INVOKE_STATIC_JUMBO_resolve:
14010    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
14011    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
14012    mov     r2, #METHOD_STATIC          @ resolver method type
14013    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14014    cmp     r0, #0                      @ got null?
14015#if defined(WITH_JIT)
14016    /*
14017     * Check to see if we're actively building a trace.  If so,
14018     * we need to keep this instruction out of it.
14019     * r10: &resolved_methodToCall
14020     */
14021    ldrh    r2, [rSELF, #offThread_subMode]
14022    beq     common_exceptionThrown            @ null, handle exception
14023    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
14024    beq     common_invokeMethodJumboNoThis    @ no (r0=method, r9="this")
14025    ldr     r1, [r10]                         @ reload resolved method
14026    cmp     r1, #0                            @ finished resolving?
14027    bne     common_invokeMethodJumboNoThis    @ yes (r0=method, r9="this")
14028    mov     r10, r0                           @ preserve method
14029    mov     r0, rSELF
14030    mov     r1, rPC
14031    bl      dvmJitEndTraceSelect              @ (self, pc)
14032    mov     r0, r10
14033    b       common_invokeMethodJumboNoThis    @ whew, finally!
14034#else
14035    bne     common_invokeMethodJumboNoThis    @ (r0=method, r9="this")
14036    b       common_exceptionThrown            @ yes, handle exception
14037#endif
14038
14039/* continuation for OP_INVOKE_OBJECT_INIT_JUMBO */
14040
14041.LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal:
14042    EXPORT_PC()                         @ can throw
14043    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
14044    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
14045    cmp     r0, #0                      @ exception pending?
14046    bne     common_exceptionThrown      @ yes, handle it
14047    b       .LOP_INVOKE_OBJECT_INIT_JUMBO_finish
14048
14049    /*
14050     * A debugger is attached, so we need to go ahead and do
14051     * this.  For simplicity, we'll just jump directly to the
14052     * corresponding handler.  Note that we can't use
14053     * rIBASE here because it may be in single-step mode.
14054     * Load the primary table base directly.
14055     */
14056.LOP_INVOKE_OBJECT_INIT_JUMBO_debugger:
14057    ldr     r1, [rSELF, #offThread_mainHandlerTable]
14058    .if 1
14059    mov     ip, #OP_INVOKE_DIRECT_JUMBO
14060    .else
14061    mov     ip, #OP_INVOKE_DIRECT_RANGE
14062    .endif
14063    GOTO_OPCODE_BASE(r1,ip)             @ execute it
14064
14065/* continuation for OP_IGET_VOLATILE_JUMBO */
14066
14067    /*
14068     * Currently:
14069     *  r0 holds resolved field
14070     *  r9 holds object
14071     */
14072.LOP_IGET_VOLATILE_JUMBO_resolved:
14073    cmp     r0, #0                      @ resolution unsuccessful?
14074    beq     common_exceptionThrown      @ yes, throw exception
14075    @ fall through to OP_IGET_VOLATILE_JUMBO_finish
14076
14077    /*
14078     * Currently:
14079     *  r0 holds resolved field
14080     *  r9 holds object
14081     */
14082.LOP_IGET_VOLATILE_JUMBO_finish:
14083    @bl      common_squeak0
14084    cmp     r9, #0                      @ check object for null
14085    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14086    beq     common_errNullObject        @ object was null
14087    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14088    SMP_DMB                            @ acquiring load
14089    FETCH(r2, 3)                        @ r2<- BBBB
14090    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14091    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14092    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14093    GOTO_OPCODE(ip)                     @ jump to next instruction
14094
14095/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
14096
14097    /*
14098     * Currently:
14099     *  r0 holds resolved field
14100     *  r9 holds object
14101     */
14102.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
14103    cmp     r0, #0                      @ resolution unsuccessful?
14104    beq     common_exceptionThrown      @ yes, throw exception
14105    @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
14106
14107    /*
14108     * Currently:
14109     *  r0 holds resolved field
14110     *  r9 holds object
14111     */
14112.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
14113    cmp     r9, #0                      @ check object for null
14114    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14115    beq     common_errNullObject        @ object was null
14116    .if     1
14117    add     r0, r9, r3                  @ r0<- address of field
14118    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
14119    .else
14120    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
14121    .endif
14122    FETCH(r2, 3)                        @ r2<- BBBB
14123    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14124    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14125    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14126    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
14127    GOTO_OPCODE(ip)                     @ jump to next instruction
14128
14129/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
14130
14131    /*
14132     * Currently:
14133     *  r0 holds resolved field
14134     *  r9 holds object
14135     */
14136.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
14137    cmp     r0, #0                      @ resolution unsuccessful?
14138    beq     common_exceptionThrown      @ yes, throw exception
14139    @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
14140
14141    /*
14142     * Currently:
14143     *  r0 holds resolved field
14144     *  r9 holds object
14145     */
14146.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
14147    @bl      common_squeak0
14148    cmp     r9, #0                      @ check object for null
14149    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14150    beq     common_errNullObject        @ object was null
14151    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14152    SMP_DMB                            @ acquiring load
14153    FETCH(r2, 3)                        @ r2<- BBBB
14154    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14155    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14156    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14157    GOTO_OPCODE(ip)                     @ jump to next instruction
14158
14159/* continuation for OP_IPUT_VOLATILE_JUMBO */
14160
14161    /*
14162     * Currently:
14163     *  r0 holds resolved field
14164     *  r9 holds object
14165     */
14166.LOP_IPUT_VOLATILE_JUMBO_resolved:
14167     cmp     r0, #0                     @ resolution unsuccessful?
14168     beq     common_exceptionThrown     @ yes, throw exception
14169     @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
14170
14171    /*
14172     * Currently:
14173     *  r0 holds resolved field
14174     *  r9 holds object
14175     */
14176.LOP_IPUT_VOLATILE_JUMBO_finish:
14177    @bl      common_squeak0
14178    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14179    FETCH(r1, 3)                        @ r1<- BBBB
14180    cmp     r9, #0                      @ check object for null
14181    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14182    beq     common_errNullObject        @ object was null
14183    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14184    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14185    SMP_DMB                            @ releasing store
14186    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14187    GOTO_OPCODE(ip)                     @ jump to next instruction
14188
14189/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
14190
14191    /*
14192     * Currently:
14193     *  r0 holds resolved field
14194     *  r9 holds object
14195     */
14196.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
14197     cmp     r0, #0                     @ resolution unsuccessful?
14198     beq     common_exceptionThrown     @ yes, throw exception
14199     @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
14200
14201    /*
14202     * Currently:
14203     *  r0 holds resolved field
14204     *  r9 holds object
14205     */
14206.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
14207    cmp     r9, #0                      @ check object for null
14208    FETCH(r2, 3)                        @ r1<- BBBB
14209    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14210    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14211    beq     common_errNullObject        @ object was null
14212    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14213    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
14214    GET_INST_OPCODE(r10)                @ extract opcode from rINST
14215    .if     1
14216    add     r2, r9, r3                  @ r2<- target address
14217    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
14218    .else
14219    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
14220    .endif
14221    GOTO_OPCODE(r10)                    @ jump to next instruction
14222
14223/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
14224
14225    /*
14226     * Currently:
14227     *  r0 holds resolved field
14228     *  r9 holds object
14229     */
14230.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
14231     cmp     r0, #0                     @ resolution unsuccessful?
14232     beq     common_exceptionThrown     @ yes, throw exception
14233     @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
14234
14235    /*
14236     * Currently:
14237     *  r0 holds resolved field
14238     *  r9 holds object
14239     */
14240.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
14241    @bl      common_squeak0
14242    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14243    FETCH(r1, 3)                        @ r1<- BBBB
14244    cmp     r9, #0                      @ check object for null
14245    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14246    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
14247    beq     common_errNullObject        @ object was null
14248    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14249    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14250    SMP_DMB                            @ releasing store
14251    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
14252    cmp     r0, #0                      @ stored a null reference?
14253    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
14254    GOTO_OPCODE(ip)                     @ jump to next instruction
14255
14256/* continuation for OP_SGET_VOLATILE_JUMBO */
14257
14258    /*
14259     * Continuation if the field has not yet been resolved.
14260     *  r1:  AAAAAAAA field ref
14261     *  r10: dvmDex->pResFields
14262     */
14263.LOP_SGET_VOLATILE_JUMBO_resolve:
14264    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14265#if defined(WITH_JIT)
14266    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14267#endif
14268    EXPORT_PC()                         @ resolve() could throw, so export now
14269    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14270    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14271    cmp     r0, #0                      @ success?
14272    beq     common_exceptionThrown      @ no, handle exception
14273#if defined(WITH_JIT)
14274    /*
14275     * If the JIT is actively building a trace we need to make sure
14276     * that the field is fully resolved before including this instruction.
14277     */
14278    bl      common_verifyField
14279#endif
14280    b       .LOP_SGET_VOLATILE_JUMBO_finish          @ resume
14281
14282/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
14283
14284    /*
14285     * Continuation if the field has not yet been resolved.
14286     *  r1: AAAAAAAA field ref
14287     *
14288     * Returns StaticField pointer in r0.
14289     */
14290.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
14291    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14292    EXPORT_PC()                         @ resolve() could throw, so export now
14293    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14294    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14295    cmp     r0, #0                      @ success?
14296    bne     .LOP_SGET_WIDE_VOLATILE_JUMBO_finish          @ yes, finish
14297    b       common_exceptionThrown      @ no, handle exception
14298
14299/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
14300
14301    /*
14302     * Continuation if the field has not yet been resolved.
14303     *  r1:  AAAAAAAA field ref
14304     *  r10: dvmDex->pResFields
14305     */
14306.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
14307    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14308#if defined(WITH_JIT)
14309    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14310#endif
14311    EXPORT_PC()                         @ resolve() could throw, so export now
14312    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14313    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14314    cmp     r0, #0                      @ success?
14315    beq     common_exceptionThrown      @ no, handle exception
14316#if defined(WITH_JIT)
14317    /*
14318     * If the JIT is actively building a trace we need to make sure
14319     * that the field is fully resolved before including this instruction.
14320     */
14321    bl      common_verifyField
14322#endif
14323    b       .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish          @ resume
14324
14325/* continuation for OP_SPUT_VOLATILE_JUMBO */
14326
14327    /*
14328     * Continuation if the field has not yet been resolved.
14329     *  r1:  AAAAAAAA field ref
14330     *  r10: dvmDex->pResFields
14331     */
14332.LOP_SPUT_VOLATILE_JUMBO_resolve:
14333    ldr     r2, [rSELF, #offThread_method]    @ r2<- 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_VOLATILE_JUMBO_finish          @ resume
14350
14351/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
14352
14353    /*
14354     * Continuation if the field has not yet been resolved.
14355     *  r1:  AAAAAAAA field ref
14356     *  r9:  &fp[BBBB]
14357     *  r10: dvmDex->pResFields
14358     *
14359     * Returns StaticField pointer in r2.
14360     */
14361.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
14362    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14363#if defined(WITH_JIT)
14364    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14365#endif
14366    EXPORT_PC()                         @ resolve() could throw, so export now
14367    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14368    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14369    cmp     r0, #0                      @ success?
14370    mov     r2, r0                      @ copy to r2
14371    beq     common_exceptionThrown      @ no, handle exception
14372#if defined(WITH_JIT)
14373    /*
14374     * If the JIT is actively building a trace we need to make sure
14375     * that the field is fully resolved before including this instruction.
14376     */
14377    bl      common_verifyField
14378#endif
14379    b       .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish          @ resume
14380
14381/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
14382
14383
14384.LOP_SPUT_OBJECT_VOLATILE_JUMBO_end:
14385    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
14386    cmp     r1, #0                      @ stored a null object?
14387    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
14388    GOTO_OPCODE(ip)                     @ jump to next instruction
14389
14390    /* Continuation if the field has not yet been resolved.
14391     * r1:  AAAAaaaa field ref
14392     * r10: dvmDex->pResFields
14393     */
14394.LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve:
14395    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
14396#if defined(WITH_JIT)
14397    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14398#endif
14399    EXPORT_PC()                         @ resolve() could throw, so export now
14400    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14401    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14402    cmp     r0, #0                      @ success?
14403    beq     common_exceptionThrown      @ no, handle exception
14404#if defined(WITH_JIT)
14405    /*
14406     * If the JIT is actively building a trace we need to make sure
14407     * that the field is fully resolved before including this instruction.
14408     */
14409    bl      common_verifyField
14410#endif
14411    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish          @ resume
14412
14413
14414    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
14415    .global dvmAsmSisterEnd
14416dvmAsmSisterEnd:
14417
14418
14419    .global dvmAsmAltInstructionStart
14420    .type   dvmAsmAltInstructionStart, %function
14421    .text
14422
14423dvmAsmAltInstructionStart = .L_ALT_OP_NOP
14424/* ------------------------------ */
14425    .balign 64
14426.L_ALT_OP_NOP: /* 0x00 */
14427/* File: armv5te/alt_stub.S */
14428/*
14429 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14430 * any interesting requests and then jump to the real instruction
14431 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14432 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14433 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14434 * bail to the real handler if breakFlags==0.
14435 */
14436    ldrb   r3, [rSELF, #offThread_breakFlags]
14437    adrl   lr, dvmAsmInstructionStart + (0 * 64)
14438    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14439    cmp    r3, #0
14440    bxeq   lr                   @ nothing to do - jump to real handler
14441    EXPORT_PC()
14442    mov    r0, rPC              @ arg0
14443    mov    r1, rFP              @ arg1
14444    mov    r2, rSELF            @ arg2
14445    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14446
14447/* ------------------------------ */
14448    .balign 64
14449.L_ALT_OP_MOVE: /* 0x01 */
14450/* File: armv5te/alt_stub.S */
14451/*
14452 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14453 * any interesting requests and then jump to the real instruction
14454 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14455 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14456 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14457 * bail to the real handler if breakFlags==0.
14458 */
14459    ldrb   r3, [rSELF, #offThread_breakFlags]
14460    adrl   lr, dvmAsmInstructionStart + (1 * 64)
14461    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14462    cmp    r3, #0
14463    bxeq   lr                   @ nothing to do - jump to real handler
14464    EXPORT_PC()
14465    mov    r0, rPC              @ arg0
14466    mov    r1, rFP              @ arg1
14467    mov    r2, rSELF            @ arg2
14468    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14469
14470/* ------------------------------ */
14471    .balign 64
14472.L_ALT_OP_MOVE_FROM16: /* 0x02 */
14473/* File: armv5te/alt_stub.S */
14474/*
14475 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14476 * any interesting requests and then jump to the real instruction
14477 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14478 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14479 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14480 * bail to the real handler if breakFlags==0.
14481 */
14482    ldrb   r3, [rSELF, #offThread_breakFlags]
14483    adrl   lr, dvmAsmInstructionStart + (2 * 64)
14484    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14485    cmp    r3, #0
14486    bxeq   lr                   @ nothing to do - jump to real handler
14487    EXPORT_PC()
14488    mov    r0, rPC              @ arg0
14489    mov    r1, rFP              @ arg1
14490    mov    r2, rSELF            @ arg2
14491    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14492
14493/* ------------------------------ */
14494    .balign 64
14495.L_ALT_OP_MOVE_16: /* 0x03 */
14496/* File: armv5te/alt_stub.S */
14497/*
14498 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14499 * any interesting requests and then jump to the real instruction
14500 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14501 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14502 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14503 * bail to the real handler if breakFlags==0.
14504 */
14505    ldrb   r3, [rSELF, #offThread_breakFlags]
14506    adrl   lr, dvmAsmInstructionStart + (3 * 64)
14507    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14508    cmp    r3, #0
14509    bxeq   lr                   @ nothing to do - jump to real handler
14510    EXPORT_PC()
14511    mov    r0, rPC              @ arg0
14512    mov    r1, rFP              @ arg1
14513    mov    r2, rSELF            @ arg2
14514    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14515
14516/* ------------------------------ */
14517    .balign 64
14518.L_ALT_OP_MOVE_WIDE: /* 0x04 */
14519/* File: armv5te/alt_stub.S */
14520/*
14521 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14522 * any interesting requests and then jump to the real instruction
14523 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14524 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14525 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14526 * bail to the real handler if breakFlags==0.
14527 */
14528    ldrb   r3, [rSELF, #offThread_breakFlags]
14529    adrl   lr, dvmAsmInstructionStart + (4 * 64)
14530    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14531    cmp    r3, #0
14532    bxeq   lr                   @ nothing to do - jump to real handler
14533    EXPORT_PC()
14534    mov    r0, rPC              @ arg0
14535    mov    r1, rFP              @ arg1
14536    mov    r2, rSELF            @ arg2
14537    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14538
14539/* ------------------------------ */
14540    .balign 64
14541.L_ALT_OP_MOVE_WIDE_FROM16: /* 0x05 */
14542/* File: armv5te/alt_stub.S */
14543/*
14544 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14545 * any interesting requests and then jump to the real instruction
14546 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14547 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14548 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14549 * bail to the real handler if breakFlags==0.
14550 */
14551    ldrb   r3, [rSELF, #offThread_breakFlags]
14552    adrl   lr, dvmAsmInstructionStart + (5 * 64)
14553    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14554    cmp    r3, #0
14555    bxeq   lr                   @ nothing to do - jump to real handler
14556    EXPORT_PC()
14557    mov    r0, rPC              @ arg0
14558    mov    r1, rFP              @ arg1
14559    mov    r2, rSELF            @ arg2
14560    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14561
14562/* ------------------------------ */
14563    .balign 64
14564.L_ALT_OP_MOVE_WIDE_16: /* 0x06 */
14565/* File: armv5te/alt_stub.S */
14566/*
14567 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14568 * any interesting requests and then jump to the real instruction
14569 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14570 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14571 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14572 * bail to the real handler if breakFlags==0.
14573 */
14574    ldrb   r3, [rSELF, #offThread_breakFlags]
14575    adrl   lr, dvmAsmInstructionStart + (6 * 64)
14576    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14577    cmp    r3, #0
14578    bxeq   lr                   @ nothing to do - jump to real handler
14579    EXPORT_PC()
14580    mov    r0, rPC              @ arg0
14581    mov    r1, rFP              @ arg1
14582    mov    r2, rSELF            @ arg2
14583    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14584
14585/* ------------------------------ */
14586    .balign 64
14587.L_ALT_OP_MOVE_OBJECT: /* 0x07 */
14588/* File: armv5te/alt_stub.S */
14589/*
14590 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14591 * any interesting requests and then jump to the real instruction
14592 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14593 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14594 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14595 * bail to the real handler if breakFlags==0.
14596 */
14597    ldrb   r3, [rSELF, #offThread_breakFlags]
14598    adrl   lr, dvmAsmInstructionStart + (7 * 64)
14599    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14600    cmp    r3, #0
14601    bxeq   lr                   @ nothing to do - jump to real handler
14602    EXPORT_PC()
14603    mov    r0, rPC              @ arg0
14604    mov    r1, rFP              @ arg1
14605    mov    r2, rSELF            @ arg2
14606    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14607
14608/* ------------------------------ */
14609    .balign 64
14610.L_ALT_OP_MOVE_OBJECT_FROM16: /* 0x08 */
14611/* File: armv5te/alt_stub.S */
14612/*
14613 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14614 * any interesting requests and then jump to the real instruction
14615 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14616 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14617 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14618 * bail to the real handler if breakFlags==0.
14619 */
14620    ldrb   r3, [rSELF, #offThread_breakFlags]
14621    adrl   lr, dvmAsmInstructionStart + (8 * 64)
14622    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14623    cmp    r3, #0
14624    bxeq   lr                   @ nothing to do - jump to real handler
14625    EXPORT_PC()
14626    mov    r0, rPC              @ arg0
14627    mov    r1, rFP              @ arg1
14628    mov    r2, rSELF            @ arg2
14629    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14630
14631/* ------------------------------ */
14632    .balign 64
14633.L_ALT_OP_MOVE_OBJECT_16: /* 0x09 */
14634/* File: armv5te/alt_stub.S */
14635/*
14636 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14637 * any interesting requests and then jump to the real instruction
14638 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14639 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14640 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14641 * bail to the real handler if breakFlags==0.
14642 */
14643    ldrb   r3, [rSELF, #offThread_breakFlags]
14644    adrl   lr, dvmAsmInstructionStart + (9 * 64)
14645    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14646    cmp    r3, #0
14647    bxeq   lr                   @ nothing to do - jump to real handler
14648    EXPORT_PC()
14649    mov    r0, rPC              @ arg0
14650    mov    r1, rFP              @ arg1
14651    mov    r2, rSELF            @ arg2
14652    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14653
14654/* ------------------------------ */
14655    .balign 64
14656.L_ALT_OP_MOVE_RESULT: /* 0x0a */
14657/* File: armv5te/alt_stub.S */
14658/*
14659 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14660 * any interesting requests and then jump to the real instruction
14661 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14662 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14663 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14664 * bail to the real handler if breakFlags==0.
14665 */
14666    ldrb   r3, [rSELF, #offThread_breakFlags]
14667    adrl   lr, dvmAsmInstructionStart + (10 * 64)
14668    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14669    cmp    r3, #0
14670    bxeq   lr                   @ nothing to do - jump to real handler
14671    EXPORT_PC()
14672    mov    r0, rPC              @ arg0
14673    mov    r1, rFP              @ arg1
14674    mov    r2, rSELF            @ arg2
14675    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14676
14677/* ------------------------------ */
14678    .balign 64
14679.L_ALT_OP_MOVE_RESULT_WIDE: /* 0x0b */
14680/* File: armv5te/alt_stub.S */
14681/*
14682 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14683 * any interesting requests and then jump to the real instruction
14684 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14685 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14686 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14687 * bail to the real handler if breakFlags==0.
14688 */
14689    ldrb   r3, [rSELF, #offThread_breakFlags]
14690    adrl   lr, dvmAsmInstructionStart + (11 * 64)
14691    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14692    cmp    r3, #0
14693    bxeq   lr                   @ nothing to do - jump to real handler
14694    EXPORT_PC()
14695    mov    r0, rPC              @ arg0
14696    mov    r1, rFP              @ arg1
14697    mov    r2, rSELF            @ arg2
14698    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14699
14700/* ------------------------------ */
14701    .balign 64
14702.L_ALT_OP_MOVE_RESULT_OBJECT: /* 0x0c */
14703/* File: armv5te/alt_stub.S */
14704/*
14705 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14706 * any interesting requests and then jump to the real instruction
14707 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14708 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14709 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14710 * bail to the real handler if breakFlags==0.
14711 */
14712    ldrb   r3, [rSELF, #offThread_breakFlags]
14713    adrl   lr, dvmAsmInstructionStart + (12 * 64)
14714    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14715    cmp    r3, #0
14716    bxeq   lr                   @ nothing to do - jump to real handler
14717    EXPORT_PC()
14718    mov    r0, rPC              @ arg0
14719    mov    r1, rFP              @ arg1
14720    mov    r2, rSELF            @ arg2
14721    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14722
14723/* ------------------------------ */
14724    .balign 64
14725.L_ALT_OP_MOVE_EXCEPTION: /* 0x0d */
14726/* File: armv5te/alt_stub.S */
14727/*
14728 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14729 * any interesting requests and then jump to the real instruction
14730 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14731 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14732 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14733 * bail to the real handler if breakFlags==0.
14734 */
14735    ldrb   r3, [rSELF, #offThread_breakFlags]
14736    adrl   lr, dvmAsmInstructionStart + (13 * 64)
14737    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14738    cmp    r3, #0
14739    bxeq   lr                   @ nothing to do - jump to real handler
14740    EXPORT_PC()
14741    mov    r0, rPC              @ arg0
14742    mov    r1, rFP              @ arg1
14743    mov    r2, rSELF            @ arg2
14744    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14745
14746/* ------------------------------ */
14747    .balign 64
14748.L_ALT_OP_RETURN_VOID: /* 0x0e */
14749/* File: armv5te/alt_stub.S */
14750/*
14751 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14752 * any interesting requests and then jump to the real instruction
14753 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14754 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14755 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14756 * bail to the real handler if breakFlags==0.
14757 */
14758    ldrb   r3, [rSELF, #offThread_breakFlags]
14759    adrl   lr, dvmAsmInstructionStart + (14 * 64)
14760    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14761    cmp    r3, #0
14762    bxeq   lr                   @ nothing to do - jump to real handler
14763    EXPORT_PC()
14764    mov    r0, rPC              @ arg0
14765    mov    r1, rFP              @ arg1
14766    mov    r2, rSELF            @ arg2
14767    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14768
14769/* ------------------------------ */
14770    .balign 64
14771.L_ALT_OP_RETURN: /* 0x0f */
14772/* File: armv5te/alt_stub.S */
14773/*
14774 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14775 * any interesting requests and then jump to the real instruction
14776 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14777 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14778 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14779 * bail to the real handler if breakFlags==0.
14780 */
14781    ldrb   r3, [rSELF, #offThread_breakFlags]
14782    adrl   lr, dvmAsmInstructionStart + (15 * 64)
14783    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14784    cmp    r3, #0
14785    bxeq   lr                   @ nothing to do - jump to real handler
14786    EXPORT_PC()
14787    mov    r0, rPC              @ arg0
14788    mov    r1, rFP              @ arg1
14789    mov    r2, rSELF            @ arg2
14790    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14791
14792/* ------------------------------ */
14793    .balign 64
14794.L_ALT_OP_RETURN_WIDE: /* 0x10 */
14795/* File: armv5te/alt_stub.S */
14796/*
14797 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14798 * any interesting requests and then jump to the real instruction
14799 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14800 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14801 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14802 * bail to the real handler if breakFlags==0.
14803 */
14804    ldrb   r3, [rSELF, #offThread_breakFlags]
14805    adrl   lr, dvmAsmInstructionStart + (16 * 64)
14806    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14807    cmp    r3, #0
14808    bxeq   lr                   @ nothing to do - jump to real handler
14809    EXPORT_PC()
14810    mov    r0, rPC              @ arg0
14811    mov    r1, rFP              @ arg1
14812    mov    r2, rSELF            @ arg2
14813    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14814
14815/* ------------------------------ */
14816    .balign 64
14817.L_ALT_OP_RETURN_OBJECT: /* 0x11 */
14818/* File: armv5te/alt_stub.S */
14819/*
14820 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14821 * any interesting requests and then jump to the real instruction
14822 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14823 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14824 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14825 * bail to the real handler if breakFlags==0.
14826 */
14827    ldrb   r3, [rSELF, #offThread_breakFlags]
14828    adrl   lr, dvmAsmInstructionStart + (17 * 64)
14829    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14830    cmp    r3, #0
14831    bxeq   lr                   @ nothing to do - jump to real handler
14832    EXPORT_PC()
14833    mov    r0, rPC              @ arg0
14834    mov    r1, rFP              @ arg1
14835    mov    r2, rSELF            @ arg2
14836    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14837
14838/* ------------------------------ */
14839    .balign 64
14840.L_ALT_OP_CONST_4: /* 0x12 */
14841/* File: armv5te/alt_stub.S */
14842/*
14843 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14844 * any interesting requests and then jump to the real instruction
14845 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14846 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14847 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14848 * bail to the real handler if breakFlags==0.
14849 */
14850    ldrb   r3, [rSELF, #offThread_breakFlags]
14851    adrl   lr, dvmAsmInstructionStart + (18 * 64)
14852    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14853    cmp    r3, #0
14854    bxeq   lr                   @ nothing to do - jump to real handler
14855    EXPORT_PC()
14856    mov    r0, rPC              @ arg0
14857    mov    r1, rFP              @ arg1
14858    mov    r2, rSELF            @ arg2
14859    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14860
14861/* ------------------------------ */
14862    .balign 64
14863.L_ALT_OP_CONST_16: /* 0x13 */
14864/* File: armv5te/alt_stub.S */
14865/*
14866 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14867 * any interesting requests and then jump to the real instruction
14868 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14869 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14870 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14871 * bail to the real handler if breakFlags==0.
14872 */
14873    ldrb   r3, [rSELF, #offThread_breakFlags]
14874    adrl   lr, dvmAsmInstructionStart + (19 * 64)
14875    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14876    cmp    r3, #0
14877    bxeq   lr                   @ nothing to do - jump to real handler
14878    EXPORT_PC()
14879    mov    r0, rPC              @ arg0
14880    mov    r1, rFP              @ arg1
14881    mov    r2, rSELF            @ arg2
14882    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14883
14884/* ------------------------------ */
14885    .balign 64
14886.L_ALT_OP_CONST: /* 0x14 */
14887/* File: armv5te/alt_stub.S */
14888/*
14889 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14890 * any interesting requests and then jump to the real instruction
14891 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14892 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14893 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14894 * bail to the real handler if breakFlags==0.
14895 */
14896    ldrb   r3, [rSELF, #offThread_breakFlags]
14897    adrl   lr, dvmAsmInstructionStart + (20 * 64)
14898    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14899    cmp    r3, #0
14900    bxeq   lr                   @ nothing to do - jump to real handler
14901    EXPORT_PC()
14902    mov    r0, rPC              @ arg0
14903    mov    r1, rFP              @ arg1
14904    mov    r2, rSELF            @ arg2
14905    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14906
14907/* ------------------------------ */
14908    .balign 64
14909.L_ALT_OP_CONST_HIGH16: /* 0x15 */
14910/* File: armv5te/alt_stub.S */
14911/*
14912 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14913 * any interesting requests and then jump to the real instruction
14914 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14915 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14916 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14917 * bail to the real handler if breakFlags==0.
14918 */
14919    ldrb   r3, [rSELF, #offThread_breakFlags]
14920    adrl   lr, dvmAsmInstructionStart + (21 * 64)
14921    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14922    cmp    r3, #0
14923    bxeq   lr                   @ nothing to do - jump to real handler
14924    EXPORT_PC()
14925    mov    r0, rPC              @ arg0
14926    mov    r1, rFP              @ arg1
14927    mov    r2, rSELF            @ arg2
14928    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14929
14930/* ------------------------------ */
14931    .balign 64
14932.L_ALT_OP_CONST_WIDE_16: /* 0x16 */
14933/* File: armv5te/alt_stub.S */
14934/*
14935 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14936 * any interesting requests and then jump to the real instruction
14937 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14938 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14939 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14940 * bail to the real handler if breakFlags==0.
14941 */
14942    ldrb   r3, [rSELF, #offThread_breakFlags]
14943    adrl   lr, dvmAsmInstructionStart + (22 * 64)
14944    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14945    cmp    r3, #0
14946    bxeq   lr                   @ nothing to do - jump to real handler
14947    EXPORT_PC()
14948    mov    r0, rPC              @ arg0
14949    mov    r1, rFP              @ arg1
14950    mov    r2, rSELF            @ arg2
14951    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14952
14953/* ------------------------------ */
14954    .balign 64
14955.L_ALT_OP_CONST_WIDE_32: /* 0x17 */
14956/* File: armv5te/alt_stub.S */
14957/*
14958 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14959 * any interesting requests and then jump to the real instruction
14960 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14961 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14962 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14963 * bail to the real handler if breakFlags==0.
14964 */
14965    ldrb   r3, [rSELF, #offThread_breakFlags]
14966    adrl   lr, dvmAsmInstructionStart + (23 * 64)
14967    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14968    cmp    r3, #0
14969    bxeq   lr                   @ nothing to do - jump to real handler
14970    EXPORT_PC()
14971    mov    r0, rPC              @ arg0
14972    mov    r1, rFP              @ arg1
14973    mov    r2, rSELF            @ arg2
14974    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14975
14976/* ------------------------------ */
14977    .balign 64
14978.L_ALT_OP_CONST_WIDE: /* 0x18 */
14979/* File: armv5te/alt_stub.S */
14980/*
14981 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14982 * any interesting requests and then jump to the real instruction
14983 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14984 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14985 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14986 * bail to the real handler if breakFlags==0.
14987 */
14988    ldrb   r3, [rSELF, #offThread_breakFlags]
14989    adrl   lr, dvmAsmInstructionStart + (24 * 64)
14990    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14991    cmp    r3, #0
14992    bxeq   lr                   @ nothing to do - jump to real handler
14993    EXPORT_PC()
14994    mov    r0, rPC              @ arg0
14995    mov    r1, rFP              @ arg1
14996    mov    r2, rSELF            @ arg2
14997    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14998
14999/* ------------------------------ */
15000    .balign 64
15001.L_ALT_OP_CONST_WIDE_HIGH16: /* 0x19 */
15002/* File: armv5te/alt_stub.S */
15003/*
15004 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15005 * any interesting requests and then jump to the real instruction
15006 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15007 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15008 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15009 * bail to the real handler if breakFlags==0.
15010 */
15011    ldrb   r3, [rSELF, #offThread_breakFlags]
15012    adrl   lr, dvmAsmInstructionStart + (25 * 64)
15013    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15014    cmp    r3, #0
15015    bxeq   lr                   @ nothing to do - jump to real handler
15016    EXPORT_PC()
15017    mov    r0, rPC              @ arg0
15018    mov    r1, rFP              @ arg1
15019    mov    r2, rSELF            @ arg2
15020    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15021
15022/* ------------------------------ */
15023    .balign 64
15024.L_ALT_OP_CONST_STRING: /* 0x1a */
15025/* File: armv5te/alt_stub.S */
15026/*
15027 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15028 * any interesting requests and then jump to the real instruction
15029 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15030 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15031 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15032 * bail to the real handler if breakFlags==0.
15033 */
15034    ldrb   r3, [rSELF, #offThread_breakFlags]
15035    adrl   lr, dvmAsmInstructionStart + (26 * 64)
15036    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15037    cmp    r3, #0
15038    bxeq   lr                   @ nothing to do - jump to real handler
15039    EXPORT_PC()
15040    mov    r0, rPC              @ arg0
15041    mov    r1, rFP              @ arg1
15042    mov    r2, rSELF            @ arg2
15043    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15044
15045/* ------------------------------ */
15046    .balign 64
15047.L_ALT_OP_CONST_STRING_JUMBO: /* 0x1b */
15048/* File: armv5te/alt_stub.S */
15049/*
15050 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15051 * any interesting requests and then jump to the real instruction
15052 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15053 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15054 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15055 * bail to the real handler if breakFlags==0.
15056 */
15057    ldrb   r3, [rSELF, #offThread_breakFlags]
15058    adrl   lr, dvmAsmInstructionStart + (27 * 64)
15059    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15060    cmp    r3, #0
15061    bxeq   lr                   @ nothing to do - jump to real handler
15062    EXPORT_PC()
15063    mov    r0, rPC              @ arg0
15064    mov    r1, rFP              @ arg1
15065    mov    r2, rSELF            @ arg2
15066    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15067
15068/* ------------------------------ */
15069    .balign 64
15070.L_ALT_OP_CONST_CLASS: /* 0x1c */
15071/* File: armv5te/alt_stub.S */
15072/*
15073 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15074 * any interesting requests and then jump to the real instruction
15075 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15076 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15077 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15078 * bail to the real handler if breakFlags==0.
15079 */
15080    ldrb   r3, [rSELF, #offThread_breakFlags]
15081    adrl   lr, dvmAsmInstructionStart + (28 * 64)
15082    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15083    cmp    r3, #0
15084    bxeq   lr                   @ nothing to do - jump to real handler
15085    EXPORT_PC()
15086    mov    r0, rPC              @ arg0
15087    mov    r1, rFP              @ arg1
15088    mov    r2, rSELF            @ arg2
15089    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15090
15091/* ------------------------------ */
15092    .balign 64
15093.L_ALT_OP_MONITOR_ENTER: /* 0x1d */
15094/* File: armv5te/alt_stub.S */
15095/*
15096 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15097 * any interesting requests and then jump to the real instruction
15098 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15099 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15100 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15101 * bail to the real handler if breakFlags==0.
15102 */
15103    ldrb   r3, [rSELF, #offThread_breakFlags]
15104    adrl   lr, dvmAsmInstructionStart + (29 * 64)
15105    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15106    cmp    r3, #0
15107    bxeq   lr                   @ nothing to do - jump to real handler
15108    EXPORT_PC()
15109    mov    r0, rPC              @ arg0
15110    mov    r1, rFP              @ arg1
15111    mov    r2, rSELF            @ arg2
15112    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15113
15114/* ------------------------------ */
15115    .balign 64
15116.L_ALT_OP_MONITOR_EXIT: /* 0x1e */
15117/* File: armv5te/alt_stub.S */
15118/*
15119 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15120 * any interesting requests and then jump to the real instruction
15121 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15122 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15123 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15124 * bail to the real handler if breakFlags==0.
15125 */
15126    ldrb   r3, [rSELF, #offThread_breakFlags]
15127    adrl   lr, dvmAsmInstructionStart + (30 * 64)
15128    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15129    cmp    r3, #0
15130    bxeq   lr                   @ nothing to do - jump to real handler
15131    EXPORT_PC()
15132    mov    r0, rPC              @ arg0
15133    mov    r1, rFP              @ arg1
15134    mov    r2, rSELF            @ arg2
15135    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15136
15137/* ------------------------------ */
15138    .balign 64
15139.L_ALT_OP_CHECK_CAST: /* 0x1f */
15140/* File: armv5te/alt_stub.S */
15141/*
15142 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15143 * any interesting requests and then jump to the real instruction
15144 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15145 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15146 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15147 * bail to the real handler if breakFlags==0.
15148 */
15149    ldrb   r3, [rSELF, #offThread_breakFlags]
15150    adrl   lr, dvmAsmInstructionStart + (31 * 64)
15151    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15152    cmp    r3, #0
15153    bxeq   lr                   @ nothing to do - jump to real handler
15154    EXPORT_PC()
15155    mov    r0, rPC              @ arg0
15156    mov    r1, rFP              @ arg1
15157    mov    r2, rSELF            @ arg2
15158    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15159
15160/* ------------------------------ */
15161    .balign 64
15162.L_ALT_OP_INSTANCE_OF: /* 0x20 */
15163/* File: armv5te/alt_stub.S */
15164/*
15165 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15166 * any interesting requests and then jump to the real instruction
15167 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15168 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15169 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15170 * bail to the real handler if breakFlags==0.
15171 */
15172    ldrb   r3, [rSELF, #offThread_breakFlags]
15173    adrl   lr, dvmAsmInstructionStart + (32 * 64)
15174    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15175    cmp    r3, #0
15176    bxeq   lr                   @ nothing to do - jump to real handler
15177    EXPORT_PC()
15178    mov    r0, rPC              @ arg0
15179    mov    r1, rFP              @ arg1
15180    mov    r2, rSELF            @ arg2
15181    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15182
15183/* ------------------------------ */
15184    .balign 64
15185.L_ALT_OP_ARRAY_LENGTH: /* 0x21 */
15186/* File: armv5te/alt_stub.S */
15187/*
15188 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15189 * any interesting requests and then jump to the real instruction
15190 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15191 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15192 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15193 * bail to the real handler if breakFlags==0.
15194 */
15195    ldrb   r3, [rSELF, #offThread_breakFlags]
15196    adrl   lr, dvmAsmInstructionStart + (33 * 64)
15197    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15198    cmp    r3, #0
15199    bxeq   lr                   @ nothing to do - jump to real handler
15200    EXPORT_PC()
15201    mov    r0, rPC              @ arg0
15202    mov    r1, rFP              @ arg1
15203    mov    r2, rSELF            @ arg2
15204    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15205
15206/* ------------------------------ */
15207    .balign 64
15208.L_ALT_OP_NEW_INSTANCE: /* 0x22 */
15209/* File: armv5te/alt_stub.S */
15210/*
15211 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15212 * any interesting requests and then jump to the real instruction
15213 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15214 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15215 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15216 * bail to the real handler if breakFlags==0.
15217 */
15218    ldrb   r3, [rSELF, #offThread_breakFlags]
15219    adrl   lr, dvmAsmInstructionStart + (34 * 64)
15220    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15221    cmp    r3, #0
15222    bxeq   lr                   @ nothing to do - jump to real handler
15223    EXPORT_PC()
15224    mov    r0, rPC              @ arg0
15225    mov    r1, rFP              @ arg1
15226    mov    r2, rSELF            @ arg2
15227    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15228
15229/* ------------------------------ */
15230    .balign 64
15231.L_ALT_OP_NEW_ARRAY: /* 0x23 */
15232/* File: armv5te/alt_stub.S */
15233/*
15234 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15235 * any interesting requests and then jump to the real instruction
15236 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15237 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15238 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15239 * bail to the real handler if breakFlags==0.
15240 */
15241    ldrb   r3, [rSELF, #offThread_breakFlags]
15242    adrl   lr, dvmAsmInstructionStart + (35 * 64)
15243    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15244    cmp    r3, #0
15245    bxeq   lr                   @ nothing to do - jump to real handler
15246    EXPORT_PC()
15247    mov    r0, rPC              @ arg0
15248    mov    r1, rFP              @ arg1
15249    mov    r2, rSELF            @ arg2
15250    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15251
15252/* ------------------------------ */
15253    .balign 64
15254.L_ALT_OP_FILLED_NEW_ARRAY: /* 0x24 */
15255/* File: armv5te/alt_stub.S */
15256/*
15257 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15258 * any interesting requests and then jump to the real instruction
15259 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15260 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15261 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15262 * bail to the real handler if breakFlags==0.
15263 */
15264    ldrb   r3, [rSELF, #offThread_breakFlags]
15265    adrl   lr, dvmAsmInstructionStart + (36 * 64)
15266    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15267    cmp    r3, #0
15268    bxeq   lr                   @ nothing to do - jump to real handler
15269    EXPORT_PC()
15270    mov    r0, rPC              @ arg0
15271    mov    r1, rFP              @ arg1
15272    mov    r2, rSELF            @ arg2
15273    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15274
15275/* ------------------------------ */
15276    .balign 64
15277.L_ALT_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
15278/* File: armv5te/alt_stub.S */
15279/*
15280 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15281 * any interesting requests and then jump to the real instruction
15282 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15283 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15284 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15285 * bail to the real handler if breakFlags==0.
15286 */
15287    ldrb   r3, [rSELF, #offThread_breakFlags]
15288    adrl   lr, dvmAsmInstructionStart + (37 * 64)
15289    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15290    cmp    r3, #0
15291    bxeq   lr                   @ nothing to do - jump to real handler
15292    EXPORT_PC()
15293    mov    r0, rPC              @ arg0
15294    mov    r1, rFP              @ arg1
15295    mov    r2, rSELF            @ arg2
15296    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15297
15298/* ------------------------------ */
15299    .balign 64
15300.L_ALT_OP_FILL_ARRAY_DATA: /* 0x26 */
15301/* File: armv5te/alt_stub.S */
15302/*
15303 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15304 * any interesting requests and then jump to the real instruction
15305 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15306 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15307 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15308 * bail to the real handler if breakFlags==0.
15309 */
15310    ldrb   r3, [rSELF, #offThread_breakFlags]
15311    adrl   lr, dvmAsmInstructionStart + (38 * 64)
15312    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15313    cmp    r3, #0
15314    bxeq   lr                   @ nothing to do - jump to real handler
15315    EXPORT_PC()
15316    mov    r0, rPC              @ arg0
15317    mov    r1, rFP              @ arg1
15318    mov    r2, rSELF            @ arg2
15319    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15320
15321/* ------------------------------ */
15322    .balign 64
15323.L_ALT_OP_THROW: /* 0x27 */
15324/* File: armv5te/alt_stub.S */
15325/*
15326 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15327 * any interesting requests and then jump to the real instruction
15328 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15329 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15330 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15331 * bail to the real handler if breakFlags==0.
15332 */
15333    ldrb   r3, [rSELF, #offThread_breakFlags]
15334    adrl   lr, dvmAsmInstructionStart + (39 * 64)
15335    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15336    cmp    r3, #0
15337    bxeq   lr                   @ nothing to do - jump to real handler
15338    EXPORT_PC()
15339    mov    r0, rPC              @ arg0
15340    mov    r1, rFP              @ arg1
15341    mov    r2, rSELF            @ arg2
15342    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15343
15344/* ------------------------------ */
15345    .balign 64
15346.L_ALT_OP_GOTO: /* 0x28 */
15347/* File: armv5te/alt_stub.S */
15348/*
15349 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15350 * any interesting requests and then jump to the real instruction
15351 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15352 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15353 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15354 * bail to the real handler if breakFlags==0.
15355 */
15356    ldrb   r3, [rSELF, #offThread_breakFlags]
15357    adrl   lr, dvmAsmInstructionStart + (40 * 64)
15358    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15359    cmp    r3, #0
15360    bxeq   lr                   @ nothing to do - jump to real handler
15361    EXPORT_PC()
15362    mov    r0, rPC              @ arg0
15363    mov    r1, rFP              @ arg1
15364    mov    r2, rSELF            @ arg2
15365    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15366
15367/* ------------------------------ */
15368    .balign 64
15369.L_ALT_OP_GOTO_16: /* 0x29 */
15370/* File: armv5te/alt_stub.S */
15371/*
15372 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15373 * any interesting requests and then jump to the real instruction
15374 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15375 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15376 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15377 * bail to the real handler if breakFlags==0.
15378 */
15379    ldrb   r3, [rSELF, #offThread_breakFlags]
15380    adrl   lr, dvmAsmInstructionStart + (41 * 64)
15381    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15382    cmp    r3, #0
15383    bxeq   lr                   @ nothing to do - jump to real handler
15384    EXPORT_PC()
15385    mov    r0, rPC              @ arg0
15386    mov    r1, rFP              @ arg1
15387    mov    r2, rSELF            @ arg2
15388    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15389
15390/* ------------------------------ */
15391    .balign 64
15392.L_ALT_OP_GOTO_32: /* 0x2a */
15393/* File: armv5te/alt_stub.S */
15394/*
15395 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15396 * any interesting requests and then jump to the real instruction
15397 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15398 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15399 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15400 * bail to the real handler if breakFlags==0.
15401 */
15402    ldrb   r3, [rSELF, #offThread_breakFlags]
15403    adrl   lr, dvmAsmInstructionStart + (42 * 64)
15404    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15405    cmp    r3, #0
15406    bxeq   lr                   @ nothing to do - jump to real handler
15407    EXPORT_PC()
15408    mov    r0, rPC              @ arg0
15409    mov    r1, rFP              @ arg1
15410    mov    r2, rSELF            @ arg2
15411    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15412
15413/* ------------------------------ */
15414    .balign 64
15415.L_ALT_OP_PACKED_SWITCH: /* 0x2b */
15416/* File: armv5te/alt_stub.S */
15417/*
15418 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15419 * any interesting requests and then jump to the real instruction
15420 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15421 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15422 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15423 * bail to the real handler if breakFlags==0.
15424 */
15425    ldrb   r3, [rSELF, #offThread_breakFlags]
15426    adrl   lr, dvmAsmInstructionStart + (43 * 64)
15427    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15428    cmp    r3, #0
15429    bxeq   lr                   @ nothing to do - jump to real handler
15430    EXPORT_PC()
15431    mov    r0, rPC              @ arg0
15432    mov    r1, rFP              @ arg1
15433    mov    r2, rSELF            @ arg2
15434    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15435
15436/* ------------------------------ */
15437    .balign 64
15438.L_ALT_OP_SPARSE_SWITCH: /* 0x2c */
15439/* File: armv5te/alt_stub.S */
15440/*
15441 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15442 * any interesting requests and then jump to the real instruction
15443 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15444 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15445 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15446 * bail to the real handler if breakFlags==0.
15447 */
15448    ldrb   r3, [rSELF, #offThread_breakFlags]
15449    adrl   lr, dvmAsmInstructionStart + (44 * 64)
15450    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15451    cmp    r3, #0
15452    bxeq   lr                   @ nothing to do - jump to real handler
15453    EXPORT_PC()
15454    mov    r0, rPC              @ arg0
15455    mov    r1, rFP              @ arg1
15456    mov    r2, rSELF            @ arg2
15457    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15458
15459/* ------------------------------ */
15460    .balign 64
15461.L_ALT_OP_CMPL_FLOAT: /* 0x2d */
15462/* File: armv5te/alt_stub.S */
15463/*
15464 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15465 * any interesting requests and then jump to the real instruction
15466 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15467 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15468 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15469 * bail to the real handler if breakFlags==0.
15470 */
15471    ldrb   r3, [rSELF, #offThread_breakFlags]
15472    adrl   lr, dvmAsmInstructionStart + (45 * 64)
15473    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15474    cmp    r3, #0
15475    bxeq   lr                   @ nothing to do - jump to real handler
15476    EXPORT_PC()
15477    mov    r0, rPC              @ arg0
15478    mov    r1, rFP              @ arg1
15479    mov    r2, rSELF            @ arg2
15480    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15481
15482/* ------------------------------ */
15483    .balign 64
15484.L_ALT_OP_CMPG_FLOAT: /* 0x2e */
15485/* File: armv5te/alt_stub.S */
15486/*
15487 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15488 * any interesting requests and then jump to the real instruction
15489 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15490 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15491 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15492 * bail to the real handler if breakFlags==0.
15493 */
15494    ldrb   r3, [rSELF, #offThread_breakFlags]
15495    adrl   lr, dvmAsmInstructionStart + (46 * 64)
15496    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15497    cmp    r3, #0
15498    bxeq   lr                   @ nothing to do - jump to real handler
15499    EXPORT_PC()
15500    mov    r0, rPC              @ arg0
15501    mov    r1, rFP              @ arg1
15502    mov    r2, rSELF            @ arg2
15503    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15504
15505/* ------------------------------ */
15506    .balign 64
15507.L_ALT_OP_CMPL_DOUBLE: /* 0x2f */
15508/* File: armv5te/alt_stub.S */
15509/*
15510 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15511 * any interesting requests and then jump to the real instruction
15512 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15513 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15514 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15515 * bail to the real handler if breakFlags==0.
15516 */
15517    ldrb   r3, [rSELF, #offThread_breakFlags]
15518    adrl   lr, dvmAsmInstructionStart + (47 * 64)
15519    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15520    cmp    r3, #0
15521    bxeq   lr                   @ nothing to do - jump to real handler
15522    EXPORT_PC()
15523    mov    r0, rPC              @ arg0
15524    mov    r1, rFP              @ arg1
15525    mov    r2, rSELF            @ arg2
15526    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15527
15528/* ------------------------------ */
15529    .balign 64
15530.L_ALT_OP_CMPG_DOUBLE: /* 0x30 */
15531/* File: armv5te/alt_stub.S */
15532/*
15533 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15534 * any interesting requests and then jump to the real instruction
15535 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15536 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15537 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15538 * bail to the real handler if breakFlags==0.
15539 */
15540    ldrb   r3, [rSELF, #offThread_breakFlags]
15541    adrl   lr, dvmAsmInstructionStart + (48 * 64)
15542    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15543    cmp    r3, #0
15544    bxeq   lr                   @ nothing to do - jump to real handler
15545    EXPORT_PC()
15546    mov    r0, rPC              @ arg0
15547    mov    r1, rFP              @ arg1
15548    mov    r2, rSELF            @ arg2
15549    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15550
15551/* ------------------------------ */
15552    .balign 64
15553.L_ALT_OP_CMP_LONG: /* 0x31 */
15554/* File: armv5te/alt_stub.S */
15555/*
15556 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15557 * any interesting requests and then jump to the real instruction
15558 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15559 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15560 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15561 * bail to the real handler if breakFlags==0.
15562 */
15563    ldrb   r3, [rSELF, #offThread_breakFlags]
15564    adrl   lr, dvmAsmInstructionStart + (49 * 64)
15565    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15566    cmp    r3, #0
15567    bxeq   lr                   @ nothing to do - jump to real handler
15568    EXPORT_PC()
15569    mov    r0, rPC              @ arg0
15570    mov    r1, rFP              @ arg1
15571    mov    r2, rSELF            @ arg2
15572    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15573
15574/* ------------------------------ */
15575    .balign 64
15576.L_ALT_OP_IF_EQ: /* 0x32 */
15577/* File: armv5te/alt_stub.S */
15578/*
15579 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15580 * any interesting requests and then jump to the real instruction
15581 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15582 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15583 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15584 * bail to the real handler if breakFlags==0.
15585 */
15586    ldrb   r3, [rSELF, #offThread_breakFlags]
15587    adrl   lr, dvmAsmInstructionStart + (50 * 64)
15588    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15589    cmp    r3, #0
15590    bxeq   lr                   @ nothing to do - jump to real handler
15591    EXPORT_PC()
15592    mov    r0, rPC              @ arg0
15593    mov    r1, rFP              @ arg1
15594    mov    r2, rSELF            @ arg2
15595    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15596
15597/* ------------------------------ */
15598    .balign 64
15599.L_ALT_OP_IF_NE: /* 0x33 */
15600/* File: armv5te/alt_stub.S */
15601/*
15602 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15603 * any interesting requests and then jump to the real instruction
15604 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15605 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15606 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15607 * bail to the real handler if breakFlags==0.
15608 */
15609    ldrb   r3, [rSELF, #offThread_breakFlags]
15610    adrl   lr, dvmAsmInstructionStart + (51 * 64)
15611    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15612    cmp    r3, #0
15613    bxeq   lr                   @ nothing to do - jump to real handler
15614    EXPORT_PC()
15615    mov    r0, rPC              @ arg0
15616    mov    r1, rFP              @ arg1
15617    mov    r2, rSELF            @ arg2
15618    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15619
15620/* ------------------------------ */
15621    .balign 64
15622.L_ALT_OP_IF_LT: /* 0x34 */
15623/* File: armv5te/alt_stub.S */
15624/*
15625 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15626 * any interesting requests and then jump to the real instruction
15627 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15628 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15629 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15630 * bail to the real handler if breakFlags==0.
15631 */
15632    ldrb   r3, [rSELF, #offThread_breakFlags]
15633    adrl   lr, dvmAsmInstructionStart + (52 * 64)
15634    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15635    cmp    r3, #0
15636    bxeq   lr                   @ nothing to do - jump to real handler
15637    EXPORT_PC()
15638    mov    r0, rPC              @ arg0
15639    mov    r1, rFP              @ arg1
15640    mov    r2, rSELF            @ arg2
15641    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15642
15643/* ------------------------------ */
15644    .balign 64
15645.L_ALT_OP_IF_GE: /* 0x35 */
15646/* File: armv5te/alt_stub.S */
15647/*
15648 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15649 * any interesting requests and then jump to the real instruction
15650 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15651 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15652 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15653 * bail to the real handler if breakFlags==0.
15654 */
15655    ldrb   r3, [rSELF, #offThread_breakFlags]
15656    adrl   lr, dvmAsmInstructionStart + (53 * 64)
15657    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15658    cmp    r3, #0
15659    bxeq   lr                   @ nothing to do - jump to real handler
15660    EXPORT_PC()
15661    mov    r0, rPC              @ arg0
15662    mov    r1, rFP              @ arg1
15663    mov    r2, rSELF            @ arg2
15664    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15665
15666/* ------------------------------ */
15667    .balign 64
15668.L_ALT_OP_IF_GT: /* 0x36 */
15669/* File: armv5te/alt_stub.S */
15670/*
15671 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15672 * any interesting requests and then jump to the real instruction
15673 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15674 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15675 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15676 * bail to the real handler if breakFlags==0.
15677 */
15678    ldrb   r3, [rSELF, #offThread_breakFlags]
15679    adrl   lr, dvmAsmInstructionStart + (54 * 64)
15680    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15681    cmp    r3, #0
15682    bxeq   lr                   @ nothing to do - jump to real handler
15683    EXPORT_PC()
15684    mov    r0, rPC              @ arg0
15685    mov    r1, rFP              @ arg1
15686    mov    r2, rSELF            @ arg2
15687    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15688
15689/* ------------------------------ */
15690    .balign 64
15691.L_ALT_OP_IF_LE: /* 0x37 */
15692/* File: armv5te/alt_stub.S */
15693/*
15694 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15695 * any interesting requests and then jump to the real instruction
15696 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15697 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15698 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15699 * bail to the real handler if breakFlags==0.
15700 */
15701    ldrb   r3, [rSELF, #offThread_breakFlags]
15702    adrl   lr, dvmAsmInstructionStart + (55 * 64)
15703    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15704    cmp    r3, #0
15705    bxeq   lr                   @ nothing to do - jump to real handler
15706    EXPORT_PC()
15707    mov    r0, rPC              @ arg0
15708    mov    r1, rFP              @ arg1
15709    mov    r2, rSELF            @ arg2
15710    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15711
15712/* ------------------------------ */
15713    .balign 64
15714.L_ALT_OP_IF_EQZ: /* 0x38 */
15715/* File: armv5te/alt_stub.S */
15716/*
15717 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15718 * any interesting requests and then jump to the real instruction
15719 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15720 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15721 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15722 * bail to the real handler if breakFlags==0.
15723 */
15724    ldrb   r3, [rSELF, #offThread_breakFlags]
15725    adrl   lr, dvmAsmInstructionStart + (56 * 64)
15726    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15727    cmp    r3, #0
15728    bxeq   lr                   @ nothing to do - jump to real handler
15729    EXPORT_PC()
15730    mov    r0, rPC              @ arg0
15731    mov    r1, rFP              @ arg1
15732    mov    r2, rSELF            @ arg2
15733    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15734
15735/* ------------------------------ */
15736    .balign 64
15737.L_ALT_OP_IF_NEZ: /* 0x39 */
15738/* File: armv5te/alt_stub.S */
15739/*
15740 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15741 * any interesting requests and then jump to the real instruction
15742 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15743 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15744 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15745 * bail to the real handler if breakFlags==0.
15746 */
15747    ldrb   r3, [rSELF, #offThread_breakFlags]
15748    adrl   lr, dvmAsmInstructionStart + (57 * 64)
15749    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15750    cmp    r3, #0
15751    bxeq   lr                   @ nothing to do - jump to real handler
15752    EXPORT_PC()
15753    mov    r0, rPC              @ arg0
15754    mov    r1, rFP              @ arg1
15755    mov    r2, rSELF            @ arg2
15756    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15757
15758/* ------------------------------ */
15759    .balign 64
15760.L_ALT_OP_IF_LTZ: /* 0x3a */
15761/* File: armv5te/alt_stub.S */
15762/*
15763 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15764 * any interesting requests and then jump to the real instruction
15765 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15766 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15767 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15768 * bail to the real handler if breakFlags==0.
15769 */
15770    ldrb   r3, [rSELF, #offThread_breakFlags]
15771    adrl   lr, dvmAsmInstructionStart + (58 * 64)
15772    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15773    cmp    r3, #0
15774    bxeq   lr                   @ nothing to do - jump to real handler
15775    EXPORT_PC()
15776    mov    r0, rPC              @ arg0
15777    mov    r1, rFP              @ arg1
15778    mov    r2, rSELF            @ arg2
15779    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15780
15781/* ------------------------------ */
15782    .balign 64
15783.L_ALT_OP_IF_GEZ: /* 0x3b */
15784/* File: armv5te/alt_stub.S */
15785/*
15786 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15787 * any interesting requests and then jump to the real instruction
15788 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15789 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15790 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15791 * bail to the real handler if breakFlags==0.
15792 */
15793    ldrb   r3, [rSELF, #offThread_breakFlags]
15794    adrl   lr, dvmAsmInstructionStart + (59 * 64)
15795    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15796    cmp    r3, #0
15797    bxeq   lr                   @ nothing to do - jump to real handler
15798    EXPORT_PC()
15799    mov    r0, rPC              @ arg0
15800    mov    r1, rFP              @ arg1
15801    mov    r2, rSELF            @ arg2
15802    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15803
15804/* ------------------------------ */
15805    .balign 64
15806.L_ALT_OP_IF_GTZ: /* 0x3c */
15807/* File: armv5te/alt_stub.S */
15808/*
15809 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15810 * any interesting requests and then jump to the real instruction
15811 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15812 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15813 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15814 * bail to the real handler if breakFlags==0.
15815 */
15816    ldrb   r3, [rSELF, #offThread_breakFlags]
15817    adrl   lr, dvmAsmInstructionStart + (60 * 64)
15818    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15819    cmp    r3, #0
15820    bxeq   lr                   @ nothing to do - jump to real handler
15821    EXPORT_PC()
15822    mov    r0, rPC              @ arg0
15823    mov    r1, rFP              @ arg1
15824    mov    r2, rSELF            @ arg2
15825    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15826
15827/* ------------------------------ */
15828    .balign 64
15829.L_ALT_OP_IF_LEZ: /* 0x3d */
15830/* File: armv5te/alt_stub.S */
15831/*
15832 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15833 * any interesting requests and then jump to the real instruction
15834 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15835 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15836 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15837 * bail to the real handler if breakFlags==0.
15838 */
15839    ldrb   r3, [rSELF, #offThread_breakFlags]
15840    adrl   lr, dvmAsmInstructionStart + (61 * 64)
15841    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15842    cmp    r3, #0
15843    bxeq   lr                   @ nothing to do - jump to real handler
15844    EXPORT_PC()
15845    mov    r0, rPC              @ arg0
15846    mov    r1, rFP              @ arg1
15847    mov    r2, rSELF            @ arg2
15848    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15849
15850/* ------------------------------ */
15851    .balign 64
15852.L_ALT_OP_UNUSED_3E: /* 0x3e */
15853/* File: armv5te/alt_stub.S */
15854/*
15855 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15856 * any interesting requests and then jump to the real instruction
15857 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15858 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15859 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15860 * bail to the real handler if breakFlags==0.
15861 */
15862    ldrb   r3, [rSELF, #offThread_breakFlags]
15863    adrl   lr, dvmAsmInstructionStart + (62 * 64)
15864    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15865    cmp    r3, #0
15866    bxeq   lr                   @ nothing to do - jump to real handler
15867    EXPORT_PC()
15868    mov    r0, rPC              @ arg0
15869    mov    r1, rFP              @ arg1
15870    mov    r2, rSELF            @ arg2
15871    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15872
15873/* ------------------------------ */
15874    .balign 64
15875.L_ALT_OP_UNUSED_3F: /* 0x3f */
15876/* File: armv5te/alt_stub.S */
15877/*
15878 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15879 * any interesting requests and then jump to the real instruction
15880 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15881 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15882 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15883 * bail to the real handler if breakFlags==0.
15884 */
15885    ldrb   r3, [rSELF, #offThread_breakFlags]
15886    adrl   lr, dvmAsmInstructionStart + (63 * 64)
15887    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15888    cmp    r3, #0
15889    bxeq   lr                   @ nothing to do - jump to real handler
15890    EXPORT_PC()
15891    mov    r0, rPC              @ arg0
15892    mov    r1, rFP              @ arg1
15893    mov    r2, rSELF            @ arg2
15894    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15895
15896/* ------------------------------ */
15897    .balign 64
15898.L_ALT_OP_UNUSED_40: /* 0x40 */
15899/* File: armv5te/alt_stub.S */
15900/*
15901 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15902 * any interesting requests and then jump to the real instruction
15903 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15904 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15905 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15906 * bail to the real handler if breakFlags==0.
15907 */
15908    ldrb   r3, [rSELF, #offThread_breakFlags]
15909    adrl   lr, dvmAsmInstructionStart + (64 * 64)
15910    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15911    cmp    r3, #0
15912    bxeq   lr                   @ nothing to do - jump to real handler
15913    EXPORT_PC()
15914    mov    r0, rPC              @ arg0
15915    mov    r1, rFP              @ arg1
15916    mov    r2, rSELF            @ arg2
15917    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15918
15919/* ------------------------------ */
15920    .balign 64
15921.L_ALT_OP_UNUSED_41: /* 0x41 */
15922/* File: armv5te/alt_stub.S */
15923/*
15924 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15925 * any interesting requests and then jump to the real instruction
15926 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15927 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15928 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15929 * bail to the real handler if breakFlags==0.
15930 */
15931    ldrb   r3, [rSELF, #offThread_breakFlags]
15932    adrl   lr, dvmAsmInstructionStart + (65 * 64)
15933    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15934    cmp    r3, #0
15935    bxeq   lr                   @ nothing to do - jump to real handler
15936    EXPORT_PC()
15937    mov    r0, rPC              @ arg0
15938    mov    r1, rFP              @ arg1
15939    mov    r2, rSELF            @ arg2
15940    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15941
15942/* ------------------------------ */
15943    .balign 64
15944.L_ALT_OP_UNUSED_42: /* 0x42 */
15945/* File: armv5te/alt_stub.S */
15946/*
15947 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15948 * any interesting requests and then jump to the real instruction
15949 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15950 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15951 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15952 * bail to the real handler if breakFlags==0.
15953 */
15954    ldrb   r3, [rSELF, #offThread_breakFlags]
15955    adrl   lr, dvmAsmInstructionStart + (66 * 64)
15956    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15957    cmp    r3, #0
15958    bxeq   lr                   @ nothing to do - jump to real handler
15959    EXPORT_PC()
15960    mov    r0, rPC              @ arg0
15961    mov    r1, rFP              @ arg1
15962    mov    r2, rSELF            @ arg2
15963    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15964
15965/* ------------------------------ */
15966    .balign 64
15967.L_ALT_OP_UNUSED_43: /* 0x43 */
15968/* File: armv5te/alt_stub.S */
15969/*
15970 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15971 * any interesting requests and then jump to the real instruction
15972 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15973 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15974 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15975 * bail to the real handler if breakFlags==0.
15976 */
15977    ldrb   r3, [rSELF, #offThread_breakFlags]
15978    adrl   lr, dvmAsmInstructionStart + (67 * 64)
15979    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15980    cmp    r3, #0
15981    bxeq   lr                   @ nothing to do - jump to real handler
15982    EXPORT_PC()
15983    mov    r0, rPC              @ arg0
15984    mov    r1, rFP              @ arg1
15985    mov    r2, rSELF            @ arg2
15986    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15987
15988/* ------------------------------ */
15989    .balign 64
15990.L_ALT_OP_AGET: /* 0x44 */
15991/* File: armv5te/alt_stub.S */
15992/*
15993 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15994 * any interesting requests and then jump to the real instruction
15995 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15996 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15997 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15998 * bail to the real handler if breakFlags==0.
15999 */
16000    ldrb   r3, [rSELF, #offThread_breakFlags]
16001    adrl   lr, dvmAsmInstructionStart + (68 * 64)
16002    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16003    cmp    r3, #0
16004    bxeq   lr                   @ nothing to do - jump to real handler
16005    EXPORT_PC()
16006    mov    r0, rPC              @ arg0
16007    mov    r1, rFP              @ arg1
16008    mov    r2, rSELF            @ arg2
16009    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16010
16011/* ------------------------------ */
16012    .balign 64
16013.L_ALT_OP_AGET_WIDE: /* 0x45 */
16014/* File: armv5te/alt_stub.S */
16015/*
16016 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16017 * any interesting requests and then jump to the real instruction
16018 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16019 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16020 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16021 * bail to the real handler if breakFlags==0.
16022 */
16023    ldrb   r3, [rSELF, #offThread_breakFlags]
16024    adrl   lr, dvmAsmInstructionStart + (69 * 64)
16025    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16026    cmp    r3, #0
16027    bxeq   lr                   @ nothing to do - jump to real handler
16028    EXPORT_PC()
16029    mov    r0, rPC              @ arg0
16030    mov    r1, rFP              @ arg1
16031    mov    r2, rSELF            @ arg2
16032    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16033
16034/* ------------------------------ */
16035    .balign 64
16036.L_ALT_OP_AGET_OBJECT: /* 0x46 */
16037/* File: armv5te/alt_stub.S */
16038/*
16039 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16040 * any interesting requests and then jump to the real instruction
16041 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16042 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16043 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16044 * bail to the real handler if breakFlags==0.
16045 */
16046    ldrb   r3, [rSELF, #offThread_breakFlags]
16047    adrl   lr, dvmAsmInstructionStart + (70 * 64)
16048    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16049    cmp    r3, #0
16050    bxeq   lr                   @ nothing to do - jump to real handler
16051    EXPORT_PC()
16052    mov    r0, rPC              @ arg0
16053    mov    r1, rFP              @ arg1
16054    mov    r2, rSELF            @ arg2
16055    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16056
16057/* ------------------------------ */
16058    .balign 64
16059.L_ALT_OP_AGET_BOOLEAN: /* 0x47 */
16060/* File: armv5te/alt_stub.S */
16061/*
16062 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16063 * any interesting requests and then jump to the real instruction
16064 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16065 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16066 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16067 * bail to the real handler if breakFlags==0.
16068 */
16069    ldrb   r3, [rSELF, #offThread_breakFlags]
16070    adrl   lr, dvmAsmInstructionStart + (71 * 64)
16071    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16072    cmp    r3, #0
16073    bxeq   lr                   @ nothing to do - jump to real handler
16074    EXPORT_PC()
16075    mov    r0, rPC              @ arg0
16076    mov    r1, rFP              @ arg1
16077    mov    r2, rSELF            @ arg2
16078    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16079
16080/* ------------------------------ */
16081    .balign 64
16082.L_ALT_OP_AGET_BYTE: /* 0x48 */
16083/* File: armv5te/alt_stub.S */
16084/*
16085 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16086 * any interesting requests and then jump to the real instruction
16087 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16088 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16089 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16090 * bail to the real handler if breakFlags==0.
16091 */
16092    ldrb   r3, [rSELF, #offThread_breakFlags]
16093    adrl   lr, dvmAsmInstructionStart + (72 * 64)
16094    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16095    cmp    r3, #0
16096    bxeq   lr                   @ nothing to do - jump to real handler
16097    EXPORT_PC()
16098    mov    r0, rPC              @ arg0
16099    mov    r1, rFP              @ arg1
16100    mov    r2, rSELF            @ arg2
16101    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16102
16103/* ------------------------------ */
16104    .balign 64
16105.L_ALT_OP_AGET_CHAR: /* 0x49 */
16106/* File: armv5te/alt_stub.S */
16107/*
16108 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16109 * any interesting requests and then jump to the real instruction
16110 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16111 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16112 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16113 * bail to the real handler if breakFlags==0.
16114 */
16115    ldrb   r3, [rSELF, #offThread_breakFlags]
16116    adrl   lr, dvmAsmInstructionStart + (73 * 64)
16117    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16118    cmp    r3, #0
16119    bxeq   lr                   @ nothing to do - jump to real handler
16120    EXPORT_PC()
16121    mov    r0, rPC              @ arg0
16122    mov    r1, rFP              @ arg1
16123    mov    r2, rSELF            @ arg2
16124    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16125
16126/* ------------------------------ */
16127    .balign 64
16128.L_ALT_OP_AGET_SHORT: /* 0x4a */
16129/* File: armv5te/alt_stub.S */
16130/*
16131 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16132 * any interesting requests and then jump to the real instruction
16133 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16134 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16135 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16136 * bail to the real handler if breakFlags==0.
16137 */
16138    ldrb   r3, [rSELF, #offThread_breakFlags]
16139    adrl   lr, dvmAsmInstructionStart + (74 * 64)
16140    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16141    cmp    r3, #0
16142    bxeq   lr                   @ nothing to do - jump to real handler
16143    EXPORT_PC()
16144    mov    r0, rPC              @ arg0
16145    mov    r1, rFP              @ arg1
16146    mov    r2, rSELF            @ arg2
16147    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16148
16149/* ------------------------------ */
16150    .balign 64
16151.L_ALT_OP_APUT: /* 0x4b */
16152/* File: armv5te/alt_stub.S */
16153/*
16154 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16155 * any interesting requests and then jump to the real instruction
16156 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16157 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16158 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16159 * bail to the real handler if breakFlags==0.
16160 */
16161    ldrb   r3, [rSELF, #offThread_breakFlags]
16162    adrl   lr, dvmAsmInstructionStart + (75 * 64)
16163    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16164    cmp    r3, #0
16165    bxeq   lr                   @ nothing to do - jump to real handler
16166    EXPORT_PC()
16167    mov    r0, rPC              @ arg0
16168    mov    r1, rFP              @ arg1
16169    mov    r2, rSELF            @ arg2
16170    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16171
16172/* ------------------------------ */
16173    .balign 64
16174.L_ALT_OP_APUT_WIDE: /* 0x4c */
16175/* File: armv5te/alt_stub.S */
16176/*
16177 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16178 * any interesting requests and then jump to the real instruction
16179 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16180 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16181 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16182 * bail to the real handler if breakFlags==0.
16183 */
16184    ldrb   r3, [rSELF, #offThread_breakFlags]
16185    adrl   lr, dvmAsmInstructionStart + (76 * 64)
16186    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16187    cmp    r3, #0
16188    bxeq   lr                   @ nothing to do - jump to real handler
16189    EXPORT_PC()
16190    mov    r0, rPC              @ arg0
16191    mov    r1, rFP              @ arg1
16192    mov    r2, rSELF            @ arg2
16193    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16194
16195/* ------------------------------ */
16196    .balign 64
16197.L_ALT_OP_APUT_OBJECT: /* 0x4d */
16198/* File: armv5te/alt_stub.S */
16199/*
16200 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16201 * any interesting requests and then jump to the real instruction
16202 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16203 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16204 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16205 * bail to the real handler if breakFlags==0.
16206 */
16207    ldrb   r3, [rSELF, #offThread_breakFlags]
16208    adrl   lr, dvmAsmInstructionStart + (77 * 64)
16209    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16210    cmp    r3, #0
16211    bxeq   lr                   @ nothing to do - jump to real handler
16212    EXPORT_PC()
16213    mov    r0, rPC              @ arg0
16214    mov    r1, rFP              @ arg1
16215    mov    r2, rSELF            @ arg2
16216    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16217
16218/* ------------------------------ */
16219    .balign 64
16220.L_ALT_OP_APUT_BOOLEAN: /* 0x4e */
16221/* File: armv5te/alt_stub.S */
16222/*
16223 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16224 * any interesting requests and then jump to the real instruction
16225 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16226 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16227 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16228 * bail to the real handler if breakFlags==0.
16229 */
16230    ldrb   r3, [rSELF, #offThread_breakFlags]
16231    adrl   lr, dvmAsmInstructionStart + (78 * 64)
16232    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16233    cmp    r3, #0
16234    bxeq   lr                   @ nothing to do - jump to real handler
16235    EXPORT_PC()
16236    mov    r0, rPC              @ arg0
16237    mov    r1, rFP              @ arg1
16238    mov    r2, rSELF            @ arg2
16239    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16240
16241/* ------------------------------ */
16242    .balign 64
16243.L_ALT_OP_APUT_BYTE: /* 0x4f */
16244/* File: armv5te/alt_stub.S */
16245/*
16246 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16247 * any interesting requests and then jump to the real instruction
16248 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16249 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16250 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16251 * bail to the real handler if breakFlags==0.
16252 */
16253    ldrb   r3, [rSELF, #offThread_breakFlags]
16254    adrl   lr, dvmAsmInstructionStart + (79 * 64)
16255    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16256    cmp    r3, #0
16257    bxeq   lr                   @ nothing to do - jump to real handler
16258    EXPORT_PC()
16259    mov    r0, rPC              @ arg0
16260    mov    r1, rFP              @ arg1
16261    mov    r2, rSELF            @ arg2
16262    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16263
16264/* ------------------------------ */
16265    .balign 64
16266.L_ALT_OP_APUT_CHAR: /* 0x50 */
16267/* File: armv5te/alt_stub.S */
16268/*
16269 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16270 * any interesting requests and then jump to the real instruction
16271 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16272 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16273 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16274 * bail to the real handler if breakFlags==0.
16275 */
16276    ldrb   r3, [rSELF, #offThread_breakFlags]
16277    adrl   lr, dvmAsmInstructionStart + (80 * 64)
16278    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16279    cmp    r3, #0
16280    bxeq   lr                   @ nothing to do - jump to real handler
16281    EXPORT_PC()
16282    mov    r0, rPC              @ arg0
16283    mov    r1, rFP              @ arg1
16284    mov    r2, rSELF            @ arg2
16285    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16286
16287/* ------------------------------ */
16288    .balign 64
16289.L_ALT_OP_APUT_SHORT: /* 0x51 */
16290/* File: armv5te/alt_stub.S */
16291/*
16292 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16293 * any interesting requests and then jump to the real instruction
16294 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16295 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16296 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16297 * bail to the real handler if breakFlags==0.
16298 */
16299    ldrb   r3, [rSELF, #offThread_breakFlags]
16300    adrl   lr, dvmAsmInstructionStart + (81 * 64)
16301    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16302    cmp    r3, #0
16303    bxeq   lr                   @ nothing to do - jump to real handler
16304    EXPORT_PC()
16305    mov    r0, rPC              @ arg0
16306    mov    r1, rFP              @ arg1
16307    mov    r2, rSELF            @ arg2
16308    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16309
16310/* ------------------------------ */
16311    .balign 64
16312.L_ALT_OP_IGET: /* 0x52 */
16313/* File: armv5te/alt_stub.S */
16314/*
16315 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16316 * any interesting requests and then jump to the real instruction
16317 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16318 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16319 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16320 * bail to the real handler if breakFlags==0.
16321 */
16322    ldrb   r3, [rSELF, #offThread_breakFlags]
16323    adrl   lr, dvmAsmInstructionStart + (82 * 64)
16324    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16325    cmp    r3, #0
16326    bxeq   lr                   @ nothing to do - jump to real handler
16327    EXPORT_PC()
16328    mov    r0, rPC              @ arg0
16329    mov    r1, rFP              @ arg1
16330    mov    r2, rSELF            @ arg2
16331    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16332
16333/* ------------------------------ */
16334    .balign 64
16335.L_ALT_OP_IGET_WIDE: /* 0x53 */
16336/* File: armv5te/alt_stub.S */
16337/*
16338 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16339 * any interesting requests and then jump to the real instruction
16340 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16341 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16342 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16343 * bail to the real handler if breakFlags==0.
16344 */
16345    ldrb   r3, [rSELF, #offThread_breakFlags]
16346    adrl   lr, dvmAsmInstructionStart + (83 * 64)
16347    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16348    cmp    r3, #0
16349    bxeq   lr                   @ nothing to do - jump to real handler
16350    EXPORT_PC()
16351    mov    r0, rPC              @ arg0
16352    mov    r1, rFP              @ arg1
16353    mov    r2, rSELF            @ arg2
16354    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16355
16356/* ------------------------------ */
16357    .balign 64
16358.L_ALT_OP_IGET_OBJECT: /* 0x54 */
16359/* File: armv5te/alt_stub.S */
16360/*
16361 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16362 * any interesting requests and then jump to the real instruction
16363 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16364 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16365 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16366 * bail to the real handler if breakFlags==0.
16367 */
16368    ldrb   r3, [rSELF, #offThread_breakFlags]
16369    adrl   lr, dvmAsmInstructionStart + (84 * 64)
16370    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16371    cmp    r3, #0
16372    bxeq   lr                   @ nothing to do - jump to real handler
16373    EXPORT_PC()
16374    mov    r0, rPC              @ arg0
16375    mov    r1, rFP              @ arg1
16376    mov    r2, rSELF            @ arg2
16377    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16378
16379/* ------------------------------ */
16380    .balign 64
16381.L_ALT_OP_IGET_BOOLEAN: /* 0x55 */
16382/* File: armv5te/alt_stub.S */
16383/*
16384 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16385 * any interesting requests and then jump to the real instruction
16386 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16387 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16388 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16389 * bail to the real handler if breakFlags==0.
16390 */
16391    ldrb   r3, [rSELF, #offThread_breakFlags]
16392    adrl   lr, dvmAsmInstructionStart + (85 * 64)
16393    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16394    cmp    r3, #0
16395    bxeq   lr                   @ nothing to do - jump to real handler
16396    EXPORT_PC()
16397    mov    r0, rPC              @ arg0
16398    mov    r1, rFP              @ arg1
16399    mov    r2, rSELF            @ arg2
16400    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16401
16402/* ------------------------------ */
16403    .balign 64
16404.L_ALT_OP_IGET_BYTE: /* 0x56 */
16405/* File: armv5te/alt_stub.S */
16406/*
16407 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16408 * any interesting requests and then jump to the real instruction
16409 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16410 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16411 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16412 * bail to the real handler if breakFlags==0.
16413 */
16414    ldrb   r3, [rSELF, #offThread_breakFlags]
16415    adrl   lr, dvmAsmInstructionStart + (86 * 64)
16416    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16417    cmp    r3, #0
16418    bxeq   lr                   @ nothing to do - jump to real handler
16419    EXPORT_PC()
16420    mov    r0, rPC              @ arg0
16421    mov    r1, rFP              @ arg1
16422    mov    r2, rSELF            @ arg2
16423    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16424
16425/* ------------------------------ */
16426    .balign 64
16427.L_ALT_OP_IGET_CHAR: /* 0x57 */
16428/* File: armv5te/alt_stub.S */
16429/*
16430 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16431 * any interesting requests and then jump to the real instruction
16432 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16433 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16434 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16435 * bail to the real handler if breakFlags==0.
16436 */
16437    ldrb   r3, [rSELF, #offThread_breakFlags]
16438    adrl   lr, dvmAsmInstructionStart + (87 * 64)
16439    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16440    cmp    r3, #0
16441    bxeq   lr                   @ nothing to do - jump to real handler
16442    EXPORT_PC()
16443    mov    r0, rPC              @ arg0
16444    mov    r1, rFP              @ arg1
16445    mov    r2, rSELF            @ arg2
16446    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16447
16448/* ------------------------------ */
16449    .balign 64
16450.L_ALT_OP_IGET_SHORT: /* 0x58 */
16451/* File: armv5te/alt_stub.S */
16452/*
16453 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16454 * any interesting requests and then jump to the real instruction
16455 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16456 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16457 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16458 * bail to the real handler if breakFlags==0.
16459 */
16460    ldrb   r3, [rSELF, #offThread_breakFlags]
16461    adrl   lr, dvmAsmInstructionStart + (88 * 64)
16462    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16463    cmp    r3, #0
16464    bxeq   lr                   @ nothing to do - jump to real handler
16465    EXPORT_PC()
16466    mov    r0, rPC              @ arg0
16467    mov    r1, rFP              @ arg1
16468    mov    r2, rSELF            @ arg2
16469    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16470
16471/* ------------------------------ */
16472    .balign 64
16473.L_ALT_OP_IPUT: /* 0x59 */
16474/* File: armv5te/alt_stub.S */
16475/*
16476 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16477 * any interesting requests and then jump to the real instruction
16478 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16479 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16480 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16481 * bail to the real handler if breakFlags==0.
16482 */
16483    ldrb   r3, [rSELF, #offThread_breakFlags]
16484    adrl   lr, dvmAsmInstructionStart + (89 * 64)
16485    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16486    cmp    r3, #0
16487    bxeq   lr                   @ nothing to do - jump to real handler
16488    EXPORT_PC()
16489    mov    r0, rPC              @ arg0
16490    mov    r1, rFP              @ arg1
16491    mov    r2, rSELF            @ arg2
16492    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16493
16494/* ------------------------------ */
16495    .balign 64
16496.L_ALT_OP_IPUT_WIDE: /* 0x5a */
16497/* File: armv5te/alt_stub.S */
16498/*
16499 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16500 * any interesting requests and then jump to the real instruction
16501 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16502 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16503 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16504 * bail to the real handler if breakFlags==0.
16505 */
16506    ldrb   r3, [rSELF, #offThread_breakFlags]
16507    adrl   lr, dvmAsmInstructionStart + (90 * 64)
16508    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16509    cmp    r3, #0
16510    bxeq   lr                   @ nothing to do - jump to real handler
16511    EXPORT_PC()
16512    mov    r0, rPC              @ arg0
16513    mov    r1, rFP              @ arg1
16514    mov    r2, rSELF            @ arg2
16515    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16516
16517/* ------------------------------ */
16518    .balign 64
16519.L_ALT_OP_IPUT_OBJECT: /* 0x5b */
16520/* File: armv5te/alt_stub.S */
16521/*
16522 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16523 * any interesting requests and then jump to the real instruction
16524 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16525 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16526 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16527 * bail to the real handler if breakFlags==0.
16528 */
16529    ldrb   r3, [rSELF, #offThread_breakFlags]
16530    adrl   lr, dvmAsmInstructionStart + (91 * 64)
16531    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16532    cmp    r3, #0
16533    bxeq   lr                   @ nothing to do - jump to real handler
16534    EXPORT_PC()
16535    mov    r0, rPC              @ arg0
16536    mov    r1, rFP              @ arg1
16537    mov    r2, rSELF            @ arg2
16538    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16539
16540/* ------------------------------ */
16541    .balign 64
16542.L_ALT_OP_IPUT_BOOLEAN: /* 0x5c */
16543/* File: armv5te/alt_stub.S */
16544/*
16545 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16546 * any interesting requests and then jump to the real instruction
16547 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16548 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16549 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16550 * bail to the real handler if breakFlags==0.
16551 */
16552    ldrb   r3, [rSELF, #offThread_breakFlags]
16553    adrl   lr, dvmAsmInstructionStart + (92 * 64)
16554    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16555    cmp    r3, #0
16556    bxeq   lr                   @ nothing to do - jump to real handler
16557    EXPORT_PC()
16558    mov    r0, rPC              @ arg0
16559    mov    r1, rFP              @ arg1
16560    mov    r2, rSELF            @ arg2
16561    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16562
16563/* ------------------------------ */
16564    .balign 64
16565.L_ALT_OP_IPUT_BYTE: /* 0x5d */
16566/* File: armv5te/alt_stub.S */
16567/*
16568 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16569 * any interesting requests and then jump to the real instruction
16570 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16571 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16572 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16573 * bail to the real handler if breakFlags==0.
16574 */
16575    ldrb   r3, [rSELF, #offThread_breakFlags]
16576    adrl   lr, dvmAsmInstructionStart + (93 * 64)
16577    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16578    cmp    r3, #0
16579    bxeq   lr                   @ nothing to do - jump to real handler
16580    EXPORT_PC()
16581    mov    r0, rPC              @ arg0
16582    mov    r1, rFP              @ arg1
16583    mov    r2, rSELF            @ arg2
16584    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16585
16586/* ------------------------------ */
16587    .balign 64
16588.L_ALT_OP_IPUT_CHAR: /* 0x5e */
16589/* File: armv5te/alt_stub.S */
16590/*
16591 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16592 * any interesting requests and then jump to the real instruction
16593 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16594 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16595 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16596 * bail to the real handler if breakFlags==0.
16597 */
16598    ldrb   r3, [rSELF, #offThread_breakFlags]
16599    adrl   lr, dvmAsmInstructionStart + (94 * 64)
16600    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16601    cmp    r3, #0
16602    bxeq   lr                   @ nothing to do - jump to real handler
16603    EXPORT_PC()
16604    mov    r0, rPC              @ arg0
16605    mov    r1, rFP              @ arg1
16606    mov    r2, rSELF            @ arg2
16607    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16608
16609/* ------------------------------ */
16610    .balign 64
16611.L_ALT_OP_IPUT_SHORT: /* 0x5f */
16612/* File: armv5te/alt_stub.S */
16613/*
16614 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16615 * any interesting requests and then jump to the real instruction
16616 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16617 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16618 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16619 * bail to the real handler if breakFlags==0.
16620 */
16621    ldrb   r3, [rSELF, #offThread_breakFlags]
16622    adrl   lr, dvmAsmInstructionStart + (95 * 64)
16623    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16624    cmp    r3, #0
16625    bxeq   lr                   @ nothing to do - jump to real handler
16626    EXPORT_PC()
16627    mov    r0, rPC              @ arg0
16628    mov    r1, rFP              @ arg1
16629    mov    r2, rSELF            @ arg2
16630    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16631
16632/* ------------------------------ */
16633    .balign 64
16634.L_ALT_OP_SGET: /* 0x60 */
16635/* File: armv5te/alt_stub.S */
16636/*
16637 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16638 * any interesting requests and then jump to the real instruction
16639 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16640 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16641 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16642 * bail to the real handler if breakFlags==0.
16643 */
16644    ldrb   r3, [rSELF, #offThread_breakFlags]
16645    adrl   lr, dvmAsmInstructionStart + (96 * 64)
16646    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16647    cmp    r3, #0
16648    bxeq   lr                   @ nothing to do - jump to real handler
16649    EXPORT_PC()
16650    mov    r0, rPC              @ arg0
16651    mov    r1, rFP              @ arg1
16652    mov    r2, rSELF            @ arg2
16653    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16654
16655/* ------------------------------ */
16656    .balign 64
16657.L_ALT_OP_SGET_WIDE: /* 0x61 */
16658/* File: armv5te/alt_stub.S */
16659/*
16660 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16661 * any interesting requests and then jump to the real instruction
16662 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16663 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16664 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16665 * bail to the real handler if breakFlags==0.
16666 */
16667    ldrb   r3, [rSELF, #offThread_breakFlags]
16668    adrl   lr, dvmAsmInstructionStart + (97 * 64)
16669    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16670    cmp    r3, #0
16671    bxeq   lr                   @ nothing to do - jump to real handler
16672    EXPORT_PC()
16673    mov    r0, rPC              @ arg0
16674    mov    r1, rFP              @ arg1
16675    mov    r2, rSELF            @ arg2
16676    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16677
16678/* ------------------------------ */
16679    .balign 64
16680.L_ALT_OP_SGET_OBJECT: /* 0x62 */
16681/* File: armv5te/alt_stub.S */
16682/*
16683 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16684 * any interesting requests and then jump to the real instruction
16685 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16686 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16687 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16688 * bail to the real handler if breakFlags==0.
16689 */
16690    ldrb   r3, [rSELF, #offThread_breakFlags]
16691    adrl   lr, dvmAsmInstructionStart + (98 * 64)
16692    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16693    cmp    r3, #0
16694    bxeq   lr                   @ nothing to do - jump to real handler
16695    EXPORT_PC()
16696    mov    r0, rPC              @ arg0
16697    mov    r1, rFP              @ arg1
16698    mov    r2, rSELF            @ arg2
16699    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16700
16701/* ------------------------------ */
16702    .balign 64
16703.L_ALT_OP_SGET_BOOLEAN: /* 0x63 */
16704/* File: armv5te/alt_stub.S */
16705/*
16706 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16707 * any interesting requests and then jump to the real instruction
16708 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16709 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16710 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16711 * bail to the real handler if breakFlags==0.
16712 */
16713    ldrb   r3, [rSELF, #offThread_breakFlags]
16714    adrl   lr, dvmAsmInstructionStart + (99 * 64)
16715    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16716    cmp    r3, #0
16717    bxeq   lr                   @ nothing to do - jump to real handler
16718    EXPORT_PC()
16719    mov    r0, rPC              @ arg0
16720    mov    r1, rFP              @ arg1
16721    mov    r2, rSELF            @ arg2
16722    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16723
16724/* ------------------------------ */
16725    .balign 64
16726.L_ALT_OP_SGET_BYTE: /* 0x64 */
16727/* File: armv5te/alt_stub.S */
16728/*
16729 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16730 * any interesting requests and then jump to the real instruction
16731 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16732 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16733 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16734 * bail to the real handler if breakFlags==0.
16735 */
16736    ldrb   r3, [rSELF, #offThread_breakFlags]
16737    adrl   lr, dvmAsmInstructionStart + (100 * 64)
16738    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16739    cmp    r3, #0
16740    bxeq   lr                   @ nothing to do - jump to real handler
16741    EXPORT_PC()
16742    mov    r0, rPC              @ arg0
16743    mov    r1, rFP              @ arg1
16744    mov    r2, rSELF            @ arg2
16745    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16746
16747/* ------------------------------ */
16748    .balign 64
16749.L_ALT_OP_SGET_CHAR: /* 0x65 */
16750/* File: armv5te/alt_stub.S */
16751/*
16752 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16753 * any interesting requests and then jump to the real instruction
16754 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16755 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16756 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16757 * bail to the real handler if breakFlags==0.
16758 */
16759    ldrb   r3, [rSELF, #offThread_breakFlags]
16760    adrl   lr, dvmAsmInstructionStart + (101 * 64)
16761    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16762    cmp    r3, #0
16763    bxeq   lr                   @ nothing to do - jump to real handler
16764    EXPORT_PC()
16765    mov    r0, rPC              @ arg0
16766    mov    r1, rFP              @ arg1
16767    mov    r2, rSELF            @ arg2
16768    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16769
16770/* ------------------------------ */
16771    .balign 64
16772.L_ALT_OP_SGET_SHORT: /* 0x66 */
16773/* File: armv5te/alt_stub.S */
16774/*
16775 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16776 * any interesting requests and then jump to the real instruction
16777 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16778 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16779 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16780 * bail to the real handler if breakFlags==0.
16781 */
16782    ldrb   r3, [rSELF, #offThread_breakFlags]
16783    adrl   lr, dvmAsmInstructionStart + (102 * 64)
16784    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16785    cmp    r3, #0
16786    bxeq   lr                   @ nothing to do - jump to real handler
16787    EXPORT_PC()
16788    mov    r0, rPC              @ arg0
16789    mov    r1, rFP              @ arg1
16790    mov    r2, rSELF            @ arg2
16791    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16792
16793/* ------------------------------ */
16794    .balign 64
16795.L_ALT_OP_SPUT: /* 0x67 */
16796/* File: armv5te/alt_stub.S */
16797/*
16798 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16799 * any interesting requests and then jump to the real instruction
16800 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16801 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16802 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16803 * bail to the real handler if breakFlags==0.
16804 */
16805    ldrb   r3, [rSELF, #offThread_breakFlags]
16806    adrl   lr, dvmAsmInstructionStart + (103 * 64)
16807    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16808    cmp    r3, #0
16809    bxeq   lr                   @ nothing to do - jump to real handler
16810    EXPORT_PC()
16811    mov    r0, rPC              @ arg0
16812    mov    r1, rFP              @ arg1
16813    mov    r2, rSELF            @ arg2
16814    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16815
16816/* ------------------------------ */
16817    .balign 64
16818.L_ALT_OP_SPUT_WIDE: /* 0x68 */
16819/* File: armv5te/alt_stub.S */
16820/*
16821 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16822 * any interesting requests and then jump to the real instruction
16823 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16824 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16825 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16826 * bail to the real handler if breakFlags==0.
16827 */
16828    ldrb   r3, [rSELF, #offThread_breakFlags]
16829    adrl   lr, dvmAsmInstructionStart + (104 * 64)
16830    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16831    cmp    r3, #0
16832    bxeq   lr                   @ nothing to do - jump to real handler
16833    EXPORT_PC()
16834    mov    r0, rPC              @ arg0
16835    mov    r1, rFP              @ arg1
16836    mov    r2, rSELF            @ arg2
16837    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16838
16839/* ------------------------------ */
16840    .balign 64
16841.L_ALT_OP_SPUT_OBJECT: /* 0x69 */
16842/* File: armv5te/alt_stub.S */
16843/*
16844 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16845 * any interesting requests and then jump to the real instruction
16846 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16847 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16848 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16849 * bail to the real handler if breakFlags==0.
16850 */
16851    ldrb   r3, [rSELF, #offThread_breakFlags]
16852    adrl   lr, dvmAsmInstructionStart + (105 * 64)
16853    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16854    cmp    r3, #0
16855    bxeq   lr                   @ nothing to do - jump to real handler
16856    EXPORT_PC()
16857    mov    r0, rPC              @ arg0
16858    mov    r1, rFP              @ arg1
16859    mov    r2, rSELF            @ arg2
16860    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16861
16862/* ------------------------------ */
16863    .balign 64
16864.L_ALT_OP_SPUT_BOOLEAN: /* 0x6a */
16865/* File: armv5te/alt_stub.S */
16866/*
16867 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16868 * any interesting requests and then jump to the real instruction
16869 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16870 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16871 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16872 * bail to the real handler if breakFlags==0.
16873 */
16874    ldrb   r3, [rSELF, #offThread_breakFlags]
16875    adrl   lr, dvmAsmInstructionStart + (106 * 64)
16876    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16877    cmp    r3, #0
16878    bxeq   lr                   @ nothing to do - jump to real handler
16879    EXPORT_PC()
16880    mov    r0, rPC              @ arg0
16881    mov    r1, rFP              @ arg1
16882    mov    r2, rSELF            @ arg2
16883    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16884
16885/* ------------------------------ */
16886    .balign 64
16887.L_ALT_OP_SPUT_BYTE: /* 0x6b */
16888/* File: armv5te/alt_stub.S */
16889/*
16890 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16891 * any interesting requests and then jump to the real instruction
16892 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16893 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16894 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16895 * bail to the real handler if breakFlags==0.
16896 */
16897    ldrb   r3, [rSELF, #offThread_breakFlags]
16898    adrl   lr, dvmAsmInstructionStart + (107 * 64)
16899    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16900    cmp    r3, #0
16901    bxeq   lr                   @ nothing to do - jump to real handler
16902    EXPORT_PC()
16903    mov    r0, rPC              @ arg0
16904    mov    r1, rFP              @ arg1
16905    mov    r2, rSELF            @ arg2
16906    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16907
16908/* ------------------------------ */
16909    .balign 64
16910.L_ALT_OP_SPUT_CHAR: /* 0x6c */
16911/* File: armv5te/alt_stub.S */
16912/*
16913 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16914 * any interesting requests and then jump to the real instruction
16915 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16916 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16917 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16918 * bail to the real handler if breakFlags==0.
16919 */
16920    ldrb   r3, [rSELF, #offThread_breakFlags]
16921    adrl   lr, dvmAsmInstructionStart + (108 * 64)
16922    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16923    cmp    r3, #0
16924    bxeq   lr                   @ nothing to do - jump to real handler
16925    EXPORT_PC()
16926    mov    r0, rPC              @ arg0
16927    mov    r1, rFP              @ arg1
16928    mov    r2, rSELF            @ arg2
16929    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16930
16931/* ------------------------------ */
16932    .balign 64
16933.L_ALT_OP_SPUT_SHORT: /* 0x6d */
16934/* File: armv5te/alt_stub.S */
16935/*
16936 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16937 * any interesting requests and then jump to the real instruction
16938 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16939 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16940 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16941 * bail to the real handler if breakFlags==0.
16942 */
16943    ldrb   r3, [rSELF, #offThread_breakFlags]
16944    adrl   lr, dvmAsmInstructionStart + (109 * 64)
16945    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16946    cmp    r3, #0
16947    bxeq   lr                   @ nothing to do - jump to real handler
16948    EXPORT_PC()
16949    mov    r0, rPC              @ arg0
16950    mov    r1, rFP              @ arg1
16951    mov    r2, rSELF            @ arg2
16952    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16953
16954/* ------------------------------ */
16955    .balign 64
16956.L_ALT_OP_INVOKE_VIRTUAL: /* 0x6e */
16957/* File: armv5te/alt_stub.S */
16958/*
16959 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16960 * any interesting requests and then jump to the real instruction
16961 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16962 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16963 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16964 * bail to the real handler if breakFlags==0.
16965 */
16966    ldrb   r3, [rSELF, #offThread_breakFlags]
16967    adrl   lr, dvmAsmInstructionStart + (110 * 64)
16968    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16969    cmp    r3, #0
16970    bxeq   lr                   @ nothing to do - jump to real handler
16971    EXPORT_PC()
16972    mov    r0, rPC              @ arg0
16973    mov    r1, rFP              @ arg1
16974    mov    r2, rSELF            @ arg2
16975    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16976
16977/* ------------------------------ */
16978    .balign 64
16979.L_ALT_OP_INVOKE_SUPER: /* 0x6f */
16980/* File: armv5te/alt_stub.S */
16981/*
16982 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16983 * any interesting requests and then jump to the real instruction
16984 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16985 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16986 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16987 * bail to the real handler if breakFlags==0.
16988 */
16989    ldrb   r3, [rSELF, #offThread_breakFlags]
16990    adrl   lr, dvmAsmInstructionStart + (111 * 64)
16991    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16992    cmp    r3, #0
16993    bxeq   lr                   @ nothing to do - jump to real handler
16994    EXPORT_PC()
16995    mov    r0, rPC              @ arg0
16996    mov    r1, rFP              @ arg1
16997    mov    r2, rSELF            @ arg2
16998    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16999
17000/* ------------------------------ */
17001    .balign 64
17002.L_ALT_OP_INVOKE_DIRECT: /* 0x70 */
17003/* File: armv5te/alt_stub.S */
17004/*
17005 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17006 * any interesting requests and then jump to the real instruction
17007 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17008 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17009 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17010 * bail to the real handler if breakFlags==0.
17011 */
17012    ldrb   r3, [rSELF, #offThread_breakFlags]
17013    adrl   lr, dvmAsmInstructionStart + (112 * 64)
17014    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17015    cmp    r3, #0
17016    bxeq   lr                   @ nothing to do - jump to real handler
17017    EXPORT_PC()
17018    mov    r0, rPC              @ arg0
17019    mov    r1, rFP              @ arg1
17020    mov    r2, rSELF            @ arg2
17021    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17022
17023/* ------------------------------ */
17024    .balign 64
17025.L_ALT_OP_INVOKE_STATIC: /* 0x71 */
17026/* File: armv5te/alt_stub.S */
17027/*
17028 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17029 * any interesting requests and then jump to the real instruction
17030 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17031 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17032 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17033 * bail to the real handler if breakFlags==0.
17034 */
17035    ldrb   r3, [rSELF, #offThread_breakFlags]
17036    adrl   lr, dvmAsmInstructionStart + (113 * 64)
17037    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17038    cmp    r3, #0
17039    bxeq   lr                   @ nothing to do - jump to real handler
17040    EXPORT_PC()
17041    mov    r0, rPC              @ arg0
17042    mov    r1, rFP              @ arg1
17043    mov    r2, rSELF            @ arg2
17044    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17045
17046/* ------------------------------ */
17047    .balign 64
17048.L_ALT_OP_INVOKE_INTERFACE: /* 0x72 */
17049/* File: armv5te/alt_stub.S */
17050/*
17051 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17052 * any interesting requests and then jump to the real instruction
17053 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17054 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17055 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17056 * bail to the real handler if breakFlags==0.
17057 */
17058    ldrb   r3, [rSELF, #offThread_breakFlags]
17059    adrl   lr, dvmAsmInstructionStart + (114 * 64)
17060    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17061    cmp    r3, #0
17062    bxeq   lr                   @ nothing to do - jump to real handler
17063    EXPORT_PC()
17064    mov    r0, rPC              @ arg0
17065    mov    r1, rFP              @ arg1
17066    mov    r2, rSELF            @ arg2
17067    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17068
17069/* ------------------------------ */
17070    .balign 64
17071.L_ALT_OP_UNUSED_73: /* 0x73 */
17072/* File: armv5te/alt_stub.S */
17073/*
17074 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17075 * any interesting requests and then jump to the real instruction
17076 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17077 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17078 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17079 * bail to the real handler if breakFlags==0.
17080 */
17081    ldrb   r3, [rSELF, #offThread_breakFlags]
17082    adrl   lr, dvmAsmInstructionStart + (115 * 64)
17083    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17084    cmp    r3, #0
17085    bxeq   lr                   @ nothing to do - jump to real handler
17086    EXPORT_PC()
17087    mov    r0, rPC              @ arg0
17088    mov    r1, rFP              @ arg1
17089    mov    r2, rSELF            @ arg2
17090    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17091
17092/* ------------------------------ */
17093    .balign 64
17094.L_ALT_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
17095/* File: armv5te/alt_stub.S */
17096/*
17097 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17098 * any interesting requests and then jump to the real instruction
17099 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17100 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17101 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17102 * bail to the real handler if breakFlags==0.
17103 */
17104    ldrb   r3, [rSELF, #offThread_breakFlags]
17105    adrl   lr, dvmAsmInstructionStart + (116 * 64)
17106    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17107    cmp    r3, #0
17108    bxeq   lr                   @ nothing to do - jump to real handler
17109    EXPORT_PC()
17110    mov    r0, rPC              @ arg0
17111    mov    r1, rFP              @ arg1
17112    mov    r2, rSELF            @ arg2
17113    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17114
17115/* ------------------------------ */
17116    .balign 64
17117.L_ALT_OP_INVOKE_SUPER_RANGE: /* 0x75 */
17118/* File: armv5te/alt_stub.S */
17119/*
17120 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17121 * any interesting requests and then jump to the real instruction
17122 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17123 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17124 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17125 * bail to the real handler if breakFlags==0.
17126 */
17127    ldrb   r3, [rSELF, #offThread_breakFlags]
17128    adrl   lr, dvmAsmInstructionStart + (117 * 64)
17129    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17130    cmp    r3, #0
17131    bxeq   lr                   @ nothing to do - jump to real handler
17132    EXPORT_PC()
17133    mov    r0, rPC              @ arg0
17134    mov    r1, rFP              @ arg1
17135    mov    r2, rSELF            @ arg2
17136    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17137
17138/* ------------------------------ */
17139    .balign 64
17140.L_ALT_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
17141/* File: armv5te/alt_stub.S */
17142/*
17143 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17144 * any interesting requests and then jump to the real instruction
17145 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17146 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17147 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17148 * bail to the real handler if breakFlags==0.
17149 */
17150    ldrb   r3, [rSELF, #offThread_breakFlags]
17151    adrl   lr, dvmAsmInstructionStart + (118 * 64)
17152    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17153    cmp    r3, #0
17154    bxeq   lr                   @ nothing to do - jump to real handler
17155    EXPORT_PC()
17156    mov    r0, rPC              @ arg0
17157    mov    r1, rFP              @ arg1
17158    mov    r2, rSELF            @ arg2
17159    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17160
17161/* ------------------------------ */
17162    .balign 64
17163.L_ALT_OP_INVOKE_STATIC_RANGE: /* 0x77 */
17164/* File: armv5te/alt_stub.S */
17165/*
17166 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17167 * any interesting requests and then jump to the real instruction
17168 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17169 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17170 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17171 * bail to the real handler if breakFlags==0.
17172 */
17173    ldrb   r3, [rSELF, #offThread_breakFlags]
17174    adrl   lr, dvmAsmInstructionStart + (119 * 64)
17175    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17176    cmp    r3, #0
17177    bxeq   lr                   @ nothing to do - jump to real handler
17178    EXPORT_PC()
17179    mov    r0, rPC              @ arg0
17180    mov    r1, rFP              @ arg1
17181    mov    r2, rSELF            @ arg2
17182    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17183
17184/* ------------------------------ */
17185    .balign 64
17186.L_ALT_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
17187/* File: armv5te/alt_stub.S */
17188/*
17189 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17190 * any interesting requests and then jump to the real instruction
17191 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17192 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17193 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17194 * bail to the real handler if breakFlags==0.
17195 */
17196    ldrb   r3, [rSELF, #offThread_breakFlags]
17197    adrl   lr, dvmAsmInstructionStart + (120 * 64)
17198    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17199    cmp    r3, #0
17200    bxeq   lr                   @ nothing to do - jump to real handler
17201    EXPORT_PC()
17202    mov    r0, rPC              @ arg0
17203    mov    r1, rFP              @ arg1
17204    mov    r2, rSELF            @ arg2
17205    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17206
17207/* ------------------------------ */
17208    .balign 64
17209.L_ALT_OP_UNUSED_79: /* 0x79 */
17210/* File: armv5te/alt_stub.S */
17211/*
17212 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17213 * any interesting requests and then jump to the real instruction
17214 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17215 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17216 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17217 * bail to the real handler if breakFlags==0.
17218 */
17219    ldrb   r3, [rSELF, #offThread_breakFlags]
17220    adrl   lr, dvmAsmInstructionStart + (121 * 64)
17221    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17222    cmp    r3, #0
17223    bxeq   lr                   @ nothing to do - jump to real handler
17224    EXPORT_PC()
17225    mov    r0, rPC              @ arg0
17226    mov    r1, rFP              @ arg1
17227    mov    r2, rSELF            @ arg2
17228    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17229
17230/* ------------------------------ */
17231    .balign 64
17232.L_ALT_OP_UNUSED_7A: /* 0x7a */
17233/* File: armv5te/alt_stub.S */
17234/*
17235 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17236 * any interesting requests and then jump to the real instruction
17237 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17238 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17239 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17240 * bail to the real handler if breakFlags==0.
17241 */
17242    ldrb   r3, [rSELF, #offThread_breakFlags]
17243    adrl   lr, dvmAsmInstructionStart + (122 * 64)
17244    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17245    cmp    r3, #0
17246    bxeq   lr                   @ nothing to do - jump to real handler
17247    EXPORT_PC()
17248    mov    r0, rPC              @ arg0
17249    mov    r1, rFP              @ arg1
17250    mov    r2, rSELF            @ arg2
17251    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17252
17253/* ------------------------------ */
17254    .balign 64
17255.L_ALT_OP_NEG_INT: /* 0x7b */
17256/* File: armv5te/alt_stub.S */
17257/*
17258 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17259 * any interesting requests and then jump to the real instruction
17260 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17261 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17262 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17263 * bail to the real handler if breakFlags==0.
17264 */
17265    ldrb   r3, [rSELF, #offThread_breakFlags]
17266    adrl   lr, dvmAsmInstructionStart + (123 * 64)
17267    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17268    cmp    r3, #0
17269    bxeq   lr                   @ nothing to do - jump to real handler
17270    EXPORT_PC()
17271    mov    r0, rPC              @ arg0
17272    mov    r1, rFP              @ arg1
17273    mov    r2, rSELF            @ arg2
17274    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17275
17276/* ------------------------------ */
17277    .balign 64
17278.L_ALT_OP_NOT_INT: /* 0x7c */
17279/* File: armv5te/alt_stub.S */
17280/*
17281 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17282 * any interesting requests and then jump to the real instruction
17283 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17284 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17285 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17286 * bail to the real handler if breakFlags==0.
17287 */
17288    ldrb   r3, [rSELF, #offThread_breakFlags]
17289    adrl   lr, dvmAsmInstructionStart + (124 * 64)
17290    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17291    cmp    r3, #0
17292    bxeq   lr                   @ nothing to do - jump to real handler
17293    EXPORT_PC()
17294    mov    r0, rPC              @ arg0
17295    mov    r1, rFP              @ arg1
17296    mov    r2, rSELF            @ arg2
17297    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17298
17299/* ------------------------------ */
17300    .balign 64
17301.L_ALT_OP_NEG_LONG: /* 0x7d */
17302/* File: armv5te/alt_stub.S */
17303/*
17304 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17305 * any interesting requests and then jump to the real instruction
17306 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17307 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17308 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17309 * bail to the real handler if breakFlags==0.
17310 */
17311    ldrb   r3, [rSELF, #offThread_breakFlags]
17312    adrl   lr, dvmAsmInstructionStart + (125 * 64)
17313    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17314    cmp    r3, #0
17315    bxeq   lr                   @ nothing to do - jump to real handler
17316    EXPORT_PC()
17317    mov    r0, rPC              @ arg0
17318    mov    r1, rFP              @ arg1
17319    mov    r2, rSELF            @ arg2
17320    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17321
17322/* ------------------------------ */
17323    .balign 64
17324.L_ALT_OP_NOT_LONG: /* 0x7e */
17325/* File: armv5te/alt_stub.S */
17326/*
17327 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17328 * any interesting requests and then jump to the real instruction
17329 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17330 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17331 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17332 * bail to the real handler if breakFlags==0.
17333 */
17334    ldrb   r3, [rSELF, #offThread_breakFlags]
17335    adrl   lr, dvmAsmInstructionStart + (126 * 64)
17336    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17337    cmp    r3, #0
17338    bxeq   lr                   @ nothing to do - jump to real handler
17339    EXPORT_PC()
17340    mov    r0, rPC              @ arg0
17341    mov    r1, rFP              @ arg1
17342    mov    r2, rSELF            @ arg2
17343    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17344
17345/* ------------------------------ */
17346    .balign 64
17347.L_ALT_OP_NEG_FLOAT: /* 0x7f */
17348/* File: armv5te/alt_stub.S */
17349/*
17350 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17351 * any interesting requests and then jump to the real instruction
17352 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17353 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17354 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17355 * bail to the real handler if breakFlags==0.
17356 */
17357    ldrb   r3, [rSELF, #offThread_breakFlags]
17358    adrl   lr, dvmAsmInstructionStart + (127 * 64)
17359    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17360    cmp    r3, #0
17361    bxeq   lr                   @ nothing to do - jump to real handler
17362    EXPORT_PC()
17363    mov    r0, rPC              @ arg0
17364    mov    r1, rFP              @ arg1
17365    mov    r2, rSELF            @ arg2
17366    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17367
17368/* ------------------------------ */
17369    .balign 64
17370.L_ALT_OP_NEG_DOUBLE: /* 0x80 */
17371/* File: armv5te/alt_stub.S */
17372/*
17373 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17374 * any interesting requests and then jump to the real instruction
17375 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17376 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17377 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17378 * bail to the real handler if breakFlags==0.
17379 */
17380    ldrb   r3, [rSELF, #offThread_breakFlags]
17381    adrl   lr, dvmAsmInstructionStart + (128 * 64)
17382    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17383    cmp    r3, #0
17384    bxeq   lr                   @ nothing to do - jump to real handler
17385    EXPORT_PC()
17386    mov    r0, rPC              @ arg0
17387    mov    r1, rFP              @ arg1
17388    mov    r2, rSELF            @ arg2
17389    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17390
17391/* ------------------------------ */
17392    .balign 64
17393.L_ALT_OP_INT_TO_LONG: /* 0x81 */
17394/* File: armv5te/alt_stub.S */
17395/*
17396 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17397 * any interesting requests and then jump to the real instruction
17398 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17399 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17400 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17401 * bail to the real handler if breakFlags==0.
17402 */
17403    ldrb   r3, [rSELF, #offThread_breakFlags]
17404    adrl   lr, dvmAsmInstructionStart + (129 * 64)
17405    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17406    cmp    r3, #0
17407    bxeq   lr                   @ nothing to do - jump to real handler
17408    EXPORT_PC()
17409    mov    r0, rPC              @ arg0
17410    mov    r1, rFP              @ arg1
17411    mov    r2, rSELF            @ arg2
17412    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17413
17414/* ------------------------------ */
17415    .balign 64
17416.L_ALT_OP_INT_TO_FLOAT: /* 0x82 */
17417/* File: armv5te/alt_stub.S */
17418/*
17419 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17420 * any interesting requests and then jump to the real instruction
17421 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17422 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17423 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17424 * bail to the real handler if breakFlags==0.
17425 */
17426    ldrb   r3, [rSELF, #offThread_breakFlags]
17427    adrl   lr, dvmAsmInstructionStart + (130 * 64)
17428    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17429    cmp    r3, #0
17430    bxeq   lr                   @ nothing to do - jump to real handler
17431    EXPORT_PC()
17432    mov    r0, rPC              @ arg0
17433    mov    r1, rFP              @ arg1
17434    mov    r2, rSELF            @ arg2
17435    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17436
17437/* ------------------------------ */
17438    .balign 64
17439.L_ALT_OP_INT_TO_DOUBLE: /* 0x83 */
17440/* File: armv5te/alt_stub.S */
17441/*
17442 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17443 * any interesting requests and then jump to the real instruction
17444 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17445 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17446 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17447 * bail to the real handler if breakFlags==0.
17448 */
17449    ldrb   r3, [rSELF, #offThread_breakFlags]
17450    adrl   lr, dvmAsmInstructionStart + (131 * 64)
17451    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17452    cmp    r3, #0
17453    bxeq   lr                   @ nothing to do - jump to real handler
17454    EXPORT_PC()
17455    mov    r0, rPC              @ arg0
17456    mov    r1, rFP              @ arg1
17457    mov    r2, rSELF            @ arg2
17458    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17459
17460/* ------------------------------ */
17461    .balign 64
17462.L_ALT_OP_LONG_TO_INT: /* 0x84 */
17463/* File: armv5te/alt_stub.S */
17464/*
17465 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17466 * any interesting requests and then jump to the real instruction
17467 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17468 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17469 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17470 * bail to the real handler if breakFlags==0.
17471 */
17472    ldrb   r3, [rSELF, #offThread_breakFlags]
17473    adrl   lr, dvmAsmInstructionStart + (132 * 64)
17474    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17475    cmp    r3, #0
17476    bxeq   lr                   @ nothing to do - jump to real handler
17477    EXPORT_PC()
17478    mov    r0, rPC              @ arg0
17479    mov    r1, rFP              @ arg1
17480    mov    r2, rSELF            @ arg2
17481    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17482
17483/* ------------------------------ */
17484    .balign 64
17485.L_ALT_OP_LONG_TO_FLOAT: /* 0x85 */
17486/* File: armv5te/alt_stub.S */
17487/*
17488 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17489 * any interesting requests and then jump to the real instruction
17490 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17491 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17492 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17493 * bail to the real handler if breakFlags==0.
17494 */
17495    ldrb   r3, [rSELF, #offThread_breakFlags]
17496    adrl   lr, dvmAsmInstructionStart + (133 * 64)
17497    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17498    cmp    r3, #0
17499    bxeq   lr                   @ nothing to do - jump to real handler
17500    EXPORT_PC()
17501    mov    r0, rPC              @ arg0
17502    mov    r1, rFP              @ arg1
17503    mov    r2, rSELF            @ arg2
17504    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17505
17506/* ------------------------------ */
17507    .balign 64
17508.L_ALT_OP_LONG_TO_DOUBLE: /* 0x86 */
17509/* File: armv5te/alt_stub.S */
17510/*
17511 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17512 * any interesting requests and then jump to the real instruction
17513 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17514 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17515 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17516 * bail to the real handler if breakFlags==0.
17517 */
17518    ldrb   r3, [rSELF, #offThread_breakFlags]
17519    adrl   lr, dvmAsmInstructionStart + (134 * 64)
17520    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17521    cmp    r3, #0
17522    bxeq   lr                   @ nothing to do - jump to real handler
17523    EXPORT_PC()
17524    mov    r0, rPC              @ arg0
17525    mov    r1, rFP              @ arg1
17526    mov    r2, rSELF            @ arg2
17527    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17528
17529/* ------------------------------ */
17530    .balign 64
17531.L_ALT_OP_FLOAT_TO_INT: /* 0x87 */
17532/* File: armv5te/alt_stub.S */
17533/*
17534 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17535 * any interesting requests and then jump to the real instruction
17536 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17537 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17538 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17539 * bail to the real handler if breakFlags==0.
17540 */
17541    ldrb   r3, [rSELF, #offThread_breakFlags]
17542    adrl   lr, dvmAsmInstructionStart + (135 * 64)
17543    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17544    cmp    r3, #0
17545    bxeq   lr                   @ nothing to do - jump to real handler
17546    EXPORT_PC()
17547    mov    r0, rPC              @ arg0
17548    mov    r1, rFP              @ arg1
17549    mov    r2, rSELF            @ arg2
17550    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17551
17552/* ------------------------------ */
17553    .balign 64
17554.L_ALT_OP_FLOAT_TO_LONG: /* 0x88 */
17555/* File: armv5te/alt_stub.S */
17556/*
17557 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17558 * any interesting requests and then jump to the real instruction
17559 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17560 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17561 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17562 * bail to the real handler if breakFlags==0.
17563 */
17564    ldrb   r3, [rSELF, #offThread_breakFlags]
17565    adrl   lr, dvmAsmInstructionStart + (136 * 64)
17566    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17567    cmp    r3, #0
17568    bxeq   lr                   @ nothing to do - jump to real handler
17569    EXPORT_PC()
17570    mov    r0, rPC              @ arg0
17571    mov    r1, rFP              @ arg1
17572    mov    r2, rSELF            @ arg2
17573    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17574
17575/* ------------------------------ */
17576    .balign 64
17577.L_ALT_OP_FLOAT_TO_DOUBLE: /* 0x89 */
17578/* File: armv5te/alt_stub.S */
17579/*
17580 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17581 * any interesting requests and then jump to the real instruction
17582 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17583 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17584 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17585 * bail to the real handler if breakFlags==0.
17586 */
17587    ldrb   r3, [rSELF, #offThread_breakFlags]
17588    adrl   lr, dvmAsmInstructionStart + (137 * 64)
17589    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17590    cmp    r3, #0
17591    bxeq   lr                   @ nothing to do - jump to real handler
17592    EXPORT_PC()
17593    mov    r0, rPC              @ arg0
17594    mov    r1, rFP              @ arg1
17595    mov    r2, rSELF            @ arg2
17596    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17597
17598/* ------------------------------ */
17599    .balign 64
17600.L_ALT_OP_DOUBLE_TO_INT: /* 0x8a */
17601/* File: armv5te/alt_stub.S */
17602/*
17603 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17604 * any interesting requests and then jump to the real instruction
17605 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17606 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17607 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17608 * bail to the real handler if breakFlags==0.
17609 */
17610    ldrb   r3, [rSELF, #offThread_breakFlags]
17611    adrl   lr, dvmAsmInstructionStart + (138 * 64)
17612    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17613    cmp    r3, #0
17614    bxeq   lr                   @ nothing to do - jump to real handler
17615    EXPORT_PC()
17616    mov    r0, rPC              @ arg0
17617    mov    r1, rFP              @ arg1
17618    mov    r2, rSELF            @ arg2
17619    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17620
17621/* ------------------------------ */
17622    .balign 64
17623.L_ALT_OP_DOUBLE_TO_LONG: /* 0x8b */
17624/* File: armv5te/alt_stub.S */
17625/*
17626 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17627 * any interesting requests and then jump to the real instruction
17628 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17629 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17630 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17631 * bail to the real handler if breakFlags==0.
17632 */
17633    ldrb   r3, [rSELF, #offThread_breakFlags]
17634    adrl   lr, dvmAsmInstructionStart + (139 * 64)
17635    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17636    cmp    r3, #0
17637    bxeq   lr                   @ nothing to do - jump to real handler
17638    EXPORT_PC()
17639    mov    r0, rPC              @ arg0
17640    mov    r1, rFP              @ arg1
17641    mov    r2, rSELF            @ arg2
17642    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17643
17644/* ------------------------------ */
17645    .balign 64
17646.L_ALT_OP_DOUBLE_TO_FLOAT: /* 0x8c */
17647/* File: armv5te/alt_stub.S */
17648/*
17649 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17650 * any interesting requests and then jump to the real instruction
17651 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17652 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17653 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17654 * bail to the real handler if breakFlags==0.
17655 */
17656    ldrb   r3, [rSELF, #offThread_breakFlags]
17657    adrl   lr, dvmAsmInstructionStart + (140 * 64)
17658    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17659    cmp    r3, #0
17660    bxeq   lr                   @ nothing to do - jump to real handler
17661    EXPORT_PC()
17662    mov    r0, rPC              @ arg0
17663    mov    r1, rFP              @ arg1
17664    mov    r2, rSELF            @ arg2
17665    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17666
17667/* ------------------------------ */
17668    .balign 64
17669.L_ALT_OP_INT_TO_BYTE: /* 0x8d */
17670/* File: armv5te/alt_stub.S */
17671/*
17672 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17673 * any interesting requests and then jump to the real instruction
17674 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17675 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17676 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17677 * bail to the real handler if breakFlags==0.
17678 */
17679    ldrb   r3, [rSELF, #offThread_breakFlags]
17680    adrl   lr, dvmAsmInstructionStart + (141 * 64)
17681    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17682    cmp    r3, #0
17683    bxeq   lr                   @ nothing to do - jump to real handler
17684    EXPORT_PC()
17685    mov    r0, rPC              @ arg0
17686    mov    r1, rFP              @ arg1
17687    mov    r2, rSELF            @ arg2
17688    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17689
17690/* ------------------------------ */
17691    .balign 64
17692.L_ALT_OP_INT_TO_CHAR: /* 0x8e */
17693/* File: armv5te/alt_stub.S */
17694/*
17695 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17696 * any interesting requests and then jump to the real instruction
17697 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17698 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17699 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17700 * bail to the real handler if breakFlags==0.
17701 */
17702    ldrb   r3, [rSELF, #offThread_breakFlags]
17703    adrl   lr, dvmAsmInstructionStart + (142 * 64)
17704    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17705    cmp    r3, #0
17706    bxeq   lr                   @ nothing to do - jump to real handler
17707    EXPORT_PC()
17708    mov    r0, rPC              @ arg0
17709    mov    r1, rFP              @ arg1
17710    mov    r2, rSELF            @ arg2
17711    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17712
17713/* ------------------------------ */
17714    .balign 64
17715.L_ALT_OP_INT_TO_SHORT: /* 0x8f */
17716/* File: armv5te/alt_stub.S */
17717/*
17718 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17719 * any interesting requests and then jump to the real instruction
17720 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17721 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17722 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17723 * bail to the real handler if breakFlags==0.
17724 */
17725    ldrb   r3, [rSELF, #offThread_breakFlags]
17726    adrl   lr, dvmAsmInstructionStart + (143 * 64)
17727    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17728    cmp    r3, #0
17729    bxeq   lr                   @ nothing to do - jump to real handler
17730    EXPORT_PC()
17731    mov    r0, rPC              @ arg0
17732    mov    r1, rFP              @ arg1
17733    mov    r2, rSELF            @ arg2
17734    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17735
17736/* ------------------------------ */
17737    .balign 64
17738.L_ALT_OP_ADD_INT: /* 0x90 */
17739/* File: armv5te/alt_stub.S */
17740/*
17741 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17742 * any interesting requests and then jump to the real instruction
17743 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17744 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17745 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17746 * bail to the real handler if breakFlags==0.
17747 */
17748    ldrb   r3, [rSELF, #offThread_breakFlags]
17749    adrl   lr, dvmAsmInstructionStart + (144 * 64)
17750    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17751    cmp    r3, #0
17752    bxeq   lr                   @ nothing to do - jump to real handler
17753    EXPORT_PC()
17754    mov    r0, rPC              @ arg0
17755    mov    r1, rFP              @ arg1
17756    mov    r2, rSELF            @ arg2
17757    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17758
17759/* ------------------------------ */
17760    .balign 64
17761.L_ALT_OP_SUB_INT: /* 0x91 */
17762/* File: armv5te/alt_stub.S */
17763/*
17764 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17765 * any interesting requests and then jump to the real instruction
17766 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17767 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17768 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17769 * bail to the real handler if breakFlags==0.
17770 */
17771    ldrb   r3, [rSELF, #offThread_breakFlags]
17772    adrl   lr, dvmAsmInstructionStart + (145 * 64)
17773    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17774    cmp    r3, #0
17775    bxeq   lr                   @ nothing to do - jump to real handler
17776    EXPORT_PC()
17777    mov    r0, rPC              @ arg0
17778    mov    r1, rFP              @ arg1
17779    mov    r2, rSELF            @ arg2
17780    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17781
17782/* ------------------------------ */
17783    .balign 64
17784.L_ALT_OP_MUL_INT: /* 0x92 */
17785/* File: armv5te/alt_stub.S */
17786/*
17787 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17788 * any interesting requests and then jump to the real instruction
17789 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17790 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17791 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17792 * bail to the real handler if breakFlags==0.
17793 */
17794    ldrb   r3, [rSELF, #offThread_breakFlags]
17795    adrl   lr, dvmAsmInstructionStart + (146 * 64)
17796    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17797    cmp    r3, #0
17798    bxeq   lr                   @ nothing to do - jump to real handler
17799    EXPORT_PC()
17800    mov    r0, rPC              @ arg0
17801    mov    r1, rFP              @ arg1
17802    mov    r2, rSELF            @ arg2
17803    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17804
17805/* ------------------------------ */
17806    .balign 64
17807.L_ALT_OP_DIV_INT: /* 0x93 */
17808/* File: armv5te/alt_stub.S */
17809/*
17810 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17811 * any interesting requests and then jump to the real instruction
17812 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17813 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17814 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17815 * bail to the real handler if breakFlags==0.
17816 */
17817    ldrb   r3, [rSELF, #offThread_breakFlags]
17818    adrl   lr, dvmAsmInstructionStart + (147 * 64)
17819    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17820    cmp    r3, #0
17821    bxeq   lr                   @ nothing to do - jump to real handler
17822    EXPORT_PC()
17823    mov    r0, rPC              @ arg0
17824    mov    r1, rFP              @ arg1
17825    mov    r2, rSELF            @ arg2
17826    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17827
17828/* ------------------------------ */
17829    .balign 64
17830.L_ALT_OP_REM_INT: /* 0x94 */
17831/* File: armv5te/alt_stub.S */
17832/*
17833 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17834 * any interesting requests and then jump to the real instruction
17835 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17836 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17837 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17838 * bail to the real handler if breakFlags==0.
17839 */
17840    ldrb   r3, [rSELF, #offThread_breakFlags]
17841    adrl   lr, dvmAsmInstructionStart + (148 * 64)
17842    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17843    cmp    r3, #0
17844    bxeq   lr                   @ nothing to do - jump to real handler
17845    EXPORT_PC()
17846    mov    r0, rPC              @ arg0
17847    mov    r1, rFP              @ arg1
17848    mov    r2, rSELF            @ arg2
17849    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17850
17851/* ------------------------------ */
17852    .balign 64
17853.L_ALT_OP_AND_INT: /* 0x95 */
17854/* File: armv5te/alt_stub.S */
17855/*
17856 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17857 * any interesting requests and then jump to the real instruction
17858 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17859 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17860 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17861 * bail to the real handler if breakFlags==0.
17862 */
17863    ldrb   r3, [rSELF, #offThread_breakFlags]
17864    adrl   lr, dvmAsmInstructionStart + (149 * 64)
17865    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17866    cmp    r3, #0
17867    bxeq   lr                   @ nothing to do - jump to real handler
17868    EXPORT_PC()
17869    mov    r0, rPC              @ arg0
17870    mov    r1, rFP              @ arg1
17871    mov    r2, rSELF            @ arg2
17872    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17873
17874/* ------------------------------ */
17875    .balign 64
17876.L_ALT_OP_OR_INT: /* 0x96 */
17877/* File: armv5te/alt_stub.S */
17878/*
17879 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17880 * any interesting requests and then jump to the real instruction
17881 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17882 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17883 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17884 * bail to the real handler if breakFlags==0.
17885 */
17886    ldrb   r3, [rSELF, #offThread_breakFlags]
17887    adrl   lr, dvmAsmInstructionStart + (150 * 64)
17888    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17889    cmp    r3, #0
17890    bxeq   lr                   @ nothing to do - jump to real handler
17891    EXPORT_PC()
17892    mov    r0, rPC              @ arg0
17893    mov    r1, rFP              @ arg1
17894    mov    r2, rSELF            @ arg2
17895    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17896
17897/* ------------------------------ */
17898    .balign 64
17899.L_ALT_OP_XOR_INT: /* 0x97 */
17900/* File: armv5te/alt_stub.S */
17901/*
17902 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17903 * any interesting requests and then jump to the real instruction
17904 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17905 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17906 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17907 * bail to the real handler if breakFlags==0.
17908 */
17909    ldrb   r3, [rSELF, #offThread_breakFlags]
17910    adrl   lr, dvmAsmInstructionStart + (151 * 64)
17911    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17912    cmp    r3, #0
17913    bxeq   lr                   @ nothing to do - jump to real handler
17914    EXPORT_PC()
17915    mov    r0, rPC              @ arg0
17916    mov    r1, rFP              @ arg1
17917    mov    r2, rSELF            @ arg2
17918    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17919
17920/* ------------------------------ */
17921    .balign 64
17922.L_ALT_OP_SHL_INT: /* 0x98 */
17923/* File: armv5te/alt_stub.S */
17924/*
17925 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17926 * any interesting requests and then jump to the real instruction
17927 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17928 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17929 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17930 * bail to the real handler if breakFlags==0.
17931 */
17932    ldrb   r3, [rSELF, #offThread_breakFlags]
17933    adrl   lr, dvmAsmInstructionStart + (152 * 64)
17934    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17935    cmp    r3, #0
17936    bxeq   lr                   @ nothing to do - jump to real handler
17937    EXPORT_PC()
17938    mov    r0, rPC              @ arg0
17939    mov    r1, rFP              @ arg1
17940    mov    r2, rSELF            @ arg2
17941    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17942
17943/* ------------------------------ */
17944    .balign 64
17945.L_ALT_OP_SHR_INT: /* 0x99 */
17946/* File: armv5te/alt_stub.S */
17947/*
17948 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17949 * any interesting requests and then jump to the real instruction
17950 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17951 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17952 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17953 * bail to the real handler if breakFlags==0.
17954 */
17955    ldrb   r3, [rSELF, #offThread_breakFlags]
17956    adrl   lr, dvmAsmInstructionStart + (153 * 64)
17957    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17958    cmp    r3, #0
17959    bxeq   lr                   @ nothing to do - jump to real handler
17960    EXPORT_PC()
17961    mov    r0, rPC              @ arg0
17962    mov    r1, rFP              @ arg1
17963    mov    r2, rSELF            @ arg2
17964    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17965
17966/* ------------------------------ */
17967    .balign 64
17968.L_ALT_OP_USHR_INT: /* 0x9a */
17969/* File: armv5te/alt_stub.S */
17970/*
17971 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17972 * any interesting requests and then jump to the real instruction
17973 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17974 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17975 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17976 * bail to the real handler if breakFlags==0.
17977 */
17978    ldrb   r3, [rSELF, #offThread_breakFlags]
17979    adrl   lr, dvmAsmInstructionStart + (154 * 64)
17980    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17981    cmp    r3, #0
17982    bxeq   lr                   @ nothing to do - jump to real handler
17983    EXPORT_PC()
17984    mov    r0, rPC              @ arg0
17985    mov    r1, rFP              @ arg1
17986    mov    r2, rSELF            @ arg2
17987    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17988
17989/* ------------------------------ */
17990    .balign 64
17991.L_ALT_OP_ADD_LONG: /* 0x9b */
17992/* File: armv5te/alt_stub.S */
17993/*
17994 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17995 * any interesting requests and then jump to the real instruction
17996 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17997 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17998 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17999 * bail to the real handler if breakFlags==0.
18000 */
18001    ldrb   r3, [rSELF, #offThread_breakFlags]
18002    adrl   lr, dvmAsmInstructionStart + (155 * 64)
18003    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18004    cmp    r3, #0
18005    bxeq   lr                   @ nothing to do - jump to real handler
18006    EXPORT_PC()
18007    mov    r0, rPC              @ arg0
18008    mov    r1, rFP              @ arg1
18009    mov    r2, rSELF            @ arg2
18010    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18011
18012/* ------------------------------ */
18013    .balign 64
18014.L_ALT_OP_SUB_LONG: /* 0x9c */
18015/* File: armv5te/alt_stub.S */
18016/*
18017 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18018 * any interesting requests and then jump to the real instruction
18019 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18020 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18021 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18022 * bail to the real handler if breakFlags==0.
18023 */
18024    ldrb   r3, [rSELF, #offThread_breakFlags]
18025    adrl   lr, dvmAsmInstructionStart + (156 * 64)
18026    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18027    cmp    r3, #0
18028    bxeq   lr                   @ nothing to do - jump to real handler
18029    EXPORT_PC()
18030    mov    r0, rPC              @ arg0
18031    mov    r1, rFP              @ arg1
18032    mov    r2, rSELF            @ arg2
18033    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18034
18035/* ------------------------------ */
18036    .balign 64
18037.L_ALT_OP_MUL_LONG: /* 0x9d */
18038/* File: armv5te/alt_stub.S */
18039/*
18040 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18041 * any interesting requests and then jump to the real instruction
18042 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18043 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18044 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18045 * bail to the real handler if breakFlags==0.
18046 */
18047    ldrb   r3, [rSELF, #offThread_breakFlags]
18048    adrl   lr, dvmAsmInstructionStart + (157 * 64)
18049    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18050    cmp    r3, #0
18051    bxeq   lr                   @ nothing to do - jump to real handler
18052    EXPORT_PC()
18053    mov    r0, rPC              @ arg0
18054    mov    r1, rFP              @ arg1
18055    mov    r2, rSELF            @ arg2
18056    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18057
18058/* ------------------------------ */
18059    .balign 64
18060.L_ALT_OP_DIV_LONG: /* 0x9e */
18061/* File: armv5te/alt_stub.S */
18062/*
18063 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18064 * any interesting requests and then jump to the real instruction
18065 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18066 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18067 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18068 * bail to the real handler if breakFlags==0.
18069 */
18070    ldrb   r3, [rSELF, #offThread_breakFlags]
18071    adrl   lr, dvmAsmInstructionStart + (158 * 64)
18072    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18073    cmp    r3, #0
18074    bxeq   lr                   @ nothing to do - jump to real handler
18075    EXPORT_PC()
18076    mov    r0, rPC              @ arg0
18077    mov    r1, rFP              @ arg1
18078    mov    r2, rSELF            @ arg2
18079    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18080
18081/* ------------------------------ */
18082    .balign 64
18083.L_ALT_OP_REM_LONG: /* 0x9f */
18084/* File: armv5te/alt_stub.S */
18085/*
18086 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18087 * any interesting requests and then jump to the real instruction
18088 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18089 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18090 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18091 * bail to the real handler if breakFlags==0.
18092 */
18093    ldrb   r3, [rSELF, #offThread_breakFlags]
18094    adrl   lr, dvmAsmInstructionStart + (159 * 64)
18095    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18096    cmp    r3, #0
18097    bxeq   lr                   @ nothing to do - jump to real handler
18098    EXPORT_PC()
18099    mov    r0, rPC              @ arg0
18100    mov    r1, rFP              @ arg1
18101    mov    r2, rSELF            @ arg2
18102    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18103
18104/* ------------------------------ */
18105    .balign 64
18106.L_ALT_OP_AND_LONG: /* 0xa0 */
18107/* File: armv5te/alt_stub.S */
18108/*
18109 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18110 * any interesting requests and then jump to the real instruction
18111 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18112 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18113 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18114 * bail to the real handler if breakFlags==0.
18115 */
18116    ldrb   r3, [rSELF, #offThread_breakFlags]
18117    adrl   lr, dvmAsmInstructionStart + (160 * 64)
18118    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18119    cmp    r3, #0
18120    bxeq   lr                   @ nothing to do - jump to real handler
18121    EXPORT_PC()
18122    mov    r0, rPC              @ arg0
18123    mov    r1, rFP              @ arg1
18124    mov    r2, rSELF            @ arg2
18125    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18126
18127/* ------------------------------ */
18128    .balign 64
18129.L_ALT_OP_OR_LONG: /* 0xa1 */
18130/* File: armv5te/alt_stub.S */
18131/*
18132 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18133 * any interesting requests and then jump to the real instruction
18134 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18135 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18136 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18137 * bail to the real handler if breakFlags==0.
18138 */
18139    ldrb   r3, [rSELF, #offThread_breakFlags]
18140    adrl   lr, dvmAsmInstructionStart + (161 * 64)
18141    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18142    cmp    r3, #0
18143    bxeq   lr                   @ nothing to do - jump to real handler
18144    EXPORT_PC()
18145    mov    r0, rPC              @ arg0
18146    mov    r1, rFP              @ arg1
18147    mov    r2, rSELF            @ arg2
18148    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18149
18150/* ------------------------------ */
18151    .balign 64
18152.L_ALT_OP_XOR_LONG: /* 0xa2 */
18153/* File: armv5te/alt_stub.S */
18154/*
18155 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18156 * any interesting requests and then jump to the real instruction
18157 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18158 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18159 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18160 * bail to the real handler if breakFlags==0.
18161 */
18162    ldrb   r3, [rSELF, #offThread_breakFlags]
18163    adrl   lr, dvmAsmInstructionStart + (162 * 64)
18164    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18165    cmp    r3, #0
18166    bxeq   lr                   @ nothing to do - jump to real handler
18167    EXPORT_PC()
18168    mov    r0, rPC              @ arg0
18169    mov    r1, rFP              @ arg1
18170    mov    r2, rSELF            @ arg2
18171    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18172
18173/* ------------------------------ */
18174    .balign 64
18175.L_ALT_OP_SHL_LONG: /* 0xa3 */
18176/* File: armv5te/alt_stub.S */
18177/*
18178 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18179 * any interesting requests and then jump to the real instruction
18180 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18181 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18182 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18183 * bail to the real handler if breakFlags==0.
18184 */
18185    ldrb   r3, [rSELF, #offThread_breakFlags]
18186    adrl   lr, dvmAsmInstructionStart + (163 * 64)
18187    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18188    cmp    r3, #0
18189    bxeq   lr                   @ nothing to do - jump to real handler
18190    EXPORT_PC()
18191    mov    r0, rPC              @ arg0
18192    mov    r1, rFP              @ arg1
18193    mov    r2, rSELF            @ arg2
18194    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18195
18196/* ------------------------------ */
18197    .balign 64
18198.L_ALT_OP_SHR_LONG: /* 0xa4 */
18199/* File: armv5te/alt_stub.S */
18200/*
18201 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18202 * any interesting requests and then jump to the real instruction
18203 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18204 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18205 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18206 * bail to the real handler if breakFlags==0.
18207 */
18208    ldrb   r3, [rSELF, #offThread_breakFlags]
18209    adrl   lr, dvmAsmInstructionStart + (164 * 64)
18210    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18211    cmp    r3, #0
18212    bxeq   lr                   @ nothing to do - jump to real handler
18213    EXPORT_PC()
18214    mov    r0, rPC              @ arg0
18215    mov    r1, rFP              @ arg1
18216    mov    r2, rSELF            @ arg2
18217    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18218
18219/* ------------------------------ */
18220    .balign 64
18221.L_ALT_OP_USHR_LONG: /* 0xa5 */
18222/* File: armv5te/alt_stub.S */
18223/*
18224 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18225 * any interesting requests and then jump to the real instruction
18226 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18227 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18228 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18229 * bail to the real handler if breakFlags==0.
18230 */
18231    ldrb   r3, [rSELF, #offThread_breakFlags]
18232    adrl   lr, dvmAsmInstructionStart + (165 * 64)
18233    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18234    cmp    r3, #0
18235    bxeq   lr                   @ nothing to do - jump to real handler
18236    EXPORT_PC()
18237    mov    r0, rPC              @ arg0
18238    mov    r1, rFP              @ arg1
18239    mov    r2, rSELF            @ arg2
18240    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18241
18242/* ------------------------------ */
18243    .balign 64
18244.L_ALT_OP_ADD_FLOAT: /* 0xa6 */
18245/* File: armv5te/alt_stub.S */
18246/*
18247 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18248 * any interesting requests and then jump to the real instruction
18249 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18250 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18251 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18252 * bail to the real handler if breakFlags==0.
18253 */
18254    ldrb   r3, [rSELF, #offThread_breakFlags]
18255    adrl   lr, dvmAsmInstructionStart + (166 * 64)
18256    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18257    cmp    r3, #0
18258    bxeq   lr                   @ nothing to do - jump to real handler
18259    EXPORT_PC()
18260    mov    r0, rPC              @ arg0
18261    mov    r1, rFP              @ arg1
18262    mov    r2, rSELF            @ arg2
18263    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18264
18265/* ------------------------------ */
18266    .balign 64
18267.L_ALT_OP_SUB_FLOAT: /* 0xa7 */
18268/* File: armv5te/alt_stub.S */
18269/*
18270 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18271 * any interesting requests and then jump to the real instruction
18272 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18273 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18274 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18275 * bail to the real handler if breakFlags==0.
18276 */
18277    ldrb   r3, [rSELF, #offThread_breakFlags]
18278    adrl   lr, dvmAsmInstructionStart + (167 * 64)
18279    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18280    cmp    r3, #0
18281    bxeq   lr                   @ nothing to do - jump to real handler
18282    EXPORT_PC()
18283    mov    r0, rPC              @ arg0
18284    mov    r1, rFP              @ arg1
18285    mov    r2, rSELF            @ arg2
18286    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18287
18288/* ------------------------------ */
18289    .balign 64
18290.L_ALT_OP_MUL_FLOAT: /* 0xa8 */
18291/* File: armv5te/alt_stub.S */
18292/*
18293 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18294 * any interesting requests and then jump to the real instruction
18295 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18296 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18297 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18298 * bail to the real handler if breakFlags==0.
18299 */
18300    ldrb   r3, [rSELF, #offThread_breakFlags]
18301    adrl   lr, dvmAsmInstructionStart + (168 * 64)
18302    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18303    cmp    r3, #0
18304    bxeq   lr                   @ nothing to do - jump to real handler
18305    EXPORT_PC()
18306    mov    r0, rPC              @ arg0
18307    mov    r1, rFP              @ arg1
18308    mov    r2, rSELF            @ arg2
18309    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18310
18311/* ------------------------------ */
18312    .balign 64
18313.L_ALT_OP_DIV_FLOAT: /* 0xa9 */
18314/* File: armv5te/alt_stub.S */
18315/*
18316 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18317 * any interesting requests and then jump to the real instruction
18318 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18319 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18320 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18321 * bail to the real handler if breakFlags==0.
18322 */
18323    ldrb   r3, [rSELF, #offThread_breakFlags]
18324    adrl   lr, dvmAsmInstructionStart + (169 * 64)
18325    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18326    cmp    r3, #0
18327    bxeq   lr                   @ nothing to do - jump to real handler
18328    EXPORT_PC()
18329    mov    r0, rPC              @ arg0
18330    mov    r1, rFP              @ arg1
18331    mov    r2, rSELF            @ arg2
18332    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18333
18334/* ------------------------------ */
18335    .balign 64
18336.L_ALT_OP_REM_FLOAT: /* 0xaa */
18337/* File: armv5te/alt_stub.S */
18338/*
18339 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18340 * any interesting requests and then jump to the real instruction
18341 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18342 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18343 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18344 * bail to the real handler if breakFlags==0.
18345 */
18346    ldrb   r3, [rSELF, #offThread_breakFlags]
18347    adrl   lr, dvmAsmInstructionStart + (170 * 64)
18348    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18349    cmp    r3, #0
18350    bxeq   lr                   @ nothing to do - jump to real handler
18351    EXPORT_PC()
18352    mov    r0, rPC              @ arg0
18353    mov    r1, rFP              @ arg1
18354    mov    r2, rSELF            @ arg2
18355    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18356
18357/* ------------------------------ */
18358    .balign 64
18359.L_ALT_OP_ADD_DOUBLE: /* 0xab */
18360/* File: armv5te/alt_stub.S */
18361/*
18362 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18363 * any interesting requests and then jump to the real instruction
18364 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18365 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18366 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18367 * bail to the real handler if breakFlags==0.
18368 */
18369    ldrb   r3, [rSELF, #offThread_breakFlags]
18370    adrl   lr, dvmAsmInstructionStart + (171 * 64)
18371    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18372    cmp    r3, #0
18373    bxeq   lr                   @ nothing to do - jump to real handler
18374    EXPORT_PC()
18375    mov    r0, rPC              @ arg0
18376    mov    r1, rFP              @ arg1
18377    mov    r2, rSELF            @ arg2
18378    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18379
18380/* ------------------------------ */
18381    .balign 64
18382.L_ALT_OP_SUB_DOUBLE: /* 0xac */
18383/* File: armv5te/alt_stub.S */
18384/*
18385 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18386 * any interesting requests and then jump to the real instruction
18387 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18388 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18389 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18390 * bail to the real handler if breakFlags==0.
18391 */
18392    ldrb   r3, [rSELF, #offThread_breakFlags]
18393    adrl   lr, dvmAsmInstructionStart + (172 * 64)
18394    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18395    cmp    r3, #0
18396    bxeq   lr                   @ nothing to do - jump to real handler
18397    EXPORT_PC()
18398    mov    r0, rPC              @ arg0
18399    mov    r1, rFP              @ arg1
18400    mov    r2, rSELF            @ arg2
18401    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18402
18403/* ------------------------------ */
18404    .balign 64
18405.L_ALT_OP_MUL_DOUBLE: /* 0xad */
18406/* File: armv5te/alt_stub.S */
18407/*
18408 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18409 * any interesting requests and then jump to the real instruction
18410 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18411 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18412 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18413 * bail to the real handler if breakFlags==0.
18414 */
18415    ldrb   r3, [rSELF, #offThread_breakFlags]
18416    adrl   lr, dvmAsmInstructionStart + (173 * 64)
18417    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18418    cmp    r3, #0
18419    bxeq   lr                   @ nothing to do - jump to real handler
18420    EXPORT_PC()
18421    mov    r0, rPC              @ arg0
18422    mov    r1, rFP              @ arg1
18423    mov    r2, rSELF            @ arg2
18424    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18425
18426/* ------------------------------ */
18427    .balign 64
18428.L_ALT_OP_DIV_DOUBLE: /* 0xae */
18429/* File: armv5te/alt_stub.S */
18430/*
18431 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18432 * any interesting requests and then jump to the real instruction
18433 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18434 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18435 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18436 * bail to the real handler if breakFlags==0.
18437 */
18438    ldrb   r3, [rSELF, #offThread_breakFlags]
18439    adrl   lr, dvmAsmInstructionStart + (174 * 64)
18440    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18441    cmp    r3, #0
18442    bxeq   lr                   @ nothing to do - jump to real handler
18443    EXPORT_PC()
18444    mov    r0, rPC              @ arg0
18445    mov    r1, rFP              @ arg1
18446    mov    r2, rSELF            @ arg2
18447    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18448
18449/* ------------------------------ */
18450    .balign 64
18451.L_ALT_OP_REM_DOUBLE: /* 0xaf */
18452/* File: armv5te/alt_stub.S */
18453/*
18454 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18455 * any interesting requests and then jump to the real instruction
18456 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18457 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18458 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18459 * bail to the real handler if breakFlags==0.
18460 */
18461    ldrb   r3, [rSELF, #offThread_breakFlags]
18462    adrl   lr, dvmAsmInstructionStart + (175 * 64)
18463    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18464    cmp    r3, #0
18465    bxeq   lr                   @ nothing to do - jump to real handler
18466    EXPORT_PC()
18467    mov    r0, rPC              @ arg0
18468    mov    r1, rFP              @ arg1
18469    mov    r2, rSELF            @ arg2
18470    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18471
18472/* ------------------------------ */
18473    .balign 64
18474.L_ALT_OP_ADD_INT_2ADDR: /* 0xb0 */
18475/* File: armv5te/alt_stub.S */
18476/*
18477 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18478 * any interesting requests and then jump to the real instruction
18479 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18480 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18481 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18482 * bail to the real handler if breakFlags==0.
18483 */
18484    ldrb   r3, [rSELF, #offThread_breakFlags]
18485    adrl   lr, dvmAsmInstructionStart + (176 * 64)
18486    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18487    cmp    r3, #0
18488    bxeq   lr                   @ nothing to do - jump to real handler
18489    EXPORT_PC()
18490    mov    r0, rPC              @ arg0
18491    mov    r1, rFP              @ arg1
18492    mov    r2, rSELF            @ arg2
18493    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18494
18495/* ------------------------------ */
18496    .balign 64
18497.L_ALT_OP_SUB_INT_2ADDR: /* 0xb1 */
18498/* File: armv5te/alt_stub.S */
18499/*
18500 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18501 * any interesting requests and then jump to the real instruction
18502 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18503 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18504 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18505 * bail to the real handler if breakFlags==0.
18506 */
18507    ldrb   r3, [rSELF, #offThread_breakFlags]
18508    adrl   lr, dvmAsmInstructionStart + (177 * 64)
18509    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18510    cmp    r3, #0
18511    bxeq   lr                   @ nothing to do - jump to real handler
18512    EXPORT_PC()
18513    mov    r0, rPC              @ arg0
18514    mov    r1, rFP              @ arg1
18515    mov    r2, rSELF            @ arg2
18516    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18517
18518/* ------------------------------ */
18519    .balign 64
18520.L_ALT_OP_MUL_INT_2ADDR: /* 0xb2 */
18521/* File: armv5te/alt_stub.S */
18522/*
18523 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18524 * any interesting requests and then jump to the real instruction
18525 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18526 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18527 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18528 * bail to the real handler if breakFlags==0.
18529 */
18530    ldrb   r3, [rSELF, #offThread_breakFlags]
18531    adrl   lr, dvmAsmInstructionStart + (178 * 64)
18532    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18533    cmp    r3, #0
18534    bxeq   lr                   @ nothing to do - jump to real handler
18535    EXPORT_PC()
18536    mov    r0, rPC              @ arg0
18537    mov    r1, rFP              @ arg1
18538    mov    r2, rSELF            @ arg2
18539    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18540
18541/* ------------------------------ */
18542    .balign 64
18543.L_ALT_OP_DIV_INT_2ADDR: /* 0xb3 */
18544/* File: armv5te/alt_stub.S */
18545/*
18546 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18547 * any interesting requests and then jump to the real instruction
18548 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18549 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18550 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18551 * bail to the real handler if breakFlags==0.
18552 */
18553    ldrb   r3, [rSELF, #offThread_breakFlags]
18554    adrl   lr, dvmAsmInstructionStart + (179 * 64)
18555    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18556    cmp    r3, #0
18557    bxeq   lr                   @ nothing to do - jump to real handler
18558    EXPORT_PC()
18559    mov    r0, rPC              @ arg0
18560    mov    r1, rFP              @ arg1
18561    mov    r2, rSELF            @ arg2
18562    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18563
18564/* ------------------------------ */
18565    .balign 64
18566.L_ALT_OP_REM_INT_2ADDR: /* 0xb4 */
18567/* File: armv5te/alt_stub.S */
18568/*
18569 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18570 * any interesting requests and then jump to the real instruction
18571 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18572 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18573 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18574 * bail to the real handler if breakFlags==0.
18575 */
18576    ldrb   r3, [rSELF, #offThread_breakFlags]
18577    adrl   lr, dvmAsmInstructionStart + (180 * 64)
18578    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18579    cmp    r3, #0
18580    bxeq   lr                   @ nothing to do - jump to real handler
18581    EXPORT_PC()
18582    mov    r0, rPC              @ arg0
18583    mov    r1, rFP              @ arg1
18584    mov    r2, rSELF            @ arg2
18585    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18586
18587/* ------------------------------ */
18588    .balign 64
18589.L_ALT_OP_AND_INT_2ADDR: /* 0xb5 */
18590/* File: armv5te/alt_stub.S */
18591/*
18592 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18593 * any interesting requests and then jump to the real instruction
18594 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18595 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18596 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18597 * bail to the real handler if breakFlags==0.
18598 */
18599    ldrb   r3, [rSELF, #offThread_breakFlags]
18600    adrl   lr, dvmAsmInstructionStart + (181 * 64)
18601    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18602    cmp    r3, #0
18603    bxeq   lr                   @ nothing to do - jump to real handler
18604    EXPORT_PC()
18605    mov    r0, rPC              @ arg0
18606    mov    r1, rFP              @ arg1
18607    mov    r2, rSELF            @ arg2
18608    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18609
18610/* ------------------------------ */
18611    .balign 64
18612.L_ALT_OP_OR_INT_2ADDR: /* 0xb6 */
18613/* File: armv5te/alt_stub.S */
18614/*
18615 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18616 * any interesting requests and then jump to the real instruction
18617 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18618 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18619 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18620 * bail to the real handler if breakFlags==0.
18621 */
18622    ldrb   r3, [rSELF, #offThread_breakFlags]
18623    adrl   lr, dvmAsmInstructionStart + (182 * 64)
18624    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18625    cmp    r3, #0
18626    bxeq   lr                   @ nothing to do - jump to real handler
18627    EXPORT_PC()
18628    mov    r0, rPC              @ arg0
18629    mov    r1, rFP              @ arg1
18630    mov    r2, rSELF            @ arg2
18631    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18632
18633/* ------------------------------ */
18634    .balign 64
18635.L_ALT_OP_XOR_INT_2ADDR: /* 0xb7 */
18636/* File: armv5te/alt_stub.S */
18637/*
18638 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18639 * any interesting requests and then jump to the real instruction
18640 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18641 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18642 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18643 * bail to the real handler if breakFlags==0.
18644 */
18645    ldrb   r3, [rSELF, #offThread_breakFlags]
18646    adrl   lr, dvmAsmInstructionStart + (183 * 64)
18647    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18648    cmp    r3, #0
18649    bxeq   lr                   @ nothing to do - jump to real handler
18650    EXPORT_PC()
18651    mov    r0, rPC              @ arg0
18652    mov    r1, rFP              @ arg1
18653    mov    r2, rSELF            @ arg2
18654    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18655
18656/* ------------------------------ */
18657    .balign 64
18658.L_ALT_OP_SHL_INT_2ADDR: /* 0xb8 */
18659/* File: armv5te/alt_stub.S */
18660/*
18661 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18662 * any interesting requests and then jump to the real instruction
18663 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18664 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18665 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18666 * bail to the real handler if breakFlags==0.
18667 */
18668    ldrb   r3, [rSELF, #offThread_breakFlags]
18669    adrl   lr, dvmAsmInstructionStart + (184 * 64)
18670    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18671    cmp    r3, #0
18672    bxeq   lr                   @ nothing to do - jump to real handler
18673    EXPORT_PC()
18674    mov    r0, rPC              @ arg0
18675    mov    r1, rFP              @ arg1
18676    mov    r2, rSELF            @ arg2
18677    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18678
18679/* ------------------------------ */
18680    .balign 64
18681.L_ALT_OP_SHR_INT_2ADDR: /* 0xb9 */
18682/* File: armv5te/alt_stub.S */
18683/*
18684 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18685 * any interesting requests and then jump to the real instruction
18686 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18687 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18688 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18689 * bail to the real handler if breakFlags==0.
18690 */
18691    ldrb   r3, [rSELF, #offThread_breakFlags]
18692    adrl   lr, dvmAsmInstructionStart + (185 * 64)
18693    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18694    cmp    r3, #0
18695    bxeq   lr                   @ nothing to do - jump to real handler
18696    EXPORT_PC()
18697    mov    r0, rPC              @ arg0
18698    mov    r1, rFP              @ arg1
18699    mov    r2, rSELF            @ arg2
18700    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18701
18702/* ------------------------------ */
18703    .balign 64
18704.L_ALT_OP_USHR_INT_2ADDR: /* 0xba */
18705/* File: armv5te/alt_stub.S */
18706/*
18707 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18708 * any interesting requests and then jump to the real instruction
18709 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18710 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18711 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18712 * bail to the real handler if breakFlags==0.
18713 */
18714    ldrb   r3, [rSELF, #offThread_breakFlags]
18715    adrl   lr, dvmAsmInstructionStart + (186 * 64)
18716    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18717    cmp    r3, #0
18718    bxeq   lr                   @ nothing to do - jump to real handler
18719    EXPORT_PC()
18720    mov    r0, rPC              @ arg0
18721    mov    r1, rFP              @ arg1
18722    mov    r2, rSELF            @ arg2
18723    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18724
18725/* ------------------------------ */
18726    .balign 64
18727.L_ALT_OP_ADD_LONG_2ADDR: /* 0xbb */
18728/* File: armv5te/alt_stub.S */
18729/*
18730 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18731 * any interesting requests and then jump to the real instruction
18732 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18733 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18734 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18735 * bail to the real handler if breakFlags==0.
18736 */
18737    ldrb   r3, [rSELF, #offThread_breakFlags]
18738    adrl   lr, dvmAsmInstructionStart + (187 * 64)
18739    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18740    cmp    r3, #0
18741    bxeq   lr                   @ nothing to do - jump to real handler
18742    EXPORT_PC()
18743    mov    r0, rPC              @ arg0
18744    mov    r1, rFP              @ arg1
18745    mov    r2, rSELF            @ arg2
18746    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18747
18748/* ------------------------------ */
18749    .balign 64
18750.L_ALT_OP_SUB_LONG_2ADDR: /* 0xbc */
18751/* File: armv5te/alt_stub.S */
18752/*
18753 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18754 * any interesting requests and then jump to the real instruction
18755 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18756 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18757 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18758 * bail to the real handler if breakFlags==0.
18759 */
18760    ldrb   r3, [rSELF, #offThread_breakFlags]
18761    adrl   lr, dvmAsmInstructionStart + (188 * 64)
18762    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18763    cmp    r3, #0
18764    bxeq   lr                   @ nothing to do - jump to real handler
18765    EXPORT_PC()
18766    mov    r0, rPC              @ arg0
18767    mov    r1, rFP              @ arg1
18768    mov    r2, rSELF            @ arg2
18769    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18770
18771/* ------------------------------ */
18772    .balign 64
18773.L_ALT_OP_MUL_LONG_2ADDR: /* 0xbd */
18774/* File: armv5te/alt_stub.S */
18775/*
18776 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18777 * any interesting requests and then jump to the real instruction
18778 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18779 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18780 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18781 * bail to the real handler if breakFlags==0.
18782 */
18783    ldrb   r3, [rSELF, #offThread_breakFlags]
18784    adrl   lr, dvmAsmInstructionStart + (189 * 64)
18785    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18786    cmp    r3, #0
18787    bxeq   lr                   @ nothing to do - jump to real handler
18788    EXPORT_PC()
18789    mov    r0, rPC              @ arg0
18790    mov    r1, rFP              @ arg1
18791    mov    r2, rSELF            @ arg2
18792    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18793
18794/* ------------------------------ */
18795    .balign 64
18796.L_ALT_OP_DIV_LONG_2ADDR: /* 0xbe */
18797/* File: armv5te/alt_stub.S */
18798/*
18799 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18800 * any interesting requests and then jump to the real instruction
18801 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18802 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18803 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18804 * bail to the real handler if breakFlags==0.
18805 */
18806    ldrb   r3, [rSELF, #offThread_breakFlags]
18807    adrl   lr, dvmAsmInstructionStart + (190 * 64)
18808    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18809    cmp    r3, #0
18810    bxeq   lr                   @ nothing to do - jump to real handler
18811    EXPORT_PC()
18812    mov    r0, rPC              @ arg0
18813    mov    r1, rFP              @ arg1
18814    mov    r2, rSELF            @ arg2
18815    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18816
18817/* ------------------------------ */
18818    .balign 64
18819.L_ALT_OP_REM_LONG_2ADDR: /* 0xbf */
18820/* File: armv5te/alt_stub.S */
18821/*
18822 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18823 * any interesting requests and then jump to the real instruction
18824 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18825 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18826 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18827 * bail to the real handler if breakFlags==0.
18828 */
18829    ldrb   r3, [rSELF, #offThread_breakFlags]
18830    adrl   lr, dvmAsmInstructionStart + (191 * 64)
18831    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18832    cmp    r3, #0
18833    bxeq   lr                   @ nothing to do - jump to real handler
18834    EXPORT_PC()
18835    mov    r0, rPC              @ arg0
18836    mov    r1, rFP              @ arg1
18837    mov    r2, rSELF            @ arg2
18838    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18839
18840/* ------------------------------ */
18841    .balign 64
18842.L_ALT_OP_AND_LONG_2ADDR: /* 0xc0 */
18843/* File: armv5te/alt_stub.S */
18844/*
18845 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18846 * any interesting requests and then jump to the real instruction
18847 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18848 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18849 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18850 * bail to the real handler if breakFlags==0.
18851 */
18852    ldrb   r3, [rSELF, #offThread_breakFlags]
18853    adrl   lr, dvmAsmInstructionStart + (192 * 64)
18854    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18855    cmp    r3, #0
18856    bxeq   lr                   @ nothing to do - jump to real handler
18857    EXPORT_PC()
18858    mov    r0, rPC              @ arg0
18859    mov    r1, rFP              @ arg1
18860    mov    r2, rSELF            @ arg2
18861    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18862
18863/* ------------------------------ */
18864    .balign 64
18865.L_ALT_OP_OR_LONG_2ADDR: /* 0xc1 */
18866/* File: armv5te/alt_stub.S */
18867/*
18868 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18869 * any interesting requests and then jump to the real instruction
18870 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18871 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18872 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18873 * bail to the real handler if breakFlags==0.
18874 */
18875    ldrb   r3, [rSELF, #offThread_breakFlags]
18876    adrl   lr, dvmAsmInstructionStart + (193 * 64)
18877    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18878    cmp    r3, #0
18879    bxeq   lr                   @ nothing to do - jump to real handler
18880    EXPORT_PC()
18881    mov    r0, rPC              @ arg0
18882    mov    r1, rFP              @ arg1
18883    mov    r2, rSELF            @ arg2
18884    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18885
18886/* ------------------------------ */
18887    .balign 64
18888.L_ALT_OP_XOR_LONG_2ADDR: /* 0xc2 */
18889/* File: armv5te/alt_stub.S */
18890/*
18891 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18892 * any interesting requests and then jump to the real instruction
18893 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18894 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18895 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18896 * bail to the real handler if breakFlags==0.
18897 */
18898    ldrb   r3, [rSELF, #offThread_breakFlags]
18899    adrl   lr, dvmAsmInstructionStart + (194 * 64)
18900    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18901    cmp    r3, #0
18902    bxeq   lr                   @ nothing to do - jump to real handler
18903    EXPORT_PC()
18904    mov    r0, rPC              @ arg0
18905    mov    r1, rFP              @ arg1
18906    mov    r2, rSELF            @ arg2
18907    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18908
18909/* ------------------------------ */
18910    .balign 64
18911.L_ALT_OP_SHL_LONG_2ADDR: /* 0xc3 */
18912/* File: armv5te/alt_stub.S */
18913/*
18914 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18915 * any interesting requests and then jump to the real instruction
18916 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18917 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18918 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18919 * bail to the real handler if breakFlags==0.
18920 */
18921    ldrb   r3, [rSELF, #offThread_breakFlags]
18922    adrl   lr, dvmAsmInstructionStart + (195 * 64)
18923    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18924    cmp    r3, #0
18925    bxeq   lr                   @ nothing to do - jump to real handler
18926    EXPORT_PC()
18927    mov    r0, rPC              @ arg0
18928    mov    r1, rFP              @ arg1
18929    mov    r2, rSELF            @ arg2
18930    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18931
18932/* ------------------------------ */
18933    .balign 64
18934.L_ALT_OP_SHR_LONG_2ADDR: /* 0xc4 */
18935/* File: armv5te/alt_stub.S */
18936/*
18937 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18938 * any interesting requests and then jump to the real instruction
18939 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18940 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18941 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18942 * bail to the real handler if breakFlags==0.
18943 */
18944    ldrb   r3, [rSELF, #offThread_breakFlags]
18945    adrl   lr, dvmAsmInstructionStart + (196 * 64)
18946    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18947    cmp    r3, #0
18948    bxeq   lr                   @ nothing to do - jump to real handler
18949    EXPORT_PC()
18950    mov    r0, rPC              @ arg0
18951    mov    r1, rFP              @ arg1
18952    mov    r2, rSELF            @ arg2
18953    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18954
18955/* ------------------------------ */
18956    .balign 64
18957.L_ALT_OP_USHR_LONG_2ADDR: /* 0xc5 */
18958/* File: armv5te/alt_stub.S */
18959/*
18960 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18961 * any interesting requests and then jump to the real instruction
18962 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18963 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18964 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18965 * bail to the real handler if breakFlags==0.
18966 */
18967    ldrb   r3, [rSELF, #offThread_breakFlags]
18968    adrl   lr, dvmAsmInstructionStart + (197 * 64)
18969    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18970    cmp    r3, #0
18971    bxeq   lr                   @ nothing to do - jump to real handler
18972    EXPORT_PC()
18973    mov    r0, rPC              @ arg0
18974    mov    r1, rFP              @ arg1
18975    mov    r2, rSELF            @ arg2
18976    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18977
18978/* ------------------------------ */
18979    .balign 64
18980.L_ALT_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
18981/* File: armv5te/alt_stub.S */
18982/*
18983 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18984 * any interesting requests and then jump to the real instruction
18985 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18986 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18987 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18988 * bail to the real handler if breakFlags==0.
18989 */
18990    ldrb   r3, [rSELF, #offThread_breakFlags]
18991    adrl   lr, dvmAsmInstructionStart + (198 * 64)
18992    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18993    cmp    r3, #0
18994    bxeq   lr                   @ nothing to do - jump to real handler
18995    EXPORT_PC()
18996    mov    r0, rPC              @ arg0
18997    mov    r1, rFP              @ arg1
18998    mov    r2, rSELF            @ arg2
18999    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19000
19001/* ------------------------------ */
19002    .balign 64
19003.L_ALT_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
19004/* File: armv5te/alt_stub.S */
19005/*
19006 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19007 * any interesting requests and then jump to the real instruction
19008 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19009 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19010 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19011 * bail to the real handler if breakFlags==0.
19012 */
19013    ldrb   r3, [rSELF, #offThread_breakFlags]
19014    adrl   lr, dvmAsmInstructionStart + (199 * 64)
19015    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19016    cmp    r3, #0
19017    bxeq   lr                   @ nothing to do - jump to real handler
19018    EXPORT_PC()
19019    mov    r0, rPC              @ arg0
19020    mov    r1, rFP              @ arg1
19021    mov    r2, rSELF            @ arg2
19022    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19023
19024/* ------------------------------ */
19025    .balign 64
19026.L_ALT_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
19027/* File: armv5te/alt_stub.S */
19028/*
19029 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19030 * any interesting requests and then jump to the real instruction
19031 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19032 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19033 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19034 * bail to the real handler if breakFlags==0.
19035 */
19036    ldrb   r3, [rSELF, #offThread_breakFlags]
19037    adrl   lr, dvmAsmInstructionStart + (200 * 64)
19038    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19039    cmp    r3, #0
19040    bxeq   lr                   @ nothing to do - jump to real handler
19041    EXPORT_PC()
19042    mov    r0, rPC              @ arg0
19043    mov    r1, rFP              @ arg1
19044    mov    r2, rSELF            @ arg2
19045    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19046
19047/* ------------------------------ */
19048    .balign 64
19049.L_ALT_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
19050/* File: armv5te/alt_stub.S */
19051/*
19052 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19053 * any interesting requests and then jump to the real instruction
19054 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19055 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19056 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19057 * bail to the real handler if breakFlags==0.
19058 */
19059    ldrb   r3, [rSELF, #offThread_breakFlags]
19060    adrl   lr, dvmAsmInstructionStart + (201 * 64)
19061    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19062    cmp    r3, #0
19063    bxeq   lr                   @ nothing to do - jump to real handler
19064    EXPORT_PC()
19065    mov    r0, rPC              @ arg0
19066    mov    r1, rFP              @ arg1
19067    mov    r2, rSELF            @ arg2
19068    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19069
19070/* ------------------------------ */
19071    .balign 64
19072.L_ALT_OP_REM_FLOAT_2ADDR: /* 0xca */
19073/* File: armv5te/alt_stub.S */
19074/*
19075 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19076 * any interesting requests and then jump to the real instruction
19077 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19078 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19079 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19080 * bail to the real handler if breakFlags==0.
19081 */
19082    ldrb   r3, [rSELF, #offThread_breakFlags]
19083    adrl   lr, dvmAsmInstructionStart + (202 * 64)
19084    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19085    cmp    r3, #0
19086    bxeq   lr                   @ nothing to do - jump to real handler
19087    EXPORT_PC()
19088    mov    r0, rPC              @ arg0
19089    mov    r1, rFP              @ arg1
19090    mov    r2, rSELF            @ arg2
19091    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19092
19093/* ------------------------------ */
19094    .balign 64
19095.L_ALT_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
19096/* File: armv5te/alt_stub.S */
19097/*
19098 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19099 * any interesting requests and then jump to the real instruction
19100 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19101 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19102 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19103 * bail to the real handler if breakFlags==0.
19104 */
19105    ldrb   r3, [rSELF, #offThread_breakFlags]
19106    adrl   lr, dvmAsmInstructionStart + (203 * 64)
19107    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19108    cmp    r3, #0
19109    bxeq   lr                   @ nothing to do - jump to real handler
19110    EXPORT_PC()
19111    mov    r0, rPC              @ arg0
19112    mov    r1, rFP              @ arg1
19113    mov    r2, rSELF            @ arg2
19114    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19115
19116/* ------------------------------ */
19117    .balign 64
19118.L_ALT_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
19119/* File: armv5te/alt_stub.S */
19120/*
19121 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19122 * any interesting requests and then jump to the real instruction
19123 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19124 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19125 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19126 * bail to the real handler if breakFlags==0.
19127 */
19128    ldrb   r3, [rSELF, #offThread_breakFlags]
19129    adrl   lr, dvmAsmInstructionStart + (204 * 64)
19130    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19131    cmp    r3, #0
19132    bxeq   lr                   @ nothing to do - jump to real handler
19133    EXPORT_PC()
19134    mov    r0, rPC              @ arg0
19135    mov    r1, rFP              @ arg1
19136    mov    r2, rSELF            @ arg2
19137    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19138
19139/* ------------------------------ */
19140    .balign 64
19141.L_ALT_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
19142/* File: armv5te/alt_stub.S */
19143/*
19144 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19145 * any interesting requests and then jump to the real instruction
19146 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19147 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19148 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19149 * bail to the real handler if breakFlags==0.
19150 */
19151    ldrb   r3, [rSELF, #offThread_breakFlags]
19152    adrl   lr, dvmAsmInstructionStart + (205 * 64)
19153    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19154    cmp    r3, #0
19155    bxeq   lr                   @ nothing to do - jump to real handler
19156    EXPORT_PC()
19157    mov    r0, rPC              @ arg0
19158    mov    r1, rFP              @ arg1
19159    mov    r2, rSELF            @ arg2
19160    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19161
19162/* ------------------------------ */
19163    .balign 64
19164.L_ALT_OP_DIV_DOUBLE_2ADDR: /* 0xce */
19165/* File: armv5te/alt_stub.S */
19166/*
19167 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19168 * any interesting requests and then jump to the real instruction
19169 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19170 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19171 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19172 * bail to the real handler if breakFlags==0.
19173 */
19174    ldrb   r3, [rSELF, #offThread_breakFlags]
19175    adrl   lr, dvmAsmInstructionStart + (206 * 64)
19176    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19177    cmp    r3, #0
19178    bxeq   lr                   @ nothing to do - jump to real handler
19179    EXPORT_PC()
19180    mov    r0, rPC              @ arg0
19181    mov    r1, rFP              @ arg1
19182    mov    r2, rSELF            @ arg2
19183    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19184
19185/* ------------------------------ */
19186    .balign 64
19187.L_ALT_OP_REM_DOUBLE_2ADDR: /* 0xcf */
19188/* File: armv5te/alt_stub.S */
19189/*
19190 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19191 * any interesting requests and then jump to the real instruction
19192 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19193 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19194 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19195 * bail to the real handler if breakFlags==0.
19196 */
19197    ldrb   r3, [rSELF, #offThread_breakFlags]
19198    adrl   lr, dvmAsmInstructionStart + (207 * 64)
19199    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19200    cmp    r3, #0
19201    bxeq   lr                   @ nothing to do - jump to real handler
19202    EXPORT_PC()
19203    mov    r0, rPC              @ arg0
19204    mov    r1, rFP              @ arg1
19205    mov    r2, rSELF            @ arg2
19206    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19207
19208/* ------------------------------ */
19209    .balign 64
19210.L_ALT_OP_ADD_INT_LIT16: /* 0xd0 */
19211/* File: armv5te/alt_stub.S */
19212/*
19213 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19214 * any interesting requests and then jump to the real instruction
19215 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19216 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19217 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19218 * bail to the real handler if breakFlags==0.
19219 */
19220    ldrb   r3, [rSELF, #offThread_breakFlags]
19221    adrl   lr, dvmAsmInstructionStart + (208 * 64)
19222    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19223    cmp    r3, #0
19224    bxeq   lr                   @ nothing to do - jump to real handler
19225    EXPORT_PC()
19226    mov    r0, rPC              @ arg0
19227    mov    r1, rFP              @ arg1
19228    mov    r2, rSELF            @ arg2
19229    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19230
19231/* ------------------------------ */
19232    .balign 64
19233.L_ALT_OP_RSUB_INT: /* 0xd1 */
19234/* File: armv5te/alt_stub.S */
19235/*
19236 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19237 * any interesting requests and then jump to the real instruction
19238 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19239 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19240 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19241 * bail to the real handler if breakFlags==0.
19242 */
19243    ldrb   r3, [rSELF, #offThread_breakFlags]
19244    adrl   lr, dvmAsmInstructionStart + (209 * 64)
19245    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19246    cmp    r3, #0
19247    bxeq   lr                   @ nothing to do - jump to real handler
19248    EXPORT_PC()
19249    mov    r0, rPC              @ arg0
19250    mov    r1, rFP              @ arg1
19251    mov    r2, rSELF            @ arg2
19252    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19253
19254/* ------------------------------ */
19255    .balign 64
19256.L_ALT_OP_MUL_INT_LIT16: /* 0xd2 */
19257/* File: armv5te/alt_stub.S */
19258/*
19259 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19260 * any interesting requests and then jump to the real instruction
19261 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19262 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19263 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19264 * bail to the real handler if breakFlags==0.
19265 */
19266    ldrb   r3, [rSELF, #offThread_breakFlags]
19267    adrl   lr, dvmAsmInstructionStart + (210 * 64)
19268    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19269    cmp    r3, #0
19270    bxeq   lr                   @ nothing to do - jump to real handler
19271    EXPORT_PC()
19272    mov    r0, rPC              @ arg0
19273    mov    r1, rFP              @ arg1
19274    mov    r2, rSELF            @ arg2
19275    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19276
19277/* ------------------------------ */
19278    .balign 64
19279.L_ALT_OP_DIV_INT_LIT16: /* 0xd3 */
19280/* File: armv5te/alt_stub.S */
19281/*
19282 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19283 * any interesting requests and then jump to the real instruction
19284 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19285 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19286 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19287 * bail to the real handler if breakFlags==0.
19288 */
19289    ldrb   r3, [rSELF, #offThread_breakFlags]
19290    adrl   lr, dvmAsmInstructionStart + (211 * 64)
19291    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19292    cmp    r3, #0
19293    bxeq   lr                   @ nothing to do - jump to real handler
19294    EXPORT_PC()
19295    mov    r0, rPC              @ arg0
19296    mov    r1, rFP              @ arg1
19297    mov    r2, rSELF            @ arg2
19298    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19299
19300/* ------------------------------ */
19301    .balign 64
19302.L_ALT_OP_REM_INT_LIT16: /* 0xd4 */
19303/* File: armv5te/alt_stub.S */
19304/*
19305 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19306 * any interesting requests and then jump to the real instruction
19307 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19308 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19309 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19310 * bail to the real handler if breakFlags==0.
19311 */
19312    ldrb   r3, [rSELF, #offThread_breakFlags]
19313    adrl   lr, dvmAsmInstructionStart + (212 * 64)
19314    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19315    cmp    r3, #0
19316    bxeq   lr                   @ nothing to do - jump to real handler
19317    EXPORT_PC()
19318    mov    r0, rPC              @ arg0
19319    mov    r1, rFP              @ arg1
19320    mov    r2, rSELF            @ arg2
19321    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19322
19323/* ------------------------------ */
19324    .balign 64
19325.L_ALT_OP_AND_INT_LIT16: /* 0xd5 */
19326/* File: armv5te/alt_stub.S */
19327/*
19328 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19329 * any interesting requests and then jump to the real instruction
19330 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19331 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19332 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19333 * bail to the real handler if breakFlags==0.
19334 */
19335    ldrb   r3, [rSELF, #offThread_breakFlags]
19336    adrl   lr, dvmAsmInstructionStart + (213 * 64)
19337    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19338    cmp    r3, #0
19339    bxeq   lr                   @ nothing to do - jump to real handler
19340    EXPORT_PC()
19341    mov    r0, rPC              @ arg0
19342    mov    r1, rFP              @ arg1
19343    mov    r2, rSELF            @ arg2
19344    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19345
19346/* ------------------------------ */
19347    .balign 64
19348.L_ALT_OP_OR_INT_LIT16: /* 0xd6 */
19349/* File: armv5te/alt_stub.S */
19350/*
19351 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19352 * any interesting requests and then jump to the real instruction
19353 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19354 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19355 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19356 * bail to the real handler if breakFlags==0.
19357 */
19358    ldrb   r3, [rSELF, #offThread_breakFlags]
19359    adrl   lr, dvmAsmInstructionStart + (214 * 64)
19360    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19361    cmp    r3, #0
19362    bxeq   lr                   @ nothing to do - jump to real handler
19363    EXPORT_PC()
19364    mov    r0, rPC              @ arg0
19365    mov    r1, rFP              @ arg1
19366    mov    r2, rSELF            @ arg2
19367    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19368
19369/* ------------------------------ */
19370    .balign 64
19371.L_ALT_OP_XOR_INT_LIT16: /* 0xd7 */
19372/* File: armv5te/alt_stub.S */
19373/*
19374 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19375 * any interesting requests and then jump to the real instruction
19376 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19377 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19378 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19379 * bail to the real handler if breakFlags==0.
19380 */
19381    ldrb   r3, [rSELF, #offThread_breakFlags]
19382    adrl   lr, dvmAsmInstructionStart + (215 * 64)
19383    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19384    cmp    r3, #0
19385    bxeq   lr                   @ nothing to do - jump to real handler
19386    EXPORT_PC()
19387    mov    r0, rPC              @ arg0
19388    mov    r1, rFP              @ arg1
19389    mov    r2, rSELF            @ arg2
19390    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19391
19392/* ------------------------------ */
19393    .balign 64
19394.L_ALT_OP_ADD_INT_LIT8: /* 0xd8 */
19395/* File: armv5te/alt_stub.S */
19396/*
19397 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19398 * any interesting requests and then jump to the real instruction
19399 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19400 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19401 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19402 * bail to the real handler if breakFlags==0.
19403 */
19404    ldrb   r3, [rSELF, #offThread_breakFlags]
19405    adrl   lr, dvmAsmInstructionStart + (216 * 64)
19406    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19407    cmp    r3, #0
19408    bxeq   lr                   @ nothing to do - jump to real handler
19409    EXPORT_PC()
19410    mov    r0, rPC              @ arg0
19411    mov    r1, rFP              @ arg1
19412    mov    r2, rSELF            @ arg2
19413    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19414
19415/* ------------------------------ */
19416    .balign 64
19417.L_ALT_OP_RSUB_INT_LIT8: /* 0xd9 */
19418/* File: armv5te/alt_stub.S */
19419/*
19420 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19421 * any interesting requests and then jump to the real instruction
19422 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19423 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19424 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19425 * bail to the real handler if breakFlags==0.
19426 */
19427    ldrb   r3, [rSELF, #offThread_breakFlags]
19428    adrl   lr, dvmAsmInstructionStart + (217 * 64)
19429    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19430    cmp    r3, #0
19431    bxeq   lr                   @ nothing to do - jump to real handler
19432    EXPORT_PC()
19433    mov    r0, rPC              @ arg0
19434    mov    r1, rFP              @ arg1
19435    mov    r2, rSELF            @ arg2
19436    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19437
19438/* ------------------------------ */
19439    .balign 64
19440.L_ALT_OP_MUL_INT_LIT8: /* 0xda */
19441/* File: armv5te/alt_stub.S */
19442/*
19443 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19444 * any interesting requests and then jump to the real instruction
19445 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19446 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19447 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19448 * bail to the real handler if breakFlags==0.
19449 */
19450    ldrb   r3, [rSELF, #offThread_breakFlags]
19451    adrl   lr, dvmAsmInstructionStart + (218 * 64)
19452    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19453    cmp    r3, #0
19454    bxeq   lr                   @ nothing to do - jump to real handler
19455    EXPORT_PC()
19456    mov    r0, rPC              @ arg0
19457    mov    r1, rFP              @ arg1
19458    mov    r2, rSELF            @ arg2
19459    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19460
19461/* ------------------------------ */
19462    .balign 64
19463.L_ALT_OP_DIV_INT_LIT8: /* 0xdb */
19464/* File: armv5te/alt_stub.S */
19465/*
19466 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19467 * any interesting requests and then jump to the real instruction
19468 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19469 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19470 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19471 * bail to the real handler if breakFlags==0.
19472 */
19473    ldrb   r3, [rSELF, #offThread_breakFlags]
19474    adrl   lr, dvmAsmInstructionStart + (219 * 64)
19475    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19476    cmp    r3, #0
19477    bxeq   lr                   @ nothing to do - jump to real handler
19478    EXPORT_PC()
19479    mov    r0, rPC              @ arg0
19480    mov    r1, rFP              @ arg1
19481    mov    r2, rSELF            @ arg2
19482    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19483
19484/* ------------------------------ */
19485    .balign 64
19486.L_ALT_OP_REM_INT_LIT8: /* 0xdc */
19487/* File: armv5te/alt_stub.S */
19488/*
19489 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19490 * any interesting requests and then jump to the real instruction
19491 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19492 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19493 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19494 * bail to the real handler if breakFlags==0.
19495 */
19496    ldrb   r3, [rSELF, #offThread_breakFlags]
19497    adrl   lr, dvmAsmInstructionStart + (220 * 64)
19498    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19499    cmp    r3, #0
19500    bxeq   lr                   @ nothing to do - jump to real handler
19501    EXPORT_PC()
19502    mov    r0, rPC              @ arg0
19503    mov    r1, rFP              @ arg1
19504    mov    r2, rSELF            @ arg2
19505    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19506
19507/* ------------------------------ */
19508    .balign 64
19509.L_ALT_OP_AND_INT_LIT8: /* 0xdd */
19510/* File: armv5te/alt_stub.S */
19511/*
19512 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19513 * any interesting requests and then jump to the real instruction
19514 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19515 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19516 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19517 * bail to the real handler if breakFlags==0.
19518 */
19519    ldrb   r3, [rSELF, #offThread_breakFlags]
19520    adrl   lr, dvmAsmInstructionStart + (221 * 64)
19521    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19522    cmp    r3, #0
19523    bxeq   lr                   @ nothing to do - jump to real handler
19524    EXPORT_PC()
19525    mov    r0, rPC              @ arg0
19526    mov    r1, rFP              @ arg1
19527    mov    r2, rSELF            @ arg2
19528    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19529
19530/* ------------------------------ */
19531    .balign 64
19532.L_ALT_OP_OR_INT_LIT8: /* 0xde */
19533/* File: armv5te/alt_stub.S */
19534/*
19535 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19536 * any interesting requests and then jump to the real instruction
19537 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19538 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19539 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19540 * bail to the real handler if breakFlags==0.
19541 */
19542    ldrb   r3, [rSELF, #offThread_breakFlags]
19543    adrl   lr, dvmAsmInstructionStart + (222 * 64)
19544    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19545    cmp    r3, #0
19546    bxeq   lr                   @ nothing to do - jump to real handler
19547    EXPORT_PC()
19548    mov    r0, rPC              @ arg0
19549    mov    r1, rFP              @ arg1
19550    mov    r2, rSELF            @ arg2
19551    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19552
19553/* ------------------------------ */
19554    .balign 64
19555.L_ALT_OP_XOR_INT_LIT8: /* 0xdf */
19556/* File: armv5te/alt_stub.S */
19557/*
19558 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19559 * any interesting requests and then jump to the real instruction
19560 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19561 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19562 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19563 * bail to the real handler if breakFlags==0.
19564 */
19565    ldrb   r3, [rSELF, #offThread_breakFlags]
19566    adrl   lr, dvmAsmInstructionStart + (223 * 64)
19567    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19568    cmp    r3, #0
19569    bxeq   lr                   @ nothing to do - jump to real handler
19570    EXPORT_PC()
19571    mov    r0, rPC              @ arg0
19572    mov    r1, rFP              @ arg1
19573    mov    r2, rSELF            @ arg2
19574    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19575
19576/* ------------------------------ */
19577    .balign 64
19578.L_ALT_OP_SHL_INT_LIT8: /* 0xe0 */
19579/* File: armv5te/alt_stub.S */
19580/*
19581 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19582 * any interesting requests and then jump to the real instruction
19583 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19584 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19585 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19586 * bail to the real handler if breakFlags==0.
19587 */
19588    ldrb   r3, [rSELF, #offThread_breakFlags]
19589    adrl   lr, dvmAsmInstructionStart + (224 * 64)
19590    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19591    cmp    r3, #0
19592    bxeq   lr                   @ nothing to do - jump to real handler
19593    EXPORT_PC()
19594    mov    r0, rPC              @ arg0
19595    mov    r1, rFP              @ arg1
19596    mov    r2, rSELF            @ arg2
19597    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19598
19599/* ------------------------------ */
19600    .balign 64
19601.L_ALT_OP_SHR_INT_LIT8: /* 0xe1 */
19602/* File: armv5te/alt_stub.S */
19603/*
19604 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19605 * any interesting requests and then jump to the real instruction
19606 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19607 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19608 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19609 * bail to the real handler if breakFlags==0.
19610 */
19611    ldrb   r3, [rSELF, #offThread_breakFlags]
19612    adrl   lr, dvmAsmInstructionStart + (225 * 64)
19613    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19614    cmp    r3, #0
19615    bxeq   lr                   @ nothing to do - jump to real handler
19616    EXPORT_PC()
19617    mov    r0, rPC              @ arg0
19618    mov    r1, rFP              @ arg1
19619    mov    r2, rSELF            @ arg2
19620    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19621
19622/* ------------------------------ */
19623    .balign 64
19624.L_ALT_OP_USHR_INT_LIT8: /* 0xe2 */
19625/* File: armv5te/alt_stub.S */
19626/*
19627 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19628 * any interesting requests and then jump to the real instruction
19629 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19630 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19631 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19632 * bail to the real handler if breakFlags==0.
19633 */
19634    ldrb   r3, [rSELF, #offThread_breakFlags]
19635    adrl   lr, dvmAsmInstructionStart + (226 * 64)
19636    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19637    cmp    r3, #0
19638    bxeq   lr                   @ nothing to do - jump to real handler
19639    EXPORT_PC()
19640    mov    r0, rPC              @ arg0
19641    mov    r1, rFP              @ arg1
19642    mov    r2, rSELF            @ arg2
19643    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19644
19645/* ------------------------------ */
19646    .balign 64
19647.L_ALT_OP_IGET_VOLATILE: /* 0xe3 */
19648/* File: armv5te/alt_stub.S */
19649/*
19650 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19651 * any interesting requests and then jump to the real instruction
19652 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19653 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19654 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19655 * bail to the real handler if breakFlags==0.
19656 */
19657    ldrb   r3, [rSELF, #offThread_breakFlags]
19658    adrl   lr, dvmAsmInstructionStart + (227 * 64)
19659    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19660    cmp    r3, #0
19661    bxeq   lr                   @ nothing to do - jump to real handler
19662    EXPORT_PC()
19663    mov    r0, rPC              @ arg0
19664    mov    r1, rFP              @ arg1
19665    mov    r2, rSELF            @ arg2
19666    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19667
19668/* ------------------------------ */
19669    .balign 64
19670.L_ALT_OP_IPUT_VOLATILE: /* 0xe4 */
19671/* File: armv5te/alt_stub.S */
19672/*
19673 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19674 * any interesting requests and then jump to the real instruction
19675 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19676 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19677 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19678 * bail to the real handler if breakFlags==0.
19679 */
19680    ldrb   r3, [rSELF, #offThread_breakFlags]
19681    adrl   lr, dvmAsmInstructionStart + (228 * 64)
19682    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19683    cmp    r3, #0
19684    bxeq   lr                   @ nothing to do - jump to real handler
19685    EXPORT_PC()
19686    mov    r0, rPC              @ arg0
19687    mov    r1, rFP              @ arg1
19688    mov    r2, rSELF            @ arg2
19689    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19690
19691/* ------------------------------ */
19692    .balign 64
19693.L_ALT_OP_SGET_VOLATILE: /* 0xe5 */
19694/* File: armv5te/alt_stub.S */
19695/*
19696 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19697 * any interesting requests and then jump to the real instruction
19698 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19699 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19700 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19701 * bail to the real handler if breakFlags==0.
19702 */
19703    ldrb   r3, [rSELF, #offThread_breakFlags]
19704    adrl   lr, dvmAsmInstructionStart + (229 * 64)
19705    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19706    cmp    r3, #0
19707    bxeq   lr                   @ nothing to do - jump to real handler
19708    EXPORT_PC()
19709    mov    r0, rPC              @ arg0
19710    mov    r1, rFP              @ arg1
19711    mov    r2, rSELF            @ arg2
19712    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19713
19714/* ------------------------------ */
19715    .balign 64
19716.L_ALT_OP_SPUT_VOLATILE: /* 0xe6 */
19717/* File: armv5te/alt_stub.S */
19718/*
19719 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19720 * any interesting requests and then jump to the real instruction
19721 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19722 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19723 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19724 * bail to the real handler if breakFlags==0.
19725 */
19726    ldrb   r3, [rSELF, #offThread_breakFlags]
19727    adrl   lr, dvmAsmInstructionStart + (230 * 64)
19728    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19729    cmp    r3, #0
19730    bxeq   lr                   @ nothing to do - jump to real handler
19731    EXPORT_PC()
19732    mov    r0, rPC              @ arg0
19733    mov    r1, rFP              @ arg1
19734    mov    r2, rSELF            @ arg2
19735    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19736
19737/* ------------------------------ */
19738    .balign 64
19739.L_ALT_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
19740/* File: armv5te/alt_stub.S */
19741/*
19742 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19743 * any interesting requests and then jump to the real instruction
19744 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19745 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19746 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19747 * bail to the real handler if breakFlags==0.
19748 */
19749    ldrb   r3, [rSELF, #offThread_breakFlags]
19750    adrl   lr, dvmAsmInstructionStart + (231 * 64)
19751    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19752    cmp    r3, #0
19753    bxeq   lr                   @ nothing to do - jump to real handler
19754    EXPORT_PC()
19755    mov    r0, rPC              @ arg0
19756    mov    r1, rFP              @ arg1
19757    mov    r2, rSELF            @ arg2
19758    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19759
19760/* ------------------------------ */
19761    .balign 64
19762.L_ALT_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
19763/* File: armv5te/alt_stub.S */
19764/*
19765 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19766 * any interesting requests and then jump to the real instruction
19767 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19768 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19769 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19770 * bail to the real handler if breakFlags==0.
19771 */
19772    ldrb   r3, [rSELF, #offThread_breakFlags]
19773    adrl   lr, dvmAsmInstructionStart + (232 * 64)
19774    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19775    cmp    r3, #0
19776    bxeq   lr                   @ nothing to do - jump to real handler
19777    EXPORT_PC()
19778    mov    r0, rPC              @ arg0
19779    mov    r1, rFP              @ arg1
19780    mov    r2, rSELF            @ arg2
19781    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19782
19783/* ------------------------------ */
19784    .balign 64
19785.L_ALT_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
19786/* File: armv5te/alt_stub.S */
19787/*
19788 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19789 * any interesting requests and then jump to the real instruction
19790 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19791 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19792 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19793 * bail to the real handler if breakFlags==0.
19794 */
19795    ldrb   r3, [rSELF, #offThread_breakFlags]
19796    adrl   lr, dvmAsmInstructionStart + (233 * 64)
19797    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19798    cmp    r3, #0
19799    bxeq   lr                   @ nothing to do - jump to real handler
19800    EXPORT_PC()
19801    mov    r0, rPC              @ arg0
19802    mov    r1, rFP              @ arg1
19803    mov    r2, rSELF            @ arg2
19804    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19805
19806/* ------------------------------ */
19807    .balign 64
19808.L_ALT_OP_SGET_WIDE_VOLATILE: /* 0xea */
19809/* File: armv5te/alt_stub.S */
19810/*
19811 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19812 * any interesting requests and then jump to the real instruction
19813 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19814 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19815 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19816 * bail to the real handler if breakFlags==0.
19817 */
19818    ldrb   r3, [rSELF, #offThread_breakFlags]
19819    adrl   lr, dvmAsmInstructionStart + (234 * 64)
19820    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19821    cmp    r3, #0
19822    bxeq   lr                   @ nothing to do - jump to real handler
19823    EXPORT_PC()
19824    mov    r0, rPC              @ arg0
19825    mov    r1, rFP              @ arg1
19826    mov    r2, rSELF            @ arg2
19827    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19828
19829/* ------------------------------ */
19830    .balign 64
19831.L_ALT_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
19832/* File: armv5te/alt_stub.S */
19833/*
19834 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19835 * any interesting requests and then jump to the real instruction
19836 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19837 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19838 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19839 * bail to the real handler if breakFlags==0.
19840 */
19841    ldrb   r3, [rSELF, #offThread_breakFlags]
19842    adrl   lr, dvmAsmInstructionStart + (235 * 64)
19843    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19844    cmp    r3, #0
19845    bxeq   lr                   @ nothing to do - jump to real handler
19846    EXPORT_PC()
19847    mov    r0, rPC              @ arg0
19848    mov    r1, rFP              @ arg1
19849    mov    r2, rSELF            @ arg2
19850    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19851
19852/* ------------------------------ */
19853    .balign 64
19854.L_ALT_OP_BREAKPOINT: /* 0xec */
19855/* File: armv5te/alt_stub.S */
19856/*
19857 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19858 * any interesting requests and then jump to the real instruction
19859 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19860 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19861 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19862 * bail to the real handler if breakFlags==0.
19863 */
19864    ldrb   r3, [rSELF, #offThread_breakFlags]
19865    adrl   lr, dvmAsmInstructionStart + (236 * 64)
19866    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19867    cmp    r3, #0
19868    bxeq   lr                   @ nothing to do - jump to real handler
19869    EXPORT_PC()
19870    mov    r0, rPC              @ arg0
19871    mov    r1, rFP              @ arg1
19872    mov    r2, rSELF            @ arg2
19873    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19874
19875/* ------------------------------ */
19876    .balign 64
19877.L_ALT_OP_THROW_VERIFICATION_ERROR: /* 0xed */
19878/* File: armv5te/alt_stub.S */
19879/*
19880 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19881 * any interesting requests and then jump to the real instruction
19882 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19883 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19884 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19885 * bail to the real handler if breakFlags==0.
19886 */
19887    ldrb   r3, [rSELF, #offThread_breakFlags]
19888    adrl   lr, dvmAsmInstructionStart + (237 * 64)
19889    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19890    cmp    r3, #0
19891    bxeq   lr                   @ nothing to do - jump to real handler
19892    EXPORT_PC()
19893    mov    r0, rPC              @ arg0
19894    mov    r1, rFP              @ arg1
19895    mov    r2, rSELF            @ arg2
19896    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19897
19898/* ------------------------------ */
19899    .balign 64
19900.L_ALT_OP_EXECUTE_INLINE: /* 0xee */
19901/* File: armv5te/alt_stub.S */
19902/*
19903 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19904 * any interesting requests and then jump to the real instruction
19905 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19906 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19907 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19908 * bail to the real handler if breakFlags==0.
19909 */
19910    ldrb   r3, [rSELF, #offThread_breakFlags]
19911    adrl   lr, dvmAsmInstructionStart + (238 * 64)
19912    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19913    cmp    r3, #0
19914    bxeq   lr                   @ nothing to do - jump to real handler
19915    EXPORT_PC()
19916    mov    r0, rPC              @ arg0
19917    mov    r1, rFP              @ arg1
19918    mov    r2, rSELF            @ arg2
19919    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19920
19921/* ------------------------------ */
19922    .balign 64
19923.L_ALT_OP_EXECUTE_INLINE_RANGE: /* 0xef */
19924/* File: armv5te/alt_stub.S */
19925/*
19926 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19927 * any interesting requests and then jump to the real instruction
19928 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19929 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19930 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19931 * bail to the real handler if breakFlags==0.
19932 */
19933    ldrb   r3, [rSELF, #offThread_breakFlags]
19934    adrl   lr, dvmAsmInstructionStart + (239 * 64)
19935    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19936    cmp    r3, #0
19937    bxeq   lr                   @ nothing to do - jump to real handler
19938    EXPORT_PC()
19939    mov    r0, rPC              @ arg0
19940    mov    r1, rFP              @ arg1
19941    mov    r2, rSELF            @ arg2
19942    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19943
19944/* ------------------------------ */
19945    .balign 64
19946.L_ALT_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
19947/* File: armv5te/alt_stub.S */
19948/*
19949 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19950 * any interesting requests and then jump to the real instruction
19951 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19952 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19953 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19954 * bail to the real handler if breakFlags==0.
19955 */
19956    ldrb   r3, [rSELF, #offThread_breakFlags]
19957    adrl   lr, dvmAsmInstructionStart + (240 * 64)
19958    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19959    cmp    r3, #0
19960    bxeq   lr                   @ nothing to do - jump to real handler
19961    EXPORT_PC()
19962    mov    r0, rPC              @ arg0
19963    mov    r1, rFP              @ arg1
19964    mov    r2, rSELF            @ arg2
19965    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19966
19967/* ------------------------------ */
19968    .balign 64
19969.L_ALT_OP_RETURN_VOID_BARRIER: /* 0xf1 */
19970/* File: armv5te/alt_stub.S */
19971/*
19972 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19973 * any interesting requests and then jump to the real instruction
19974 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19975 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19976 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19977 * bail to the real handler if breakFlags==0.
19978 */
19979    ldrb   r3, [rSELF, #offThread_breakFlags]
19980    adrl   lr, dvmAsmInstructionStart + (241 * 64)
19981    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19982    cmp    r3, #0
19983    bxeq   lr                   @ nothing to do - jump to real handler
19984    EXPORT_PC()
19985    mov    r0, rPC              @ arg0
19986    mov    r1, rFP              @ arg1
19987    mov    r2, rSELF            @ arg2
19988    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19989
19990/* ------------------------------ */
19991    .balign 64
19992.L_ALT_OP_IGET_QUICK: /* 0xf2 */
19993/* File: armv5te/alt_stub.S */
19994/*
19995 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19996 * any interesting requests and then jump to the real instruction
19997 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19998 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19999 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20000 * bail to the real handler if breakFlags==0.
20001 */
20002    ldrb   r3, [rSELF, #offThread_breakFlags]
20003    adrl   lr, dvmAsmInstructionStart + (242 * 64)
20004    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20005    cmp    r3, #0
20006    bxeq   lr                   @ nothing to do - jump to real handler
20007    EXPORT_PC()
20008    mov    r0, rPC              @ arg0
20009    mov    r1, rFP              @ arg1
20010    mov    r2, rSELF            @ arg2
20011    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20012
20013/* ------------------------------ */
20014    .balign 64
20015.L_ALT_OP_IGET_WIDE_QUICK: /* 0xf3 */
20016/* File: armv5te/alt_stub.S */
20017/*
20018 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20019 * any interesting requests and then jump to the real instruction
20020 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20021 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20022 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20023 * bail to the real handler if breakFlags==0.
20024 */
20025    ldrb   r3, [rSELF, #offThread_breakFlags]
20026    adrl   lr, dvmAsmInstructionStart + (243 * 64)
20027    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20028    cmp    r3, #0
20029    bxeq   lr                   @ nothing to do - jump to real handler
20030    EXPORT_PC()
20031    mov    r0, rPC              @ arg0
20032    mov    r1, rFP              @ arg1
20033    mov    r2, rSELF            @ arg2
20034    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20035
20036/* ------------------------------ */
20037    .balign 64
20038.L_ALT_OP_IGET_OBJECT_QUICK: /* 0xf4 */
20039/* File: armv5te/alt_stub.S */
20040/*
20041 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20042 * any interesting requests and then jump to the real instruction
20043 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20044 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20045 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20046 * bail to the real handler if breakFlags==0.
20047 */
20048    ldrb   r3, [rSELF, #offThread_breakFlags]
20049    adrl   lr, dvmAsmInstructionStart + (244 * 64)
20050    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20051    cmp    r3, #0
20052    bxeq   lr                   @ nothing to do - jump to real handler
20053    EXPORT_PC()
20054    mov    r0, rPC              @ arg0
20055    mov    r1, rFP              @ arg1
20056    mov    r2, rSELF            @ arg2
20057    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20058
20059/* ------------------------------ */
20060    .balign 64
20061.L_ALT_OP_IPUT_QUICK: /* 0xf5 */
20062/* File: armv5te/alt_stub.S */
20063/*
20064 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20065 * any interesting requests and then jump to the real instruction
20066 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20067 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20068 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20069 * bail to the real handler if breakFlags==0.
20070 */
20071    ldrb   r3, [rSELF, #offThread_breakFlags]
20072    adrl   lr, dvmAsmInstructionStart + (245 * 64)
20073    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20074    cmp    r3, #0
20075    bxeq   lr                   @ nothing to do - jump to real handler
20076    EXPORT_PC()
20077    mov    r0, rPC              @ arg0
20078    mov    r1, rFP              @ arg1
20079    mov    r2, rSELF            @ arg2
20080    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20081
20082/* ------------------------------ */
20083    .balign 64
20084.L_ALT_OP_IPUT_WIDE_QUICK: /* 0xf6 */
20085/* File: armv5te/alt_stub.S */
20086/*
20087 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20088 * any interesting requests and then jump to the real instruction
20089 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20090 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20091 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20092 * bail to the real handler if breakFlags==0.
20093 */
20094    ldrb   r3, [rSELF, #offThread_breakFlags]
20095    adrl   lr, dvmAsmInstructionStart + (246 * 64)
20096    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20097    cmp    r3, #0
20098    bxeq   lr                   @ nothing to do - jump to real handler
20099    EXPORT_PC()
20100    mov    r0, rPC              @ arg0
20101    mov    r1, rFP              @ arg1
20102    mov    r2, rSELF            @ arg2
20103    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20104
20105/* ------------------------------ */
20106    .balign 64
20107.L_ALT_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
20108/* File: armv5te/alt_stub.S */
20109/*
20110 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20111 * any interesting requests and then jump to the real instruction
20112 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20113 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20114 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20115 * bail to the real handler if breakFlags==0.
20116 */
20117    ldrb   r3, [rSELF, #offThread_breakFlags]
20118    adrl   lr, dvmAsmInstructionStart + (247 * 64)
20119    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20120    cmp    r3, #0
20121    bxeq   lr                   @ nothing to do - jump to real handler
20122    EXPORT_PC()
20123    mov    r0, rPC              @ arg0
20124    mov    r1, rFP              @ arg1
20125    mov    r2, rSELF            @ arg2
20126    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20127
20128/* ------------------------------ */
20129    .balign 64
20130.L_ALT_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
20131/* File: armv5te/alt_stub.S */
20132/*
20133 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20134 * any interesting requests and then jump to the real instruction
20135 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20136 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20137 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20138 * bail to the real handler if breakFlags==0.
20139 */
20140    ldrb   r3, [rSELF, #offThread_breakFlags]
20141    adrl   lr, dvmAsmInstructionStart + (248 * 64)
20142    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20143    cmp    r3, #0
20144    bxeq   lr                   @ nothing to do - jump to real handler
20145    EXPORT_PC()
20146    mov    r0, rPC              @ arg0
20147    mov    r1, rFP              @ arg1
20148    mov    r2, rSELF            @ arg2
20149    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20150
20151/* ------------------------------ */
20152    .balign 64
20153.L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
20154/* File: armv5te/alt_stub.S */
20155/*
20156 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20157 * any interesting requests and then jump to the real instruction
20158 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20159 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20160 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20161 * bail to the real handler if breakFlags==0.
20162 */
20163    ldrb   r3, [rSELF, #offThread_breakFlags]
20164    adrl   lr, dvmAsmInstructionStart + (249 * 64)
20165    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20166    cmp    r3, #0
20167    bxeq   lr                   @ nothing to do - jump to real handler
20168    EXPORT_PC()
20169    mov    r0, rPC              @ arg0
20170    mov    r1, rFP              @ arg1
20171    mov    r2, rSELF            @ arg2
20172    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20173
20174/* ------------------------------ */
20175    .balign 64
20176.L_ALT_OP_INVOKE_SUPER_QUICK: /* 0xfa */
20177/* File: armv5te/alt_stub.S */
20178/*
20179 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20180 * any interesting requests and then jump to the real instruction
20181 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20182 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20183 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20184 * bail to the real handler if breakFlags==0.
20185 */
20186    ldrb   r3, [rSELF, #offThread_breakFlags]
20187    adrl   lr, dvmAsmInstructionStart + (250 * 64)
20188    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20189    cmp    r3, #0
20190    bxeq   lr                   @ nothing to do - jump to real handler
20191    EXPORT_PC()
20192    mov    r0, rPC              @ arg0
20193    mov    r1, rFP              @ arg1
20194    mov    r2, rSELF            @ arg2
20195    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20196
20197/* ------------------------------ */
20198    .balign 64
20199.L_ALT_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
20200/* File: armv5te/alt_stub.S */
20201/*
20202 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20203 * any interesting requests and then jump to the real instruction
20204 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20205 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20206 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20207 * bail to the real handler if breakFlags==0.
20208 */
20209    ldrb   r3, [rSELF, #offThread_breakFlags]
20210    adrl   lr, dvmAsmInstructionStart + (251 * 64)
20211    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20212    cmp    r3, #0
20213    bxeq   lr                   @ nothing to do - jump to real handler
20214    EXPORT_PC()
20215    mov    r0, rPC              @ arg0
20216    mov    r1, rFP              @ arg1
20217    mov    r2, rSELF            @ arg2
20218    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20219
20220/* ------------------------------ */
20221    .balign 64
20222.L_ALT_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
20223/* File: armv5te/alt_stub.S */
20224/*
20225 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20226 * any interesting requests and then jump to the real instruction
20227 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20228 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20229 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20230 * bail to the real handler if breakFlags==0.
20231 */
20232    ldrb   r3, [rSELF, #offThread_breakFlags]
20233    adrl   lr, dvmAsmInstructionStart + (252 * 64)
20234    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20235    cmp    r3, #0
20236    bxeq   lr                   @ nothing to do - jump to real handler
20237    EXPORT_PC()
20238    mov    r0, rPC              @ arg0
20239    mov    r1, rFP              @ arg1
20240    mov    r2, rSELF            @ arg2
20241    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20242
20243/* ------------------------------ */
20244    .balign 64
20245.L_ALT_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
20246/* File: armv5te/alt_stub.S */
20247/*
20248 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20249 * any interesting requests and then jump to the real instruction
20250 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20251 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20252 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20253 * bail to the real handler if breakFlags==0.
20254 */
20255    ldrb   r3, [rSELF, #offThread_breakFlags]
20256    adrl   lr, dvmAsmInstructionStart + (253 * 64)
20257    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20258    cmp    r3, #0
20259    bxeq   lr                   @ nothing to do - jump to real handler
20260    EXPORT_PC()
20261    mov    r0, rPC              @ arg0
20262    mov    r1, rFP              @ arg1
20263    mov    r2, rSELF            @ arg2
20264    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20265
20266/* ------------------------------ */
20267    .balign 64
20268.L_ALT_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
20269/* File: armv5te/alt_stub.S */
20270/*
20271 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20272 * any interesting requests and then jump to the real instruction
20273 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20274 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20275 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20276 * bail to the real handler if breakFlags==0.
20277 */
20278    ldrb   r3, [rSELF, #offThread_breakFlags]
20279    adrl   lr, dvmAsmInstructionStart + (254 * 64)
20280    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20281    cmp    r3, #0
20282    bxeq   lr                   @ nothing to do - jump to real handler
20283    EXPORT_PC()
20284    mov    r0, rPC              @ arg0
20285    mov    r1, rFP              @ arg1
20286    mov    r2, rSELF            @ arg2
20287    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20288
20289/* ------------------------------ */
20290    .balign 64
20291.L_ALT_OP_DISPATCH_FF: /* 0xff */
20292/* File: armv5te/alt_stub.S */
20293/*
20294 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20295 * any interesting requests and then jump to the real instruction
20296 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20297 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20298 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20299 * bail to the real handler if breakFlags==0.
20300 */
20301    ldrb   r3, [rSELF, #offThread_breakFlags]
20302    adrl   lr, dvmAsmInstructionStart + (255 * 64)
20303    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20304    cmp    r3, #0
20305    bxeq   lr                   @ nothing to do - jump to real handler
20306    EXPORT_PC()
20307    mov    r0, rPC              @ arg0
20308    mov    r1, rFP              @ arg1
20309    mov    r2, rSELF            @ arg2
20310    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20311
20312/* ------------------------------ */
20313    .balign 64
20314.L_ALT_OP_CONST_CLASS_JUMBO: /* 0x100 */
20315/* File: armv5te/alt_stub.S */
20316/*
20317 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20318 * any interesting requests and then jump to the real instruction
20319 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20320 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20321 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20322 * bail to the real handler if breakFlags==0.
20323 */
20324    ldrb   r3, [rSELF, #offThread_breakFlags]
20325    adrl   lr, dvmAsmInstructionStart + (256 * 64)
20326    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20327    cmp    r3, #0
20328    bxeq   lr                   @ nothing to do - jump to real handler
20329    EXPORT_PC()
20330    mov    r0, rPC              @ arg0
20331    mov    r1, rFP              @ arg1
20332    mov    r2, rSELF            @ arg2
20333    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20334
20335/* ------------------------------ */
20336    .balign 64
20337.L_ALT_OP_CHECK_CAST_JUMBO: /* 0x101 */
20338/* File: armv5te/alt_stub.S */
20339/*
20340 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20341 * any interesting requests and then jump to the real instruction
20342 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20343 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20344 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20345 * bail to the real handler if breakFlags==0.
20346 */
20347    ldrb   r3, [rSELF, #offThread_breakFlags]
20348    adrl   lr, dvmAsmInstructionStart + (257 * 64)
20349    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20350    cmp    r3, #0
20351    bxeq   lr                   @ nothing to do - jump to real handler
20352    EXPORT_PC()
20353    mov    r0, rPC              @ arg0
20354    mov    r1, rFP              @ arg1
20355    mov    r2, rSELF            @ arg2
20356    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20357
20358/* ------------------------------ */
20359    .balign 64
20360.L_ALT_OP_INSTANCE_OF_JUMBO: /* 0x102 */
20361/* File: armv5te/alt_stub.S */
20362/*
20363 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20364 * any interesting requests and then jump to the real instruction
20365 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20366 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20367 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20368 * bail to the real handler if breakFlags==0.
20369 */
20370    ldrb   r3, [rSELF, #offThread_breakFlags]
20371    adrl   lr, dvmAsmInstructionStart + (258 * 64)
20372    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20373    cmp    r3, #0
20374    bxeq   lr                   @ nothing to do - jump to real handler
20375    EXPORT_PC()
20376    mov    r0, rPC              @ arg0
20377    mov    r1, rFP              @ arg1
20378    mov    r2, rSELF            @ arg2
20379    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20380
20381/* ------------------------------ */
20382    .balign 64
20383.L_ALT_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
20384/* File: armv5te/alt_stub.S */
20385/*
20386 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20387 * any interesting requests and then jump to the real instruction
20388 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20389 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20390 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20391 * bail to the real handler if breakFlags==0.
20392 */
20393    ldrb   r3, [rSELF, #offThread_breakFlags]
20394    adrl   lr, dvmAsmInstructionStart + (259 * 64)
20395    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20396    cmp    r3, #0
20397    bxeq   lr                   @ nothing to do - jump to real handler
20398    EXPORT_PC()
20399    mov    r0, rPC              @ arg0
20400    mov    r1, rFP              @ arg1
20401    mov    r2, rSELF            @ arg2
20402    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20403
20404/* ------------------------------ */
20405    .balign 64
20406.L_ALT_OP_NEW_ARRAY_JUMBO: /* 0x104 */
20407/* File: armv5te/alt_stub.S */
20408/*
20409 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20410 * any interesting requests and then jump to the real instruction
20411 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20412 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20413 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20414 * bail to the real handler if breakFlags==0.
20415 */
20416    ldrb   r3, [rSELF, #offThread_breakFlags]
20417    adrl   lr, dvmAsmInstructionStart + (260 * 64)
20418    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20419    cmp    r3, #0
20420    bxeq   lr                   @ nothing to do - jump to real handler
20421    EXPORT_PC()
20422    mov    r0, rPC              @ arg0
20423    mov    r1, rFP              @ arg1
20424    mov    r2, rSELF            @ arg2
20425    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20426
20427/* ------------------------------ */
20428    .balign 64
20429.L_ALT_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
20430/* File: armv5te/alt_stub.S */
20431/*
20432 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20433 * any interesting requests and then jump to the real instruction
20434 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20435 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20436 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20437 * bail to the real handler if breakFlags==0.
20438 */
20439    ldrb   r3, [rSELF, #offThread_breakFlags]
20440    adrl   lr, dvmAsmInstructionStart + (261 * 64)
20441    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20442    cmp    r3, #0
20443    bxeq   lr                   @ nothing to do - jump to real handler
20444    EXPORT_PC()
20445    mov    r0, rPC              @ arg0
20446    mov    r1, rFP              @ arg1
20447    mov    r2, rSELF            @ arg2
20448    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20449
20450/* ------------------------------ */
20451    .balign 64
20452.L_ALT_OP_IGET_JUMBO: /* 0x106 */
20453/* File: armv5te/alt_stub.S */
20454/*
20455 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20456 * any interesting requests and then jump to the real instruction
20457 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20458 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20459 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20460 * bail to the real handler if breakFlags==0.
20461 */
20462    ldrb   r3, [rSELF, #offThread_breakFlags]
20463    adrl   lr, dvmAsmInstructionStart + (262 * 64)
20464    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20465    cmp    r3, #0
20466    bxeq   lr                   @ nothing to do - jump to real handler
20467    EXPORT_PC()
20468    mov    r0, rPC              @ arg0
20469    mov    r1, rFP              @ arg1
20470    mov    r2, rSELF            @ arg2
20471    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20472
20473/* ------------------------------ */
20474    .balign 64
20475.L_ALT_OP_IGET_WIDE_JUMBO: /* 0x107 */
20476/* File: armv5te/alt_stub.S */
20477/*
20478 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20479 * any interesting requests and then jump to the real instruction
20480 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20481 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20482 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20483 * bail to the real handler if breakFlags==0.
20484 */
20485    ldrb   r3, [rSELF, #offThread_breakFlags]
20486    adrl   lr, dvmAsmInstructionStart + (263 * 64)
20487    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20488    cmp    r3, #0
20489    bxeq   lr                   @ nothing to do - jump to real handler
20490    EXPORT_PC()
20491    mov    r0, rPC              @ arg0
20492    mov    r1, rFP              @ arg1
20493    mov    r2, rSELF            @ arg2
20494    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20495
20496/* ------------------------------ */
20497    .balign 64
20498.L_ALT_OP_IGET_OBJECT_JUMBO: /* 0x108 */
20499/* File: armv5te/alt_stub.S */
20500/*
20501 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20502 * any interesting requests and then jump to the real instruction
20503 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20504 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20505 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20506 * bail to the real handler if breakFlags==0.
20507 */
20508    ldrb   r3, [rSELF, #offThread_breakFlags]
20509    adrl   lr, dvmAsmInstructionStart + (264 * 64)
20510    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20511    cmp    r3, #0
20512    bxeq   lr                   @ nothing to do - jump to real handler
20513    EXPORT_PC()
20514    mov    r0, rPC              @ arg0
20515    mov    r1, rFP              @ arg1
20516    mov    r2, rSELF            @ arg2
20517    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20518
20519/* ------------------------------ */
20520    .balign 64
20521.L_ALT_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
20522/* File: armv5te/alt_stub.S */
20523/*
20524 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20525 * any interesting requests and then jump to the real instruction
20526 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20527 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20528 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20529 * bail to the real handler if breakFlags==0.
20530 */
20531    ldrb   r3, [rSELF, #offThread_breakFlags]
20532    adrl   lr, dvmAsmInstructionStart + (265 * 64)
20533    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20534    cmp    r3, #0
20535    bxeq   lr                   @ nothing to do - jump to real handler
20536    EXPORT_PC()
20537    mov    r0, rPC              @ arg0
20538    mov    r1, rFP              @ arg1
20539    mov    r2, rSELF            @ arg2
20540    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20541
20542/* ------------------------------ */
20543    .balign 64
20544.L_ALT_OP_IGET_BYTE_JUMBO: /* 0x10a */
20545/* File: armv5te/alt_stub.S */
20546/*
20547 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20548 * any interesting requests and then jump to the real instruction
20549 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20550 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20551 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20552 * bail to the real handler if breakFlags==0.
20553 */
20554    ldrb   r3, [rSELF, #offThread_breakFlags]
20555    adrl   lr, dvmAsmInstructionStart + (266 * 64)
20556    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20557    cmp    r3, #0
20558    bxeq   lr                   @ nothing to do - jump to real handler
20559    EXPORT_PC()
20560    mov    r0, rPC              @ arg0
20561    mov    r1, rFP              @ arg1
20562    mov    r2, rSELF            @ arg2
20563    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20564
20565/* ------------------------------ */
20566    .balign 64
20567.L_ALT_OP_IGET_CHAR_JUMBO: /* 0x10b */
20568/* File: armv5te/alt_stub.S */
20569/*
20570 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20571 * any interesting requests and then jump to the real instruction
20572 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20573 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20574 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20575 * bail to the real handler if breakFlags==0.
20576 */
20577    ldrb   r3, [rSELF, #offThread_breakFlags]
20578    adrl   lr, dvmAsmInstructionStart + (267 * 64)
20579    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20580    cmp    r3, #0
20581    bxeq   lr                   @ nothing to do - jump to real handler
20582    EXPORT_PC()
20583    mov    r0, rPC              @ arg0
20584    mov    r1, rFP              @ arg1
20585    mov    r2, rSELF            @ arg2
20586    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20587
20588/* ------------------------------ */
20589    .balign 64
20590.L_ALT_OP_IGET_SHORT_JUMBO: /* 0x10c */
20591/* File: armv5te/alt_stub.S */
20592/*
20593 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20594 * any interesting requests and then jump to the real instruction
20595 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20596 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20597 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20598 * bail to the real handler if breakFlags==0.
20599 */
20600    ldrb   r3, [rSELF, #offThread_breakFlags]
20601    adrl   lr, dvmAsmInstructionStart + (268 * 64)
20602    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20603    cmp    r3, #0
20604    bxeq   lr                   @ nothing to do - jump to real handler
20605    EXPORT_PC()
20606    mov    r0, rPC              @ arg0
20607    mov    r1, rFP              @ arg1
20608    mov    r2, rSELF            @ arg2
20609    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20610
20611/* ------------------------------ */
20612    .balign 64
20613.L_ALT_OP_IPUT_JUMBO: /* 0x10d */
20614/* File: armv5te/alt_stub.S */
20615/*
20616 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20617 * any interesting requests and then jump to the real instruction
20618 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20619 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20620 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20621 * bail to the real handler if breakFlags==0.
20622 */
20623    ldrb   r3, [rSELF, #offThread_breakFlags]
20624    adrl   lr, dvmAsmInstructionStart + (269 * 64)
20625    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20626    cmp    r3, #0
20627    bxeq   lr                   @ nothing to do - jump to real handler
20628    EXPORT_PC()
20629    mov    r0, rPC              @ arg0
20630    mov    r1, rFP              @ arg1
20631    mov    r2, rSELF            @ arg2
20632    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20633
20634/* ------------------------------ */
20635    .balign 64
20636.L_ALT_OP_IPUT_WIDE_JUMBO: /* 0x10e */
20637/* File: armv5te/alt_stub.S */
20638/*
20639 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20640 * any interesting requests and then jump to the real instruction
20641 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20642 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20643 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20644 * bail to the real handler if breakFlags==0.
20645 */
20646    ldrb   r3, [rSELF, #offThread_breakFlags]
20647    adrl   lr, dvmAsmInstructionStart + (270 * 64)
20648    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20649    cmp    r3, #0
20650    bxeq   lr                   @ nothing to do - jump to real handler
20651    EXPORT_PC()
20652    mov    r0, rPC              @ arg0
20653    mov    r1, rFP              @ arg1
20654    mov    r2, rSELF            @ arg2
20655    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20656
20657/* ------------------------------ */
20658    .balign 64
20659.L_ALT_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
20660/* File: armv5te/alt_stub.S */
20661/*
20662 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20663 * any interesting requests and then jump to the real instruction
20664 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20665 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20666 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20667 * bail to the real handler if breakFlags==0.
20668 */
20669    ldrb   r3, [rSELF, #offThread_breakFlags]
20670    adrl   lr, dvmAsmInstructionStart + (271 * 64)
20671    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20672    cmp    r3, #0
20673    bxeq   lr                   @ nothing to do - jump to real handler
20674    EXPORT_PC()
20675    mov    r0, rPC              @ arg0
20676    mov    r1, rFP              @ arg1
20677    mov    r2, rSELF            @ arg2
20678    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20679
20680/* ------------------------------ */
20681    .balign 64
20682.L_ALT_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
20683/* File: armv5te/alt_stub.S */
20684/*
20685 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20686 * any interesting requests and then jump to the real instruction
20687 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20688 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20689 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20690 * bail to the real handler if breakFlags==0.
20691 */
20692    ldrb   r3, [rSELF, #offThread_breakFlags]
20693    adrl   lr, dvmAsmInstructionStart + (272 * 64)
20694    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20695    cmp    r3, #0
20696    bxeq   lr                   @ nothing to do - jump to real handler
20697    EXPORT_PC()
20698    mov    r0, rPC              @ arg0
20699    mov    r1, rFP              @ arg1
20700    mov    r2, rSELF            @ arg2
20701    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20702
20703/* ------------------------------ */
20704    .balign 64
20705.L_ALT_OP_IPUT_BYTE_JUMBO: /* 0x111 */
20706/* File: armv5te/alt_stub.S */
20707/*
20708 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20709 * any interesting requests and then jump to the real instruction
20710 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20711 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20712 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20713 * bail to the real handler if breakFlags==0.
20714 */
20715    ldrb   r3, [rSELF, #offThread_breakFlags]
20716    adrl   lr, dvmAsmInstructionStart + (273 * 64)
20717    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20718    cmp    r3, #0
20719    bxeq   lr                   @ nothing to do - jump to real handler
20720    EXPORT_PC()
20721    mov    r0, rPC              @ arg0
20722    mov    r1, rFP              @ arg1
20723    mov    r2, rSELF            @ arg2
20724    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20725
20726/* ------------------------------ */
20727    .balign 64
20728.L_ALT_OP_IPUT_CHAR_JUMBO: /* 0x112 */
20729/* File: armv5te/alt_stub.S */
20730/*
20731 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20732 * any interesting requests and then jump to the real instruction
20733 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20734 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20735 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20736 * bail to the real handler if breakFlags==0.
20737 */
20738    ldrb   r3, [rSELF, #offThread_breakFlags]
20739    adrl   lr, dvmAsmInstructionStart + (274 * 64)
20740    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20741    cmp    r3, #0
20742    bxeq   lr                   @ nothing to do - jump to real handler
20743    EXPORT_PC()
20744    mov    r0, rPC              @ arg0
20745    mov    r1, rFP              @ arg1
20746    mov    r2, rSELF            @ arg2
20747    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20748
20749/* ------------------------------ */
20750    .balign 64
20751.L_ALT_OP_IPUT_SHORT_JUMBO: /* 0x113 */
20752/* File: armv5te/alt_stub.S */
20753/*
20754 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20755 * any interesting requests and then jump to the real instruction
20756 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20757 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20758 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20759 * bail to the real handler if breakFlags==0.
20760 */
20761    ldrb   r3, [rSELF, #offThread_breakFlags]
20762    adrl   lr, dvmAsmInstructionStart + (275 * 64)
20763    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20764    cmp    r3, #0
20765    bxeq   lr                   @ nothing to do - jump to real handler
20766    EXPORT_PC()
20767    mov    r0, rPC              @ arg0
20768    mov    r1, rFP              @ arg1
20769    mov    r2, rSELF            @ arg2
20770    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20771
20772/* ------------------------------ */
20773    .balign 64
20774.L_ALT_OP_SGET_JUMBO: /* 0x114 */
20775/* File: armv5te/alt_stub.S */
20776/*
20777 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20778 * any interesting requests and then jump to the real instruction
20779 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20780 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20781 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20782 * bail to the real handler if breakFlags==0.
20783 */
20784    ldrb   r3, [rSELF, #offThread_breakFlags]
20785    adrl   lr, dvmAsmInstructionStart + (276 * 64)
20786    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20787    cmp    r3, #0
20788    bxeq   lr                   @ nothing to do - jump to real handler
20789    EXPORT_PC()
20790    mov    r0, rPC              @ arg0
20791    mov    r1, rFP              @ arg1
20792    mov    r2, rSELF            @ arg2
20793    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20794
20795/* ------------------------------ */
20796    .balign 64
20797.L_ALT_OP_SGET_WIDE_JUMBO: /* 0x115 */
20798/* File: armv5te/alt_stub.S */
20799/*
20800 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20801 * any interesting requests and then jump to the real instruction
20802 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20803 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20804 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20805 * bail to the real handler if breakFlags==0.
20806 */
20807    ldrb   r3, [rSELF, #offThread_breakFlags]
20808    adrl   lr, dvmAsmInstructionStart + (277 * 64)
20809    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20810    cmp    r3, #0
20811    bxeq   lr                   @ nothing to do - jump to real handler
20812    EXPORT_PC()
20813    mov    r0, rPC              @ arg0
20814    mov    r1, rFP              @ arg1
20815    mov    r2, rSELF            @ arg2
20816    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20817
20818/* ------------------------------ */
20819    .balign 64
20820.L_ALT_OP_SGET_OBJECT_JUMBO: /* 0x116 */
20821/* File: armv5te/alt_stub.S */
20822/*
20823 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20824 * any interesting requests and then jump to the real instruction
20825 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20826 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20827 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20828 * bail to the real handler if breakFlags==0.
20829 */
20830    ldrb   r3, [rSELF, #offThread_breakFlags]
20831    adrl   lr, dvmAsmInstructionStart + (278 * 64)
20832    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20833    cmp    r3, #0
20834    bxeq   lr                   @ nothing to do - jump to real handler
20835    EXPORT_PC()
20836    mov    r0, rPC              @ arg0
20837    mov    r1, rFP              @ arg1
20838    mov    r2, rSELF            @ arg2
20839    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20840
20841/* ------------------------------ */
20842    .balign 64
20843.L_ALT_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
20844/* File: armv5te/alt_stub.S */
20845/*
20846 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20847 * any interesting requests and then jump to the real instruction
20848 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20849 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20850 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20851 * bail to the real handler if breakFlags==0.
20852 */
20853    ldrb   r3, [rSELF, #offThread_breakFlags]
20854    adrl   lr, dvmAsmInstructionStart + (279 * 64)
20855    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20856    cmp    r3, #0
20857    bxeq   lr                   @ nothing to do - jump to real handler
20858    EXPORT_PC()
20859    mov    r0, rPC              @ arg0
20860    mov    r1, rFP              @ arg1
20861    mov    r2, rSELF            @ arg2
20862    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20863
20864/* ------------------------------ */
20865    .balign 64
20866.L_ALT_OP_SGET_BYTE_JUMBO: /* 0x118 */
20867/* File: armv5te/alt_stub.S */
20868/*
20869 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20870 * any interesting requests and then jump to the real instruction
20871 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20872 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20873 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20874 * bail to the real handler if breakFlags==0.
20875 */
20876    ldrb   r3, [rSELF, #offThread_breakFlags]
20877    adrl   lr, dvmAsmInstructionStart + (280 * 64)
20878    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20879    cmp    r3, #0
20880    bxeq   lr                   @ nothing to do - jump to real handler
20881    EXPORT_PC()
20882    mov    r0, rPC              @ arg0
20883    mov    r1, rFP              @ arg1
20884    mov    r2, rSELF            @ arg2
20885    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20886
20887/* ------------------------------ */
20888    .balign 64
20889.L_ALT_OP_SGET_CHAR_JUMBO: /* 0x119 */
20890/* File: armv5te/alt_stub.S */
20891/*
20892 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20893 * any interesting requests and then jump to the real instruction
20894 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20895 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20896 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20897 * bail to the real handler if breakFlags==0.
20898 */
20899    ldrb   r3, [rSELF, #offThread_breakFlags]
20900    adrl   lr, dvmAsmInstructionStart + (281 * 64)
20901    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20902    cmp    r3, #0
20903    bxeq   lr                   @ nothing to do - jump to real handler
20904    EXPORT_PC()
20905    mov    r0, rPC              @ arg0
20906    mov    r1, rFP              @ arg1
20907    mov    r2, rSELF            @ arg2
20908    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20909
20910/* ------------------------------ */
20911    .balign 64
20912.L_ALT_OP_SGET_SHORT_JUMBO: /* 0x11a */
20913/* File: armv5te/alt_stub.S */
20914/*
20915 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20916 * any interesting requests and then jump to the real instruction
20917 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20918 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20919 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20920 * bail to the real handler if breakFlags==0.
20921 */
20922    ldrb   r3, [rSELF, #offThread_breakFlags]
20923    adrl   lr, dvmAsmInstructionStart + (282 * 64)
20924    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20925    cmp    r3, #0
20926    bxeq   lr                   @ nothing to do - jump to real handler
20927    EXPORT_PC()
20928    mov    r0, rPC              @ arg0
20929    mov    r1, rFP              @ arg1
20930    mov    r2, rSELF            @ arg2
20931    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20932
20933/* ------------------------------ */
20934    .balign 64
20935.L_ALT_OP_SPUT_JUMBO: /* 0x11b */
20936/* File: armv5te/alt_stub.S */
20937/*
20938 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20939 * any interesting requests and then jump to the real instruction
20940 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20941 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20942 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20943 * bail to the real handler if breakFlags==0.
20944 */
20945    ldrb   r3, [rSELF, #offThread_breakFlags]
20946    adrl   lr, dvmAsmInstructionStart + (283 * 64)
20947    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20948    cmp    r3, #0
20949    bxeq   lr                   @ nothing to do - jump to real handler
20950    EXPORT_PC()
20951    mov    r0, rPC              @ arg0
20952    mov    r1, rFP              @ arg1
20953    mov    r2, rSELF            @ arg2
20954    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20955
20956/* ------------------------------ */
20957    .balign 64
20958.L_ALT_OP_SPUT_WIDE_JUMBO: /* 0x11c */
20959/* File: armv5te/alt_stub.S */
20960/*
20961 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20962 * any interesting requests and then jump to the real instruction
20963 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20964 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20965 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20966 * bail to the real handler if breakFlags==0.
20967 */
20968    ldrb   r3, [rSELF, #offThread_breakFlags]
20969    adrl   lr, dvmAsmInstructionStart + (284 * 64)
20970    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20971    cmp    r3, #0
20972    bxeq   lr                   @ nothing to do - jump to real handler
20973    EXPORT_PC()
20974    mov    r0, rPC              @ arg0
20975    mov    r1, rFP              @ arg1
20976    mov    r2, rSELF            @ arg2
20977    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20978
20979/* ------------------------------ */
20980    .balign 64
20981.L_ALT_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
20982/* File: armv5te/alt_stub.S */
20983/*
20984 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20985 * any interesting requests and then jump to the real instruction
20986 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20987 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20988 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20989 * bail to the real handler if breakFlags==0.
20990 */
20991    ldrb   r3, [rSELF, #offThread_breakFlags]
20992    adrl   lr, dvmAsmInstructionStart + (285 * 64)
20993    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20994    cmp    r3, #0
20995    bxeq   lr                   @ nothing to do - jump to real handler
20996    EXPORT_PC()
20997    mov    r0, rPC              @ arg0
20998    mov    r1, rFP              @ arg1
20999    mov    r2, rSELF            @ arg2
21000    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21001
21002/* ------------------------------ */
21003    .balign 64
21004.L_ALT_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
21005/* File: armv5te/alt_stub.S */
21006/*
21007 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21008 * any interesting requests and then jump to the real instruction
21009 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21010 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21011 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21012 * bail to the real handler if breakFlags==0.
21013 */
21014    ldrb   r3, [rSELF, #offThread_breakFlags]
21015    adrl   lr, dvmAsmInstructionStart + (286 * 64)
21016    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21017    cmp    r3, #0
21018    bxeq   lr                   @ nothing to do - jump to real handler
21019    EXPORT_PC()
21020    mov    r0, rPC              @ arg0
21021    mov    r1, rFP              @ arg1
21022    mov    r2, rSELF            @ arg2
21023    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21024
21025/* ------------------------------ */
21026    .balign 64
21027.L_ALT_OP_SPUT_BYTE_JUMBO: /* 0x11f */
21028/* File: armv5te/alt_stub.S */
21029/*
21030 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21031 * any interesting requests and then jump to the real instruction
21032 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21033 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21034 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21035 * bail to the real handler if breakFlags==0.
21036 */
21037    ldrb   r3, [rSELF, #offThread_breakFlags]
21038    adrl   lr, dvmAsmInstructionStart + (287 * 64)
21039    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21040    cmp    r3, #0
21041    bxeq   lr                   @ nothing to do - jump to real handler
21042    EXPORT_PC()
21043    mov    r0, rPC              @ arg0
21044    mov    r1, rFP              @ arg1
21045    mov    r2, rSELF            @ arg2
21046    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21047
21048/* ------------------------------ */
21049    .balign 64
21050.L_ALT_OP_SPUT_CHAR_JUMBO: /* 0x120 */
21051/* File: armv5te/alt_stub.S */
21052/*
21053 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21054 * any interesting requests and then jump to the real instruction
21055 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21056 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21057 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21058 * bail to the real handler if breakFlags==0.
21059 */
21060    ldrb   r3, [rSELF, #offThread_breakFlags]
21061    adrl   lr, dvmAsmInstructionStart + (288 * 64)
21062    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21063    cmp    r3, #0
21064    bxeq   lr                   @ nothing to do - jump to real handler
21065    EXPORT_PC()
21066    mov    r0, rPC              @ arg0
21067    mov    r1, rFP              @ arg1
21068    mov    r2, rSELF            @ arg2
21069    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21070
21071/* ------------------------------ */
21072    .balign 64
21073.L_ALT_OP_SPUT_SHORT_JUMBO: /* 0x121 */
21074/* File: armv5te/alt_stub.S */
21075/*
21076 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21077 * any interesting requests and then jump to the real instruction
21078 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21079 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21080 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21081 * bail to the real handler if breakFlags==0.
21082 */
21083    ldrb   r3, [rSELF, #offThread_breakFlags]
21084    adrl   lr, dvmAsmInstructionStart + (289 * 64)
21085    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21086    cmp    r3, #0
21087    bxeq   lr                   @ nothing to do - jump to real handler
21088    EXPORT_PC()
21089    mov    r0, rPC              @ arg0
21090    mov    r1, rFP              @ arg1
21091    mov    r2, rSELF            @ arg2
21092    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21093
21094/* ------------------------------ */
21095    .balign 64
21096.L_ALT_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
21097/* File: armv5te/alt_stub.S */
21098/*
21099 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21100 * any interesting requests and then jump to the real instruction
21101 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21102 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21103 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21104 * bail to the real handler if breakFlags==0.
21105 */
21106    ldrb   r3, [rSELF, #offThread_breakFlags]
21107    adrl   lr, dvmAsmInstructionStart + (290 * 64)
21108    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21109    cmp    r3, #0
21110    bxeq   lr                   @ nothing to do - jump to real handler
21111    EXPORT_PC()
21112    mov    r0, rPC              @ arg0
21113    mov    r1, rFP              @ arg1
21114    mov    r2, rSELF            @ arg2
21115    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21116
21117/* ------------------------------ */
21118    .balign 64
21119.L_ALT_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
21120/* File: armv5te/alt_stub.S */
21121/*
21122 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21123 * any interesting requests and then jump to the real instruction
21124 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21125 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21126 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21127 * bail to the real handler if breakFlags==0.
21128 */
21129    ldrb   r3, [rSELF, #offThread_breakFlags]
21130    adrl   lr, dvmAsmInstructionStart + (291 * 64)
21131    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21132    cmp    r3, #0
21133    bxeq   lr                   @ nothing to do - jump to real handler
21134    EXPORT_PC()
21135    mov    r0, rPC              @ arg0
21136    mov    r1, rFP              @ arg1
21137    mov    r2, rSELF            @ arg2
21138    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21139
21140/* ------------------------------ */
21141    .balign 64
21142.L_ALT_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
21143/* File: armv5te/alt_stub.S */
21144/*
21145 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21146 * any interesting requests and then jump to the real instruction
21147 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21148 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21149 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21150 * bail to the real handler if breakFlags==0.
21151 */
21152    ldrb   r3, [rSELF, #offThread_breakFlags]
21153    adrl   lr, dvmAsmInstructionStart + (292 * 64)
21154    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21155    cmp    r3, #0
21156    bxeq   lr                   @ nothing to do - jump to real handler
21157    EXPORT_PC()
21158    mov    r0, rPC              @ arg0
21159    mov    r1, rFP              @ arg1
21160    mov    r2, rSELF            @ arg2
21161    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21162
21163/* ------------------------------ */
21164    .balign 64
21165.L_ALT_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
21166/* File: armv5te/alt_stub.S */
21167/*
21168 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21169 * any interesting requests and then jump to the real instruction
21170 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21171 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21172 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21173 * bail to the real handler if breakFlags==0.
21174 */
21175    ldrb   r3, [rSELF, #offThread_breakFlags]
21176    adrl   lr, dvmAsmInstructionStart + (293 * 64)
21177    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21178    cmp    r3, #0
21179    bxeq   lr                   @ nothing to do - jump to real handler
21180    EXPORT_PC()
21181    mov    r0, rPC              @ arg0
21182    mov    r1, rFP              @ arg1
21183    mov    r2, rSELF            @ arg2
21184    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21185
21186/* ------------------------------ */
21187    .balign 64
21188.L_ALT_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
21189/* File: armv5te/alt_stub.S */
21190/*
21191 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21192 * any interesting requests and then jump to the real instruction
21193 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21194 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21195 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21196 * bail to the real handler if breakFlags==0.
21197 */
21198    ldrb   r3, [rSELF, #offThread_breakFlags]
21199    adrl   lr, dvmAsmInstructionStart + (294 * 64)
21200    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21201    cmp    r3, #0
21202    bxeq   lr                   @ nothing to do - jump to real handler
21203    EXPORT_PC()
21204    mov    r0, rPC              @ arg0
21205    mov    r1, rFP              @ arg1
21206    mov    r2, rSELF            @ arg2
21207    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21208
21209/* ------------------------------ */
21210    .balign 64
21211.L_ALT_OP_UNUSED_27FF: /* 0x127 */
21212/* File: armv5te/alt_stub.S */
21213/*
21214 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21215 * any interesting requests and then jump to the real instruction
21216 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21217 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21218 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21219 * bail to the real handler if breakFlags==0.
21220 */
21221    ldrb   r3, [rSELF, #offThread_breakFlags]
21222    adrl   lr, dvmAsmInstructionStart + (295 * 64)
21223    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21224    cmp    r3, #0
21225    bxeq   lr                   @ nothing to do - jump to real handler
21226    EXPORT_PC()
21227    mov    r0, rPC              @ arg0
21228    mov    r1, rFP              @ arg1
21229    mov    r2, rSELF            @ arg2
21230    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21231
21232/* ------------------------------ */
21233    .balign 64
21234.L_ALT_OP_UNUSED_28FF: /* 0x128 */
21235/* File: armv5te/alt_stub.S */
21236/*
21237 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21238 * any interesting requests and then jump to the real instruction
21239 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21240 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21241 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21242 * bail to the real handler if breakFlags==0.
21243 */
21244    ldrb   r3, [rSELF, #offThread_breakFlags]
21245    adrl   lr, dvmAsmInstructionStart + (296 * 64)
21246    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21247    cmp    r3, #0
21248    bxeq   lr                   @ nothing to do - jump to real handler
21249    EXPORT_PC()
21250    mov    r0, rPC              @ arg0
21251    mov    r1, rFP              @ arg1
21252    mov    r2, rSELF            @ arg2
21253    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21254
21255/* ------------------------------ */
21256    .balign 64
21257.L_ALT_OP_UNUSED_29FF: /* 0x129 */
21258/* File: armv5te/alt_stub.S */
21259/*
21260 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21261 * any interesting requests and then jump to the real instruction
21262 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21263 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21264 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21265 * bail to the real handler if breakFlags==0.
21266 */
21267    ldrb   r3, [rSELF, #offThread_breakFlags]
21268    adrl   lr, dvmAsmInstructionStart + (297 * 64)
21269    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21270    cmp    r3, #0
21271    bxeq   lr                   @ nothing to do - jump to real handler
21272    EXPORT_PC()
21273    mov    r0, rPC              @ arg0
21274    mov    r1, rFP              @ arg1
21275    mov    r2, rSELF            @ arg2
21276    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21277
21278/* ------------------------------ */
21279    .balign 64
21280.L_ALT_OP_UNUSED_2AFF: /* 0x12a */
21281/* File: armv5te/alt_stub.S */
21282/*
21283 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21284 * any interesting requests and then jump to the real instruction
21285 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21286 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21287 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21288 * bail to the real handler if breakFlags==0.
21289 */
21290    ldrb   r3, [rSELF, #offThread_breakFlags]
21291    adrl   lr, dvmAsmInstructionStart + (298 * 64)
21292    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21293    cmp    r3, #0
21294    bxeq   lr                   @ nothing to do - jump to real handler
21295    EXPORT_PC()
21296    mov    r0, rPC              @ arg0
21297    mov    r1, rFP              @ arg1
21298    mov    r2, rSELF            @ arg2
21299    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21300
21301/* ------------------------------ */
21302    .balign 64
21303.L_ALT_OP_UNUSED_2BFF: /* 0x12b */
21304/* File: armv5te/alt_stub.S */
21305/*
21306 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21307 * any interesting requests and then jump to the real instruction
21308 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21309 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21310 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21311 * bail to the real handler if breakFlags==0.
21312 */
21313    ldrb   r3, [rSELF, #offThread_breakFlags]
21314    adrl   lr, dvmAsmInstructionStart + (299 * 64)
21315    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21316    cmp    r3, #0
21317    bxeq   lr                   @ nothing to do - jump to real handler
21318    EXPORT_PC()
21319    mov    r0, rPC              @ arg0
21320    mov    r1, rFP              @ arg1
21321    mov    r2, rSELF            @ arg2
21322    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21323
21324/* ------------------------------ */
21325    .balign 64
21326.L_ALT_OP_UNUSED_2CFF: /* 0x12c */
21327/* File: armv5te/alt_stub.S */
21328/*
21329 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21330 * any interesting requests and then jump to the real instruction
21331 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21332 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21333 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21334 * bail to the real handler if breakFlags==0.
21335 */
21336    ldrb   r3, [rSELF, #offThread_breakFlags]
21337    adrl   lr, dvmAsmInstructionStart + (300 * 64)
21338    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21339    cmp    r3, #0
21340    bxeq   lr                   @ nothing to do - jump to real handler
21341    EXPORT_PC()
21342    mov    r0, rPC              @ arg0
21343    mov    r1, rFP              @ arg1
21344    mov    r2, rSELF            @ arg2
21345    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21346
21347/* ------------------------------ */
21348    .balign 64
21349.L_ALT_OP_UNUSED_2DFF: /* 0x12d */
21350/* File: armv5te/alt_stub.S */
21351/*
21352 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21353 * any interesting requests and then jump to the real instruction
21354 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21355 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21356 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21357 * bail to the real handler if breakFlags==0.
21358 */
21359    ldrb   r3, [rSELF, #offThread_breakFlags]
21360    adrl   lr, dvmAsmInstructionStart + (301 * 64)
21361    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21362    cmp    r3, #0
21363    bxeq   lr                   @ nothing to do - jump to real handler
21364    EXPORT_PC()
21365    mov    r0, rPC              @ arg0
21366    mov    r1, rFP              @ arg1
21367    mov    r2, rSELF            @ arg2
21368    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21369
21370/* ------------------------------ */
21371    .balign 64
21372.L_ALT_OP_UNUSED_2EFF: /* 0x12e */
21373/* File: armv5te/alt_stub.S */
21374/*
21375 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21376 * any interesting requests and then jump to the real instruction
21377 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21378 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21379 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21380 * bail to the real handler if breakFlags==0.
21381 */
21382    ldrb   r3, [rSELF, #offThread_breakFlags]
21383    adrl   lr, dvmAsmInstructionStart + (302 * 64)
21384    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21385    cmp    r3, #0
21386    bxeq   lr                   @ nothing to do - jump to real handler
21387    EXPORT_PC()
21388    mov    r0, rPC              @ arg0
21389    mov    r1, rFP              @ arg1
21390    mov    r2, rSELF            @ arg2
21391    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21392
21393/* ------------------------------ */
21394    .balign 64
21395.L_ALT_OP_UNUSED_2FFF: /* 0x12f */
21396/* File: armv5te/alt_stub.S */
21397/*
21398 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21399 * any interesting requests and then jump to the real instruction
21400 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21401 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21402 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21403 * bail to the real handler if breakFlags==0.
21404 */
21405    ldrb   r3, [rSELF, #offThread_breakFlags]
21406    adrl   lr, dvmAsmInstructionStart + (303 * 64)
21407    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21408    cmp    r3, #0
21409    bxeq   lr                   @ nothing to do - jump to real handler
21410    EXPORT_PC()
21411    mov    r0, rPC              @ arg0
21412    mov    r1, rFP              @ arg1
21413    mov    r2, rSELF            @ arg2
21414    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21415
21416/* ------------------------------ */
21417    .balign 64
21418.L_ALT_OP_UNUSED_30FF: /* 0x130 */
21419/* File: armv5te/alt_stub.S */
21420/*
21421 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21422 * any interesting requests and then jump to the real instruction
21423 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21424 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21425 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21426 * bail to the real handler if breakFlags==0.
21427 */
21428    ldrb   r3, [rSELF, #offThread_breakFlags]
21429    adrl   lr, dvmAsmInstructionStart + (304 * 64)
21430    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21431    cmp    r3, #0
21432    bxeq   lr                   @ nothing to do - jump to real handler
21433    EXPORT_PC()
21434    mov    r0, rPC              @ arg0
21435    mov    r1, rFP              @ arg1
21436    mov    r2, rSELF            @ arg2
21437    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21438
21439/* ------------------------------ */
21440    .balign 64
21441.L_ALT_OP_UNUSED_31FF: /* 0x131 */
21442/* File: armv5te/alt_stub.S */
21443/*
21444 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21445 * any interesting requests and then jump to the real instruction
21446 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21447 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21448 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21449 * bail to the real handler if breakFlags==0.
21450 */
21451    ldrb   r3, [rSELF, #offThread_breakFlags]
21452    adrl   lr, dvmAsmInstructionStart + (305 * 64)
21453    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21454    cmp    r3, #0
21455    bxeq   lr                   @ nothing to do - jump to real handler
21456    EXPORT_PC()
21457    mov    r0, rPC              @ arg0
21458    mov    r1, rFP              @ arg1
21459    mov    r2, rSELF            @ arg2
21460    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21461
21462/* ------------------------------ */
21463    .balign 64
21464.L_ALT_OP_UNUSED_32FF: /* 0x132 */
21465/* File: armv5te/alt_stub.S */
21466/*
21467 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21468 * any interesting requests and then jump to the real instruction
21469 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21470 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21471 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21472 * bail to the real handler if breakFlags==0.
21473 */
21474    ldrb   r3, [rSELF, #offThread_breakFlags]
21475    adrl   lr, dvmAsmInstructionStart + (306 * 64)
21476    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21477    cmp    r3, #0
21478    bxeq   lr                   @ nothing to do - jump to real handler
21479    EXPORT_PC()
21480    mov    r0, rPC              @ arg0
21481    mov    r1, rFP              @ arg1
21482    mov    r2, rSELF            @ arg2
21483    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21484
21485/* ------------------------------ */
21486    .balign 64
21487.L_ALT_OP_UNUSED_33FF: /* 0x133 */
21488/* File: armv5te/alt_stub.S */
21489/*
21490 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21491 * any interesting requests and then jump to the real instruction
21492 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21493 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21494 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21495 * bail to the real handler if breakFlags==0.
21496 */
21497    ldrb   r3, [rSELF, #offThread_breakFlags]
21498    adrl   lr, dvmAsmInstructionStart + (307 * 64)
21499    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21500    cmp    r3, #0
21501    bxeq   lr                   @ nothing to do - jump to real handler
21502    EXPORT_PC()
21503    mov    r0, rPC              @ arg0
21504    mov    r1, rFP              @ arg1
21505    mov    r2, rSELF            @ arg2
21506    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21507
21508/* ------------------------------ */
21509    .balign 64
21510.L_ALT_OP_UNUSED_34FF: /* 0x134 */
21511/* File: armv5te/alt_stub.S */
21512/*
21513 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21514 * any interesting requests and then jump to the real instruction
21515 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21516 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21517 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21518 * bail to the real handler if breakFlags==0.
21519 */
21520    ldrb   r3, [rSELF, #offThread_breakFlags]
21521    adrl   lr, dvmAsmInstructionStart + (308 * 64)
21522    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21523    cmp    r3, #0
21524    bxeq   lr                   @ nothing to do - jump to real handler
21525    EXPORT_PC()
21526    mov    r0, rPC              @ arg0
21527    mov    r1, rFP              @ arg1
21528    mov    r2, rSELF            @ arg2
21529    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21530
21531/* ------------------------------ */
21532    .balign 64
21533.L_ALT_OP_UNUSED_35FF: /* 0x135 */
21534/* File: armv5te/alt_stub.S */
21535/*
21536 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21537 * any interesting requests and then jump to the real instruction
21538 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21539 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21540 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21541 * bail to the real handler if breakFlags==0.
21542 */
21543    ldrb   r3, [rSELF, #offThread_breakFlags]
21544    adrl   lr, dvmAsmInstructionStart + (309 * 64)
21545    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21546    cmp    r3, #0
21547    bxeq   lr                   @ nothing to do - jump to real handler
21548    EXPORT_PC()
21549    mov    r0, rPC              @ arg0
21550    mov    r1, rFP              @ arg1
21551    mov    r2, rSELF            @ arg2
21552    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21553
21554/* ------------------------------ */
21555    .balign 64
21556.L_ALT_OP_UNUSED_36FF: /* 0x136 */
21557/* File: armv5te/alt_stub.S */
21558/*
21559 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21560 * any interesting requests and then jump to the real instruction
21561 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21562 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21563 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21564 * bail to the real handler if breakFlags==0.
21565 */
21566    ldrb   r3, [rSELF, #offThread_breakFlags]
21567    adrl   lr, dvmAsmInstructionStart + (310 * 64)
21568    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21569    cmp    r3, #0
21570    bxeq   lr                   @ nothing to do - jump to real handler
21571    EXPORT_PC()
21572    mov    r0, rPC              @ arg0
21573    mov    r1, rFP              @ arg1
21574    mov    r2, rSELF            @ arg2
21575    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21576
21577/* ------------------------------ */
21578    .balign 64
21579.L_ALT_OP_UNUSED_37FF: /* 0x137 */
21580/* File: armv5te/alt_stub.S */
21581/*
21582 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21583 * any interesting requests and then jump to the real instruction
21584 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21585 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21586 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21587 * bail to the real handler if breakFlags==0.
21588 */
21589    ldrb   r3, [rSELF, #offThread_breakFlags]
21590    adrl   lr, dvmAsmInstructionStart + (311 * 64)
21591    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21592    cmp    r3, #0
21593    bxeq   lr                   @ nothing to do - jump to real handler
21594    EXPORT_PC()
21595    mov    r0, rPC              @ arg0
21596    mov    r1, rFP              @ arg1
21597    mov    r2, rSELF            @ arg2
21598    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21599
21600/* ------------------------------ */
21601    .balign 64
21602.L_ALT_OP_UNUSED_38FF: /* 0x138 */
21603/* File: armv5te/alt_stub.S */
21604/*
21605 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21606 * any interesting requests and then jump to the real instruction
21607 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21608 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21609 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21610 * bail to the real handler if breakFlags==0.
21611 */
21612    ldrb   r3, [rSELF, #offThread_breakFlags]
21613    adrl   lr, dvmAsmInstructionStart + (312 * 64)
21614    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21615    cmp    r3, #0
21616    bxeq   lr                   @ nothing to do - jump to real handler
21617    EXPORT_PC()
21618    mov    r0, rPC              @ arg0
21619    mov    r1, rFP              @ arg1
21620    mov    r2, rSELF            @ arg2
21621    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21622
21623/* ------------------------------ */
21624    .balign 64
21625.L_ALT_OP_UNUSED_39FF: /* 0x139 */
21626/* File: armv5te/alt_stub.S */
21627/*
21628 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21629 * any interesting requests and then jump to the real instruction
21630 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21631 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21632 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21633 * bail to the real handler if breakFlags==0.
21634 */
21635    ldrb   r3, [rSELF, #offThread_breakFlags]
21636    adrl   lr, dvmAsmInstructionStart + (313 * 64)
21637    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21638    cmp    r3, #0
21639    bxeq   lr                   @ nothing to do - jump to real handler
21640    EXPORT_PC()
21641    mov    r0, rPC              @ arg0
21642    mov    r1, rFP              @ arg1
21643    mov    r2, rSELF            @ arg2
21644    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21645
21646/* ------------------------------ */
21647    .balign 64
21648.L_ALT_OP_UNUSED_3AFF: /* 0x13a */
21649/* File: armv5te/alt_stub.S */
21650/*
21651 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21652 * any interesting requests and then jump to the real instruction
21653 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21654 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21655 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21656 * bail to the real handler if breakFlags==0.
21657 */
21658    ldrb   r3, [rSELF, #offThread_breakFlags]
21659    adrl   lr, dvmAsmInstructionStart + (314 * 64)
21660    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21661    cmp    r3, #0
21662    bxeq   lr                   @ nothing to do - jump to real handler
21663    EXPORT_PC()
21664    mov    r0, rPC              @ arg0
21665    mov    r1, rFP              @ arg1
21666    mov    r2, rSELF            @ arg2
21667    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21668
21669/* ------------------------------ */
21670    .balign 64
21671.L_ALT_OP_UNUSED_3BFF: /* 0x13b */
21672/* File: armv5te/alt_stub.S */
21673/*
21674 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21675 * any interesting requests and then jump to the real instruction
21676 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21677 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21678 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21679 * bail to the real handler if breakFlags==0.
21680 */
21681    ldrb   r3, [rSELF, #offThread_breakFlags]
21682    adrl   lr, dvmAsmInstructionStart + (315 * 64)
21683    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21684    cmp    r3, #0
21685    bxeq   lr                   @ nothing to do - jump to real handler
21686    EXPORT_PC()
21687    mov    r0, rPC              @ arg0
21688    mov    r1, rFP              @ arg1
21689    mov    r2, rSELF            @ arg2
21690    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21691
21692/* ------------------------------ */
21693    .balign 64
21694.L_ALT_OP_UNUSED_3CFF: /* 0x13c */
21695/* File: armv5te/alt_stub.S */
21696/*
21697 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21698 * any interesting requests and then jump to the real instruction
21699 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21700 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21701 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21702 * bail to the real handler if breakFlags==0.
21703 */
21704    ldrb   r3, [rSELF, #offThread_breakFlags]
21705    adrl   lr, dvmAsmInstructionStart + (316 * 64)
21706    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21707    cmp    r3, #0
21708    bxeq   lr                   @ nothing to do - jump to real handler
21709    EXPORT_PC()
21710    mov    r0, rPC              @ arg0
21711    mov    r1, rFP              @ arg1
21712    mov    r2, rSELF            @ arg2
21713    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21714
21715/* ------------------------------ */
21716    .balign 64
21717.L_ALT_OP_UNUSED_3DFF: /* 0x13d */
21718/* File: armv5te/alt_stub.S */
21719/*
21720 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21721 * any interesting requests and then jump to the real instruction
21722 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21723 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21724 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21725 * bail to the real handler if breakFlags==0.
21726 */
21727    ldrb   r3, [rSELF, #offThread_breakFlags]
21728    adrl   lr, dvmAsmInstructionStart + (317 * 64)
21729    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21730    cmp    r3, #0
21731    bxeq   lr                   @ nothing to do - jump to real handler
21732    EXPORT_PC()
21733    mov    r0, rPC              @ arg0
21734    mov    r1, rFP              @ arg1
21735    mov    r2, rSELF            @ arg2
21736    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21737
21738/* ------------------------------ */
21739    .balign 64
21740.L_ALT_OP_UNUSED_3EFF: /* 0x13e */
21741/* File: armv5te/alt_stub.S */
21742/*
21743 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21744 * any interesting requests and then jump to the real instruction
21745 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21746 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21747 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21748 * bail to the real handler if breakFlags==0.
21749 */
21750    ldrb   r3, [rSELF, #offThread_breakFlags]
21751    adrl   lr, dvmAsmInstructionStart + (318 * 64)
21752    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21753    cmp    r3, #0
21754    bxeq   lr                   @ nothing to do - jump to real handler
21755    EXPORT_PC()
21756    mov    r0, rPC              @ arg0
21757    mov    r1, rFP              @ arg1
21758    mov    r2, rSELF            @ arg2
21759    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21760
21761/* ------------------------------ */
21762    .balign 64
21763.L_ALT_OP_UNUSED_3FFF: /* 0x13f */
21764/* File: armv5te/alt_stub.S */
21765/*
21766 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21767 * any interesting requests and then jump to the real instruction
21768 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21769 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21770 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21771 * bail to the real handler if breakFlags==0.
21772 */
21773    ldrb   r3, [rSELF, #offThread_breakFlags]
21774    adrl   lr, dvmAsmInstructionStart + (319 * 64)
21775    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21776    cmp    r3, #0
21777    bxeq   lr                   @ nothing to do - jump to real handler
21778    EXPORT_PC()
21779    mov    r0, rPC              @ arg0
21780    mov    r1, rFP              @ arg1
21781    mov    r2, rSELF            @ arg2
21782    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21783
21784/* ------------------------------ */
21785    .balign 64
21786.L_ALT_OP_UNUSED_40FF: /* 0x140 */
21787/* File: armv5te/alt_stub.S */
21788/*
21789 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21790 * any interesting requests and then jump to the real instruction
21791 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21792 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21793 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21794 * bail to the real handler if breakFlags==0.
21795 */
21796    ldrb   r3, [rSELF, #offThread_breakFlags]
21797    adrl   lr, dvmAsmInstructionStart + (320 * 64)
21798    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21799    cmp    r3, #0
21800    bxeq   lr                   @ nothing to do - jump to real handler
21801    EXPORT_PC()
21802    mov    r0, rPC              @ arg0
21803    mov    r1, rFP              @ arg1
21804    mov    r2, rSELF            @ arg2
21805    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21806
21807/* ------------------------------ */
21808    .balign 64
21809.L_ALT_OP_UNUSED_41FF: /* 0x141 */
21810/* File: armv5te/alt_stub.S */
21811/*
21812 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21813 * any interesting requests and then jump to the real instruction
21814 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21815 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21816 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21817 * bail to the real handler if breakFlags==0.
21818 */
21819    ldrb   r3, [rSELF, #offThread_breakFlags]
21820    adrl   lr, dvmAsmInstructionStart + (321 * 64)
21821    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21822    cmp    r3, #0
21823    bxeq   lr                   @ nothing to do - jump to real handler
21824    EXPORT_PC()
21825    mov    r0, rPC              @ arg0
21826    mov    r1, rFP              @ arg1
21827    mov    r2, rSELF            @ arg2
21828    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21829
21830/* ------------------------------ */
21831    .balign 64
21832.L_ALT_OP_UNUSED_42FF: /* 0x142 */
21833/* File: armv5te/alt_stub.S */
21834/*
21835 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21836 * any interesting requests and then jump to the real instruction
21837 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21838 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21839 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21840 * bail to the real handler if breakFlags==0.
21841 */
21842    ldrb   r3, [rSELF, #offThread_breakFlags]
21843    adrl   lr, dvmAsmInstructionStart + (322 * 64)
21844    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21845    cmp    r3, #0
21846    bxeq   lr                   @ nothing to do - jump to real handler
21847    EXPORT_PC()
21848    mov    r0, rPC              @ arg0
21849    mov    r1, rFP              @ arg1
21850    mov    r2, rSELF            @ arg2
21851    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21852
21853/* ------------------------------ */
21854    .balign 64
21855.L_ALT_OP_UNUSED_43FF: /* 0x143 */
21856/* File: armv5te/alt_stub.S */
21857/*
21858 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21859 * any interesting requests and then jump to the real instruction
21860 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21861 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21862 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21863 * bail to the real handler if breakFlags==0.
21864 */
21865    ldrb   r3, [rSELF, #offThread_breakFlags]
21866    adrl   lr, dvmAsmInstructionStart + (323 * 64)
21867    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21868    cmp    r3, #0
21869    bxeq   lr                   @ nothing to do - jump to real handler
21870    EXPORT_PC()
21871    mov    r0, rPC              @ arg0
21872    mov    r1, rFP              @ arg1
21873    mov    r2, rSELF            @ arg2
21874    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21875
21876/* ------------------------------ */
21877    .balign 64
21878.L_ALT_OP_UNUSED_44FF: /* 0x144 */
21879/* File: armv5te/alt_stub.S */
21880/*
21881 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21882 * any interesting requests and then jump to the real instruction
21883 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21884 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21885 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21886 * bail to the real handler if breakFlags==0.
21887 */
21888    ldrb   r3, [rSELF, #offThread_breakFlags]
21889    adrl   lr, dvmAsmInstructionStart + (324 * 64)
21890    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21891    cmp    r3, #0
21892    bxeq   lr                   @ nothing to do - jump to real handler
21893    EXPORT_PC()
21894    mov    r0, rPC              @ arg0
21895    mov    r1, rFP              @ arg1
21896    mov    r2, rSELF            @ arg2
21897    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21898
21899/* ------------------------------ */
21900    .balign 64
21901.L_ALT_OP_UNUSED_45FF: /* 0x145 */
21902/* File: armv5te/alt_stub.S */
21903/*
21904 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21905 * any interesting requests and then jump to the real instruction
21906 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21907 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21908 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21909 * bail to the real handler if breakFlags==0.
21910 */
21911    ldrb   r3, [rSELF, #offThread_breakFlags]
21912    adrl   lr, dvmAsmInstructionStart + (325 * 64)
21913    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21914    cmp    r3, #0
21915    bxeq   lr                   @ nothing to do - jump to real handler
21916    EXPORT_PC()
21917    mov    r0, rPC              @ arg0
21918    mov    r1, rFP              @ arg1
21919    mov    r2, rSELF            @ arg2
21920    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21921
21922/* ------------------------------ */
21923    .balign 64
21924.L_ALT_OP_UNUSED_46FF: /* 0x146 */
21925/* File: armv5te/alt_stub.S */
21926/*
21927 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21928 * any interesting requests and then jump to the real instruction
21929 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21930 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21931 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21932 * bail to the real handler if breakFlags==0.
21933 */
21934    ldrb   r3, [rSELF, #offThread_breakFlags]
21935    adrl   lr, dvmAsmInstructionStart + (326 * 64)
21936    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21937    cmp    r3, #0
21938    bxeq   lr                   @ nothing to do - jump to real handler
21939    EXPORT_PC()
21940    mov    r0, rPC              @ arg0
21941    mov    r1, rFP              @ arg1
21942    mov    r2, rSELF            @ arg2
21943    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21944
21945/* ------------------------------ */
21946    .balign 64
21947.L_ALT_OP_UNUSED_47FF: /* 0x147 */
21948/* File: armv5te/alt_stub.S */
21949/*
21950 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21951 * any interesting requests and then jump to the real instruction
21952 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21953 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21954 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21955 * bail to the real handler if breakFlags==0.
21956 */
21957    ldrb   r3, [rSELF, #offThread_breakFlags]
21958    adrl   lr, dvmAsmInstructionStart + (327 * 64)
21959    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21960    cmp    r3, #0
21961    bxeq   lr                   @ nothing to do - jump to real handler
21962    EXPORT_PC()
21963    mov    r0, rPC              @ arg0
21964    mov    r1, rFP              @ arg1
21965    mov    r2, rSELF            @ arg2
21966    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21967
21968/* ------------------------------ */
21969    .balign 64
21970.L_ALT_OP_UNUSED_48FF: /* 0x148 */
21971/* File: armv5te/alt_stub.S */
21972/*
21973 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21974 * any interesting requests and then jump to the real instruction
21975 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21976 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21977 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21978 * bail to the real handler if breakFlags==0.
21979 */
21980    ldrb   r3, [rSELF, #offThread_breakFlags]
21981    adrl   lr, dvmAsmInstructionStart + (328 * 64)
21982    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21983    cmp    r3, #0
21984    bxeq   lr                   @ nothing to do - jump to real handler
21985    EXPORT_PC()
21986    mov    r0, rPC              @ arg0
21987    mov    r1, rFP              @ arg1
21988    mov    r2, rSELF            @ arg2
21989    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21990
21991/* ------------------------------ */
21992    .balign 64
21993.L_ALT_OP_UNUSED_49FF: /* 0x149 */
21994/* File: armv5te/alt_stub.S */
21995/*
21996 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21997 * any interesting requests and then jump to the real instruction
21998 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21999 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22000 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22001 * bail to the real handler if breakFlags==0.
22002 */
22003    ldrb   r3, [rSELF, #offThread_breakFlags]
22004    adrl   lr, dvmAsmInstructionStart + (329 * 64)
22005    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22006    cmp    r3, #0
22007    bxeq   lr                   @ nothing to do - jump to real handler
22008    EXPORT_PC()
22009    mov    r0, rPC              @ arg0
22010    mov    r1, rFP              @ arg1
22011    mov    r2, rSELF            @ arg2
22012    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22013
22014/* ------------------------------ */
22015    .balign 64
22016.L_ALT_OP_UNUSED_4AFF: /* 0x14a */
22017/* File: armv5te/alt_stub.S */
22018/*
22019 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22020 * any interesting requests and then jump to the real instruction
22021 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22022 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22023 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22024 * bail to the real handler if breakFlags==0.
22025 */
22026    ldrb   r3, [rSELF, #offThread_breakFlags]
22027    adrl   lr, dvmAsmInstructionStart + (330 * 64)
22028    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22029    cmp    r3, #0
22030    bxeq   lr                   @ nothing to do - jump to real handler
22031    EXPORT_PC()
22032    mov    r0, rPC              @ arg0
22033    mov    r1, rFP              @ arg1
22034    mov    r2, rSELF            @ arg2
22035    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22036
22037/* ------------------------------ */
22038    .balign 64
22039.L_ALT_OP_UNUSED_4BFF: /* 0x14b */
22040/* File: armv5te/alt_stub.S */
22041/*
22042 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22043 * any interesting requests and then jump to the real instruction
22044 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22045 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22046 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22047 * bail to the real handler if breakFlags==0.
22048 */
22049    ldrb   r3, [rSELF, #offThread_breakFlags]
22050    adrl   lr, dvmAsmInstructionStart + (331 * 64)
22051    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22052    cmp    r3, #0
22053    bxeq   lr                   @ nothing to do - jump to real handler
22054    EXPORT_PC()
22055    mov    r0, rPC              @ arg0
22056    mov    r1, rFP              @ arg1
22057    mov    r2, rSELF            @ arg2
22058    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22059
22060/* ------------------------------ */
22061    .balign 64
22062.L_ALT_OP_UNUSED_4CFF: /* 0x14c */
22063/* File: armv5te/alt_stub.S */
22064/*
22065 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22066 * any interesting requests and then jump to the real instruction
22067 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22068 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22069 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22070 * bail to the real handler if breakFlags==0.
22071 */
22072    ldrb   r3, [rSELF, #offThread_breakFlags]
22073    adrl   lr, dvmAsmInstructionStart + (332 * 64)
22074    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22075    cmp    r3, #0
22076    bxeq   lr                   @ nothing to do - jump to real handler
22077    EXPORT_PC()
22078    mov    r0, rPC              @ arg0
22079    mov    r1, rFP              @ arg1
22080    mov    r2, rSELF            @ arg2
22081    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22082
22083/* ------------------------------ */
22084    .balign 64
22085.L_ALT_OP_UNUSED_4DFF: /* 0x14d */
22086/* File: armv5te/alt_stub.S */
22087/*
22088 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22089 * any interesting requests and then jump to the real instruction
22090 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22091 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22092 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22093 * bail to the real handler if breakFlags==0.
22094 */
22095    ldrb   r3, [rSELF, #offThread_breakFlags]
22096    adrl   lr, dvmAsmInstructionStart + (333 * 64)
22097    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22098    cmp    r3, #0
22099    bxeq   lr                   @ nothing to do - jump to real handler
22100    EXPORT_PC()
22101    mov    r0, rPC              @ arg0
22102    mov    r1, rFP              @ arg1
22103    mov    r2, rSELF            @ arg2
22104    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22105
22106/* ------------------------------ */
22107    .balign 64
22108.L_ALT_OP_UNUSED_4EFF: /* 0x14e */
22109/* File: armv5te/alt_stub.S */
22110/*
22111 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22112 * any interesting requests and then jump to the real instruction
22113 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22114 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22115 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22116 * bail to the real handler if breakFlags==0.
22117 */
22118    ldrb   r3, [rSELF, #offThread_breakFlags]
22119    adrl   lr, dvmAsmInstructionStart + (334 * 64)
22120    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22121    cmp    r3, #0
22122    bxeq   lr                   @ nothing to do - jump to real handler
22123    EXPORT_PC()
22124    mov    r0, rPC              @ arg0
22125    mov    r1, rFP              @ arg1
22126    mov    r2, rSELF            @ arg2
22127    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22128
22129/* ------------------------------ */
22130    .balign 64
22131.L_ALT_OP_UNUSED_4FFF: /* 0x14f */
22132/* File: armv5te/alt_stub.S */
22133/*
22134 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22135 * any interesting requests and then jump to the real instruction
22136 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22137 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22138 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22139 * bail to the real handler if breakFlags==0.
22140 */
22141    ldrb   r3, [rSELF, #offThread_breakFlags]
22142    adrl   lr, dvmAsmInstructionStart + (335 * 64)
22143    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22144    cmp    r3, #0
22145    bxeq   lr                   @ nothing to do - jump to real handler
22146    EXPORT_PC()
22147    mov    r0, rPC              @ arg0
22148    mov    r1, rFP              @ arg1
22149    mov    r2, rSELF            @ arg2
22150    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22151
22152/* ------------------------------ */
22153    .balign 64
22154.L_ALT_OP_UNUSED_50FF: /* 0x150 */
22155/* File: armv5te/alt_stub.S */
22156/*
22157 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22158 * any interesting requests and then jump to the real instruction
22159 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22160 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22161 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22162 * bail to the real handler if breakFlags==0.
22163 */
22164    ldrb   r3, [rSELF, #offThread_breakFlags]
22165    adrl   lr, dvmAsmInstructionStart + (336 * 64)
22166    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22167    cmp    r3, #0
22168    bxeq   lr                   @ nothing to do - jump to real handler
22169    EXPORT_PC()
22170    mov    r0, rPC              @ arg0
22171    mov    r1, rFP              @ arg1
22172    mov    r2, rSELF            @ arg2
22173    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22174
22175/* ------------------------------ */
22176    .balign 64
22177.L_ALT_OP_UNUSED_51FF: /* 0x151 */
22178/* File: armv5te/alt_stub.S */
22179/*
22180 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22181 * any interesting requests and then jump to the real instruction
22182 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22183 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22184 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22185 * bail to the real handler if breakFlags==0.
22186 */
22187    ldrb   r3, [rSELF, #offThread_breakFlags]
22188    adrl   lr, dvmAsmInstructionStart + (337 * 64)
22189    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22190    cmp    r3, #0
22191    bxeq   lr                   @ nothing to do - jump to real handler
22192    EXPORT_PC()
22193    mov    r0, rPC              @ arg0
22194    mov    r1, rFP              @ arg1
22195    mov    r2, rSELF            @ arg2
22196    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22197
22198/* ------------------------------ */
22199    .balign 64
22200.L_ALT_OP_UNUSED_52FF: /* 0x152 */
22201/* File: armv5te/alt_stub.S */
22202/*
22203 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22204 * any interesting requests and then jump to the real instruction
22205 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22206 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22207 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22208 * bail to the real handler if breakFlags==0.
22209 */
22210    ldrb   r3, [rSELF, #offThread_breakFlags]
22211    adrl   lr, dvmAsmInstructionStart + (338 * 64)
22212    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22213    cmp    r3, #0
22214    bxeq   lr                   @ nothing to do - jump to real handler
22215    EXPORT_PC()
22216    mov    r0, rPC              @ arg0
22217    mov    r1, rFP              @ arg1
22218    mov    r2, rSELF            @ arg2
22219    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22220
22221/* ------------------------------ */
22222    .balign 64
22223.L_ALT_OP_UNUSED_53FF: /* 0x153 */
22224/* File: armv5te/alt_stub.S */
22225/*
22226 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22227 * any interesting requests and then jump to the real instruction
22228 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22229 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22230 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22231 * bail to the real handler if breakFlags==0.
22232 */
22233    ldrb   r3, [rSELF, #offThread_breakFlags]
22234    adrl   lr, dvmAsmInstructionStart + (339 * 64)
22235    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22236    cmp    r3, #0
22237    bxeq   lr                   @ nothing to do - jump to real handler
22238    EXPORT_PC()
22239    mov    r0, rPC              @ arg0
22240    mov    r1, rFP              @ arg1
22241    mov    r2, rSELF            @ arg2
22242    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22243
22244/* ------------------------------ */
22245    .balign 64
22246.L_ALT_OP_UNUSED_54FF: /* 0x154 */
22247/* File: armv5te/alt_stub.S */
22248/*
22249 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22250 * any interesting requests and then jump to the real instruction
22251 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22252 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22253 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22254 * bail to the real handler if breakFlags==0.
22255 */
22256    ldrb   r3, [rSELF, #offThread_breakFlags]
22257    adrl   lr, dvmAsmInstructionStart + (340 * 64)
22258    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22259    cmp    r3, #0
22260    bxeq   lr                   @ nothing to do - jump to real handler
22261    EXPORT_PC()
22262    mov    r0, rPC              @ arg0
22263    mov    r1, rFP              @ arg1
22264    mov    r2, rSELF            @ arg2
22265    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22266
22267/* ------------------------------ */
22268    .balign 64
22269.L_ALT_OP_UNUSED_55FF: /* 0x155 */
22270/* File: armv5te/alt_stub.S */
22271/*
22272 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22273 * any interesting requests and then jump to the real instruction
22274 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22275 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22276 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22277 * bail to the real handler if breakFlags==0.
22278 */
22279    ldrb   r3, [rSELF, #offThread_breakFlags]
22280    adrl   lr, dvmAsmInstructionStart + (341 * 64)
22281    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22282    cmp    r3, #0
22283    bxeq   lr                   @ nothing to do - jump to real handler
22284    EXPORT_PC()
22285    mov    r0, rPC              @ arg0
22286    mov    r1, rFP              @ arg1
22287    mov    r2, rSELF            @ arg2
22288    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22289
22290/* ------------------------------ */
22291    .balign 64
22292.L_ALT_OP_UNUSED_56FF: /* 0x156 */
22293/* File: armv5te/alt_stub.S */
22294/*
22295 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22296 * any interesting requests and then jump to the real instruction
22297 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22298 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22299 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22300 * bail to the real handler if breakFlags==0.
22301 */
22302    ldrb   r3, [rSELF, #offThread_breakFlags]
22303    adrl   lr, dvmAsmInstructionStart + (342 * 64)
22304    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22305    cmp    r3, #0
22306    bxeq   lr                   @ nothing to do - jump to real handler
22307    EXPORT_PC()
22308    mov    r0, rPC              @ arg0
22309    mov    r1, rFP              @ arg1
22310    mov    r2, rSELF            @ arg2
22311    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22312
22313/* ------------------------------ */
22314    .balign 64
22315.L_ALT_OP_UNUSED_57FF: /* 0x157 */
22316/* File: armv5te/alt_stub.S */
22317/*
22318 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22319 * any interesting requests and then jump to the real instruction
22320 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22321 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22322 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22323 * bail to the real handler if breakFlags==0.
22324 */
22325    ldrb   r3, [rSELF, #offThread_breakFlags]
22326    adrl   lr, dvmAsmInstructionStart + (343 * 64)
22327    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22328    cmp    r3, #0
22329    bxeq   lr                   @ nothing to do - jump to real handler
22330    EXPORT_PC()
22331    mov    r0, rPC              @ arg0
22332    mov    r1, rFP              @ arg1
22333    mov    r2, rSELF            @ arg2
22334    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22335
22336/* ------------------------------ */
22337    .balign 64
22338.L_ALT_OP_UNUSED_58FF: /* 0x158 */
22339/* File: armv5te/alt_stub.S */
22340/*
22341 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22342 * any interesting requests and then jump to the real instruction
22343 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22344 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22345 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22346 * bail to the real handler if breakFlags==0.
22347 */
22348    ldrb   r3, [rSELF, #offThread_breakFlags]
22349    adrl   lr, dvmAsmInstructionStart + (344 * 64)
22350    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22351    cmp    r3, #0
22352    bxeq   lr                   @ nothing to do - jump to real handler
22353    EXPORT_PC()
22354    mov    r0, rPC              @ arg0
22355    mov    r1, rFP              @ arg1
22356    mov    r2, rSELF            @ arg2
22357    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22358
22359/* ------------------------------ */
22360    .balign 64
22361.L_ALT_OP_UNUSED_59FF: /* 0x159 */
22362/* File: armv5te/alt_stub.S */
22363/*
22364 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22365 * any interesting requests and then jump to the real instruction
22366 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22367 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22368 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22369 * bail to the real handler if breakFlags==0.
22370 */
22371    ldrb   r3, [rSELF, #offThread_breakFlags]
22372    adrl   lr, dvmAsmInstructionStart + (345 * 64)
22373    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22374    cmp    r3, #0
22375    bxeq   lr                   @ nothing to do - jump to real handler
22376    EXPORT_PC()
22377    mov    r0, rPC              @ arg0
22378    mov    r1, rFP              @ arg1
22379    mov    r2, rSELF            @ arg2
22380    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22381
22382/* ------------------------------ */
22383    .balign 64
22384.L_ALT_OP_UNUSED_5AFF: /* 0x15a */
22385/* File: armv5te/alt_stub.S */
22386/*
22387 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22388 * any interesting requests and then jump to the real instruction
22389 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22390 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22391 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22392 * bail to the real handler if breakFlags==0.
22393 */
22394    ldrb   r3, [rSELF, #offThread_breakFlags]
22395    adrl   lr, dvmAsmInstructionStart + (346 * 64)
22396    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22397    cmp    r3, #0
22398    bxeq   lr                   @ nothing to do - jump to real handler
22399    EXPORT_PC()
22400    mov    r0, rPC              @ arg0
22401    mov    r1, rFP              @ arg1
22402    mov    r2, rSELF            @ arg2
22403    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22404
22405/* ------------------------------ */
22406    .balign 64
22407.L_ALT_OP_UNUSED_5BFF: /* 0x15b */
22408/* File: armv5te/alt_stub.S */
22409/*
22410 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22411 * any interesting requests and then jump to the real instruction
22412 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22413 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22414 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22415 * bail to the real handler if breakFlags==0.
22416 */
22417    ldrb   r3, [rSELF, #offThread_breakFlags]
22418    adrl   lr, dvmAsmInstructionStart + (347 * 64)
22419    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22420    cmp    r3, #0
22421    bxeq   lr                   @ nothing to do - jump to real handler
22422    EXPORT_PC()
22423    mov    r0, rPC              @ arg0
22424    mov    r1, rFP              @ arg1
22425    mov    r2, rSELF            @ arg2
22426    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22427
22428/* ------------------------------ */
22429    .balign 64
22430.L_ALT_OP_UNUSED_5CFF: /* 0x15c */
22431/* File: armv5te/alt_stub.S */
22432/*
22433 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22434 * any interesting requests and then jump to the real instruction
22435 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22436 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22437 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22438 * bail to the real handler if breakFlags==0.
22439 */
22440    ldrb   r3, [rSELF, #offThread_breakFlags]
22441    adrl   lr, dvmAsmInstructionStart + (348 * 64)
22442    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22443    cmp    r3, #0
22444    bxeq   lr                   @ nothing to do - jump to real handler
22445    EXPORT_PC()
22446    mov    r0, rPC              @ arg0
22447    mov    r1, rFP              @ arg1
22448    mov    r2, rSELF            @ arg2
22449    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22450
22451/* ------------------------------ */
22452    .balign 64
22453.L_ALT_OP_UNUSED_5DFF: /* 0x15d */
22454/* File: armv5te/alt_stub.S */
22455/*
22456 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22457 * any interesting requests and then jump to the real instruction
22458 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22459 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22460 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22461 * bail to the real handler if breakFlags==0.
22462 */
22463    ldrb   r3, [rSELF, #offThread_breakFlags]
22464    adrl   lr, dvmAsmInstructionStart + (349 * 64)
22465    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22466    cmp    r3, #0
22467    bxeq   lr                   @ nothing to do - jump to real handler
22468    EXPORT_PC()
22469    mov    r0, rPC              @ arg0
22470    mov    r1, rFP              @ arg1
22471    mov    r2, rSELF            @ arg2
22472    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22473
22474/* ------------------------------ */
22475    .balign 64
22476.L_ALT_OP_UNUSED_5EFF: /* 0x15e */
22477/* File: armv5te/alt_stub.S */
22478/*
22479 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22480 * any interesting requests and then jump to the real instruction
22481 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22482 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22483 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22484 * bail to the real handler if breakFlags==0.
22485 */
22486    ldrb   r3, [rSELF, #offThread_breakFlags]
22487    adrl   lr, dvmAsmInstructionStart + (350 * 64)
22488    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22489    cmp    r3, #0
22490    bxeq   lr                   @ nothing to do - jump to real handler
22491    EXPORT_PC()
22492    mov    r0, rPC              @ arg0
22493    mov    r1, rFP              @ arg1
22494    mov    r2, rSELF            @ arg2
22495    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22496
22497/* ------------------------------ */
22498    .balign 64
22499.L_ALT_OP_UNUSED_5FFF: /* 0x15f */
22500/* File: armv5te/alt_stub.S */
22501/*
22502 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22503 * any interesting requests and then jump to the real instruction
22504 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22505 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22506 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22507 * bail to the real handler if breakFlags==0.
22508 */
22509    ldrb   r3, [rSELF, #offThread_breakFlags]
22510    adrl   lr, dvmAsmInstructionStart + (351 * 64)
22511    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22512    cmp    r3, #0
22513    bxeq   lr                   @ nothing to do - jump to real handler
22514    EXPORT_PC()
22515    mov    r0, rPC              @ arg0
22516    mov    r1, rFP              @ arg1
22517    mov    r2, rSELF            @ arg2
22518    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22519
22520/* ------------------------------ */
22521    .balign 64
22522.L_ALT_OP_UNUSED_60FF: /* 0x160 */
22523/* File: armv5te/alt_stub.S */
22524/*
22525 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22526 * any interesting requests and then jump to the real instruction
22527 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22528 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22529 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22530 * bail to the real handler if breakFlags==0.
22531 */
22532    ldrb   r3, [rSELF, #offThread_breakFlags]
22533    adrl   lr, dvmAsmInstructionStart + (352 * 64)
22534    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22535    cmp    r3, #0
22536    bxeq   lr                   @ nothing to do - jump to real handler
22537    EXPORT_PC()
22538    mov    r0, rPC              @ arg0
22539    mov    r1, rFP              @ arg1
22540    mov    r2, rSELF            @ arg2
22541    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22542
22543/* ------------------------------ */
22544    .balign 64
22545.L_ALT_OP_UNUSED_61FF: /* 0x161 */
22546/* File: armv5te/alt_stub.S */
22547/*
22548 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22549 * any interesting requests and then jump to the real instruction
22550 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22551 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22552 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22553 * bail to the real handler if breakFlags==0.
22554 */
22555    ldrb   r3, [rSELF, #offThread_breakFlags]
22556    adrl   lr, dvmAsmInstructionStart + (353 * 64)
22557    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22558    cmp    r3, #0
22559    bxeq   lr                   @ nothing to do - jump to real handler
22560    EXPORT_PC()
22561    mov    r0, rPC              @ arg0
22562    mov    r1, rFP              @ arg1
22563    mov    r2, rSELF            @ arg2
22564    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22565
22566/* ------------------------------ */
22567    .balign 64
22568.L_ALT_OP_UNUSED_62FF: /* 0x162 */
22569/* File: armv5te/alt_stub.S */
22570/*
22571 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22572 * any interesting requests and then jump to the real instruction
22573 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22574 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22575 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22576 * bail to the real handler if breakFlags==0.
22577 */
22578    ldrb   r3, [rSELF, #offThread_breakFlags]
22579    adrl   lr, dvmAsmInstructionStart + (354 * 64)
22580    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22581    cmp    r3, #0
22582    bxeq   lr                   @ nothing to do - jump to real handler
22583    EXPORT_PC()
22584    mov    r0, rPC              @ arg0
22585    mov    r1, rFP              @ arg1
22586    mov    r2, rSELF            @ arg2
22587    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22588
22589/* ------------------------------ */
22590    .balign 64
22591.L_ALT_OP_UNUSED_63FF: /* 0x163 */
22592/* File: armv5te/alt_stub.S */
22593/*
22594 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22595 * any interesting requests and then jump to the real instruction
22596 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22597 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22598 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22599 * bail to the real handler if breakFlags==0.
22600 */
22601    ldrb   r3, [rSELF, #offThread_breakFlags]
22602    adrl   lr, dvmAsmInstructionStart + (355 * 64)
22603    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22604    cmp    r3, #0
22605    bxeq   lr                   @ nothing to do - jump to real handler
22606    EXPORT_PC()
22607    mov    r0, rPC              @ arg0
22608    mov    r1, rFP              @ arg1
22609    mov    r2, rSELF            @ arg2
22610    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22611
22612/* ------------------------------ */
22613    .balign 64
22614.L_ALT_OP_UNUSED_64FF: /* 0x164 */
22615/* File: armv5te/alt_stub.S */
22616/*
22617 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22618 * any interesting requests and then jump to the real instruction
22619 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22620 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22621 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22622 * bail to the real handler if breakFlags==0.
22623 */
22624    ldrb   r3, [rSELF, #offThread_breakFlags]
22625    adrl   lr, dvmAsmInstructionStart + (356 * 64)
22626    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22627    cmp    r3, #0
22628    bxeq   lr                   @ nothing to do - jump to real handler
22629    EXPORT_PC()
22630    mov    r0, rPC              @ arg0
22631    mov    r1, rFP              @ arg1
22632    mov    r2, rSELF            @ arg2
22633    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22634
22635/* ------------------------------ */
22636    .balign 64
22637.L_ALT_OP_UNUSED_65FF: /* 0x165 */
22638/* File: armv5te/alt_stub.S */
22639/*
22640 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22641 * any interesting requests and then jump to the real instruction
22642 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22643 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22644 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22645 * bail to the real handler if breakFlags==0.
22646 */
22647    ldrb   r3, [rSELF, #offThread_breakFlags]
22648    adrl   lr, dvmAsmInstructionStart + (357 * 64)
22649    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22650    cmp    r3, #0
22651    bxeq   lr                   @ nothing to do - jump to real handler
22652    EXPORT_PC()
22653    mov    r0, rPC              @ arg0
22654    mov    r1, rFP              @ arg1
22655    mov    r2, rSELF            @ arg2
22656    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22657
22658/* ------------------------------ */
22659    .balign 64
22660.L_ALT_OP_UNUSED_66FF: /* 0x166 */
22661/* File: armv5te/alt_stub.S */
22662/*
22663 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22664 * any interesting requests and then jump to the real instruction
22665 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22666 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22667 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22668 * bail to the real handler if breakFlags==0.
22669 */
22670    ldrb   r3, [rSELF, #offThread_breakFlags]
22671    adrl   lr, dvmAsmInstructionStart + (358 * 64)
22672    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22673    cmp    r3, #0
22674    bxeq   lr                   @ nothing to do - jump to real handler
22675    EXPORT_PC()
22676    mov    r0, rPC              @ arg0
22677    mov    r1, rFP              @ arg1
22678    mov    r2, rSELF            @ arg2
22679    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22680
22681/* ------------------------------ */
22682    .balign 64
22683.L_ALT_OP_UNUSED_67FF: /* 0x167 */
22684/* File: armv5te/alt_stub.S */
22685/*
22686 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22687 * any interesting requests and then jump to the real instruction
22688 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22689 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22690 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22691 * bail to the real handler if breakFlags==0.
22692 */
22693    ldrb   r3, [rSELF, #offThread_breakFlags]
22694    adrl   lr, dvmAsmInstructionStart + (359 * 64)
22695    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22696    cmp    r3, #0
22697    bxeq   lr                   @ nothing to do - jump to real handler
22698    EXPORT_PC()
22699    mov    r0, rPC              @ arg0
22700    mov    r1, rFP              @ arg1
22701    mov    r2, rSELF            @ arg2
22702    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22703
22704/* ------------------------------ */
22705    .balign 64
22706.L_ALT_OP_UNUSED_68FF: /* 0x168 */
22707/* File: armv5te/alt_stub.S */
22708/*
22709 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22710 * any interesting requests and then jump to the real instruction
22711 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22712 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22713 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22714 * bail to the real handler if breakFlags==0.
22715 */
22716    ldrb   r3, [rSELF, #offThread_breakFlags]
22717    adrl   lr, dvmAsmInstructionStart + (360 * 64)
22718    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22719    cmp    r3, #0
22720    bxeq   lr                   @ nothing to do - jump to real handler
22721    EXPORT_PC()
22722    mov    r0, rPC              @ arg0
22723    mov    r1, rFP              @ arg1
22724    mov    r2, rSELF            @ arg2
22725    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22726
22727/* ------------------------------ */
22728    .balign 64
22729.L_ALT_OP_UNUSED_69FF: /* 0x169 */
22730/* File: armv5te/alt_stub.S */
22731/*
22732 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22733 * any interesting requests and then jump to the real instruction
22734 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22735 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22736 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22737 * bail to the real handler if breakFlags==0.
22738 */
22739    ldrb   r3, [rSELF, #offThread_breakFlags]
22740    adrl   lr, dvmAsmInstructionStart + (361 * 64)
22741    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22742    cmp    r3, #0
22743    bxeq   lr                   @ nothing to do - jump to real handler
22744    EXPORT_PC()
22745    mov    r0, rPC              @ arg0
22746    mov    r1, rFP              @ arg1
22747    mov    r2, rSELF            @ arg2
22748    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22749
22750/* ------------------------------ */
22751    .balign 64
22752.L_ALT_OP_UNUSED_6AFF: /* 0x16a */
22753/* File: armv5te/alt_stub.S */
22754/*
22755 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22756 * any interesting requests and then jump to the real instruction
22757 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22758 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22759 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22760 * bail to the real handler if breakFlags==0.
22761 */
22762    ldrb   r3, [rSELF, #offThread_breakFlags]
22763    adrl   lr, dvmAsmInstructionStart + (362 * 64)
22764    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22765    cmp    r3, #0
22766    bxeq   lr                   @ nothing to do - jump to real handler
22767    EXPORT_PC()
22768    mov    r0, rPC              @ arg0
22769    mov    r1, rFP              @ arg1
22770    mov    r2, rSELF            @ arg2
22771    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22772
22773/* ------------------------------ */
22774    .balign 64
22775.L_ALT_OP_UNUSED_6BFF: /* 0x16b */
22776/* File: armv5te/alt_stub.S */
22777/*
22778 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22779 * any interesting requests and then jump to the real instruction
22780 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22781 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22782 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22783 * bail to the real handler if breakFlags==0.
22784 */
22785    ldrb   r3, [rSELF, #offThread_breakFlags]
22786    adrl   lr, dvmAsmInstructionStart + (363 * 64)
22787    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22788    cmp    r3, #0
22789    bxeq   lr                   @ nothing to do - jump to real handler
22790    EXPORT_PC()
22791    mov    r0, rPC              @ arg0
22792    mov    r1, rFP              @ arg1
22793    mov    r2, rSELF            @ arg2
22794    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22795
22796/* ------------------------------ */
22797    .balign 64
22798.L_ALT_OP_UNUSED_6CFF: /* 0x16c */
22799/* File: armv5te/alt_stub.S */
22800/*
22801 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22802 * any interesting requests and then jump to the real instruction
22803 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22804 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22805 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22806 * bail to the real handler if breakFlags==0.
22807 */
22808    ldrb   r3, [rSELF, #offThread_breakFlags]
22809    adrl   lr, dvmAsmInstructionStart + (364 * 64)
22810    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22811    cmp    r3, #0
22812    bxeq   lr                   @ nothing to do - jump to real handler
22813    EXPORT_PC()
22814    mov    r0, rPC              @ arg0
22815    mov    r1, rFP              @ arg1
22816    mov    r2, rSELF            @ arg2
22817    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22818
22819/* ------------------------------ */
22820    .balign 64
22821.L_ALT_OP_UNUSED_6DFF: /* 0x16d */
22822/* File: armv5te/alt_stub.S */
22823/*
22824 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22825 * any interesting requests and then jump to the real instruction
22826 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22827 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22828 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22829 * bail to the real handler if breakFlags==0.
22830 */
22831    ldrb   r3, [rSELF, #offThread_breakFlags]
22832    adrl   lr, dvmAsmInstructionStart + (365 * 64)
22833    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22834    cmp    r3, #0
22835    bxeq   lr                   @ nothing to do - jump to real handler
22836    EXPORT_PC()
22837    mov    r0, rPC              @ arg0
22838    mov    r1, rFP              @ arg1
22839    mov    r2, rSELF            @ arg2
22840    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22841
22842/* ------------------------------ */
22843    .balign 64
22844.L_ALT_OP_UNUSED_6EFF: /* 0x16e */
22845/* File: armv5te/alt_stub.S */
22846/*
22847 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22848 * any interesting requests and then jump to the real instruction
22849 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22850 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22851 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22852 * bail to the real handler if breakFlags==0.
22853 */
22854    ldrb   r3, [rSELF, #offThread_breakFlags]
22855    adrl   lr, dvmAsmInstructionStart + (366 * 64)
22856    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22857    cmp    r3, #0
22858    bxeq   lr                   @ nothing to do - jump to real handler
22859    EXPORT_PC()
22860    mov    r0, rPC              @ arg0
22861    mov    r1, rFP              @ arg1
22862    mov    r2, rSELF            @ arg2
22863    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22864
22865/* ------------------------------ */
22866    .balign 64
22867.L_ALT_OP_UNUSED_6FFF: /* 0x16f */
22868/* File: armv5te/alt_stub.S */
22869/*
22870 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22871 * any interesting requests and then jump to the real instruction
22872 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22873 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22874 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22875 * bail to the real handler if breakFlags==0.
22876 */
22877    ldrb   r3, [rSELF, #offThread_breakFlags]
22878    adrl   lr, dvmAsmInstructionStart + (367 * 64)
22879    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22880    cmp    r3, #0
22881    bxeq   lr                   @ nothing to do - jump to real handler
22882    EXPORT_PC()
22883    mov    r0, rPC              @ arg0
22884    mov    r1, rFP              @ arg1
22885    mov    r2, rSELF            @ arg2
22886    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22887
22888/* ------------------------------ */
22889    .balign 64
22890.L_ALT_OP_UNUSED_70FF: /* 0x170 */
22891/* File: armv5te/alt_stub.S */
22892/*
22893 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22894 * any interesting requests and then jump to the real instruction
22895 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22896 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22897 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22898 * bail to the real handler if breakFlags==0.
22899 */
22900    ldrb   r3, [rSELF, #offThread_breakFlags]
22901    adrl   lr, dvmAsmInstructionStart + (368 * 64)
22902    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22903    cmp    r3, #0
22904    bxeq   lr                   @ nothing to do - jump to real handler
22905    EXPORT_PC()
22906    mov    r0, rPC              @ arg0
22907    mov    r1, rFP              @ arg1
22908    mov    r2, rSELF            @ arg2
22909    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22910
22911/* ------------------------------ */
22912    .balign 64
22913.L_ALT_OP_UNUSED_71FF: /* 0x171 */
22914/* File: armv5te/alt_stub.S */
22915/*
22916 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22917 * any interesting requests and then jump to the real instruction
22918 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22919 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22920 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22921 * bail to the real handler if breakFlags==0.
22922 */
22923    ldrb   r3, [rSELF, #offThread_breakFlags]
22924    adrl   lr, dvmAsmInstructionStart + (369 * 64)
22925    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22926    cmp    r3, #0
22927    bxeq   lr                   @ nothing to do - jump to real handler
22928    EXPORT_PC()
22929    mov    r0, rPC              @ arg0
22930    mov    r1, rFP              @ arg1
22931    mov    r2, rSELF            @ arg2
22932    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22933
22934/* ------------------------------ */
22935    .balign 64
22936.L_ALT_OP_UNUSED_72FF: /* 0x172 */
22937/* File: armv5te/alt_stub.S */
22938/*
22939 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22940 * any interesting requests and then jump to the real instruction
22941 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22942 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22943 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22944 * bail to the real handler if breakFlags==0.
22945 */
22946    ldrb   r3, [rSELF, #offThread_breakFlags]
22947    adrl   lr, dvmAsmInstructionStart + (370 * 64)
22948    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22949    cmp    r3, #0
22950    bxeq   lr                   @ nothing to do - jump to real handler
22951    EXPORT_PC()
22952    mov    r0, rPC              @ arg0
22953    mov    r1, rFP              @ arg1
22954    mov    r2, rSELF            @ arg2
22955    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22956
22957/* ------------------------------ */
22958    .balign 64
22959.L_ALT_OP_UNUSED_73FF: /* 0x173 */
22960/* File: armv5te/alt_stub.S */
22961/*
22962 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22963 * any interesting requests and then jump to the real instruction
22964 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22965 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22966 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22967 * bail to the real handler if breakFlags==0.
22968 */
22969    ldrb   r3, [rSELF, #offThread_breakFlags]
22970    adrl   lr, dvmAsmInstructionStart + (371 * 64)
22971    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22972    cmp    r3, #0
22973    bxeq   lr                   @ nothing to do - jump to real handler
22974    EXPORT_PC()
22975    mov    r0, rPC              @ arg0
22976    mov    r1, rFP              @ arg1
22977    mov    r2, rSELF            @ arg2
22978    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22979
22980/* ------------------------------ */
22981    .balign 64
22982.L_ALT_OP_UNUSED_74FF: /* 0x174 */
22983/* File: armv5te/alt_stub.S */
22984/*
22985 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22986 * any interesting requests and then jump to the real instruction
22987 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22988 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22989 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22990 * bail to the real handler if breakFlags==0.
22991 */
22992    ldrb   r3, [rSELF, #offThread_breakFlags]
22993    adrl   lr, dvmAsmInstructionStart + (372 * 64)
22994    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22995    cmp    r3, #0
22996    bxeq   lr                   @ nothing to do - jump to real handler
22997    EXPORT_PC()
22998    mov    r0, rPC              @ arg0
22999    mov    r1, rFP              @ arg1
23000    mov    r2, rSELF            @ arg2
23001    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23002
23003/* ------------------------------ */
23004    .balign 64
23005.L_ALT_OP_UNUSED_75FF: /* 0x175 */
23006/* File: armv5te/alt_stub.S */
23007/*
23008 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23009 * any interesting requests and then jump to the real instruction
23010 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23011 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23012 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23013 * bail to the real handler if breakFlags==0.
23014 */
23015    ldrb   r3, [rSELF, #offThread_breakFlags]
23016    adrl   lr, dvmAsmInstructionStart + (373 * 64)
23017    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23018    cmp    r3, #0
23019    bxeq   lr                   @ nothing to do - jump to real handler
23020    EXPORT_PC()
23021    mov    r0, rPC              @ arg0
23022    mov    r1, rFP              @ arg1
23023    mov    r2, rSELF            @ arg2
23024    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23025
23026/* ------------------------------ */
23027    .balign 64
23028.L_ALT_OP_UNUSED_76FF: /* 0x176 */
23029/* File: armv5te/alt_stub.S */
23030/*
23031 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23032 * any interesting requests and then jump to the real instruction
23033 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23034 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23035 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23036 * bail to the real handler if breakFlags==0.
23037 */
23038    ldrb   r3, [rSELF, #offThread_breakFlags]
23039    adrl   lr, dvmAsmInstructionStart + (374 * 64)
23040    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23041    cmp    r3, #0
23042    bxeq   lr                   @ nothing to do - jump to real handler
23043    EXPORT_PC()
23044    mov    r0, rPC              @ arg0
23045    mov    r1, rFP              @ arg1
23046    mov    r2, rSELF            @ arg2
23047    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23048
23049/* ------------------------------ */
23050    .balign 64
23051.L_ALT_OP_UNUSED_77FF: /* 0x177 */
23052/* File: armv5te/alt_stub.S */
23053/*
23054 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23055 * any interesting requests and then jump to the real instruction
23056 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23057 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23058 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23059 * bail to the real handler if breakFlags==0.
23060 */
23061    ldrb   r3, [rSELF, #offThread_breakFlags]
23062    adrl   lr, dvmAsmInstructionStart + (375 * 64)
23063    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23064    cmp    r3, #0
23065    bxeq   lr                   @ nothing to do - jump to real handler
23066    EXPORT_PC()
23067    mov    r0, rPC              @ arg0
23068    mov    r1, rFP              @ arg1
23069    mov    r2, rSELF            @ arg2
23070    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23071
23072/* ------------------------------ */
23073    .balign 64
23074.L_ALT_OP_UNUSED_78FF: /* 0x178 */
23075/* File: armv5te/alt_stub.S */
23076/*
23077 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23078 * any interesting requests and then jump to the real instruction
23079 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23080 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23081 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23082 * bail to the real handler if breakFlags==0.
23083 */
23084    ldrb   r3, [rSELF, #offThread_breakFlags]
23085    adrl   lr, dvmAsmInstructionStart + (376 * 64)
23086    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23087    cmp    r3, #0
23088    bxeq   lr                   @ nothing to do - jump to real handler
23089    EXPORT_PC()
23090    mov    r0, rPC              @ arg0
23091    mov    r1, rFP              @ arg1
23092    mov    r2, rSELF            @ arg2
23093    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23094
23095/* ------------------------------ */
23096    .balign 64
23097.L_ALT_OP_UNUSED_79FF: /* 0x179 */
23098/* File: armv5te/alt_stub.S */
23099/*
23100 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23101 * any interesting requests and then jump to the real instruction
23102 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23103 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23104 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23105 * bail to the real handler if breakFlags==0.
23106 */
23107    ldrb   r3, [rSELF, #offThread_breakFlags]
23108    adrl   lr, dvmAsmInstructionStart + (377 * 64)
23109    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23110    cmp    r3, #0
23111    bxeq   lr                   @ nothing to do - jump to real handler
23112    EXPORT_PC()
23113    mov    r0, rPC              @ arg0
23114    mov    r1, rFP              @ arg1
23115    mov    r2, rSELF            @ arg2
23116    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23117
23118/* ------------------------------ */
23119    .balign 64
23120.L_ALT_OP_UNUSED_7AFF: /* 0x17a */
23121/* File: armv5te/alt_stub.S */
23122/*
23123 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23124 * any interesting requests and then jump to the real instruction
23125 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23126 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23127 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23128 * bail to the real handler if breakFlags==0.
23129 */
23130    ldrb   r3, [rSELF, #offThread_breakFlags]
23131    adrl   lr, dvmAsmInstructionStart + (378 * 64)
23132    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23133    cmp    r3, #0
23134    bxeq   lr                   @ nothing to do - jump to real handler
23135    EXPORT_PC()
23136    mov    r0, rPC              @ arg0
23137    mov    r1, rFP              @ arg1
23138    mov    r2, rSELF            @ arg2
23139    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23140
23141/* ------------------------------ */
23142    .balign 64
23143.L_ALT_OP_UNUSED_7BFF: /* 0x17b */
23144/* File: armv5te/alt_stub.S */
23145/*
23146 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23147 * any interesting requests and then jump to the real instruction
23148 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23149 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23150 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23151 * bail to the real handler if breakFlags==0.
23152 */
23153    ldrb   r3, [rSELF, #offThread_breakFlags]
23154    adrl   lr, dvmAsmInstructionStart + (379 * 64)
23155    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23156    cmp    r3, #0
23157    bxeq   lr                   @ nothing to do - jump to real handler
23158    EXPORT_PC()
23159    mov    r0, rPC              @ arg0
23160    mov    r1, rFP              @ arg1
23161    mov    r2, rSELF            @ arg2
23162    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23163
23164/* ------------------------------ */
23165    .balign 64
23166.L_ALT_OP_UNUSED_7CFF: /* 0x17c */
23167/* File: armv5te/alt_stub.S */
23168/*
23169 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23170 * any interesting requests and then jump to the real instruction
23171 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23172 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23173 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23174 * bail to the real handler if breakFlags==0.
23175 */
23176    ldrb   r3, [rSELF, #offThread_breakFlags]
23177    adrl   lr, dvmAsmInstructionStart + (380 * 64)
23178    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23179    cmp    r3, #0
23180    bxeq   lr                   @ nothing to do - jump to real handler
23181    EXPORT_PC()
23182    mov    r0, rPC              @ arg0
23183    mov    r1, rFP              @ arg1
23184    mov    r2, rSELF            @ arg2
23185    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23186
23187/* ------------------------------ */
23188    .balign 64
23189.L_ALT_OP_UNUSED_7DFF: /* 0x17d */
23190/* File: armv5te/alt_stub.S */
23191/*
23192 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23193 * any interesting requests and then jump to the real instruction
23194 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23195 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23196 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23197 * bail to the real handler if breakFlags==0.
23198 */
23199    ldrb   r3, [rSELF, #offThread_breakFlags]
23200    adrl   lr, dvmAsmInstructionStart + (381 * 64)
23201    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23202    cmp    r3, #0
23203    bxeq   lr                   @ nothing to do - jump to real handler
23204    EXPORT_PC()
23205    mov    r0, rPC              @ arg0
23206    mov    r1, rFP              @ arg1
23207    mov    r2, rSELF            @ arg2
23208    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23209
23210/* ------------------------------ */
23211    .balign 64
23212.L_ALT_OP_UNUSED_7EFF: /* 0x17e */
23213/* File: armv5te/alt_stub.S */
23214/*
23215 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23216 * any interesting requests and then jump to the real instruction
23217 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23218 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23219 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23220 * bail to the real handler if breakFlags==0.
23221 */
23222    ldrb   r3, [rSELF, #offThread_breakFlags]
23223    adrl   lr, dvmAsmInstructionStart + (382 * 64)
23224    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23225    cmp    r3, #0
23226    bxeq   lr                   @ nothing to do - jump to real handler
23227    EXPORT_PC()
23228    mov    r0, rPC              @ arg0
23229    mov    r1, rFP              @ arg1
23230    mov    r2, rSELF            @ arg2
23231    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23232
23233/* ------------------------------ */
23234    .balign 64
23235.L_ALT_OP_UNUSED_7FFF: /* 0x17f */
23236/* File: armv5te/alt_stub.S */
23237/*
23238 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23239 * any interesting requests and then jump to the real instruction
23240 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23241 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23242 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23243 * bail to the real handler if breakFlags==0.
23244 */
23245    ldrb   r3, [rSELF, #offThread_breakFlags]
23246    adrl   lr, dvmAsmInstructionStart + (383 * 64)
23247    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23248    cmp    r3, #0
23249    bxeq   lr                   @ nothing to do - jump to real handler
23250    EXPORT_PC()
23251    mov    r0, rPC              @ arg0
23252    mov    r1, rFP              @ arg1
23253    mov    r2, rSELF            @ arg2
23254    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23255
23256/* ------------------------------ */
23257    .balign 64
23258.L_ALT_OP_UNUSED_80FF: /* 0x180 */
23259/* File: armv5te/alt_stub.S */
23260/*
23261 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23262 * any interesting requests and then jump to the real instruction
23263 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23264 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23265 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23266 * bail to the real handler if breakFlags==0.
23267 */
23268    ldrb   r3, [rSELF, #offThread_breakFlags]
23269    adrl   lr, dvmAsmInstructionStart + (384 * 64)
23270    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23271    cmp    r3, #0
23272    bxeq   lr                   @ nothing to do - jump to real handler
23273    EXPORT_PC()
23274    mov    r0, rPC              @ arg0
23275    mov    r1, rFP              @ arg1
23276    mov    r2, rSELF            @ arg2
23277    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23278
23279/* ------------------------------ */
23280    .balign 64
23281.L_ALT_OP_UNUSED_81FF: /* 0x181 */
23282/* File: armv5te/alt_stub.S */
23283/*
23284 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23285 * any interesting requests and then jump to the real instruction
23286 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23287 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23288 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23289 * bail to the real handler if breakFlags==0.
23290 */
23291    ldrb   r3, [rSELF, #offThread_breakFlags]
23292    adrl   lr, dvmAsmInstructionStart + (385 * 64)
23293    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23294    cmp    r3, #0
23295    bxeq   lr                   @ nothing to do - jump to real handler
23296    EXPORT_PC()
23297    mov    r0, rPC              @ arg0
23298    mov    r1, rFP              @ arg1
23299    mov    r2, rSELF            @ arg2
23300    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23301
23302/* ------------------------------ */
23303    .balign 64
23304.L_ALT_OP_UNUSED_82FF: /* 0x182 */
23305/* File: armv5te/alt_stub.S */
23306/*
23307 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23308 * any interesting requests and then jump to the real instruction
23309 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23310 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23311 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23312 * bail to the real handler if breakFlags==0.
23313 */
23314    ldrb   r3, [rSELF, #offThread_breakFlags]
23315    adrl   lr, dvmAsmInstructionStart + (386 * 64)
23316    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23317    cmp    r3, #0
23318    bxeq   lr                   @ nothing to do - jump to real handler
23319    EXPORT_PC()
23320    mov    r0, rPC              @ arg0
23321    mov    r1, rFP              @ arg1
23322    mov    r2, rSELF            @ arg2
23323    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23324
23325/* ------------------------------ */
23326    .balign 64
23327.L_ALT_OP_UNUSED_83FF: /* 0x183 */
23328/* File: armv5te/alt_stub.S */
23329/*
23330 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23331 * any interesting requests and then jump to the real instruction
23332 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23333 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23334 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23335 * bail to the real handler if breakFlags==0.
23336 */
23337    ldrb   r3, [rSELF, #offThread_breakFlags]
23338    adrl   lr, dvmAsmInstructionStart + (387 * 64)
23339    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23340    cmp    r3, #0
23341    bxeq   lr                   @ nothing to do - jump to real handler
23342    EXPORT_PC()
23343    mov    r0, rPC              @ arg0
23344    mov    r1, rFP              @ arg1
23345    mov    r2, rSELF            @ arg2
23346    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23347
23348/* ------------------------------ */
23349    .balign 64
23350.L_ALT_OP_UNUSED_84FF: /* 0x184 */
23351/* File: armv5te/alt_stub.S */
23352/*
23353 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23354 * any interesting requests and then jump to the real instruction
23355 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23356 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23357 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23358 * bail to the real handler if breakFlags==0.
23359 */
23360    ldrb   r3, [rSELF, #offThread_breakFlags]
23361    adrl   lr, dvmAsmInstructionStart + (388 * 64)
23362    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23363    cmp    r3, #0
23364    bxeq   lr                   @ nothing to do - jump to real handler
23365    EXPORT_PC()
23366    mov    r0, rPC              @ arg0
23367    mov    r1, rFP              @ arg1
23368    mov    r2, rSELF            @ arg2
23369    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23370
23371/* ------------------------------ */
23372    .balign 64
23373.L_ALT_OP_UNUSED_85FF: /* 0x185 */
23374/* File: armv5te/alt_stub.S */
23375/*
23376 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23377 * any interesting requests and then jump to the real instruction
23378 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23379 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23380 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23381 * bail to the real handler if breakFlags==0.
23382 */
23383    ldrb   r3, [rSELF, #offThread_breakFlags]
23384    adrl   lr, dvmAsmInstructionStart + (389 * 64)
23385    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23386    cmp    r3, #0
23387    bxeq   lr                   @ nothing to do - jump to real handler
23388    EXPORT_PC()
23389    mov    r0, rPC              @ arg0
23390    mov    r1, rFP              @ arg1
23391    mov    r2, rSELF            @ arg2
23392    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23393
23394/* ------------------------------ */
23395    .balign 64
23396.L_ALT_OP_UNUSED_86FF: /* 0x186 */
23397/* File: armv5te/alt_stub.S */
23398/*
23399 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23400 * any interesting requests and then jump to the real instruction
23401 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23402 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23403 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23404 * bail to the real handler if breakFlags==0.
23405 */
23406    ldrb   r3, [rSELF, #offThread_breakFlags]
23407    adrl   lr, dvmAsmInstructionStart + (390 * 64)
23408    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23409    cmp    r3, #0
23410    bxeq   lr                   @ nothing to do - jump to real handler
23411    EXPORT_PC()
23412    mov    r0, rPC              @ arg0
23413    mov    r1, rFP              @ arg1
23414    mov    r2, rSELF            @ arg2
23415    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23416
23417/* ------------------------------ */
23418    .balign 64
23419.L_ALT_OP_UNUSED_87FF: /* 0x187 */
23420/* File: armv5te/alt_stub.S */
23421/*
23422 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23423 * any interesting requests and then jump to the real instruction
23424 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23425 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23426 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23427 * bail to the real handler if breakFlags==0.
23428 */
23429    ldrb   r3, [rSELF, #offThread_breakFlags]
23430    adrl   lr, dvmAsmInstructionStart + (391 * 64)
23431    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23432    cmp    r3, #0
23433    bxeq   lr                   @ nothing to do - jump to real handler
23434    EXPORT_PC()
23435    mov    r0, rPC              @ arg0
23436    mov    r1, rFP              @ arg1
23437    mov    r2, rSELF            @ arg2
23438    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23439
23440/* ------------------------------ */
23441    .balign 64
23442.L_ALT_OP_UNUSED_88FF: /* 0x188 */
23443/* File: armv5te/alt_stub.S */
23444/*
23445 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23446 * any interesting requests and then jump to the real instruction
23447 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23448 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23449 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23450 * bail to the real handler if breakFlags==0.
23451 */
23452    ldrb   r3, [rSELF, #offThread_breakFlags]
23453    adrl   lr, dvmAsmInstructionStart + (392 * 64)
23454    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23455    cmp    r3, #0
23456    bxeq   lr                   @ nothing to do - jump to real handler
23457    EXPORT_PC()
23458    mov    r0, rPC              @ arg0
23459    mov    r1, rFP              @ arg1
23460    mov    r2, rSELF            @ arg2
23461    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23462
23463/* ------------------------------ */
23464    .balign 64
23465.L_ALT_OP_UNUSED_89FF: /* 0x189 */
23466/* File: armv5te/alt_stub.S */
23467/*
23468 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23469 * any interesting requests and then jump to the real instruction
23470 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23471 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23472 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23473 * bail to the real handler if breakFlags==0.
23474 */
23475    ldrb   r3, [rSELF, #offThread_breakFlags]
23476    adrl   lr, dvmAsmInstructionStart + (393 * 64)
23477    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23478    cmp    r3, #0
23479    bxeq   lr                   @ nothing to do - jump to real handler
23480    EXPORT_PC()
23481    mov    r0, rPC              @ arg0
23482    mov    r1, rFP              @ arg1
23483    mov    r2, rSELF            @ arg2
23484    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23485
23486/* ------------------------------ */
23487    .balign 64
23488.L_ALT_OP_UNUSED_8AFF: /* 0x18a */
23489/* File: armv5te/alt_stub.S */
23490/*
23491 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23492 * any interesting requests and then jump to the real instruction
23493 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23494 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23495 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23496 * bail to the real handler if breakFlags==0.
23497 */
23498    ldrb   r3, [rSELF, #offThread_breakFlags]
23499    adrl   lr, dvmAsmInstructionStart + (394 * 64)
23500    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23501    cmp    r3, #0
23502    bxeq   lr                   @ nothing to do - jump to real handler
23503    EXPORT_PC()
23504    mov    r0, rPC              @ arg0
23505    mov    r1, rFP              @ arg1
23506    mov    r2, rSELF            @ arg2
23507    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23508
23509/* ------------------------------ */
23510    .balign 64
23511.L_ALT_OP_UNUSED_8BFF: /* 0x18b */
23512/* File: armv5te/alt_stub.S */
23513/*
23514 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23515 * any interesting requests and then jump to the real instruction
23516 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23517 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23518 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23519 * bail to the real handler if breakFlags==0.
23520 */
23521    ldrb   r3, [rSELF, #offThread_breakFlags]
23522    adrl   lr, dvmAsmInstructionStart + (395 * 64)
23523    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23524    cmp    r3, #0
23525    bxeq   lr                   @ nothing to do - jump to real handler
23526    EXPORT_PC()
23527    mov    r0, rPC              @ arg0
23528    mov    r1, rFP              @ arg1
23529    mov    r2, rSELF            @ arg2
23530    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23531
23532/* ------------------------------ */
23533    .balign 64
23534.L_ALT_OP_UNUSED_8CFF: /* 0x18c */
23535/* File: armv5te/alt_stub.S */
23536/*
23537 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23538 * any interesting requests and then jump to the real instruction
23539 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23540 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23541 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23542 * bail to the real handler if breakFlags==0.
23543 */
23544    ldrb   r3, [rSELF, #offThread_breakFlags]
23545    adrl   lr, dvmAsmInstructionStart + (396 * 64)
23546    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23547    cmp    r3, #0
23548    bxeq   lr                   @ nothing to do - jump to real handler
23549    EXPORT_PC()
23550    mov    r0, rPC              @ arg0
23551    mov    r1, rFP              @ arg1
23552    mov    r2, rSELF            @ arg2
23553    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23554
23555/* ------------------------------ */
23556    .balign 64
23557.L_ALT_OP_UNUSED_8DFF: /* 0x18d */
23558/* File: armv5te/alt_stub.S */
23559/*
23560 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23561 * any interesting requests and then jump to the real instruction
23562 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23563 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23564 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23565 * bail to the real handler if breakFlags==0.
23566 */
23567    ldrb   r3, [rSELF, #offThread_breakFlags]
23568    adrl   lr, dvmAsmInstructionStart + (397 * 64)
23569    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23570    cmp    r3, #0
23571    bxeq   lr                   @ nothing to do - jump to real handler
23572    EXPORT_PC()
23573    mov    r0, rPC              @ arg0
23574    mov    r1, rFP              @ arg1
23575    mov    r2, rSELF            @ arg2
23576    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23577
23578/* ------------------------------ */
23579    .balign 64
23580.L_ALT_OP_UNUSED_8EFF: /* 0x18e */
23581/* File: armv5te/alt_stub.S */
23582/*
23583 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23584 * any interesting requests and then jump to the real instruction
23585 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23586 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23587 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23588 * bail to the real handler if breakFlags==0.
23589 */
23590    ldrb   r3, [rSELF, #offThread_breakFlags]
23591    adrl   lr, dvmAsmInstructionStart + (398 * 64)
23592    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23593    cmp    r3, #0
23594    bxeq   lr                   @ nothing to do - jump to real handler
23595    EXPORT_PC()
23596    mov    r0, rPC              @ arg0
23597    mov    r1, rFP              @ arg1
23598    mov    r2, rSELF            @ arg2
23599    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23600
23601/* ------------------------------ */
23602    .balign 64
23603.L_ALT_OP_UNUSED_8FFF: /* 0x18f */
23604/* File: armv5te/alt_stub.S */
23605/*
23606 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23607 * any interesting requests and then jump to the real instruction
23608 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23609 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23610 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23611 * bail to the real handler if breakFlags==0.
23612 */
23613    ldrb   r3, [rSELF, #offThread_breakFlags]
23614    adrl   lr, dvmAsmInstructionStart + (399 * 64)
23615    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23616    cmp    r3, #0
23617    bxeq   lr                   @ nothing to do - jump to real handler
23618    EXPORT_PC()
23619    mov    r0, rPC              @ arg0
23620    mov    r1, rFP              @ arg1
23621    mov    r2, rSELF            @ arg2
23622    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23623
23624/* ------------------------------ */
23625    .balign 64
23626.L_ALT_OP_UNUSED_90FF: /* 0x190 */
23627/* File: armv5te/alt_stub.S */
23628/*
23629 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23630 * any interesting requests and then jump to the real instruction
23631 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23632 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23633 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23634 * bail to the real handler if breakFlags==0.
23635 */
23636    ldrb   r3, [rSELF, #offThread_breakFlags]
23637    adrl   lr, dvmAsmInstructionStart + (400 * 64)
23638    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23639    cmp    r3, #0
23640    bxeq   lr                   @ nothing to do - jump to real handler
23641    EXPORT_PC()
23642    mov    r0, rPC              @ arg0
23643    mov    r1, rFP              @ arg1
23644    mov    r2, rSELF            @ arg2
23645    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23646
23647/* ------------------------------ */
23648    .balign 64
23649.L_ALT_OP_UNUSED_91FF: /* 0x191 */
23650/* File: armv5te/alt_stub.S */
23651/*
23652 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23653 * any interesting requests and then jump to the real instruction
23654 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23655 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23656 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23657 * bail to the real handler if breakFlags==0.
23658 */
23659    ldrb   r3, [rSELF, #offThread_breakFlags]
23660    adrl   lr, dvmAsmInstructionStart + (401 * 64)
23661    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23662    cmp    r3, #0
23663    bxeq   lr                   @ nothing to do - jump to real handler
23664    EXPORT_PC()
23665    mov    r0, rPC              @ arg0
23666    mov    r1, rFP              @ arg1
23667    mov    r2, rSELF            @ arg2
23668    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23669
23670/* ------------------------------ */
23671    .balign 64
23672.L_ALT_OP_UNUSED_92FF: /* 0x192 */
23673/* File: armv5te/alt_stub.S */
23674/*
23675 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23676 * any interesting requests and then jump to the real instruction
23677 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23678 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23679 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23680 * bail to the real handler if breakFlags==0.
23681 */
23682    ldrb   r3, [rSELF, #offThread_breakFlags]
23683    adrl   lr, dvmAsmInstructionStart + (402 * 64)
23684    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23685    cmp    r3, #0
23686    bxeq   lr                   @ nothing to do - jump to real handler
23687    EXPORT_PC()
23688    mov    r0, rPC              @ arg0
23689    mov    r1, rFP              @ arg1
23690    mov    r2, rSELF            @ arg2
23691    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23692
23693/* ------------------------------ */
23694    .balign 64
23695.L_ALT_OP_UNUSED_93FF: /* 0x193 */
23696/* File: armv5te/alt_stub.S */
23697/*
23698 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23699 * any interesting requests and then jump to the real instruction
23700 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23701 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23702 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23703 * bail to the real handler if breakFlags==0.
23704 */
23705    ldrb   r3, [rSELF, #offThread_breakFlags]
23706    adrl   lr, dvmAsmInstructionStart + (403 * 64)
23707    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23708    cmp    r3, #0
23709    bxeq   lr                   @ nothing to do - jump to real handler
23710    EXPORT_PC()
23711    mov    r0, rPC              @ arg0
23712    mov    r1, rFP              @ arg1
23713    mov    r2, rSELF            @ arg2
23714    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23715
23716/* ------------------------------ */
23717    .balign 64
23718.L_ALT_OP_UNUSED_94FF: /* 0x194 */
23719/* File: armv5te/alt_stub.S */
23720/*
23721 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23722 * any interesting requests and then jump to the real instruction
23723 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23724 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23725 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23726 * bail to the real handler if breakFlags==0.
23727 */
23728    ldrb   r3, [rSELF, #offThread_breakFlags]
23729    adrl   lr, dvmAsmInstructionStart + (404 * 64)
23730    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23731    cmp    r3, #0
23732    bxeq   lr                   @ nothing to do - jump to real handler
23733    EXPORT_PC()
23734    mov    r0, rPC              @ arg0
23735    mov    r1, rFP              @ arg1
23736    mov    r2, rSELF            @ arg2
23737    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23738
23739/* ------------------------------ */
23740    .balign 64
23741.L_ALT_OP_UNUSED_95FF: /* 0x195 */
23742/* File: armv5te/alt_stub.S */
23743/*
23744 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23745 * any interesting requests and then jump to the real instruction
23746 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23747 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23748 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23749 * bail to the real handler if breakFlags==0.
23750 */
23751    ldrb   r3, [rSELF, #offThread_breakFlags]
23752    adrl   lr, dvmAsmInstructionStart + (405 * 64)
23753    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23754    cmp    r3, #0
23755    bxeq   lr                   @ nothing to do - jump to real handler
23756    EXPORT_PC()
23757    mov    r0, rPC              @ arg0
23758    mov    r1, rFP              @ arg1
23759    mov    r2, rSELF            @ arg2
23760    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23761
23762/* ------------------------------ */
23763    .balign 64
23764.L_ALT_OP_UNUSED_96FF: /* 0x196 */
23765/* File: armv5te/alt_stub.S */
23766/*
23767 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23768 * any interesting requests and then jump to the real instruction
23769 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23770 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23771 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23772 * bail to the real handler if breakFlags==0.
23773 */
23774    ldrb   r3, [rSELF, #offThread_breakFlags]
23775    adrl   lr, dvmAsmInstructionStart + (406 * 64)
23776    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23777    cmp    r3, #0
23778    bxeq   lr                   @ nothing to do - jump to real handler
23779    EXPORT_PC()
23780    mov    r0, rPC              @ arg0
23781    mov    r1, rFP              @ arg1
23782    mov    r2, rSELF            @ arg2
23783    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23784
23785/* ------------------------------ */
23786    .balign 64
23787.L_ALT_OP_UNUSED_97FF: /* 0x197 */
23788/* File: armv5te/alt_stub.S */
23789/*
23790 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23791 * any interesting requests and then jump to the real instruction
23792 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23793 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23794 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23795 * bail to the real handler if breakFlags==0.
23796 */
23797    ldrb   r3, [rSELF, #offThread_breakFlags]
23798    adrl   lr, dvmAsmInstructionStart + (407 * 64)
23799    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23800    cmp    r3, #0
23801    bxeq   lr                   @ nothing to do - jump to real handler
23802    EXPORT_PC()
23803    mov    r0, rPC              @ arg0
23804    mov    r1, rFP              @ arg1
23805    mov    r2, rSELF            @ arg2
23806    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23807
23808/* ------------------------------ */
23809    .balign 64
23810.L_ALT_OP_UNUSED_98FF: /* 0x198 */
23811/* File: armv5te/alt_stub.S */
23812/*
23813 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23814 * any interesting requests and then jump to the real instruction
23815 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23816 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23817 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23818 * bail to the real handler if breakFlags==0.
23819 */
23820    ldrb   r3, [rSELF, #offThread_breakFlags]
23821    adrl   lr, dvmAsmInstructionStart + (408 * 64)
23822    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23823    cmp    r3, #0
23824    bxeq   lr                   @ nothing to do - jump to real handler
23825    EXPORT_PC()
23826    mov    r0, rPC              @ arg0
23827    mov    r1, rFP              @ arg1
23828    mov    r2, rSELF            @ arg2
23829    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23830
23831/* ------------------------------ */
23832    .balign 64
23833.L_ALT_OP_UNUSED_99FF: /* 0x199 */
23834/* File: armv5te/alt_stub.S */
23835/*
23836 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23837 * any interesting requests and then jump to the real instruction
23838 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23839 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23840 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23841 * bail to the real handler if breakFlags==0.
23842 */
23843    ldrb   r3, [rSELF, #offThread_breakFlags]
23844    adrl   lr, dvmAsmInstructionStart + (409 * 64)
23845    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23846    cmp    r3, #0
23847    bxeq   lr                   @ nothing to do - jump to real handler
23848    EXPORT_PC()
23849    mov    r0, rPC              @ arg0
23850    mov    r1, rFP              @ arg1
23851    mov    r2, rSELF            @ arg2
23852    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23853
23854/* ------------------------------ */
23855    .balign 64
23856.L_ALT_OP_UNUSED_9AFF: /* 0x19a */
23857/* File: armv5te/alt_stub.S */
23858/*
23859 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23860 * any interesting requests and then jump to the real instruction
23861 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23862 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23863 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23864 * bail to the real handler if breakFlags==0.
23865 */
23866    ldrb   r3, [rSELF, #offThread_breakFlags]
23867    adrl   lr, dvmAsmInstructionStart + (410 * 64)
23868    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23869    cmp    r3, #0
23870    bxeq   lr                   @ nothing to do - jump to real handler
23871    EXPORT_PC()
23872    mov    r0, rPC              @ arg0
23873    mov    r1, rFP              @ arg1
23874    mov    r2, rSELF            @ arg2
23875    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23876
23877/* ------------------------------ */
23878    .balign 64
23879.L_ALT_OP_UNUSED_9BFF: /* 0x19b */
23880/* File: armv5te/alt_stub.S */
23881/*
23882 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23883 * any interesting requests and then jump to the real instruction
23884 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23885 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23886 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23887 * bail to the real handler if breakFlags==0.
23888 */
23889    ldrb   r3, [rSELF, #offThread_breakFlags]
23890    adrl   lr, dvmAsmInstructionStart + (411 * 64)
23891    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23892    cmp    r3, #0
23893    bxeq   lr                   @ nothing to do - jump to real handler
23894    EXPORT_PC()
23895    mov    r0, rPC              @ arg0
23896    mov    r1, rFP              @ arg1
23897    mov    r2, rSELF            @ arg2
23898    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23899
23900/* ------------------------------ */
23901    .balign 64
23902.L_ALT_OP_UNUSED_9CFF: /* 0x19c */
23903/* File: armv5te/alt_stub.S */
23904/*
23905 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23906 * any interesting requests and then jump to the real instruction
23907 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23908 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23909 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23910 * bail to the real handler if breakFlags==0.
23911 */
23912    ldrb   r3, [rSELF, #offThread_breakFlags]
23913    adrl   lr, dvmAsmInstructionStart + (412 * 64)
23914    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23915    cmp    r3, #0
23916    bxeq   lr                   @ nothing to do - jump to real handler
23917    EXPORT_PC()
23918    mov    r0, rPC              @ arg0
23919    mov    r1, rFP              @ arg1
23920    mov    r2, rSELF            @ arg2
23921    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23922
23923/* ------------------------------ */
23924    .balign 64
23925.L_ALT_OP_UNUSED_9DFF: /* 0x19d */
23926/* File: armv5te/alt_stub.S */
23927/*
23928 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23929 * any interesting requests and then jump to the real instruction
23930 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23931 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23932 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23933 * bail to the real handler if breakFlags==0.
23934 */
23935    ldrb   r3, [rSELF, #offThread_breakFlags]
23936    adrl   lr, dvmAsmInstructionStart + (413 * 64)
23937    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23938    cmp    r3, #0
23939    bxeq   lr                   @ nothing to do - jump to real handler
23940    EXPORT_PC()
23941    mov    r0, rPC              @ arg0
23942    mov    r1, rFP              @ arg1
23943    mov    r2, rSELF            @ arg2
23944    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23945
23946/* ------------------------------ */
23947    .balign 64
23948.L_ALT_OP_UNUSED_9EFF: /* 0x19e */
23949/* File: armv5te/alt_stub.S */
23950/*
23951 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23952 * any interesting requests and then jump to the real instruction
23953 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23954 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23955 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23956 * bail to the real handler if breakFlags==0.
23957 */
23958    ldrb   r3, [rSELF, #offThread_breakFlags]
23959    adrl   lr, dvmAsmInstructionStart + (414 * 64)
23960    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23961    cmp    r3, #0
23962    bxeq   lr                   @ nothing to do - jump to real handler
23963    EXPORT_PC()
23964    mov    r0, rPC              @ arg0
23965    mov    r1, rFP              @ arg1
23966    mov    r2, rSELF            @ arg2
23967    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23968
23969/* ------------------------------ */
23970    .balign 64
23971.L_ALT_OP_UNUSED_9FFF: /* 0x19f */
23972/* File: armv5te/alt_stub.S */
23973/*
23974 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23975 * any interesting requests and then jump to the real instruction
23976 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23977 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23978 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23979 * bail to the real handler if breakFlags==0.
23980 */
23981    ldrb   r3, [rSELF, #offThread_breakFlags]
23982    adrl   lr, dvmAsmInstructionStart + (415 * 64)
23983    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23984    cmp    r3, #0
23985    bxeq   lr                   @ nothing to do - jump to real handler
23986    EXPORT_PC()
23987    mov    r0, rPC              @ arg0
23988    mov    r1, rFP              @ arg1
23989    mov    r2, rSELF            @ arg2
23990    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23991
23992/* ------------------------------ */
23993    .balign 64
23994.L_ALT_OP_UNUSED_A0FF: /* 0x1a0 */
23995/* File: armv5te/alt_stub.S */
23996/*
23997 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23998 * any interesting requests and then jump to the real instruction
23999 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24000 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24001 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24002 * bail to the real handler if breakFlags==0.
24003 */
24004    ldrb   r3, [rSELF, #offThread_breakFlags]
24005    adrl   lr, dvmAsmInstructionStart + (416 * 64)
24006    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24007    cmp    r3, #0
24008    bxeq   lr                   @ nothing to do - jump to real handler
24009    EXPORT_PC()
24010    mov    r0, rPC              @ arg0
24011    mov    r1, rFP              @ arg1
24012    mov    r2, rSELF            @ arg2
24013    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24014
24015/* ------------------------------ */
24016    .balign 64
24017.L_ALT_OP_UNUSED_A1FF: /* 0x1a1 */
24018/* File: armv5te/alt_stub.S */
24019/*
24020 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24021 * any interesting requests and then jump to the real instruction
24022 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24023 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24024 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24025 * bail to the real handler if breakFlags==0.
24026 */
24027    ldrb   r3, [rSELF, #offThread_breakFlags]
24028    adrl   lr, dvmAsmInstructionStart + (417 * 64)
24029    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24030    cmp    r3, #0
24031    bxeq   lr                   @ nothing to do - jump to real handler
24032    EXPORT_PC()
24033    mov    r0, rPC              @ arg0
24034    mov    r1, rFP              @ arg1
24035    mov    r2, rSELF            @ arg2
24036    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24037
24038/* ------------------------------ */
24039    .balign 64
24040.L_ALT_OP_UNUSED_A2FF: /* 0x1a2 */
24041/* File: armv5te/alt_stub.S */
24042/*
24043 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24044 * any interesting requests and then jump to the real instruction
24045 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24046 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24047 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24048 * bail to the real handler if breakFlags==0.
24049 */
24050    ldrb   r3, [rSELF, #offThread_breakFlags]
24051    adrl   lr, dvmAsmInstructionStart + (418 * 64)
24052    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24053    cmp    r3, #0
24054    bxeq   lr                   @ nothing to do - jump to real handler
24055    EXPORT_PC()
24056    mov    r0, rPC              @ arg0
24057    mov    r1, rFP              @ arg1
24058    mov    r2, rSELF            @ arg2
24059    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24060
24061/* ------------------------------ */
24062    .balign 64
24063.L_ALT_OP_UNUSED_A3FF: /* 0x1a3 */
24064/* File: armv5te/alt_stub.S */
24065/*
24066 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24067 * any interesting requests and then jump to the real instruction
24068 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24069 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24070 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24071 * bail to the real handler if breakFlags==0.
24072 */
24073    ldrb   r3, [rSELF, #offThread_breakFlags]
24074    adrl   lr, dvmAsmInstructionStart + (419 * 64)
24075    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24076    cmp    r3, #0
24077    bxeq   lr                   @ nothing to do - jump to real handler
24078    EXPORT_PC()
24079    mov    r0, rPC              @ arg0
24080    mov    r1, rFP              @ arg1
24081    mov    r2, rSELF            @ arg2
24082    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24083
24084/* ------------------------------ */
24085    .balign 64
24086.L_ALT_OP_UNUSED_A4FF: /* 0x1a4 */
24087/* File: armv5te/alt_stub.S */
24088/*
24089 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24090 * any interesting requests and then jump to the real instruction
24091 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24092 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24093 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24094 * bail to the real handler if breakFlags==0.
24095 */
24096    ldrb   r3, [rSELF, #offThread_breakFlags]
24097    adrl   lr, dvmAsmInstructionStart + (420 * 64)
24098    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24099    cmp    r3, #0
24100    bxeq   lr                   @ nothing to do - jump to real handler
24101    EXPORT_PC()
24102    mov    r0, rPC              @ arg0
24103    mov    r1, rFP              @ arg1
24104    mov    r2, rSELF            @ arg2
24105    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24106
24107/* ------------------------------ */
24108    .balign 64
24109.L_ALT_OP_UNUSED_A5FF: /* 0x1a5 */
24110/* File: armv5te/alt_stub.S */
24111/*
24112 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24113 * any interesting requests and then jump to the real instruction
24114 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24115 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24116 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24117 * bail to the real handler if breakFlags==0.
24118 */
24119    ldrb   r3, [rSELF, #offThread_breakFlags]
24120    adrl   lr, dvmAsmInstructionStart + (421 * 64)
24121    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24122    cmp    r3, #0
24123    bxeq   lr                   @ nothing to do - jump to real handler
24124    EXPORT_PC()
24125    mov    r0, rPC              @ arg0
24126    mov    r1, rFP              @ arg1
24127    mov    r2, rSELF            @ arg2
24128    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24129
24130/* ------------------------------ */
24131    .balign 64
24132.L_ALT_OP_UNUSED_A6FF: /* 0x1a6 */
24133/* File: armv5te/alt_stub.S */
24134/*
24135 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24136 * any interesting requests and then jump to the real instruction
24137 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24138 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24139 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24140 * bail to the real handler if breakFlags==0.
24141 */
24142    ldrb   r3, [rSELF, #offThread_breakFlags]
24143    adrl   lr, dvmAsmInstructionStart + (422 * 64)
24144    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24145    cmp    r3, #0
24146    bxeq   lr                   @ nothing to do - jump to real handler
24147    EXPORT_PC()
24148    mov    r0, rPC              @ arg0
24149    mov    r1, rFP              @ arg1
24150    mov    r2, rSELF            @ arg2
24151    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24152
24153/* ------------------------------ */
24154    .balign 64
24155.L_ALT_OP_UNUSED_A7FF: /* 0x1a7 */
24156/* File: armv5te/alt_stub.S */
24157/*
24158 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24159 * any interesting requests and then jump to the real instruction
24160 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24161 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24162 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24163 * bail to the real handler if breakFlags==0.
24164 */
24165    ldrb   r3, [rSELF, #offThread_breakFlags]
24166    adrl   lr, dvmAsmInstructionStart + (423 * 64)
24167    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24168    cmp    r3, #0
24169    bxeq   lr                   @ nothing to do - jump to real handler
24170    EXPORT_PC()
24171    mov    r0, rPC              @ arg0
24172    mov    r1, rFP              @ arg1
24173    mov    r2, rSELF            @ arg2
24174    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24175
24176/* ------------------------------ */
24177    .balign 64
24178.L_ALT_OP_UNUSED_A8FF: /* 0x1a8 */
24179/* File: armv5te/alt_stub.S */
24180/*
24181 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24182 * any interesting requests and then jump to the real instruction
24183 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24184 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24185 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24186 * bail to the real handler if breakFlags==0.
24187 */
24188    ldrb   r3, [rSELF, #offThread_breakFlags]
24189    adrl   lr, dvmAsmInstructionStart + (424 * 64)
24190    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24191    cmp    r3, #0
24192    bxeq   lr                   @ nothing to do - jump to real handler
24193    EXPORT_PC()
24194    mov    r0, rPC              @ arg0
24195    mov    r1, rFP              @ arg1
24196    mov    r2, rSELF            @ arg2
24197    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24198
24199/* ------------------------------ */
24200    .balign 64
24201.L_ALT_OP_UNUSED_A9FF: /* 0x1a9 */
24202/* File: armv5te/alt_stub.S */
24203/*
24204 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24205 * any interesting requests and then jump to the real instruction
24206 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24207 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24208 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24209 * bail to the real handler if breakFlags==0.
24210 */
24211    ldrb   r3, [rSELF, #offThread_breakFlags]
24212    adrl   lr, dvmAsmInstructionStart + (425 * 64)
24213    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24214    cmp    r3, #0
24215    bxeq   lr                   @ nothing to do - jump to real handler
24216    EXPORT_PC()
24217    mov    r0, rPC              @ arg0
24218    mov    r1, rFP              @ arg1
24219    mov    r2, rSELF            @ arg2
24220    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24221
24222/* ------------------------------ */
24223    .balign 64
24224.L_ALT_OP_UNUSED_AAFF: /* 0x1aa */
24225/* File: armv5te/alt_stub.S */
24226/*
24227 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24228 * any interesting requests and then jump to the real instruction
24229 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24230 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24231 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24232 * bail to the real handler if breakFlags==0.
24233 */
24234    ldrb   r3, [rSELF, #offThread_breakFlags]
24235    adrl   lr, dvmAsmInstructionStart + (426 * 64)
24236    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24237    cmp    r3, #0
24238    bxeq   lr                   @ nothing to do - jump to real handler
24239    EXPORT_PC()
24240    mov    r0, rPC              @ arg0
24241    mov    r1, rFP              @ arg1
24242    mov    r2, rSELF            @ arg2
24243    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24244
24245/* ------------------------------ */
24246    .balign 64
24247.L_ALT_OP_UNUSED_ABFF: /* 0x1ab */
24248/* File: armv5te/alt_stub.S */
24249/*
24250 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24251 * any interesting requests and then jump to the real instruction
24252 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24253 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24254 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24255 * bail to the real handler if breakFlags==0.
24256 */
24257    ldrb   r3, [rSELF, #offThread_breakFlags]
24258    adrl   lr, dvmAsmInstructionStart + (427 * 64)
24259    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24260    cmp    r3, #0
24261    bxeq   lr                   @ nothing to do - jump to real handler
24262    EXPORT_PC()
24263    mov    r0, rPC              @ arg0
24264    mov    r1, rFP              @ arg1
24265    mov    r2, rSELF            @ arg2
24266    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24267
24268/* ------------------------------ */
24269    .balign 64
24270.L_ALT_OP_UNUSED_ACFF: /* 0x1ac */
24271/* File: armv5te/alt_stub.S */
24272/*
24273 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24274 * any interesting requests and then jump to the real instruction
24275 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24276 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24277 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24278 * bail to the real handler if breakFlags==0.
24279 */
24280    ldrb   r3, [rSELF, #offThread_breakFlags]
24281    adrl   lr, dvmAsmInstructionStart + (428 * 64)
24282    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24283    cmp    r3, #0
24284    bxeq   lr                   @ nothing to do - jump to real handler
24285    EXPORT_PC()
24286    mov    r0, rPC              @ arg0
24287    mov    r1, rFP              @ arg1
24288    mov    r2, rSELF            @ arg2
24289    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24290
24291/* ------------------------------ */
24292    .balign 64
24293.L_ALT_OP_UNUSED_ADFF: /* 0x1ad */
24294/* File: armv5te/alt_stub.S */
24295/*
24296 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24297 * any interesting requests and then jump to the real instruction
24298 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24299 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24300 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24301 * bail to the real handler if breakFlags==0.
24302 */
24303    ldrb   r3, [rSELF, #offThread_breakFlags]
24304    adrl   lr, dvmAsmInstructionStart + (429 * 64)
24305    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24306    cmp    r3, #0
24307    bxeq   lr                   @ nothing to do - jump to real handler
24308    EXPORT_PC()
24309    mov    r0, rPC              @ arg0
24310    mov    r1, rFP              @ arg1
24311    mov    r2, rSELF            @ arg2
24312    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24313
24314/* ------------------------------ */
24315    .balign 64
24316.L_ALT_OP_UNUSED_AEFF: /* 0x1ae */
24317/* File: armv5te/alt_stub.S */
24318/*
24319 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24320 * any interesting requests and then jump to the real instruction
24321 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24322 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24323 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24324 * bail to the real handler if breakFlags==0.
24325 */
24326    ldrb   r3, [rSELF, #offThread_breakFlags]
24327    adrl   lr, dvmAsmInstructionStart + (430 * 64)
24328    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24329    cmp    r3, #0
24330    bxeq   lr                   @ nothing to do - jump to real handler
24331    EXPORT_PC()
24332    mov    r0, rPC              @ arg0
24333    mov    r1, rFP              @ arg1
24334    mov    r2, rSELF            @ arg2
24335    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24336
24337/* ------------------------------ */
24338    .balign 64
24339.L_ALT_OP_UNUSED_AFFF: /* 0x1af */
24340/* File: armv5te/alt_stub.S */
24341/*
24342 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24343 * any interesting requests and then jump to the real instruction
24344 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24345 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24346 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24347 * bail to the real handler if breakFlags==0.
24348 */
24349    ldrb   r3, [rSELF, #offThread_breakFlags]
24350    adrl   lr, dvmAsmInstructionStart + (431 * 64)
24351    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24352    cmp    r3, #0
24353    bxeq   lr                   @ nothing to do - jump to real handler
24354    EXPORT_PC()
24355    mov    r0, rPC              @ arg0
24356    mov    r1, rFP              @ arg1
24357    mov    r2, rSELF            @ arg2
24358    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24359
24360/* ------------------------------ */
24361    .balign 64
24362.L_ALT_OP_UNUSED_B0FF: /* 0x1b0 */
24363/* File: armv5te/alt_stub.S */
24364/*
24365 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24366 * any interesting requests and then jump to the real instruction
24367 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24368 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24369 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24370 * bail to the real handler if breakFlags==0.
24371 */
24372    ldrb   r3, [rSELF, #offThread_breakFlags]
24373    adrl   lr, dvmAsmInstructionStart + (432 * 64)
24374    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24375    cmp    r3, #0
24376    bxeq   lr                   @ nothing to do - jump to real handler
24377    EXPORT_PC()
24378    mov    r0, rPC              @ arg0
24379    mov    r1, rFP              @ arg1
24380    mov    r2, rSELF            @ arg2
24381    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24382
24383/* ------------------------------ */
24384    .balign 64
24385.L_ALT_OP_UNUSED_B1FF: /* 0x1b1 */
24386/* File: armv5te/alt_stub.S */
24387/*
24388 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24389 * any interesting requests and then jump to the real instruction
24390 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24391 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24392 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24393 * bail to the real handler if breakFlags==0.
24394 */
24395    ldrb   r3, [rSELF, #offThread_breakFlags]
24396    adrl   lr, dvmAsmInstructionStart + (433 * 64)
24397    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24398    cmp    r3, #0
24399    bxeq   lr                   @ nothing to do - jump to real handler
24400    EXPORT_PC()
24401    mov    r0, rPC              @ arg0
24402    mov    r1, rFP              @ arg1
24403    mov    r2, rSELF            @ arg2
24404    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24405
24406/* ------------------------------ */
24407    .balign 64
24408.L_ALT_OP_UNUSED_B2FF: /* 0x1b2 */
24409/* File: armv5te/alt_stub.S */
24410/*
24411 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24412 * any interesting requests and then jump to the real instruction
24413 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24414 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24415 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24416 * bail to the real handler if breakFlags==0.
24417 */
24418    ldrb   r3, [rSELF, #offThread_breakFlags]
24419    adrl   lr, dvmAsmInstructionStart + (434 * 64)
24420    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24421    cmp    r3, #0
24422    bxeq   lr                   @ nothing to do - jump to real handler
24423    EXPORT_PC()
24424    mov    r0, rPC              @ arg0
24425    mov    r1, rFP              @ arg1
24426    mov    r2, rSELF            @ arg2
24427    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24428
24429/* ------------------------------ */
24430    .balign 64
24431.L_ALT_OP_UNUSED_B3FF: /* 0x1b3 */
24432/* File: armv5te/alt_stub.S */
24433/*
24434 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24435 * any interesting requests and then jump to the real instruction
24436 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24437 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24438 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24439 * bail to the real handler if breakFlags==0.
24440 */
24441    ldrb   r3, [rSELF, #offThread_breakFlags]
24442    adrl   lr, dvmAsmInstructionStart + (435 * 64)
24443    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24444    cmp    r3, #0
24445    bxeq   lr                   @ nothing to do - jump to real handler
24446    EXPORT_PC()
24447    mov    r0, rPC              @ arg0
24448    mov    r1, rFP              @ arg1
24449    mov    r2, rSELF            @ arg2
24450    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24451
24452/* ------------------------------ */
24453    .balign 64
24454.L_ALT_OP_UNUSED_B4FF: /* 0x1b4 */
24455/* File: armv5te/alt_stub.S */
24456/*
24457 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24458 * any interesting requests and then jump to the real instruction
24459 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24460 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24461 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24462 * bail to the real handler if breakFlags==0.
24463 */
24464    ldrb   r3, [rSELF, #offThread_breakFlags]
24465    adrl   lr, dvmAsmInstructionStart + (436 * 64)
24466    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24467    cmp    r3, #0
24468    bxeq   lr                   @ nothing to do - jump to real handler
24469    EXPORT_PC()
24470    mov    r0, rPC              @ arg0
24471    mov    r1, rFP              @ arg1
24472    mov    r2, rSELF            @ arg2
24473    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24474
24475/* ------------------------------ */
24476    .balign 64
24477.L_ALT_OP_UNUSED_B5FF: /* 0x1b5 */
24478/* File: armv5te/alt_stub.S */
24479/*
24480 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24481 * any interesting requests and then jump to the real instruction
24482 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24483 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24484 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24485 * bail to the real handler if breakFlags==0.
24486 */
24487    ldrb   r3, [rSELF, #offThread_breakFlags]
24488    adrl   lr, dvmAsmInstructionStart + (437 * 64)
24489    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24490    cmp    r3, #0
24491    bxeq   lr                   @ nothing to do - jump to real handler
24492    EXPORT_PC()
24493    mov    r0, rPC              @ arg0
24494    mov    r1, rFP              @ arg1
24495    mov    r2, rSELF            @ arg2
24496    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24497
24498/* ------------------------------ */
24499    .balign 64
24500.L_ALT_OP_UNUSED_B6FF: /* 0x1b6 */
24501/* File: armv5te/alt_stub.S */
24502/*
24503 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24504 * any interesting requests and then jump to the real instruction
24505 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24506 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24507 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24508 * bail to the real handler if breakFlags==0.
24509 */
24510    ldrb   r3, [rSELF, #offThread_breakFlags]
24511    adrl   lr, dvmAsmInstructionStart + (438 * 64)
24512    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24513    cmp    r3, #0
24514    bxeq   lr                   @ nothing to do - jump to real handler
24515    EXPORT_PC()
24516    mov    r0, rPC              @ arg0
24517    mov    r1, rFP              @ arg1
24518    mov    r2, rSELF            @ arg2
24519    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24520
24521/* ------------------------------ */
24522    .balign 64
24523.L_ALT_OP_UNUSED_B7FF: /* 0x1b7 */
24524/* File: armv5te/alt_stub.S */
24525/*
24526 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24527 * any interesting requests and then jump to the real instruction
24528 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24529 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24530 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24531 * bail to the real handler if breakFlags==0.
24532 */
24533    ldrb   r3, [rSELF, #offThread_breakFlags]
24534    adrl   lr, dvmAsmInstructionStart + (439 * 64)
24535    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24536    cmp    r3, #0
24537    bxeq   lr                   @ nothing to do - jump to real handler
24538    EXPORT_PC()
24539    mov    r0, rPC              @ arg0
24540    mov    r1, rFP              @ arg1
24541    mov    r2, rSELF            @ arg2
24542    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24543
24544/* ------------------------------ */
24545    .balign 64
24546.L_ALT_OP_UNUSED_B8FF: /* 0x1b8 */
24547/* File: armv5te/alt_stub.S */
24548/*
24549 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24550 * any interesting requests and then jump to the real instruction
24551 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24552 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24553 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24554 * bail to the real handler if breakFlags==0.
24555 */
24556    ldrb   r3, [rSELF, #offThread_breakFlags]
24557    adrl   lr, dvmAsmInstructionStart + (440 * 64)
24558    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24559    cmp    r3, #0
24560    bxeq   lr                   @ nothing to do - jump to real handler
24561    EXPORT_PC()
24562    mov    r0, rPC              @ arg0
24563    mov    r1, rFP              @ arg1
24564    mov    r2, rSELF            @ arg2
24565    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24566
24567/* ------------------------------ */
24568    .balign 64
24569.L_ALT_OP_UNUSED_B9FF: /* 0x1b9 */
24570/* File: armv5te/alt_stub.S */
24571/*
24572 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24573 * any interesting requests and then jump to the real instruction
24574 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24575 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24576 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24577 * bail to the real handler if breakFlags==0.
24578 */
24579    ldrb   r3, [rSELF, #offThread_breakFlags]
24580    adrl   lr, dvmAsmInstructionStart + (441 * 64)
24581    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24582    cmp    r3, #0
24583    bxeq   lr                   @ nothing to do - jump to real handler
24584    EXPORT_PC()
24585    mov    r0, rPC              @ arg0
24586    mov    r1, rFP              @ arg1
24587    mov    r2, rSELF            @ arg2
24588    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24589
24590/* ------------------------------ */
24591    .balign 64
24592.L_ALT_OP_UNUSED_BAFF: /* 0x1ba */
24593/* File: armv5te/alt_stub.S */
24594/*
24595 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24596 * any interesting requests and then jump to the real instruction
24597 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24598 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24599 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24600 * bail to the real handler if breakFlags==0.
24601 */
24602    ldrb   r3, [rSELF, #offThread_breakFlags]
24603    adrl   lr, dvmAsmInstructionStart + (442 * 64)
24604    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24605    cmp    r3, #0
24606    bxeq   lr                   @ nothing to do - jump to real handler
24607    EXPORT_PC()
24608    mov    r0, rPC              @ arg0
24609    mov    r1, rFP              @ arg1
24610    mov    r2, rSELF            @ arg2
24611    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24612
24613/* ------------------------------ */
24614    .balign 64
24615.L_ALT_OP_UNUSED_BBFF: /* 0x1bb */
24616/* File: armv5te/alt_stub.S */
24617/*
24618 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24619 * any interesting requests and then jump to the real instruction
24620 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24621 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24622 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24623 * bail to the real handler if breakFlags==0.
24624 */
24625    ldrb   r3, [rSELF, #offThread_breakFlags]
24626    adrl   lr, dvmAsmInstructionStart + (443 * 64)
24627    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24628    cmp    r3, #0
24629    bxeq   lr                   @ nothing to do - jump to real handler
24630    EXPORT_PC()
24631    mov    r0, rPC              @ arg0
24632    mov    r1, rFP              @ arg1
24633    mov    r2, rSELF            @ arg2
24634    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24635
24636/* ------------------------------ */
24637    .balign 64
24638.L_ALT_OP_UNUSED_BCFF: /* 0x1bc */
24639/* File: armv5te/alt_stub.S */
24640/*
24641 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24642 * any interesting requests and then jump to the real instruction
24643 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24644 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24645 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24646 * bail to the real handler if breakFlags==0.
24647 */
24648    ldrb   r3, [rSELF, #offThread_breakFlags]
24649    adrl   lr, dvmAsmInstructionStart + (444 * 64)
24650    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24651    cmp    r3, #0
24652    bxeq   lr                   @ nothing to do - jump to real handler
24653    EXPORT_PC()
24654    mov    r0, rPC              @ arg0
24655    mov    r1, rFP              @ arg1
24656    mov    r2, rSELF            @ arg2
24657    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24658
24659/* ------------------------------ */
24660    .balign 64
24661.L_ALT_OP_UNUSED_BDFF: /* 0x1bd */
24662/* File: armv5te/alt_stub.S */
24663/*
24664 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24665 * any interesting requests and then jump to the real instruction
24666 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24667 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24668 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24669 * bail to the real handler if breakFlags==0.
24670 */
24671    ldrb   r3, [rSELF, #offThread_breakFlags]
24672    adrl   lr, dvmAsmInstructionStart + (445 * 64)
24673    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24674    cmp    r3, #0
24675    bxeq   lr                   @ nothing to do - jump to real handler
24676    EXPORT_PC()
24677    mov    r0, rPC              @ arg0
24678    mov    r1, rFP              @ arg1
24679    mov    r2, rSELF            @ arg2
24680    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24681
24682/* ------------------------------ */
24683    .balign 64
24684.L_ALT_OP_UNUSED_BEFF: /* 0x1be */
24685/* File: armv5te/alt_stub.S */
24686/*
24687 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24688 * any interesting requests and then jump to the real instruction
24689 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24690 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24691 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24692 * bail to the real handler if breakFlags==0.
24693 */
24694    ldrb   r3, [rSELF, #offThread_breakFlags]
24695    adrl   lr, dvmAsmInstructionStart + (446 * 64)
24696    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24697    cmp    r3, #0
24698    bxeq   lr                   @ nothing to do - jump to real handler
24699    EXPORT_PC()
24700    mov    r0, rPC              @ arg0
24701    mov    r1, rFP              @ arg1
24702    mov    r2, rSELF            @ arg2
24703    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24704
24705/* ------------------------------ */
24706    .balign 64
24707.L_ALT_OP_UNUSED_BFFF: /* 0x1bf */
24708/* File: armv5te/alt_stub.S */
24709/*
24710 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24711 * any interesting requests and then jump to the real instruction
24712 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24713 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24714 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24715 * bail to the real handler if breakFlags==0.
24716 */
24717    ldrb   r3, [rSELF, #offThread_breakFlags]
24718    adrl   lr, dvmAsmInstructionStart + (447 * 64)
24719    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24720    cmp    r3, #0
24721    bxeq   lr                   @ nothing to do - jump to real handler
24722    EXPORT_PC()
24723    mov    r0, rPC              @ arg0
24724    mov    r1, rFP              @ arg1
24725    mov    r2, rSELF            @ arg2
24726    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24727
24728/* ------------------------------ */
24729    .balign 64
24730.L_ALT_OP_UNUSED_C0FF: /* 0x1c0 */
24731/* File: armv5te/alt_stub.S */
24732/*
24733 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24734 * any interesting requests and then jump to the real instruction
24735 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24736 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24737 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24738 * bail to the real handler if breakFlags==0.
24739 */
24740    ldrb   r3, [rSELF, #offThread_breakFlags]
24741    adrl   lr, dvmAsmInstructionStart + (448 * 64)
24742    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24743    cmp    r3, #0
24744    bxeq   lr                   @ nothing to do - jump to real handler
24745    EXPORT_PC()
24746    mov    r0, rPC              @ arg0
24747    mov    r1, rFP              @ arg1
24748    mov    r2, rSELF            @ arg2
24749    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24750
24751/* ------------------------------ */
24752    .balign 64
24753.L_ALT_OP_UNUSED_C1FF: /* 0x1c1 */
24754/* File: armv5te/alt_stub.S */
24755/*
24756 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24757 * any interesting requests and then jump to the real instruction
24758 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24759 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24760 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24761 * bail to the real handler if breakFlags==0.
24762 */
24763    ldrb   r3, [rSELF, #offThread_breakFlags]
24764    adrl   lr, dvmAsmInstructionStart + (449 * 64)
24765    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24766    cmp    r3, #0
24767    bxeq   lr                   @ nothing to do - jump to real handler
24768    EXPORT_PC()
24769    mov    r0, rPC              @ arg0
24770    mov    r1, rFP              @ arg1
24771    mov    r2, rSELF            @ arg2
24772    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24773
24774/* ------------------------------ */
24775    .balign 64
24776.L_ALT_OP_UNUSED_C2FF: /* 0x1c2 */
24777/* File: armv5te/alt_stub.S */
24778/*
24779 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24780 * any interesting requests and then jump to the real instruction
24781 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24782 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24783 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24784 * bail to the real handler if breakFlags==0.
24785 */
24786    ldrb   r3, [rSELF, #offThread_breakFlags]
24787    adrl   lr, dvmAsmInstructionStart + (450 * 64)
24788    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24789    cmp    r3, #0
24790    bxeq   lr                   @ nothing to do - jump to real handler
24791    EXPORT_PC()
24792    mov    r0, rPC              @ arg0
24793    mov    r1, rFP              @ arg1
24794    mov    r2, rSELF            @ arg2
24795    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24796
24797/* ------------------------------ */
24798    .balign 64
24799.L_ALT_OP_UNUSED_C3FF: /* 0x1c3 */
24800/* File: armv5te/alt_stub.S */
24801/*
24802 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24803 * any interesting requests and then jump to the real instruction
24804 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24805 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24806 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24807 * bail to the real handler if breakFlags==0.
24808 */
24809    ldrb   r3, [rSELF, #offThread_breakFlags]
24810    adrl   lr, dvmAsmInstructionStart + (451 * 64)
24811    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24812    cmp    r3, #0
24813    bxeq   lr                   @ nothing to do - jump to real handler
24814    EXPORT_PC()
24815    mov    r0, rPC              @ arg0
24816    mov    r1, rFP              @ arg1
24817    mov    r2, rSELF            @ arg2
24818    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24819
24820/* ------------------------------ */
24821    .balign 64
24822.L_ALT_OP_UNUSED_C4FF: /* 0x1c4 */
24823/* File: armv5te/alt_stub.S */
24824/*
24825 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24826 * any interesting requests and then jump to the real instruction
24827 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24828 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24829 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24830 * bail to the real handler if breakFlags==0.
24831 */
24832    ldrb   r3, [rSELF, #offThread_breakFlags]
24833    adrl   lr, dvmAsmInstructionStart + (452 * 64)
24834    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24835    cmp    r3, #0
24836    bxeq   lr                   @ nothing to do - jump to real handler
24837    EXPORT_PC()
24838    mov    r0, rPC              @ arg0
24839    mov    r1, rFP              @ arg1
24840    mov    r2, rSELF            @ arg2
24841    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24842
24843/* ------------------------------ */
24844    .balign 64
24845.L_ALT_OP_UNUSED_C5FF: /* 0x1c5 */
24846/* File: armv5te/alt_stub.S */
24847/*
24848 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24849 * any interesting requests and then jump to the real instruction
24850 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24851 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24852 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24853 * bail to the real handler if breakFlags==0.
24854 */
24855    ldrb   r3, [rSELF, #offThread_breakFlags]
24856    adrl   lr, dvmAsmInstructionStart + (453 * 64)
24857    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24858    cmp    r3, #0
24859    bxeq   lr                   @ nothing to do - jump to real handler
24860    EXPORT_PC()
24861    mov    r0, rPC              @ arg0
24862    mov    r1, rFP              @ arg1
24863    mov    r2, rSELF            @ arg2
24864    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24865
24866/* ------------------------------ */
24867    .balign 64
24868.L_ALT_OP_UNUSED_C6FF: /* 0x1c6 */
24869/* File: armv5te/alt_stub.S */
24870/*
24871 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24872 * any interesting requests and then jump to the real instruction
24873 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24874 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24875 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24876 * bail to the real handler if breakFlags==0.
24877 */
24878    ldrb   r3, [rSELF, #offThread_breakFlags]
24879    adrl   lr, dvmAsmInstructionStart + (454 * 64)
24880    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24881    cmp    r3, #0
24882    bxeq   lr                   @ nothing to do - jump to real handler
24883    EXPORT_PC()
24884    mov    r0, rPC              @ arg0
24885    mov    r1, rFP              @ arg1
24886    mov    r2, rSELF            @ arg2
24887    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24888
24889/* ------------------------------ */
24890    .balign 64
24891.L_ALT_OP_UNUSED_C7FF: /* 0x1c7 */
24892/* File: armv5te/alt_stub.S */
24893/*
24894 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24895 * any interesting requests and then jump to the real instruction
24896 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24897 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24898 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24899 * bail to the real handler if breakFlags==0.
24900 */
24901    ldrb   r3, [rSELF, #offThread_breakFlags]
24902    adrl   lr, dvmAsmInstructionStart + (455 * 64)
24903    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24904    cmp    r3, #0
24905    bxeq   lr                   @ nothing to do - jump to real handler
24906    EXPORT_PC()
24907    mov    r0, rPC              @ arg0
24908    mov    r1, rFP              @ arg1
24909    mov    r2, rSELF            @ arg2
24910    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24911
24912/* ------------------------------ */
24913    .balign 64
24914.L_ALT_OP_UNUSED_C8FF: /* 0x1c8 */
24915/* File: armv5te/alt_stub.S */
24916/*
24917 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24918 * any interesting requests and then jump to the real instruction
24919 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24920 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24921 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24922 * bail to the real handler if breakFlags==0.
24923 */
24924    ldrb   r3, [rSELF, #offThread_breakFlags]
24925    adrl   lr, dvmAsmInstructionStart + (456 * 64)
24926    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24927    cmp    r3, #0
24928    bxeq   lr                   @ nothing to do - jump to real handler
24929    EXPORT_PC()
24930    mov    r0, rPC              @ arg0
24931    mov    r1, rFP              @ arg1
24932    mov    r2, rSELF            @ arg2
24933    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24934
24935/* ------------------------------ */
24936    .balign 64
24937.L_ALT_OP_UNUSED_C9FF: /* 0x1c9 */
24938/* File: armv5te/alt_stub.S */
24939/*
24940 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24941 * any interesting requests and then jump to the real instruction
24942 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24943 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24944 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24945 * bail to the real handler if breakFlags==0.
24946 */
24947    ldrb   r3, [rSELF, #offThread_breakFlags]
24948    adrl   lr, dvmAsmInstructionStart + (457 * 64)
24949    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24950    cmp    r3, #0
24951    bxeq   lr                   @ nothing to do - jump to real handler
24952    EXPORT_PC()
24953    mov    r0, rPC              @ arg0
24954    mov    r1, rFP              @ arg1
24955    mov    r2, rSELF            @ arg2
24956    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24957
24958/* ------------------------------ */
24959    .balign 64
24960.L_ALT_OP_UNUSED_CAFF: /* 0x1ca */
24961/* File: armv5te/alt_stub.S */
24962/*
24963 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24964 * any interesting requests and then jump to the real instruction
24965 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24966 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24967 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24968 * bail to the real handler if breakFlags==0.
24969 */
24970    ldrb   r3, [rSELF, #offThread_breakFlags]
24971    adrl   lr, dvmAsmInstructionStart + (458 * 64)
24972    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24973    cmp    r3, #0
24974    bxeq   lr                   @ nothing to do - jump to real handler
24975    EXPORT_PC()
24976    mov    r0, rPC              @ arg0
24977    mov    r1, rFP              @ arg1
24978    mov    r2, rSELF            @ arg2
24979    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24980
24981/* ------------------------------ */
24982    .balign 64
24983.L_ALT_OP_UNUSED_CBFF: /* 0x1cb */
24984/* File: armv5te/alt_stub.S */
24985/*
24986 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24987 * any interesting requests and then jump to the real instruction
24988 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24989 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24990 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24991 * bail to the real handler if breakFlags==0.
24992 */
24993    ldrb   r3, [rSELF, #offThread_breakFlags]
24994    adrl   lr, dvmAsmInstructionStart + (459 * 64)
24995    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24996    cmp    r3, #0
24997    bxeq   lr                   @ nothing to do - jump to real handler
24998    EXPORT_PC()
24999    mov    r0, rPC              @ arg0
25000    mov    r1, rFP              @ arg1
25001    mov    r2, rSELF            @ arg2
25002    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25003
25004/* ------------------------------ */
25005    .balign 64
25006.L_ALT_OP_UNUSED_CCFF: /* 0x1cc */
25007/* File: armv5te/alt_stub.S */
25008/*
25009 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25010 * any interesting requests and then jump to the real instruction
25011 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25012 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25013 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25014 * bail to the real handler if breakFlags==0.
25015 */
25016    ldrb   r3, [rSELF, #offThread_breakFlags]
25017    adrl   lr, dvmAsmInstructionStart + (460 * 64)
25018    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25019    cmp    r3, #0
25020    bxeq   lr                   @ nothing to do - jump to real handler
25021    EXPORT_PC()
25022    mov    r0, rPC              @ arg0
25023    mov    r1, rFP              @ arg1
25024    mov    r2, rSELF            @ arg2
25025    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25026
25027/* ------------------------------ */
25028    .balign 64
25029.L_ALT_OP_UNUSED_CDFF: /* 0x1cd */
25030/* File: armv5te/alt_stub.S */
25031/*
25032 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25033 * any interesting requests and then jump to the real instruction
25034 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25035 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25036 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25037 * bail to the real handler if breakFlags==0.
25038 */
25039    ldrb   r3, [rSELF, #offThread_breakFlags]
25040    adrl   lr, dvmAsmInstructionStart + (461 * 64)
25041    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25042    cmp    r3, #0
25043    bxeq   lr                   @ nothing to do - jump to real handler
25044    EXPORT_PC()
25045    mov    r0, rPC              @ arg0
25046    mov    r1, rFP              @ arg1
25047    mov    r2, rSELF            @ arg2
25048    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25049
25050/* ------------------------------ */
25051    .balign 64
25052.L_ALT_OP_UNUSED_CEFF: /* 0x1ce */
25053/* File: armv5te/alt_stub.S */
25054/*
25055 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25056 * any interesting requests and then jump to the real instruction
25057 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25058 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25059 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25060 * bail to the real handler if breakFlags==0.
25061 */
25062    ldrb   r3, [rSELF, #offThread_breakFlags]
25063    adrl   lr, dvmAsmInstructionStart + (462 * 64)
25064    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25065    cmp    r3, #0
25066    bxeq   lr                   @ nothing to do - jump to real handler
25067    EXPORT_PC()
25068    mov    r0, rPC              @ arg0
25069    mov    r1, rFP              @ arg1
25070    mov    r2, rSELF            @ arg2
25071    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25072
25073/* ------------------------------ */
25074    .balign 64
25075.L_ALT_OP_UNUSED_CFFF: /* 0x1cf */
25076/* File: armv5te/alt_stub.S */
25077/*
25078 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25079 * any interesting requests and then jump to the real instruction
25080 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25081 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25082 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25083 * bail to the real handler if breakFlags==0.
25084 */
25085    ldrb   r3, [rSELF, #offThread_breakFlags]
25086    adrl   lr, dvmAsmInstructionStart + (463 * 64)
25087    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25088    cmp    r3, #0
25089    bxeq   lr                   @ nothing to do - jump to real handler
25090    EXPORT_PC()
25091    mov    r0, rPC              @ arg0
25092    mov    r1, rFP              @ arg1
25093    mov    r2, rSELF            @ arg2
25094    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25095
25096/* ------------------------------ */
25097    .balign 64
25098.L_ALT_OP_UNUSED_D0FF: /* 0x1d0 */
25099/* File: armv5te/alt_stub.S */
25100/*
25101 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25102 * any interesting requests and then jump to the real instruction
25103 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25104 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25105 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25106 * bail to the real handler if breakFlags==0.
25107 */
25108    ldrb   r3, [rSELF, #offThread_breakFlags]
25109    adrl   lr, dvmAsmInstructionStart + (464 * 64)
25110    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25111    cmp    r3, #0
25112    bxeq   lr                   @ nothing to do - jump to real handler
25113    EXPORT_PC()
25114    mov    r0, rPC              @ arg0
25115    mov    r1, rFP              @ arg1
25116    mov    r2, rSELF            @ arg2
25117    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25118
25119/* ------------------------------ */
25120    .balign 64
25121.L_ALT_OP_UNUSED_D1FF: /* 0x1d1 */
25122/* File: armv5te/alt_stub.S */
25123/*
25124 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25125 * any interesting requests and then jump to the real instruction
25126 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25127 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25128 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25129 * bail to the real handler if breakFlags==0.
25130 */
25131    ldrb   r3, [rSELF, #offThread_breakFlags]
25132    adrl   lr, dvmAsmInstructionStart + (465 * 64)
25133    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25134    cmp    r3, #0
25135    bxeq   lr                   @ nothing to do - jump to real handler
25136    EXPORT_PC()
25137    mov    r0, rPC              @ arg0
25138    mov    r1, rFP              @ arg1
25139    mov    r2, rSELF            @ arg2
25140    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25141
25142/* ------------------------------ */
25143    .balign 64
25144.L_ALT_OP_UNUSED_D2FF: /* 0x1d2 */
25145/* File: armv5te/alt_stub.S */
25146/*
25147 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25148 * any interesting requests and then jump to the real instruction
25149 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25150 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25151 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25152 * bail to the real handler if breakFlags==0.
25153 */
25154    ldrb   r3, [rSELF, #offThread_breakFlags]
25155    adrl   lr, dvmAsmInstructionStart + (466 * 64)
25156    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25157    cmp    r3, #0
25158    bxeq   lr                   @ nothing to do - jump to real handler
25159    EXPORT_PC()
25160    mov    r0, rPC              @ arg0
25161    mov    r1, rFP              @ arg1
25162    mov    r2, rSELF            @ arg2
25163    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25164
25165/* ------------------------------ */
25166    .balign 64
25167.L_ALT_OP_UNUSED_D3FF: /* 0x1d3 */
25168/* File: armv5te/alt_stub.S */
25169/*
25170 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25171 * any interesting requests and then jump to the real instruction
25172 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25173 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25174 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25175 * bail to the real handler if breakFlags==0.
25176 */
25177    ldrb   r3, [rSELF, #offThread_breakFlags]
25178    adrl   lr, dvmAsmInstructionStart + (467 * 64)
25179    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25180    cmp    r3, #0
25181    bxeq   lr                   @ nothing to do - jump to real handler
25182    EXPORT_PC()
25183    mov    r0, rPC              @ arg0
25184    mov    r1, rFP              @ arg1
25185    mov    r2, rSELF            @ arg2
25186    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25187
25188/* ------------------------------ */
25189    .balign 64
25190.L_ALT_OP_UNUSED_D4FF: /* 0x1d4 */
25191/* File: armv5te/alt_stub.S */
25192/*
25193 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25194 * any interesting requests and then jump to the real instruction
25195 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25196 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25197 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25198 * bail to the real handler if breakFlags==0.
25199 */
25200    ldrb   r3, [rSELF, #offThread_breakFlags]
25201    adrl   lr, dvmAsmInstructionStart + (468 * 64)
25202    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25203    cmp    r3, #0
25204    bxeq   lr                   @ nothing to do - jump to real handler
25205    EXPORT_PC()
25206    mov    r0, rPC              @ arg0
25207    mov    r1, rFP              @ arg1
25208    mov    r2, rSELF            @ arg2
25209    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25210
25211/* ------------------------------ */
25212    .balign 64
25213.L_ALT_OP_UNUSED_D5FF: /* 0x1d5 */
25214/* File: armv5te/alt_stub.S */
25215/*
25216 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25217 * any interesting requests and then jump to the real instruction
25218 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25219 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25220 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25221 * bail to the real handler if breakFlags==0.
25222 */
25223    ldrb   r3, [rSELF, #offThread_breakFlags]
25224    adrl   lr, dvmAsmInstructionStart + (469 * 64)
25225    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25226    cmp    r3, #0
25227    bxeq   lr                   @ nothing to do - jump to real handler
25228    EXPORT_PC()
25229    mov    r0, rPC              @ arg0
25230    mov    r1, rFP              @ arg1
25231    mov    r2, rSELF            @ arg2
25232    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25233
25234/* ------------------------------ */
25235    .balign 64
25236.L_ALT_OP_UNUSED_D6FF: /* 0x1d6 */
25237/* File: armv5te/alt_stub.S */
25238/*
25239 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25240 * any interesting requests and then jump to the real instruction
25241 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25242 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25243 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25244 * bail to the real handler if breakFlags==0.
25245 */
25246    ldrb   r3, [rSELF, #offThread_breakFlags]
25247    adrl   lr, dvmAsmInstructionStart + (470 * 64)
25248    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25249    cmp    r3, #0
25250    bxeq   lr                   @ nothing to do - jump to real handler
25251    EXPORT_PC()
25252    mov    r0, rPC              @ arg0
25253    mov    r1, rFP              @ arg1
25254    mov    r2, rSELF            @ arg2
25255    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25256
25257/* ------------------------------ */
25258    .balign 64
25259.L_ALT_OP_UNUSED_D7FF: /* 0x1d7 */
25260/* File: armv5te/alt_stub.S */
25261/*
25262 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25263 * any interesting requests and then jump to the real instruction
25264 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25265 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25266 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25267 * bail to the real handler if breakFlags==0.
25268 */
25269    ldrb   r3, [rSELF, #offThread_breakFlags]
25270    adrl   lr, dvmAsmInstructionStart + (471 * 64)
25271    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25272    cmp    r3, #0
25273    bxeq   lr                   @ nothing to do - jump to real handler
25274    EXPORT_PC()
25275    mov    r0, rPC              @ arg0
25276    mov    r1, rFP              @ arg1
25277    mov    r2, rSELF            @ arg2
25278    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25279
25280/* ------------------------------ */
25281    .balign 64
25282.L_ALT_OP_UNUSED_D8FF: /* 0x1d8 */
25283/* File: armv5te/alt_stub.S */
25284/*
25285 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25286 * any interesting requests and then jump to the real instruction
25287 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25288 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25289 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25290 * bail to the real handler if breakFlags==0.
25291 */
25292    ldrb   r3, [rSELF, #offThread_breakFlags]
25293    adrl   lr, dvmAsmInstructionStart + (472 * 64)
25294    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25295    cmp    r3, #0
25296    bxeq   lr                   @ nothing to do - jump to real handler
25297    EXPORT_PC()
25298    mov    r0, rPC              @ arg0
25299    mov    r1, rFP              @ arg1
25300    mov    r2, rSELF            @ arg2
25301    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25302
25303/* ------------------------------ */
25304    .balign 64
25305.L_ALT_OP_UNUSED_D9FF: /* 0x1d9 */
25306/* File: armv5te/alt_stub.S */
25307/*
25308 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25309 * any interesting requests and then jump to the real instruction
25310 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25311 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25312 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25313 * bail to the real handler if breakFlags==0.
25314 */
25315    ldrb   r3, [rSELF, #offThread_breakFlags]
25316    adrl   lr, dvmAsmInstructionStart + (473 * 64)
25317    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25318    cmp    r3, #0
25319    bxeq   lr                   @ nothing to do - jump to real handler
25320    EXPORT_PC()
25321    mov    r0, rPC              @ arg0
25322    mov    r1, rFP              @ arg1
25323    mov    r2, rSELF            @ arg2
25324    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25325
25326/* ------------------------------ */
25327    .balign 64
25328.L_ALT_OP_UNUSED_DAFF: /* 0x1da */
25329/* File: armv5te/alt_stub.S */
25330/*
25331 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25332 * any interesting requests and then jump to the real instruction
25333 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25334 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25335 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25336 * bail to the real handler if breakFlags==0.
25337 */
25338    ldrb   r3, [rSELF, #offThread_breakFlags]
25339    adrl   lr, dvmAsmInstructionStart + (474 * 64)
25340    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25341    cmp    r3, #0
25342    bxeq   lr                   @ nothing to do - jump to real handler
25343    EXPORT_PC()
25344    mov    r0, rPC              @ arg0
25345    mov    r1, rFP              @ arg1
25346    mov    r2, rSELF            @ arg2
25347    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25348
25349/* ------------------------------ */
25350    .balign 64
25351.L_ALT_OP_UNUSED_DBFF: /* 0x1db */
25352/* File: armv5te/alt_stub.S */
25353/*
25354 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25355 * any interesting requests and then jump to the real instruction
25356 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25357 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25358 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25359 * bail to the real handler if breakFlags==0.
25360 */
25361    ldrb   r3, [rSELF, #offThread_breakFlags]
25362    adrl   lr, dvmAsmInstructionStart + (475 * 64)
25363    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25364    cmp    r3, #0
25365    bxeq   lr                   @ nothing to do - jump to real handler
25366    EXPORT_PC()
25367    mov    r0, rPC              @ arg0
25368    mov    r1, rFP              @ arg1
25369    mov    r2, rSELF            @ arg2
25370    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25371
25372/* ------------------------------ */
25373    .balign 64
25374.L_ALT_OP_UNUSED_DCFF: /* 0x1dc */
25375/* File: armv5te/alt_stub.S */
25376/*
25377 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25378 * any interesting requests and then jump to the real instruction
25379 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25380 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25381 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25382 * bail to the real handler if breakFlags==0.
25383 */
25384    ldrb   r3, [rSELF, #offThread_breakFlags]
25385    adrl   lr, dvmAsmInstructionStart + (476 * 64)
25386    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25387    cmp    r3, #0
25388    bxeq   lr                   @ nothing to do - jump to real handler
25389    EXPORT_PC()
25390    mov    r0, rPC              @ arg0
25391    mov    r1, rFP              @ arg1
25392    mov    r2, rSELF            @ arg2
25393    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25394
25395/* ------------------------------ */
25396    .balign 64
25397.L_ALT_OP_UNUSED_DDFF: /* 0x1dd */
25398/* File: armv5te/alt_stub.S */
25399/*
25400 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25401 * any interesting requests and then jump to the real instruction
25402 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25403 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25404 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25405 * bail to the real handler if breakFlags==0.
25406 */
25407    ldrb   r3, [rSELF, #offThread_breakFlags]
25408    adrl   lr, dvmAsmInstructionStart + (477 * 64)
25409    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25410    cmp    r3, #0
25411    bxeq   lr                   @ nothing to do - jump to real handler
25412    EXPORT_PC()
25413    mov    r0, rPC              @ arg0
25414    mov    r1, rFP              @ arg1
25415    mov    r2, rSELF            @ arg2
25416    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25417
25418/* ------------------------------ */
25419    .balign 64
25420.L_ALT_OP_UNUSED_DEFF: /* 0x1de */
25421/* File: armv5te/alt_stub.S */
25422/*
25423 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25424 * any interesting requests and then jump to the real instruction
25425 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25426 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25427 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25428 * bail to the real handler if breakFlags==0.
25429 */
25430    ldrb   r3, [rSELF, #offThread_breakFlags]
25431    adrl   lr, dvmAsmInstructionStart + (478 * 64)
25432    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25433    cmp    r3, #0
25434    bxeq   lr                   @ nothing to do - jump to real handler
25435    EXPORT_PC()
25436    mov    r0, rPC              @ arg0
25437    mov    r1, rFP              @ arg1
25438    mov    r2, rSELF            @ arg2
25439    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25440
25441/* ------------------------------ */
25442    .balign 64
25443.L_ALT_OP_UNUSED_DFFF: /* 0x1df */
25444/* File: armv5te/alt_stub.S */
25445/*
25446 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25447 * any interesting requests and then jump to the real instruction
25448 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25449 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25450 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25451 * bail to the real handler if breakFlags==0.
25452 */
25453    ldrb   r3, [rSELF, #offThread_breakFlags]
25454    adrl   lr, dvmAsmInstructionStart + (479 * 64)
25455    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25456    cmp    r3, #0
25457    bxeq   lr                   @ nothing to do - jump to real handler
25458    EXPORT_PC()
25459    mov    r0, rPC              @ arg0
25460    mov    r1, rFP              @ arg1
25461    mov    r2, rSELF            @ arg2
25462    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25463
25464/* ------------------------------ */
25465    .balign 64
25466.L_ALT_OP_UNUSED_E0FF: /* 0x1e0 */
25467/* File: armv5te/alt_stub.S */
25468/*
25469 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25470 * any interesting requests and then jump to the real instruction
25471 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25472 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25473 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25474 * bail to the real handler if breakFlags==0.
25475 */
25476    ldrb   r3, [rSELF, #offThread_breakFlags]
25477    adrl   lr, dvmAsmInstructionStart + (480 * 64)
25478    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25479    cmp    r3, #0
25480    bxeq   lr                   @ nothing to do - jump to real handler
25481    EXPORT_PC()
25482    mov    r0, rPC              @ arg0
25483    mov    r1, rFP              @ arg1
25484    mov    r2, rSELF            @ arg2
25485    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25486
25487/* ------------------------------ */
25488    .balign 64
25489.L_ALT_OP_UNUSED_E1FF: /* 0x1e1 */
25490/* File: armv5te/alt_stub.S */
25491/*
25492 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25493 * any interesting requests and then jump to the real instruction
25494 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25495 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25496 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25497 * bail to the real handler if breakFlags==0.
25498 */
25499    ldrb   r3, [rSELF, #offThread_breakFlags]
25500    adrl   lr, dvmAsmInstructionStart + (481 * 64)
25501    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25502    cmp    r3, #0
25503    bxeq   lr                   @ nothing to do - jump to real handler
25504    EXPORT_PC()
25505    mov    r0, rPC              @ arg0
25506    mov    r1, rFP              @ arg1
25507    mov    r2, rSELF            @ arg2
25508    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25509
25510/* ------------------------------ */
25511    .balign 64
25512.L_ALT_OP_UNUSED_E2FF: /* 0x1e2 */
25513/* File: armv5te/alt_stub.S */
25514/*
25515 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25516 * any interesting requests and then jump to the real instruction
25517 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25518 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25519 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25520 * bail to the real handler if breakFlags==0.
25521 */
25522    ldrb   r3, [rSELF, #offThread_breakFlags]
25523    adrl   lr, dvmAsmInstructionStart + (482 * 64)
25524    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25525    cmp    r3, #0
25526    bxeq   lr                   @ nothing to do - jump to real handler
25527    EXPORT_PC()
25528    mov    r0, rPC              @ arg0
25529    mov    r1, rFP              @ arg1
25530    mov    r2, rSELF            @ arg2
25531    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25532
25533/* ------------------------------ */
25534    .balign 64
25535.L_ALT_OP_UNUSED_E3FF: /* 0x1e3 */
25536/* File: armv5te/alt_stub.S */
25537/*
25538 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25539 * any interesting requests and then jump to the real instruction
25540 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25541 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25542 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25543 * bail to the real handler if breakFlags==0.
25544 */
25545    ldrb   r3, [rSELF, #offThread_breakFlags]
25546    adrl   lr, dvmAsmInstructionStart + (483 * 64)
25547    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25548    cmp    r3, #0
25549    bxeq   lr                   @ nothing to do - jump to real handler
25550    EXPORT_PC()
25551    mov    r0, rPC              @ arg0
25552    mov    r1, rFP              @ arg1
25553    mov    r2, rSELF            @ arg2
25554    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25555
25556/* ------------------------------ */
25557    .balign 64
25558.L_ALT_OP_UNUSED_E4FF: /* 0x1e4 */
25559/* File: armv5te/alt_stub.S */
25560/*
25561 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25562 * any interesting requests and then jump to the real instruction
25563 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25564 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25565 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25566 * bail to the real handler if breakFlags==0.
25567 */
25568    ldrb   r3, [rSELF, #offThread_breakFlags]
25569    adrl   lr, dvmAsmInstructionStart + (484 * 64)
25570    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25571    cmp    r3, #0
25572    bxeq   lr                   @ nothing to do - jump to real handler
25573    EXPORT_PC()
25574    mov    r0, rPC              @ arg0
25575    mov    r1, rFP              @ arg1
25576    mov    r2, rSELF            @ arg2
25577    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25578
25579/* ------------------------------ */
25580    .balign 64
25581.L_ALT_OP_UNUSED_E5FF: /* 0x1e5 */
25582/* File: armv5te/alt_stub.S */
25583/*
25584 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25585 * any interesting requests and then jump to the real instruction
25586 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25587 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25588 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25589 * bail to the real handler if breakFlags==0.
25590 */
25591    ldrb   r3, [rSELF, #offThread_breakFlags]
25592    adrl   lr, dvmAsmInstructionStart + (485 * 64)
25593    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25594    cmp    r3, #0
25595    bxeq   lr                   @ nothing to do - jump to real handler
25596    EXPORT_PC()
25597    mov    r0, rPC              @ arg0
25598    mov    r1, rFP              @ arg1
25599    mov    r2, rSELF            @ arg2
25600    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25601
25602/* ------------------------------ */
25603    .balign 64
25604.L_ALT_OP_UNUSED_E6FF: /* 0x1e6 */
25605/* File: armv5te/alt_stub.S */
25606/*
25607 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25608 * any interesting requests and then jump to the real instruction
25609 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25610 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25611 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25612 * bail to the real handler if breakFlags==0.
25613 */
25614    ldrb   r3, [rSELF, #offThread_breakFlags]
25615    adrl   lr, dvmAsmInstructionStart + (486 * 64)
25616    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25617    cmp    r3, #0
25618    bxeq   lr                   @ nothing to do - jump to real handler
25619    EXPORT_PC()
25620    mov    r0, rPC              @ arg0
25621    mov    r1, rFP              @ arg1
25622    mov    r2, rSELF            @ arg2
25623    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25624
25625/* ------------------------------ */
25626    .balign 64
25627.L_ALT_OP_UNUSED_E7FF: /* 0x1e7 */
25628/* File: armv5te/alt_stub.S */
25629/*
25630 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25631 * any interesting requests and then jump to the real instruction
25632 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25633 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25634 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25635 * bail to the real handler if breakFlags==0.
25636 */
25637    ldrb   r3, [rSELF, #offThread_breakFlags]
25638    adrl   lr, dvmAsmInstructionStart + (487 * 64)
25639    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25640    cmp    r3, #0
25641    bxeq   lr                   @ nothing to do - jump to real handler
25642    EXPORT_PC()
25643    mov    r0, rPC              @ arg0
25644    mov    r1, rFP              @ arg1
25645    mov    r2, rSELF            @ arg2
25646    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25647
25648/* ------------------------------ */
25649    .balign 64
25650.L_ALT_OP_UNUSED_E8FF: /* 0x1e8 */
25651/* File: armv5te/alt_stub.S */
25652/*
25653 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25654 * any interesting requests and then jump to the real instruction
25655 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25656 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25657 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25658 * bail to the real handler if breakFlags==0.
25659 */
25660    ldrb   r3, [rSELF, #offThread_breakFlags]
25661    adrl   lr, dvmAsmInstructionStart + (488 * 64)
25662    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25663    cmp    r3, #0
25664    bxeq   lr                   @ nothing to do - jump to real handler
25665    EXPORT_PC()
25666    mov    r0, rPC              @ arg0
25667    mov    r1, rFP              @ arg1
25668    mov    r2, rSELF            @ arg2
25669    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25670
25671/* ------------------------------ */
25672    .balign 64
25673.L_ALT_OP_UNUSED_E9FF: /* 0x1e9 */
25674/* File: armv5te/alt_stub.S */
25675/*
25676 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25677 * any interesting requests and then jump to the real instruction
25678 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25679 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25680 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25681 * bail to the real handler if breakFlags==0.
25682 */
25683    ldrb   r3, [rSELF, #offThread_breakFlags]
25684    adrl   lr, dvmAsmInstructionStart + (489 * 64)
25685    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25686    cmp    r3, #0
25687    bxeq   lr                   @ nothing to do - jump to real handler
25688    EXPORT_PC()
25689    mov    r0, rPC              @ arg0
25690    mov    r1, rFP              @ arg1
25691    mov    r2, rSELF            @ arg2
25692    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25693
25694/* ------------------------------ */
25695    .balign 64
25696.L_ALT_OP_UNUSED_EAFF: /* 0x1ea */
25697/* File: armv5te/alt_stub.S */
25698/*
25699 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25700 * any interesting requests and then jump to the real instruction
25701 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25702 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25703 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25704 * bail to the real handler if breakFlags==0.
25705 */
25706    ldrb   r3, [rSELF, #offThread_breakFlags]
25707    adrl   lr, dvmAsmInstructionStart + (490 * 64)
25708    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25709    cmp    r3, #0
25710    bxeq   lr                   @ nothing to do - jump to real handler
25711    EXPORT_PC()
25712    mov    r0, rPC              @ arg0
25713    mov    r1, rFP              @ arg1
25714    mov    r2, rSELF            @ arg2
25715    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25716
25717/* ------------------------------ */
25718    .balign 64
25719.L_ALT_OP_UNUSED_EBFF: /* 0x1eb */
25720/* File: armv5te/alt_stub.S */
25721/*
25722 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25723 * any interesting requests and then jump to the real instruction
25724 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25725 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25726 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25727 * bail to the real handler if breakFlags==0.
25728 */
25729    ldrb   r3, [rSELF, #offThread_breakFlags]
25730    adrl   lr, dvmAsmInstructionStart + (491 * 64)
25731    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25732    cmp    r3, #0
25733    bxeq   lr                   @ nothing to do - jump to real handler
25734    EXPORT_PC()
25735    mov    r0, rPC              @ arg0
25736    mov    r1, rFP              @ arg1
25737    mov    r2, rSELF            @ arg2
25738    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25739
25740/* ------------------------------ */
25741    .balign 64
25742.L_ALT_OP_UNUSED_ECFF: /* 0x1ec */
25743/* File: armv5te/alt_stub.S */
25744/*
25745 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25746 * any interesting requests and then jump to the real instruction
25747 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25748 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25749 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25750 * bail to the real handler if breakFlags==0.
25751 */
25752    ldrb   r3, [rSELF, #offThread_breakFlags]
25753    adrl   lr, dvmAsmInstructionStart + (492 * 64)
25754    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25755    cmp    r3, #0
25756    bxeq   lr                   @ nothing to do - jump to real handler
25757    EXPORT_PC()
25758    mov    r0, rPC              @ arg0
25759    mov    r1, rFP              @ arg1
25760    mov    r2, rSELF            @ arg2
25761    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25762
25763/* ------------------------------ */
25764    .balign 64
25765.L_ALT_OP_UNUSED_EDFF: /* 0x1ed */
25766/* File: armv5te/alt_stub.S */
25767/*
25768 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25769 * any interesting requests and then jump to the real instruction
25770 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25771 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25772 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25773 * bail to the real handler if breakFlags==0.
25774 */
25775    ldrb   r3, [rSELF, #offThread_breakFlags]
25776    adrl   lr, dvmAsmInstructionStart + (493 * 64)
25777    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25778    cmp    r3, #0
25779    bxeq   lr                   @ nothing to do - jump to real handler
25780    EXPORT_PC()
25781    mov    r0, rPC              @ arg0
25782    mov    r1, rFP              @ arg1
25783    mov    r2, rSELF            @ arg2
25784    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25785
25786/* ------------------------------ */
25787    .balign 64
25788.L_ALT_OP_UNUSED_EEFF: /* 0x1ee */
25789/* File: armv5te/alt_stub.S */
25790/*
25791 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25792 * any interesting requests and then jump to the real instruction
25793 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25794 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25795 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25796 * bail to the real handler if breakFlags==0.
25797 */
25798    ldrb   r3, [rSELF, #offThread_breakFlags]
25799    adrl   lr, dvmAsmInstructionStart + (494 * 64)
25800    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25801    cmp    r3, #0
25802    bxeq   lr                   @ nothing to do - jump to real handler
25803    EXPORT_PC()
25804    mov    r0, rPC              @ arg0
25805    mov    r1, rFP              @ arg1
25806    mov    r2, rSELF            @ arg2
25807    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25808
25809/* ------------------------------ */
25810    .balign 64
25811.L_ALT_OP_UNUSED_EFFF: /* 0x1ef */
25812/* File: armv5te/alt_stub.S */
25813/*
25814 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25815 * any interesting requests and then jump to the real instruction
25816 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25817 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25818 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25819 * bail to the real handler if breakFlags==0.
25820 */
25821    ldrb   r3, [rSELF, #offThread_breakFlags]
25822    adrl   lr, dvmAsmInstructionStart + (495 * 64)
25823    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25824    cmp    r3, #0
25825    bxeq   lr                   @ nothing to do - jump to real handler
25826    EXPORT_PC()
25827    mov    r0, rPC              @ arg0
25828    mov    r1, rFP              @ arg1
25829    mov    r2, rSELF            @ arg2
25830    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25831
25832/* ------------------------------ */
25833    .balign 64
25834.L_ALT_OP_UNUSED_F0FF: /* 0x1f0 */
25835/* File: armv5te/alt_stub.S */
25836/*
25837 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25838 * any interesting requests and then jump to the real instruction
25839 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25840 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25841 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25842 * bail to the real handler if breakFlags==0.
25843 */
25844    ldrb   r3, [rSELF, #offThread_breakFlags]
25845    adrl   lr, dvmAsmInstructionStart + (496 * 64)
25846    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25847    cmp    r3, #0
25848    bxeq   lr                   @ nothing to do - jump to real handler
25849    EXPORT_PC()
25850    mov    r0, rPC              @ arg0
25851    mov    r1, rFP              @ arg1
25852    mov    r2, rSELF            @ arg2
25853    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25854
25855/* ------------------------------ */
25856    .balign 64
25857.L_ALT_OP_UNUSED_F1FF: /* 0x1f1 */
25858/* File: armv5te/alt_stub.S */
25859/*
25860 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25861 * any interesting requests and then jump to the real instruction
25862 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25863 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25864 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25865 * bail to the real handler if breakFlags==0.
25866 */
25867    ldrb   r3, [rSELF, #offThread_breakFlags]
25868    adrl   lr, dvmAsmInstructionStart + (497 * 64)
25869    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25870    cmp    r3, #0
25871    bxeq   lr                   @ nothing to do - jump to real handler
25872    EXPORT_PC()
25873    mov    r0, rPC              @ arg0
25874    mov    r1, rFP              @ arg1
25875    mov    r2, rSELF            @ arg2
25876    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25877
25878/* ------------------------------ */
25879    .balign 64
25880.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
25881/* File: armv5te/alt_stub.S */
25882/*
25883 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25884 * any interesting requests and then jump to the real instruction
25885 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25886 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25887 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25888 * bail to the real handler if breakFlags==0.
25889 */
25890    ldrb   r3, [rSELF, #offThread_breakFlags]
25891    adrl   lr, dvmAsmInstructionStart + (498 * 64)
25892    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25893    cmp    r3, #0
25894    bxeq   lr                   @ nothing to do - jump to real handler
25895    EXPORT_PC()
25896    mov    r0, rPC              @ arg0
25897    mov    r1, rFP              @ arg1
25898    mov    r2, rSELF            @ arg2
25899    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25900
25901/* ------------------------------ */
25902    .balign 64
25903.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
25904/* File: armv5te/alt_stub.S */
25905/*
25906 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25907 * any interesting requests and then jump to the real instruction
25908 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25909 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25910 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25911 * bail to the real handler if breakFlags==0.
25912 */
25913    ldrb   r3, [rSELF, #offThread_breakFlags]
25914    adrl   lr, dvmAsmInstructionStart + (499 * 64)
25915    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25916    cmp    r3, #0
25917    bxeq   lr                   @ nothing to do - jump to real handler
25918    EXPORT_PC()
25919    mov    r0, rPC              @ arg0
25920    mov    r1, rFP              @ arg1
25921    mov    r2, rSELF            @ arg2
25922    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25923
25924/* ------------------------------ */
25925    .balign 64
25926.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
25927/* File: armv5te/alt_stub.S */
25928/*
25929 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25930 * any interesting requests and then jump to the real instruction
25931 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25932 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25933 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25934 * bail to the real handler if breakFlags==0.
25935 */
25936    ldrb   r3, [rSELF, #offThread_breakFlags]
25937    adrl   lr, dvmAsmInstructionStart + (500 * 64)
25938    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25939    cmp    r3, #0
25940    bxeq   lr                   @ nothing to do - jump to real handler
25941    EXPORT_PC()
25942    mov    r0, rPC              @ arg0
25943    mov    r1, rFP              @ arg1
25944    mov    r2, rSELF            @ arg2
25945    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25946
25947/* ------------------------------ */
25948    .balign 64
25949.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
25950/* File: armv5te/alt_stub.S */
25951/*
25952 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25953 * any interesting requests and then jump to the real instruction
25954 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25955 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25956 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25957 * bail to the real handler if breakFlags==0.
25958 */
25959    ldrb   r3, [rSELF, #offThread_breakFlags]
25960    adrl   lr, dvmAsmInstructionStart + (501 * 64)
25961    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25962    cmp    r3, #0
25963    bxeq   lr                   @ nothing to do - jump to real handler
25964    EXPORT_PC()
25965    mov    r0, rPC              @ arg0
25966    mov    r1, rFP              @ arg1
25967    mov    r2, rSELF            @ arg2
25968    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25969
25970/* ------------------------------ */
25971    .balign 64
25972.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
25973/* File: armv5te/alt_stub.S */
25974/*
25975 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25976 * any interesting requests and then jump to the real instruction
25977 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25978 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25979 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25980 * bail to the real handler if breakFlags==0.
25981 */
25982    ldrb   r3, [rSELF, #offThread_breakFlags]
25983    adrl   lr, dvmAsmInstructionStart + (502 * 64)
25984    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25985    cmp    r3, #0
25986    bxeq   lr                   @ nothing to do - jump to real handler
25987    EXPORT_PC()
25988    mov    r0, rPC              @ arg0
25989    mov    r1, rFP              @ arg1
25990    mov    r2, rSELF            @ arg2
25991    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25992
25993/* ------------------------------ */
25994    .balign 64
25995.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
25996/* File: armv5te/alt_stub.S */
25997/*
25998 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25999 * any interesting requests and then jump to the real instruction
26000 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26001 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26002 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26003 * bail to the real handler if breakFlags==0.
26004 */
26005    ldrb   r3, [rSELF, #offThread_breakFlags]
26006    adrl   lr, dvmAsmInstructionStart + (503 * 64)
26007    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26008    cmp    r3, #0
26009    bxeq   lr                   @ nothing to do - jump to real handler
26010    EXPORT_PC()
26011    mov    r0, rPC              @ arg0
26012    mov    r1, rFP              @ arg1
26013    mov    r2, rSELF            @ arg2
26014    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26015
26016/* ------------------------------ */
26017    .balign 64
26018.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
26019/* File: armv5te/alt_stub.S */
26020/*
26021 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26022 * any interesting requests and then jump to the real instruction
26023 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26024 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26025 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26026 * bail to the real handler if breakFlags==0.
26027 */
26028    ldrb   r3, [rSELF, #offThread_breakFlags]
26029    adrl   lr, dvmAsmInstructionStart + (504 * 64)
26030    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26031    cmp    r3, #0
26032    bxeq   lr                   @ nothing to do - jump to real handler
26033    EXPORT_PC()
26034    mov    r0, rPC              @ arg0
26035    mov    r1, rFP              @ arg1
26036    mov    r2, rSELF            @ arg2
26037    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26038
26039/* ------------------------------ */
26040    .balign 64
26041.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
26042/* File: armv5te/alt_stub.S */
26043/*
26044 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26045 * any interesting requests and then jump to the real instruction
26046 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26047 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26048 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26049 * bail to the real handler if breakFlags==0.
26050 */
26051    ldrb   r3, [rSELF, #offThread_breakFlags]
26052    adrl   lr, dvmAsmInstructionStart + (505 * 64)
26053    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26054    cmp    r3, #0
26055    bxeq   lr                   @ nothing to do - jump to real handler
26056    EXPORT_PC()
26057    mov    r0, rPC              @ arg0
26058    mov    r1, rFP              @ arg1
26059    mov    r2, rSELF            @ arg2
26060    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26061
26062/* ------------------------------ */
26063    .balign 64
26064.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
26065/* File: armv5te/alt_stub.S */
26066/*
26067 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26068 * any interesting requests and then jump to the real instruction
26069 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26070 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26071 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26072 * bail to the real handler if breakFlags==0.
26073 */
26074    ldrb   r3, [rSELF, #offThread_breakFlags]
26075    adrl   lr, dvmAsmInstructionStart + (506 * 64)
26076    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26077    cmp    r3, #0
26078    bxeq   lr                   @ nothing to do - jump to real handler
26079    EXPORT_PC()
26080    mov    r0, rPC              @ arg0
26081    mov    r1, rFP              @ arg1
26082    mov    r2, rSELF            @ arg2
26083    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26084
26085/* ------------------------------ */
26086    .balign 64
26087.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
26088/* File: armv5te/alt_stub.S */
26089/*
26090 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26091 * any interesting requests and then jump to the real instruction
26092 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26093 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26094 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26095 * bail to the real handler if breakFlags==0.
26096 */
26097    ldrb   r3, [rSELF, #offThread_breakFlags]
26098    adrl   lr, dvmAsmInstructionStart + (507 * 64)
26099    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26100    cmp    r3, #0
26101    bxeq   lr                   @ nothing to do - jump to real handler
26102    EXPORT_PC()
26103    mov    r0, rPC              @ arg0
26104    mov    r1, rFP              @ arg1
26105    mov    r2, rSELF            @ arg2
26106    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26107
26108/* ------------------------------ */
26109    .balign 64
26110.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
26111/* File: armv5te/alt_stub.S */
26112/*
26113 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26114 * any interesting requests and then jump to the real instruction
26115 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26116 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26117 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26118 * bail to the real handler if breakFlags==0.
26119 */
26120    ldrb   r3, [rSELF, #offThread_breakFlags]
26121    adrl   lr, dvmAsmInstructionStart + (508 * 64)
26122    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26123    cmp    r3, #0
26124    bxeq   lr                   @ nothing to do - jump to real handler
26125    EXPORT_PC()
26126    mov    r0, rPC              @ arg0
26127    mov    r1, rFP              @ arg1
26128    mov    r2, rSELF            @ arg2
26129    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26130
26131/* ------------------------------ */
26132    .balign 64
26133.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
26134/* File: armv5te/alt_stub.S */
26135/*
26136 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26137 * any interesting requests and then jump to the real instruction
26138 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26139 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26140 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26141 * bail to the real handler if breakFlags==0.
26142 */
26143    ldrb   r3, [rSELF, #offThread_breakFlags]
26144    adrl   lr, dvmAsmInstructionStart + (509 * 64)
26145    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26146    cmp    r3, #0
26147    bxeq   lr                   @ nothing to do - jump to real handler
26148    EXPORT_PC()
26149    mov    r0, rPC              @ arg0
26150    mov    r1, rFP              @ arg1
26151    mov    r2, rSELF            @ arg2
26152    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26153
26154/* ------------------------------ */
26155    .balign 64
26156.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
26157/* File: armv5te/alt_stub.S */
26158/*
26159 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26160 * any interesting requests and then jump to the real instruction
26161 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26162 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26163 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26164 * bail to the real handler if breakFlags==0.
26165 */
26166    ldrb   r3, [rSELF, #offThread_breakFlags]
26167    adrl   lr, dvmAsmInstructionStart + (510 * 64)
26168    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26169    cmp    r3, #0
26170    bxeq   lr                   @ nothing to do - jump to real handler
26171    EXPORT_PC()
26172    mov    r0, rPC              @ arg0
26173    mov    r1, rFP              @ arg1
26174    mov    r2, rSELF            @ arg2
26175    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26176
26177/* ------------------------------ */
26178    .balign 64
26179.L_ALT_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
26180/* File: armv5te/alt_stub.S */
26181/*
26182 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26183 * any interesting requests and then jump to the real instruction
26184 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26185 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26186 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26187 * bail to the real handler if breakFlags==0.
26188 */
26189    ldrb   r3, [rSELF, #offThread_breakFlags]
26190    adrl   lr, dvmAsmInstructionStart + (511 * 64)
26191    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26192    cmp    r3, #0
26193    bxeq   lr                   @ nothing to do - jump to real handler
26194    EXPORT_PC()
26195    mov    r0, rPC              @ arg0
26196    mov    r1, rFP              @ arg1
26197    mov    r2, rSELF            @ arg2
26198    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26199
26200    .balign 64
26201    .size   dvmAsmAltInstructionStart, .-dvmAsmAltInstructionStart
26202    .global dvmAsmAltInstructionEnd
26203dvmAsmAltInstructionEnd:
26204/* File: armv5te/footer.S */
26205/*
26206 * ===========================================================================
26207 *  Common subroutines and data
26208 * ===========================================================================
26209 */
26210
26211    .text
26212    .align  2
26213
26214#if defined(WITH_JIT)
26215
26216#if defined(WITH_SELF_VERIFICATION)
26217/*
26218 * "longjmp" to a translation after single-stepping.  Before returning
26219 * to translation, must save state for self-verification.
26220 */
26221    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26222dvmJitResumeTranslation:
26223    mov    rSELF, r0                             @ restore self
26224    mov    rPC, r1                               @ restore Dalvik pc
26225    mov    rFP, r2                               @ restore Dalvik fp
26226    ldr    r10, [rSELF,#offThread_jitResumeNPC]  @ resume address
26227    mov    r2, #0
26228    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26229    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26230    b      jitSVShadowRunStart                   @ resume as if cache hit
26231                                                 @ expects resume addr in r10
26232
26233    .global dvmJitToInterpPunt
26234dvmJitToInterpPunt:
26235    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
26236    mov    r3, #0
26237    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26238    b      jitSVShadowRunEnd            @ doesn't return
26239
26240    .global dvmJitToInterpSingleStep
26241dvmJitToInterpSingleStep:
26242    mov    rPC, r0              @ set up dalvik pc
26243    EXPORT_PC()
26244    str    lr, [rSELF,#offThread_jitResumeNPC]
26245    str    sp, [rSELF,#offThread_jitResumeNSP]
26246    str    r1, [rSELF,#offThread_jitResumeDPC]
26247    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
26248    b      jitSVShadowRunEnd            @ doesn't return
26249
26250
26251    .global dvmJitToInterpNoChainNoProfile
26252dvmJitToInterpNoChainNoProfile:
26253    mov    r0,rPC                       @ pass our target PC
26254    mov    r2,#kSVSNoProfile            @ r2<- interpreter entry point
26255    mov    r3, #0                       @ 0 means !inJitCodeCache
26256    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26257    b      jitSVShadowRunEnd            @ doesn't return
26258
26259    .global dvmJitToInterpTraceSelectNoChain
26260dvmJitToInterpTraceSelectNoChain:
26261    mov    r0,rPC                       @ pass our target PC
26262    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26263    mov    r3, #0                       @ 0 means !inJitCodeCache
26264    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26265    b      jitSVShadowRunEnd            @ doesn't return
26266
26267    .global dvmJitToInterpTraceSelect
26268dvmJitToInterpTraceSelect:
26269    ldr    r0,[lr, #-1]                 @ pass our target PC
26270    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26271    mov    r3, #0                       @ 0 means !inJitCodeCache
26272    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26273    b      jitSVShadowRunEnd            @ doesn't return
26274
26275    .global dvmJitToInterpBackwardBranch
26276dvmJitToInterpBackwardBranch:
26277    ldr    r0,[lr, #-1]                 @ pass our target PC
26278    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
26279    mov    r3, #0                       @ 0 means !inJitCodeCache
26280    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26281    b      jitSVShadowRunEnd            @ doesn't return
26282
26283    .global dvmJitToInterpNormal
26284dvmJitToInterpNormal:
26285    ldr    r0,[lr, #-1]                 @ pass our target PC
26286    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
26287    mov    r3, #0                       @ 0 means !inJitCodeCache
26288    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26289    b      jitSVShadowRunEnd            @ doesn't return
26290
26291    .global dvmJitToInterpNoChain
26292dvmJitToInterpNoChain:
26293    mov    r0,rPC                       @ pass our target PC
26294    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
26295    mov    r3, #0                       @ 0 means !inJitCodeCache
26296    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26297    b      jitSVShadowRunEnd            @ doesn't return
26298#else
26299
26300/*
26301 * "longjmp" to a translation after single-stepping.
26302 */
26303    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26304dvmJitResumeTranslation:
26305    mov    rSELF, r0                             @ restore self
26306    mov    rPC, r1                               @ restore Dalvik pc
26307    mov    rFP, r2                               @ restore Dalvik fp
26308    ldr    r0, [rSELF,#offThread_jitResumeNPC]
26309    mov    r2, #0
26310    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26311    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26312    bx     r0                                    @ resume translation
26313
26314/*
26315 * Return from the translation cache to the interpreter when the compiler is
26316 * having issues translating/executing a Dalvik instruction. We have to skip
26317 * the code cache lookup otherwise it is possible to indefinitely bouce
26318 * between the interpreter and the code cache if the instruction that fails
26319 * to be compiled happens to be at a trace start.
26320 */
26321    .global dvmJitToInterpPunt
26322dvmJitToInterpPunt:
26323    mov    rPC, r0
26324#if defined(WITH_JIT_TUNING)
26325    mov    r0,lr
26326    bl     dvmBumpPunt;
26327#endif
26328    EXPORT_PC()
26329    mov    r0, #0
26330    str    r0, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26331    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26332    FETCH_INST()
26333    GET_INST_OPCODE(ip)
26334    GOTO_OPCODE(ip)
26335
26336/*
26337 * Return to the interpreter to handle a single instruction.
26338 * We'll use the normal single-stepping mechanism via interpBreak,
26339 * but also save the native pc of the resume point in the translation
26340 * and the native sp so that we can later do the equivalent of a
26341 * longjmp() to resume.
26342 * On entry:
26343 *    dPC <= Dalvik PC of instrucion to interpret
26344 *    lr <= resume point in translation
26345 *    r1 <= Dalvik PC of next instruction
26346 */
26347    .global dvmJitToInterpSingleStep
26348dvmJitToInterpSingleStep:
26349    mov    rPC, r0              @ set up dalvik pc
26350    EXPORT_PC()
26351    str    lr, [rSELF,#offThread_jitResumeNPC]
26352    str    sp, [rSELF,#offThread_jitResumeNSP]
26353    str    r1, [rSELF,#offThread_jitResumeDPC]
26354    mov    r1, #1
26355    str    r1, [rSELF,#offThread_singleStepCount]  @ just step once
26356    mov    r0, rSELF
26357    mov    r1, #kSubModeCountedStep
26358    bl     dvmEnableSubMode     @ (self, newMode)
26359    ldr    rIBASE, [rSELF,#offThread_curHandlerTable]
26360    FETCH_INST()
26361    GET_INST_OPCODE(ip)
26362    GOTO_OPCODE(ip)
26363
26364/*
26365 * Return from the translation cache and immediately request
26366 * a translation for the exit target.  Commonly used for callees.
26367 */
26368    .global dvmJitToInterpTraceSelectNoChain
26369dvmJitToInterpTraceSelectNoChain:
26370#if defined(WITH_JIT_TUNING)
26371    bl     dvmBumpNoChain
26372#endif
26373    mov    r0,rPC
26374    mov    r1,rSELF
26375    bl     dvmJitGetTraceAddrThread @ (pc, self)
26376    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26377    mov    r1, rPC                  @ arg1 of translation may need this
26378    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26379    cmp    r0,#0                    @ !0 means translation exists
26380    bxne   r0                       @ continue native execution if so
26381    b      2f                       @ branch over to use the interpreter
26382
26383/*
26384 * Return from the translation cache and immediately request
26385 * a translation for the exit target.  Commonly used following
26386 * invokes.
26387 */
26388    .global dvmJitToInterpTraceSelect
26389dvmJitToInterpTraceSelect:
26390    ldr    rPC,[lr, #-1]           @ get our target PC
26391    add    rINST,lr,#-5            @ save start of chain branch
26392    add    rINST, #-4              @  .. which is 9 bytes back
26393    mov    r0,rPC
26394    mov    r1,rSELF
26395    bl     dvmJitGetTraceAddrThread @ (pc, self)
26396    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26397    cmp    r0,#0
26398    beq    2f
26399    mov    r1,rINST
26400    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26401    mov    r1, rPC                  @ arg1 of translation may need this
26402    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
26403    cmp    r0,#0                    @ successful chain?
26404    bxne   r0                       @ continue native execution
26405    b      toInterpreter            @ didn't chain - resume with interpreter
26406
26407/* No translation, so request one if profiling isn't disabled*/
264082:
26409    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26410    ldr    r0, [rSELF, #offThread_pJitProfTable]
26411    FETCH_INST()
26412    cmp    r0, #0
26413    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
26414    bne    common_selectTrace
26415    GET_INST_OPCODE(ip)
26416    GOTO_OPCODE(ip)
26417
26418/*
26419 * Return from the translation cache to the interpreter.
26420 * The return was done with a BLX from thumb mode, and
26421 * the following 32-bit word contains the target rPC value.
26422 * Note that lr (r14) will have its low-order bit set to denote
26423 * its thumb-mode origin.
26424 *
26425 * We'll need to stash our lr origin away, recover the new
26426 * target and then check to see if there is a translation available
26427 * for our new target.  If so, we do a translation chain and
26428 * go back to native execution.  Otherwise, it's back to the
26429 * interpreter (after treating this entry as a potential
26430 * trace start).
26431 */
26432    .global dvmJitToInterpNormal
26433dvmJitToInterpNormal:
26434    ldr    rPC,[lr, #-1]           @ get our target PC
26435    add    rINST,lr,#-5            @ save start of chain branch
26436    add    rINST,#-4               @ .. which is 9 bytes back
26437#if defined(WITH_JIT_TUNING)
26438    bl     dvmBumpNormal
26439#endif
26440    mov    r0,rPC
26441    mov    r1,rSELF
26442    bl     dvmJitGetTraceAddrThread @ (pc, self)
26443    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26444    cmp    r0,#0
26445    beq    toInterpreter            @ go if not, otherwise do chain
26446    mov    r1,rINST
26447    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26448    mov    r1, rPC                  @ arg1 of translation may need this
26449    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26450    cmp    r0,#0                    @ successful chain?
26451    bxne   r0                       @ continue native execution
26452    b      toInterpreter            @ didn't chain - resume with interpreter
26453
26454/*
26455 * Return from the translation cache to the interpreter to do method invocation.
26456 * Check if translation exists for the callee, but don't chain to it.
26457 */
26458    .global dvmJitToInterpNoChainNoProfile
26459dvmJitToInterpNoChainNoProfile:
26460#if defined(WITH_JIT_TUNING)
26461    bl     dvmBumpNoChain
26462#endif
26463    mov    r0,rPC
26464    mov    r1,rSELF
26465    bl     dvmJitGetTraceAddrThread @ (pc, self)
26466    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26467    mov    r1, rPC                  @ arg1 of translation may need this
26468    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26469    cmp    r0,#0
26470    bxne   r0                       @ continue native execution if so
26471    EXPORT_PC()
26472    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26473    FETCH_INST()
26474    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26475    GOTO_OPCODE(ip)                     @ jump to next instruction
26476
26477/*
26478 * Return from the translation cache to the interpreter to do method invocation.
26479 * Check if translation exists for the callee, but don't chain to it.
26480 */
26481    .global dvmJitToInterpNoChain
26482dvmJitToInterpNoChain:
26483#if defined(WITH_JIT_TUNING)
26484    bl     dvmBumpNoChain
26485#endif
26486    mov    r0,rPC
26487    mov    r1,rSELF
26488    bl     dvmJitGetTraceAddrThread @ (pc, self)
26489    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26490    mov    r1, rPC                  @ arg1 of translation may need this
26491    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26492    cmp    r0,#0
26493    bxne   r0                       @ continue native execution if so
26494#endif
26495
26496/*
26497 * No translation, restore interpreter regs and start interpreting.
26498 * rSELF & rFP were preserved in the translated code, and rPC has
26499 * already been restored by the time we get here.  We'll need to set
26500 * up rIBASE & rINST, and load the address of the JitTable into r0.
26501 */
26502toInterpreter:
26503    EXPORT_PC()
26504    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26505    FETCH_INST()
26506    ldr    r0, [rSELF, #offThread_pJitProfTable]
26507    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26508    @ NOTE: intended fallthrough
26509
26510/*
26511 * Similar to common_updateProfile, but tests for null pJitProfTable
26512 * r0 holds pJifProfTAble, rINST is loaded, rPC is current and
26513 * rIBASE has been recently refreshed.
26514 */
26515common_testUpdateProfile:
26516    cmp     r0, #0               @ JIT switched off?
26517    beq     4f                   @ return to interp if so
26518
26519/*
26520 * Common code to update potential trace start counter, and initiate
26521 * a trace-build if appropriate.
26522 * On entry here:
26523 *    r0    <= pJitProfTable (verified non-NULL)
26524 *    rPC   <= Dalvik PC
26525 *    rINST <= next instruction
26526 */
26527common_updateProfile:
26528    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
26529    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
26530    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
26531    GET_INST_OPCODE(ip)
26532    subs    r1,r1,#1           @ decrement counter
26533    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
26534    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
26535
26536    /* Looks good, reset the counter */
26537    ldr     r1, [rSELF, #offThread_jitThreshold]
26538    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
26539    EXPORT_PC()
26540    mov     r0,rPC
26541    mov     r1,rSELF
26542    bl      dvmJitGetTraceAddrThread    @ (pc, self)
26543    str     r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26544    mov     r1, rPC                     @ arg1 of translation may need this
26545    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
26546    cmp     r0,#0
26547#if !defined(WITH_SELF_VERIFICATION)
26548    bxne    r0                          @ jump to the translation
26549    mov     r2,#kJitTSelectRequest      @ ask for trace selection
26550    @ fall-through to common_selectTrace
26551#else
26552    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
26553    beq     common_selectTrace
26554    /*
26555     * At this point, we have a target translation.  However, if
26556     * that translation is actually the interpret-only pseudo-translation
26557     * we want to treat it the same as no translation.
26558     */
26559    mov     r10, r0                     @ save target
26560    bl      dvmCompilerGetInterpretTemplate
26561    cmp     r0, r10                     @ special case?
26562    bne     jitSVShadowRunStart         @ set up self verification shadow space
26563    @ Need to clear the inJitCodeCache flag
26564    mov    r3, #0                       @ 0 means not in the JIT code cache
26565    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26566    GET_INST_OPCODE(ip)
26567    GOTO_OPCODE(ip)
26568    /* no return */
26569#endif
26570
26571/*
26572 * On entry:
26573 *  r2 is jit state.
26574 */
26575common_selectTrace:
26576    ldrh    r0,[rSELF,#offThread_subMode]
26577    ands    r0, #(kSubModeJitTraceBuild | kSubModeJitSV)
26578    bne     3f                         @ already doing JIT work, continue
26579    str     r2,[rSELF,#offThread_jitState]
26580    mov     r0, rSELF
26581/*
26582 * Call out to validate trace-building request.  If successful,
26583 * rIBASE will be swapped to to send us into single-stepping trace
26584 * building mode, so we need to refresh before we continue.
26585 */
26586    EXPORT_PC()
26587    SAVE_PC_FP_TO_SELF()                 @ copy of pc/fp to Thread
26588    bl      dvmJitCheckTraceRequest
265893:
26590    FETCH_INST()
26591    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
265924:
26593    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26594    GOTO_OPCODE(ip)
26595    /* no return */
26596#endif
26597
26598#if defined(WITH_SELF_VERIFICATION)
26599/*
26600 * Save PC and registers to shadow memory for self verification mode
26601 * before jumping to native translation.
26602 * On entry:
26603 *    rPC, rFP, rSELF: the values that they should contain
26604 *    r10: the address of the target translation.
26605 */
26606jitSVShadowRunStart:
26607    mov     r0,rPC                      @ r0<- program counter
26608    mov     r1,rFP                      @ r1<- frame pointer
26609    mov     r2,rSELF                    @ r2<- self (Thread) pointer
26610    mov     r3,r10                      @ r3<- target translation
26611    bl      dvmSelfVerificationSaveState @ save registers to shadow space
26612    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
26613    bx      r10                         @ jump to the translation
26614
26615/*
26616 * Restore PC, registers, and interpreter state to original values
26617 * before jumping back to the interpreter.
26618 * On entry:
26619 *   r0:  dPC
26620 *   r2:  self verification state
26621 */
26622jitSVShadowRunEnd:
26623    mov    r1,rFP                        @ pass ending fp
26624    mov    r3,rSELF                      @ pass self ptr for convenience
26625    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
26626    LOAD_PC_FP_FROM_SELF()               @ restore pc, fp
26627    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
26628    cmp    r1,#0                         @ check for punt condition
26629    beq    1f
26630    @ Set up SV single-stepping
26631    mov    r0, rSELF
26632    mov    r1, #kSubModeJitSV
26633    bl     dvmEnableSubMode              @ (self, subMode)
26634    mov    r2,#kJitSelfVerification      @ ask for self verification
26635    str    r2,[rSELF,#offThread_jitState]
26636    @ intentional fallthrough
266371:                                       @ exit to interpreter without check
26638    EXPORT_PC()
26639    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26640    FETCH_INST()
26641    GET_INST_OPCODE(ip)
26642    GOTO_OPCODE(ip)
26643#endif
26644
26645/*
26646 * The equivalent of "goto bail", this calls through the "bail handler".
26647 * It will end this interpreter activation, and return to the caller
26648 * of dvmMterpStdRun.
26649 *
26650 * State registers will be saved to the "thread" area before bailing
26651 * debugging purposes
26652 */
26653common_gotoBail:
26654    SAVE_PC_FP_TO_SELF()                @ export state to "thread"
26655    mov     r0, rSELF                   @ r0<- self ptr
26656    b       dvmMterpStdBail             @ call(self, changeInterp)
26657
26658/*
26659 * The JIT's invoke method needs to remember the callsite class and
26660 * target pair.  Save them here so that they are available to
26661 * dvmCheckJit following the interpretation of this invoke.
26662 */
26663#if defined(WITH_JIT)
26664save_callsiteinfo:
26665    cmp     r9, #0
26666    ldrne   r9, [r9, #offObject_clazz]
26667    str     r0, [rSELF, #offThread_methodToCall]
26668    str     r9, [rSELF, #offThread_callsiteClass]
26669    bx      lr
26670#endif
26671
26672/*
26673 * Common code for jumbo method invocation.
26674 * NOTE: this adjusts rPC to account for the difference in instruction width.
26675 * As a result, the savedPc in the stack frame will not be wholly accurate. So
26676 * long as that is only used for source file line number calculations, we're
26677 * okay.
26678 */
26679common_invokeMethodJumboNoThis:
26680#if defined(WITH_JIT)
26681 /* On entry: r0 is "Method* methodToCall */
26682    mov     r9, #0                      @ clear "this"
26683#endif
26684common_invokeMethodJumbo:
26685 /* On entry: r0 is "Method* methodToCall, r9 is "this" */
26686.LinvokeNewJumbo:
26687#if defined(WITH_JIT)
26688    ldrh    r1, [rSELF, #offThread_subMode]
26689    ands    r1, #kSubModeJitTraceBuild
26690    blne    save_callsiteinfo
26691#endif
26692    @ prepare to copy args to "outs" area of current frame
26693    add     rPC, rPC, #4                @ adjust pc to make return consistent
26694    FETCH(r2, 1)                        @ r2<- BBBB (arg count)
26695    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26696    cmp     r2, #0                      @ no args?
26697    beq     .LinvokeArgsDone            @ if no args, skip the rest
26698    FETCH(r1, 2)                        @ r1<- CCCC
26699    b       .LinvokeRangeArgs           @ handle args like invoke range
26700
26701/*
26702 * Common code for method invocation with range.
26703 *
26704 * On entry:
26705 *  r0 is "Method* methodToCall", r9 is "this"
26706 */
26707common_invokeMethodRange:
26708.LinvokeNewRange:
26709#if defined(WITH_JIT)
26710    ldrh    r1, [rSELF, #offThread_subMode]
26711    ands    r1, #kSubModeJitTraceBuild
26712    blne    save_callsiteinfo
26713#endif
26714    @ prepare to copy args to "outs" area of current frame
26715    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
26716    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26717    beq     .LinvokeArgsDone            @ if no args, skip the rest
26718    FETCH(r1, 2)                        @ r1<- CCCC
26719
26720.LinvokeRangeArgs:
26721    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
26722    @ (very few methods have > 10 args; could unroll for common cases)
26723    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
26724    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
267251:  ldr     r1, [r3], #4                @ val = *fp++
26726    subs    r2, r2, #1                  @ count--
26727    str     r1, [r10], #4               @ *outs++ = val
26728    bne     1b                          @ ...while count != 0
26729    b       .LinvokeArgsDone
26730
26731/*
26732 * Common code for method invocation without range.
26733 *
26734 * On entry:
26735 *  r0 is "Method* methodToCall", r9 is "this"
26736 */
26737common_invokeMethodNoRange:
26738.LinvokeNewNoRange:
26739#if defined(WITH_JIT)
26740    ldrh    r1, [rSELF, #offThread_subMode]
26741    ands    r1, #kSubModeJitTraceBuild
26742    blne    save_callsiteinfo
26743#endif
26744    @ prepare to copy args to "outs" area of current frame
26745    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
26746    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26747    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
26748    beq     .LinvokeArgsDone
26749
26750    @ r0=methodToCall, r1=GFED, r2=count, r10=outs
26751.LinvokeNonRange:
26752    rsb     r2, r2, #5                  @ r2<- 5-r2
26753    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
26754    bl      common_abort                @ (skipped due to ARM prefetch)
267555:  and     ip, rINST, #0x0f00          @ isolate A
26756    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
26757    mov     r0, r0                      @ nop
26758    str     r2, [r10, #-4]!             @ *--outs = vA
267594:  and     ip, r1, #0xf000             @ isolate G
26760    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
26761    mov     r0, r0                      @ nop
26762    str     r2, [r10, #-4]!             @ *--outs = vG
267633:  and     ip, r1, #0x0f00             @ isolate F
26764    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
26765    mov     r0, r0                      @ nop
26766    str     r2, [r10, #-4]!             @ *--outs = vF
267672:  and     ip, r1, #0x00f0             @ isolate E
26768    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
26769    mov     r0, r0                      @ nop
26770    str     r2, [r10, #-4]!             @ *--outs = vE
267711:  and     ip, r1, #0x000f             @ isolate D
26772    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
26773    mov     r0, r0                      @ nop
26774    str     r2, [r10, #-4]!             @ *--outs = vD
267750:  @ fall through to .LinvokeArgsDone
26776
26777.LinvokeArgsDone: @ r0=methodToCall
26778    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
26779    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
26780    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
26781    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
26782    @ find space for the new stack frame, check for overflow
26783    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
26784    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
26785    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
26786@    bl      common_dumpRegs
26787    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
26788    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
26789    cmp     r3, r9                      @ bottom < interpStackEnd?
26790    ldrh    lr, [rSELF, #offThread_subMode]
26791    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
26792    blo     .LstackOverflow             @ yes, this frame will overflow stack
26793
26794    @ set up newSaveArea
26795#ifdef EASY_GDB
26796    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
26797    str     ip, [r10, #offStackSaveArea_prevSave]
26798#endif
26799    str     rFP, [r10, #offStackSaveArea_prevFrame]
26800    str     rPC, [r10, #offStackSaveArea_savedPc]
26801#if defined(WITH_JIT)
26802    mov     r9, #0
26803    str     r9, [r10, #offStackSaveArea_returnAddr]
26804#endif
26805    str     r0, [r10, #offStackSaveArea_method]
26806
26807    @ Profiling?
26808    cmp     lr, #0                      @ any special modes happening?
26809    bne     2f                          @ go if so
268101:
26811    tst     r3, #ACC_NATIVE
26812    bne     .LinvokeNative
26813
26814    /*
26815    stmfd   sp!, {r0-r3}
26816    bl      common_printNewline
26817    mov     r0, rFP
26818    mov     r1, #0
26819    bl      dvmDumpFp
26820    ldmfd   sp!, {r0-r3}
26821    stmfd   sp!, {r0-r3}
26822    mov     r0, r1
26823    mov     r1, r10
26824    bl      dvmDumpFp
26825    bl      common_printNewline
26826    ldmfd   sp!, {r0-r3}
26827    */
26828
26829    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
26830    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
26831    mov     rPC, r2                         @ publish new rPC
26832
26833    @ Update state values for the new method
26834    @ r0=methodToCall, r1=newFp, r3=newMethodClass, r9=newINST
26835    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
26836    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
26837    mov     r2, #1
26838    str     r2, [rSELF, #offThread_debugIsMethodEntry]
26839#if defined(WITH_JIT)
26840    ldr     r0, [rSELF, #offThread_pJitProfTable]
26841    mov     rFP, r1                         @ fp = newFp
26842    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
26843    mov     rINST, r9                       @ publish new rINST
26844    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26845    cmp     r0,#0
26846    bne     common_updateProfile
26847    GOTO_OPCODE(ip)                         @ jump to next instruction
26848#else
26849    mov     rFP, r1                         @ fp = newFp
26850    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
26851    mov     rINST, r9                       @ publish new rINST
26852    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26853    GOTO_OPCODE(ip)                         @ jump to next instruction
26854#endif
26855
268562:
26857    @ Profiling - record method entry.  r0: methodToCall
26858    stmfd   sp!, {r0-r3}                @ preserve r0-r3
26859    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
26860    mov     r1, r0
26861    mov     r0, rSELF
26862    bl      dvmReportInvoke             @ (self, method)
26863    ldmfd   sp!, {r0-r3}                @ restore r0-r3
26864    b       1b
26865
26866.LinvokeNative:
26867    @ Prep for the native call
26868    @ r0=methodToCall, r1=newFp, r10=newSaveArea
26869    ldrh    lr, [rSELF, #offThread_subMode]
26870    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
26871    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26872    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
26873    mov     r2, r0                      @ r2<- methodToCall
26874    mov     r0, r1                      @ r0<- newFp (points to args)
26875    add     r1, rSELF, #offThread_retval  @ r1<- &retval
26876    mov     r3, rSELF                   @ arg3<- self
26877
26878#ifdef ASSIST_DEBUGGER
26879    /* insert fake function header to help gdb find the stack frame */
26880    b       .Lskip
26881    .type   dalvik_mterp, %function
26882dalvik_mterp:
26883    .fnstart
26884    MTERP_ENTRY1
26885    MTERP_ENTRY2
26886.Lskip:
26887#endif
26888
26889    cmp     lr, #0                      @ any special SubModes active?
26890    bne     11f                         @ go handle them if so
26891    mov     lr, pc                      @ set return addr
26892    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
268937:
26894
26895    @ native return; r10=newSaveArea
26896    @ equivalent to dvmPopJniLocals
26897    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
26898    ldr     r1, [rSELF, #offThread_exception] @ check for exception
26899    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
26900    cmp     r1, #0                      @ null?
26901    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
26902    bne     common_exceptionThrown      @ no, handle exception
26903
26904    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
26905    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26906    GOTO_OPCODE(ip)                     @ jump to next instruction
26907
2690811:
26909    @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
26910    stmfd   sp!, {r0-r3}                @ save all but subModes
26911    mov     r0, r2                      @ r0<- methodToCall
26912    mov     r1, rSELF
26913    mov     r2, rFP
26914    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
26915    ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
26916
26917    @ Call the native method
26918    mov     lr, pc                      @ set return addr
26919    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
26920
26921    @ Restore the pre-call arguments
26922    ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
26923
26924    @ Finish up any post-invoke subMode requirements
26925    mov     r0, r2                      @ r0<- methodToCall
26926    mov     r1, rSELF
26927    mov     r2, rFP
26928    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
26929    b       7b                          @ resume
26930
26931.LstackOverflow:    @ r0=methodToCall
26932    mov     r1, r0                      @ r1<- methodToCall
26933    mov     r0, rSELF                   @ r0<- self
26934    bl      dvmHandleStackOverflow
26935    b       common_exceptionThrown
26936#ifdef ASSIST_DEBUGGER
26937    .fnend
26938    .size   dalvik_mterp, .-dalvik_mterp
26939#endif
26940
26941
26942    /*
26943     * Common code for method invocation, calling through "glue code".
26944     *
26945     * TODO: now that we have range and non-range invoke handlers, this
26946     *       needs to be split into two.  Maybe just create entry points
26947     *       that set r9 and jump here?
26948     *
26949     * On entry:
26950     *  r0 is "Method* methodToCall", the method we're trying to call
26951     *  r9 is "bool methodCallRange", indicating if this is a /range variant
26952     */
26953     .if    0
26954.LinvokeOld:
26955    sub     sp, sp, #8                  @ space for args + pad
26956    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
26957    mov     r2, r0                      @ A2<- methodToCall
26958    mov     r0, rSELF                   @ A0<- self
26959    SAVE_PC_FP_TO_SELF()                @ export state to "self"
26960    mov     r1, r9                      @ A1<- methodCallRange
26961    mov     r3, rINST, lsr #8           @ A3<- AA
26962    str     ip, [sp, #0]                @ A4<- ip
26963    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
26964    add     sp, sp, #8                  @ remove arg area
26965    b       common_resumeAfterGlueCall  @ continue to next instruction
26966    .endif
26967
26968
26969
26970/*
26971 * Common code for handling a return instruction.
26972 *
26973 * This does not return.
26974 */
26975common_returnFromMethod:
26976.LreturnNew:
26977    ldrh    lr, [rSELF, #offThread_subMode]
26978    SAVEAREA_FROM_FP(r0, rFP)
26979    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
26980    cmp     lr, #0                      @ any special subMode handling needed?
26981    bne     19f
2698214:
26983    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
26984    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
26985                                        @ r2<- method we're returning to
26986    cmp     r2, #0                      @ is this a break frame?
26987#if defined(WORKAROUND_CORTEX_A9_745320)
26988    /* Don't use conditional loads if the HW defect exists */
26989    beq     15f
26990    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
2699115:
26992#else
26993    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
26994#endif
26995    beq     common_gotoBail             @ break frame, bail out completely
26996
26997    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
26998    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
26999    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
27000    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
27001    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
27002#if defined(WITH_JIT)
27003    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
27004    mov     rPC, r9                     @ publish new rPC
27005    str     r1, [rSELF, #offThread_methodClassDex]
27006    str     r10, [rSELF, #offThread_inJitCodeCache]  @ may return to JIT'ed land
27007    cmp     r10, #0                      @ caller is compiled code
27008    blxne   r10
27009    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27010    GOTO_OPCODE(ip)                     @ jump to next instruction
27011#else
27012    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27013    mov     rPC, r9                     @ publish new rPC
27014    str     r1, [rSELF, #offThread_methodClassDex]
27015    GOTO_OPCODE(ip)                     @ jump to next instruction
27016#endif
27017
2701819:
27019    @ Handle special actions
27020    @ On entry, r0: StackSaveArea
27021    ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
27022    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
27023    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
27024    mov     r0, rSELF
27025    bl      dvmReportReturn             @ (self)
27026    SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
27027    b       14b                         @ continue
27028
27029    /*
27030     * Return handling, calls through "glue code".
27031     */
27032     .if    0
27033.LreturnOld:
27034    SAVE_PC_FP_TO_SELF()                @ export state
27035    mov     r0, rSELF                   @ arg to function
27036    bl      dvmMterp_returnFromMethod
27037    b       common_resumeAfterGlueCall
27038    .endif
27039
27040
27041/*
27042 * Somebody has thrown an exception.  Handle it.
27043 *
27044 * If the exception processing code returns to us (instead of falling
27045 * out of the interpreter), continue with whatever the next instruction
27046 * now happens to be.
27047 *
27048 * This does not return.
27049 */
27050     .global dvmMterpCommonExceptionThrown
27051dvmMterpCommonExceptionThrown:
27052common_exceptionThrown:
27053.LexceptionNew:
27054
27055    EXPORT_PC()
27056
27057    mov     r0, rSELF
27058    bl      dvmCheckSuspendPending
27059
27060    ldr     r9, [rSELF, #offThread_exception] @ r9<- self->exception
27061    mov     r1, rSELF                   @ r1<- self
27062    mov     r0, r9                      @ r0<- exception
27063    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
27064    ldrh    r2, [rSELF, #offThread_subMode]  @ get subMode flags
27065    mov     r3, #0                      @ r3<- NULL
27066    str     r3, [rSELF, #offThread_exception] @ self->exception = NULL
27067
27068    @ Special subMode?
27069    cmp     r2, #0                      @ any special subMode handling needed?
27070    bne     7f                          @ go if so
270718:
27072    /* set up args and a local for "&fp" */
27073    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
27074    str     rFP, [sp, #-4]!             @ *--sp = fp
27075    mov     ip, sp                      @ ip<- &fp
27076    mov     r3, #0                      @ r3<- false
27077    str     ip, [sp, #-4]!              @ *--sp = &fp
27078    ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
27079    mov     r0, rSELF                   @ r0<- self
27080    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
27081    ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
27082    mov     r2, r9                      @ r2<- exception
27083    sub     r1, rPC, r1                 @ r1<- pc - method->insns
27084    mov     r1, r1, asr #1              @ r1<- offset in code units
27085
27086    /* call, r0 gets catchRelPc (a code-unit offset) */
27087    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
27088
27089    /* fix earlier stack overflow if necessary; may trash rFP */
27090    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27091    cmp     r1, #0                      @ did we overflow earlier?
27092    beq     1f                          @ no, skip ahead
27093    mov     rFP, r0                     @ save relPc result in rFP
27094    mov     r0, rSELF                   @ r0<- self
27095    mov     r1, r9                      @ r1<- exception
27096    bl      dvmCleanupStackOverflow     @ call(self)
27097    mov     r0, rFP                     @ restore result
270981:
27099
27100    /* update frame pointer and check result from dvmFindCatchBlock */
27101    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
27102    cmp     r0, #0                      @ is catchRelPc < 0?
27103    add     sp, sp, #8                  @ restore stack
27104    bmi     .LnotCaughtLocally
27105
27106    /* adjust locals to match self->interpSave.curFrame and updated PC */
27107    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
27108    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
27109    str     r1, [rSELF, #offThread_method]  @ self->method = new method
27110    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
27111    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
27112    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
27113    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
27114    str     r2, [rSELF, #offThread_methodClassDex] @ self->pDvmDex = meth...
27115
27116    /* release the tracked alloc on the exception */
27117    mov     r0, r9                      @ r0<- exception
27118    mov     r1, rSELF                   @ r1<- self
27119    bl      dvmReleaseTrackedAlloc      @ release the exception
27120
27121    /* restore the exception if the handler wants it */
27122    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
27123    FETCH_INST()                        @ load rINST from rPC
27124    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27125    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
27126    streq   r9, [rSELF, #offThread_exception] @ yes, restore the exception
27127    GOTO_OPCODE(ip)                     @ jump to next instruction
27128
27129    @ Manage debugger bookkeeping
271307:
27131    str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
27132    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
27133    mov     r0, rSELF                       @ arg0<- self
27134    mov     r1, r9                          @ arg1<- exception
27135    bl      dvmReportExceptionThrow         @ (self, exception)
27136    b       8b                              @ resume with normal handling
27137
27138.LnotCaughtLocally: @ r9=exception
27139    /* fix stack overflow if necessary */
27140    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27141    cmp     r1, #0                      @ did we overflow earlier?
27142    movne   r0, rSELF                   @ if yes: r0<- self
27143    movne   r1, r9                      @ if yes: r1<- exception
27144    blne    dvmCleanupStackOverflow     @ if yes: call(self)
27145
27146    @ may want to show "not caught locally" debug messages here
27147#if DVM_SHOW_EXCEPTION >= 2
27148    /* call __android_log_print(prio, tag, format, ...) */
27149    /* "Exception %s from %s:%d not caught locally" */
27150    @ dvmLineNumFromPC(method, pc - method->insns)
27151    ldr     r0, [rSELF, #offThread_method]
27152    ldr     r1, [r0, #offMethod_insns]
27153    sub     r1, rPC, r1
27154    asr     r1, r1, #1
27155    bl      dvmLineNumFromPC
27156    str     r0, [sp, #-4]!
27157    @ dvmGetMethodSourceFile(method)
27158    ldr     r0, [rSELF, #offThread_method]
27159    bl      dvmGetMethodSourceFile
27160    str     r0, [sp, #-4]!
27161    @ exception->clazz->descriptor
27162    ldr     r3, [r9, #offObject_clazz]
27163    ldr     r3, [r3, #offClassObject_descriptor]
27164    @
27165    ldr     r2, strExceptionNotCaughtLocally
27166    ldr     r1, strLogTag
27167    mov     r0, #3                      @ LOG_DEBUG
27168    bl      __android_log_print
27169#endif
27170    str     r9, [rSELF, #offThread_exception] @ restore exception
27171    mov     r0, r9                      @ r0<- exception
27172    mov     r1, rSELF                   @ r1<- self
27173    bl      dvmReleaseTrackedAlloc      @ release the exception
27174    b       common_gotoBail             @ bail out
27175
27176
27177    /*
27178     * Exception handling, calls through "glue code".
27179     */
27180    .if     0
27181.LexceptionOld:
27182    SAVE_PC_FP_TO_SELF()                @ export state
27183    mov     r0, rSELF                   @ arg to function
27184    bl      dvmMterp_exceptionThrown
27185    b       common_resumeAfterGlueCall
27186    .endif
27187
27188#if defined(WITH_JIT)
27189    /*
27190     * If the JIT is actively building a trace we need to make sure
27191     * that the field is fully resolved before including the current
27192     * instruction.
27193     *
27194     * On entry:
27195     *     r10: &dvmDex->pResFields[field]
27196     *     r0:  field pointer (must preserve)
27197     */
27198common_verifyField:
27199    ldrh    r3, [rSELF, #offThread_subMode]  @ r3 <- submode byte
27200    ands    r3, #kSubModeJitTraceBuild
27201    bxeq    lr                          @ Not building trace, continue
27202    ldr     r1, [r10]                   @ r1<- reload resolved StaticField ptr
27203    cmp     r1, #0                      @ resolution complete?
27204    bxne    lr                          @ yes, continue
27205    stmfd   sp!, {r0-r2,lr}             @ save regs
27206    mov     r0, rSELF
27207    mov     r1, rPC
27208    bl      dvmJitEndTraceSelect        @ (self,pc) end trace before this inst
27209    ldmfd   sp!, {r0-r2, lr}
27210    bx      lr                          @ return
27211#endif
27212
27213/*
27214 * After returning from a "glued" function, pull out the updated
27215 * values and start executing at the next instruction.
27216 */
27217common_resumeAfterGlueCall:
27218    LOAD_PC_FP_FROM_SELF()              @ pull rPC and rFP out of thread
27219    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh
27220    FETCH_INST()                        @ load rINST from rPC
27221    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27222    GOTO_OPCODE(ip)                     @ jump to next instruction
27223
27224/*
27225 * Invalid array index. Note that our calling convention is strange; we use r1
27226 * and r3 because those just happen to be the registers all our callers are
27227 * using. We move r3 before calling the C function, but r1 happens to match.
27228 * r1: index
27229 * r3: size
27230 */
27231common_errArrayIndex:
27232    EXPORT_PC()
27233    mov     r0, r3
27234    bl      dvmThrowArrayIndexOutOfBoundsException
27235    b       common_exceptionThrown
27236
27237/*
27238 * Integer divide or mod by zero.
27239 */
27240common_errDivideByZero:
27241    EXPORT_PC()
27242    ldr     r0, strDivideByZero
27243    bl      dvmThrowArithmeticException
27244    b       common_exceptionThrown
27245
27246/*
27247 * Attempt to allocate an array with a negative size.
27248 * On entry: length in r1
27249 */
27250common_errNegativeArraySize:
27251    EXPORT_PC()
27252    mov     r0, r1                                @ arg0 <- len
27253    bl      dvmThrowNegativeArraySizeException    @ (len)
27254    b       common_exceptionThrown
27255
27256/*
27257 * Invocation of a non-existent method.
27258 * On entry: method name in r1
27259 */
27260common_errNoSuchMethod:
27261    EXPORT_PC()
27262    mov     r0, r1
27263    bl      dvmThrowNoSuchMethodError
27264    b       common_exceptionThrown
27265
27266/*
27267 * We encountered a null object when we weren't expecting one.  We
27268 * export the PC, throw a NullPointerException, and goto the exception
27269 * processing code.
27270 */
27271common_errNullObject:
27272    EXPORT_PC()
27273    mov     r0, #0
27274    bl      dvmThrowNullPointerException
27275    b       common_exceptionThrown
27276
27277/*
27278 * For debugging, cause an immediate fault.  The source address will
27279 * be in lr (use a bl instruction to jump here).
27280 */
27281common_abort:
27282    ldr     pc, .LdeadFood
27283.LdeadFood:
27284    .word   0xdeadf00d
27285
27286/*
27287 * Spit out a "we were here", preserving all registers.  (The attempt
27288 * to save ip won't work, but we need to save an even number of
27289 * registers for EABI 64-bit stack alignment.)
27290 */
27291    .macro  SQUEAK num
27292common_squeak\num:
27293    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27294    ldr     r0, strSqueak
27295    mov     r1, #\num
27296    bl      printf
27297    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27298    bx      lr
27299    .endm
27300
27301    SQUEAK  0
27302    SQUEAK  1
27303    SQUEAK  2
27304    SQUEAK  3
27305    SQUEAK  4
27306    SQUEAK  5
27307
27308/*
27309 * Spit out the number in r0, preserving registers.
27310 */
27311common_printNum:
27312    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27313    mov     r1, r0
27314    ldr     r0, strSqueak
27315    bl      printf
27316    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27317    bx      lr
27318
27319/*
27320 * Print a newline, preserving registers.
27321 */
27322common_printNewline:
27323    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27324    ldr     r0, strNewline
27325    bl      printf
27326    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27327    bx      lr
27328
27329    /*
27330     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
27331     */
27332common_printHex:
27333    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27334    mov     r1, r0
27335    ldr     r0, strPrintHex
27336    bl      printf
27337    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27338    bx      lr
27339
27340/*
27341 * Print the 64-bit quantity in r0-r1, preserving registers.
27342 */
27343common_printLong:
27344    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27345    mov     r3, r1
27346    mov     r2, r0
27347    ldr     r0, strPrintLong
27348    bl      printf
27349    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27350    bx      lr
27351
27352/*
27353 * Print full method info.  Pass the Method* in r0.  Preserves regs.
27354 */
27355common_printMethod:
27356    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27357    bl      dvmMterpPrintMethod
27358    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27359    bx      lr
27360
27361/*
27362 * Call a C helper function that dumps regs and possibly some
27363 * additional info.  Requires the C function to be compiled in.
27364 */
27365    .if     0
27366common_dumpRegs:
27367    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27368    bl      dvmMterpDumpArmRegs
27369    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27370    bx      lr
27371    .endif
27372
27373#if 0
27374/*
27375 * Experiment on VFP mode.
27376 *
27377 * uint32_t setFPSCR(uint32_t val, uint32_t mask)
27378 *
27379 * Updates the bits specified by "mask", setting them to the values in "val".
27380 */
27381setFPSCR:
27382    and     r0, r0, r1                  @ make sure no stray bits are set
27383    fmrx    r2, fpscr                   @ get VFP reg
27384    mvn     r1, r1                      @ bit-invert mask
27385    and     r2, r2, r1                  @ clear masked bits
27386    orr     r2, r2, r0                  @ set specified bits
27387    fmxr    fpscr, r2                   @ set VFP reg
27388    mov     r0, r2                      @ return new value
27389    bx      lr
27390
27391    .align  2
27392    .global dvmConfigureFP
27393    .type   dvmConfigureFP, %function
27394dvmConfigureFP:
27395    stmfd   sp!, {ip, lr}
27396    /* 0x03000000 sets DN/FZ */
27397    /* 0x00009f00 clears the six exception enable flags */
27398    bl      common_squeak0
27399    mov     r0, #0x03000000             @ r0<- 0x03000000
27400    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
27401    bl      setFPSCR
27402    ldmfd   sp!, {ip, pc}
27403#endif
27404
27405
27406/*
27407 * String references, must be close to the code that uses them.
27408 */
27409    .align  2
27410strDivideByZero:
27411    .word   .LstrDivideByZero
27412strLogTag:
27413    .word   .LstrLogTag
27414strExceptionNotCaughtLocally:
27415    .word   .LstrExceptionNotCaughtLocally
27416
27417strNewline:
27418    .word   .LstrNewline
27419strSqueak:
27420    .word   .LstrSqueak
27421strPrintHex:
27422    .word   .LstrPrintHex
27423strPrintLong:
27424    .word   .LstrPrintLong
27425
27426/*
27427 * Zero-terminated ASCII string data.
27428 *
27429 * On ARM we have two choices: do like gcc does, and LDR from a .word
27430 * with the address, or use an ADR pseudo-op to get the address
27431 * directly.  ADR saves 4 bytes and an indirection, but it's using a
27432 * PC-relative addressing mode and hence has a limited range, which
27433 * makes it not work well with mergeable string sections.
27434 */
27435    .section .rodata.str1.4,"aMS",%progbits,1
27436
27437.LstrBadEntryPoint:
27438    .asciz  "Bad entry point %d\n"
27439.LstrFilledNewArrayNotImpl:
27440    .asciz  "filled-new-array only implemented for objects and 'int'"
27441.LstrDivideByZero:
27442    .asciz  "divide by zero"
27443.LstrLogTag:
27444    .asciz  "mterp"
27445.LstrExceptionNotCaughtLocally:
27446    .asciz  "Exception %s from %s:%d not caught locally\n"
27447
27448.LstrNewline:
27449    .asciz  "\n"
27450.LstrSqueak:
27451    .asciz  "<%d>"
27452.LstrPrintHex:
27453    .asciz  "<0x%x>"
27454.LstrPrintLong:
27455    .asciz  "<%lld>"
27456
27457