InterpAsm-armv5te.S revision 291c84f60853d30e1c0d79dd08c5e5164f588e26
1/*
2 * This file was generated automatically by gen-mterp.py for 'armv5te'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: armv5te/header.S */
8/*
9 * Copyright (C) 2008 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 *      http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25 * ARMv5 definitions and declarations.
26 */
27
28/*
29ARM EABI general notes:
30
31r0-r3 hold first 4 args to a method; they are not preserved across method calls
32r4-r8 are available for general use
33r9 is given special treatment in some situations, but not for us
34r10 (sl) seems to be generally available
35r11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
36r12 (ip) is scratch -- not preserved across method calls
37r13 (sp) should be managed carefully in case a signal arrives
38r14 (lr) must be preserved
39r15 (pc) can be tinkered with directly
40
41r0 holds returns of <= 4 bytes
42r0-r1 hold returns of 8 bytes, low word in r0
43
44Callee must save/restore r4+ (except r12) if it modifies them.  If VFP
45is present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
46s0-s15 (d0-d7, q0-a3) do not need to be.
47
48Stack is "full descending".  Only the arguments that don't fit in the first 4
49registers are placed on the stack.  "sp" points at the first stacked argument
50(i.e. the 5th arg).
51
52VFP: single-precision results in s0, double-precision results in d0.
53
54In the EABI, "sp" must be 64-bit aligned on entry to a function, and any
5564-bit quantities (long long, double) must be 64-bit aligned.
56*/
57
58/*
59Mterp and ARM notes:
60
61The following registers have fixed assignments:
62
63  reg nick      purpose
64  r4  rPC       interpreted program counter, used for fetching instructions
65  r5  rFP       interpreted frame pointer, used for accessing locals and args
66  r6  rSELF     self (Thread) pointer
67  r7  rINST     first 16-bit code unit of current instruction
68  r8  rIBASE    interpreted instruction base pointer, used for computed goto
69
70Macros are provided for common operations.  Each macro MUST emit only
71one instruction to make instruction-counting easier.  They MUST NOT alter
72unspecified registers or condition codes.
73*/
74
75/* single-purpose registers, given names for clarity */
76#define rPC     r4
77#define rFP     r5
78#define rSELF   r6
79#define rINST   r7
80#define rIBASE  r8
81
82/* save/restore the PC and/or FP from the thread struct */
83#define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
84#define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
85#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
86#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
87#define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
88#define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
89
90/*
91 * "export" the PC to the stack frame, f/b/o future exception objects.  Must
92 * be done *before* something throws.
93 *
94 * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
95 * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
96 *
97 * It's okay to do this more than once.
98 */
99#define EXPORT_PC() \
100    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
101
102/*
103 * Given a frame pointer, find the stack save area.
104 *
105 * In C this is "((StackSaveArea*)(_fp) -1)".
106 */
107#define SAVEAREA_FROM_FP(_reg, _fpreg) \
108    sub     _reg, _fpreg, #sizeofStackSaveArea
109
110/*
111 * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
112 */
113#define FETCH_INST()            ldrh    rINST, [rPC]
114
115/*
116 * Fetch the next instruction from the specified offset.  Advances rPC
117 * to point to the next instruction.  "_count" is in 16-bit code units.
118 *
119 * Because of the limited size of immediate constants on ARM, this is only
120 * suitable for small forward movements (i.e. don't try to implement "goto"
121 * with this).
122 *
123 * This must come AFTER anything that can throw an exception, or the
124 * exception catch may miss.  (This also implies that it must come after
125 * EXPORT_PC().)
126 */
127#define FETCH_ADVANCE_INST(_count) ldrh    rINST, [rPC, #((_count)*2)]!
128
129/*
130 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
131 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
132 */
133#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
134        ldrh    _dreg, [_sreg, #((_count)*2)]!
135
136/*
137 * Fetch the next instruction from an offset specified by _reg.  Updates
138 * rPC to point to the next instruction.  "_reg" must specify the distance
139 * in bytes, *not* 16-bit code units, and may be a signed value.
140 *
141 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
142 * bits that hold the shift distance are used for the half/byte/sign flags.
143 * In some cases we can pre-double _reg for free, so we require a byte offset
144 * here.
145 */
146#define FETCH_ADVANCE_INST_RB(_reg) ldrh    rINST, [rPC, _reg]!
147
148/*
149 * Fetch a half-word code unit from an offset past the current PC.  The
150 * "_count" value is in 16-bit code units.  Does not advance rPC.
151 *
152 * The "_S" variant works the same but treats the value as signed.
153 */
154#define FETCH(_reg, _count)     ldrh    _reg, [rPC, #((_count)*2)]
155#define FETCH_S(_reg, _count)   ldrsh   _reg, [rPC, #((_count)*2)]
156
157/*
158 * Fetch one byte from an offset past the current PC.  Pass in the same
159 * "_count" as you would for FETCH, and an additional 0/1 indicating which
160 * byte of the halfword you want (lo/hi).
161 */
162#define FETCH_B(_reg, _count, _byte) ldrb     _reg, [rPC, #((_count)*2+(_byte))]
163
164/*
165 * Put the instruction's opcode field into the specified register.
166 */
167#define GET_INST_OPCODE(_reg)   and     _reg, rINST, #255
168
169/*
170 * Put the prefetched instruction's opcode field into the specified register.
171 */
172#define GET_PREFETCHED_OPCODE(_oreg, _ireg)   and     _oreg, _ireg, #255
173
174/*
175 * Begin executing the opcode in _reg.  Because this only jumps within the
176 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
177 */
178#define GOTO_OPCODE(_reg)       add     pc, rIBASE, _reg, lsl #6
179#define GOTO_OPCODE_BASE(_base,_reg)  add     pc, _base, _reg, lsl #6
180#define GOTO_OPCODE_IFEQ(_reg)  addeq   pc, rIBASE, _reg, lsl #6
181#define GOTO_OPCODE_IFNE(_reg)  addne   pc, rIBASE, _reg, lsl #6
182
183/*
184 * Get/set the 32-bit value from a Dalvik register.
185 */
186#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
187#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
188
189/*
190 * Convert a virtual register index into an address.
191 */
192#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
193        add     _reg, rFP, _vreg, lsl #2
194
195/*
196 * This is a #include, not a %include, because we want the C pre-processor
197 * to expand the macros into assembler assignment statements.
198 */
199#include "../common/asm-constants.h"
200
201#if defined(WITH_JIT)
202#include "../common/jit-config.h"
203#endif
204
205/* File: armv5te/platform.S */
206/*
207 * ===========================================================================
208 *  CPU-version-specific defines
209 * ===========================================================================
210 */
211
212/*
213 * Macro for data memory barrier; not meaningful pre-ARMv6K.
214 */
215.macro  SMP_DMB
216.endm
217
218/*
219 * Macro for data memory barrier; not meaningful pre-ARMv6K.
220 */
221.macro  SMP_DMB_ST
222.endm
223
224/* File: armv5te/entry.S */
225/*
226 * Copyright (C) 2008 The Android Open Source Project
227 *
228 * Licensed under the Apache License, Version 2.0 (the "License");
229 * you may not use this file except in compliance with the License.
230 * You may obtain a copy of the License at
231 *
232 *      http://www.apache.org/licenses/LICENSE-2.0
233 *
234 * Unless required by applicable law or agreed to in writing, software
235 * distributed under the License is distributed on an "AS IS" BASIS,
236 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
237 * See the License for the specific language governing permissions and
238 * limitations under the License.
239 */
240/*
241 * Interpreter entry point.
242 */
243
244/*
245 * We don't have formal stack frames, so gdb scans upward in the code
246 * to find the start of the function (a label with the %function type),
247 * and then looks at the next few instructions to figure out what
248 * got pushed onto the stack.  From this it figures out how to restore
249 * the registers, including PC, for the previous stack frame.  If gdb
250 * sees a non-function label, it stops scanning, so either we need to
251 * have nothing but assembler-local labels between the entry point and
252 * the break, or we need to fake it out.
253 *
254 * When this is defined, we add some stuff to make gdb less confused.
255 */
256#define ASSIST_DEBUGGER 1
257
258    .text
259    .align  2
260    .global dvmMterpStdRun
261    .type   dvmMterpStdRun, %function
262
263/*
264 * On entry:
265 *  r0  Thread* self
266 *
267 * The return comes via a call to dvmMterpStdBail().
268 */
269dvmMterpStdRun:
270#define MTERP_ENTRY1 \
271    .save {r4-r10,fp,lr}; \
272    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
273#define MTERP_ENTRY2 \
274    .pad    #4; \
275    sub     sp, sp, #4                  @ align 64
276
277    .fnstart
278    MTERP_ENTRY1
279    MTERP_ENTRY2
280
281    /* save stack pointer, add magic word for debuggerd */
282    str     sp, [r0, #offThread_bailPtr]  @ save SP for eventual return
283
284    /* set up "named" registers, figure out entry point */
285    mov     rSELF, r0                   @ set rSELF
286    LOAD_PC_FP_FROM_SELF()              @ load rPC and rFP from "thread"
287    ldr     rIBASE, [rSELF, #offThread_curHandlerTable] @ set rIBASE
288
289#if defined(WITH_JIT)
290.LentryInstr:
291    /* Entry is always a possible trace start */
292    ldr     r0, [rSELF, #offThread_pJitProfTable]
293    FETCH_INST()
294    mov     r1, #0                      @ prepare the value for the new state
295    str     r1, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
296    cmp     r0,#0                       @ is profiling disabled?
297#if !defined(WITH_SELF_VERIFICATION)
298    bne     common_updateProfile        @ profiling is enabled
299#else
300    ldr     r2, [rSELF, #offThread_shadowSpace] @ to find out the jit exit state
301    beq     1f                          @ profiling is disabled
302    ldr     r3, [r2, #offShadowSpace_jitExitState]  @ jit exit state
303    cmp     r3, #kSVSTraceSelect        @ hot trace following?
304    moveq   r2,#kJitTSelectRequestHot   @ ask for trace selection
305    beq     common_selectTrace          @ go build the trace
306    cmp     r3, #kSVSNoProfile          @ don't profile the next instruction?
307    beq     1f                          @ intrepret the next instruction
308    b       common_updateProfile        @ collect profiles
309#endif
3101:
311    GET_INST_OPCODE(ip)
312    GOTO_OPCODE(ip)
313#else
314    /* start executing the instruction at rPC */
315    FETCH_INST()                        @ load rINST from rPC
316    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
317    GOTO_OPCODE(ip)                     @ jump to next instruction
318#endif
319
320.Lbad_arg:
321    ldr     r0, strBadEntryPoint
322    @ r1 holds value of entryPoint
323    bl      printf
324    bl      dvmAbort
325    .fnend
326    .size   dvmMterpStdRun, .-dvmMterpStdRun
327
328
329    .global dvmMterpStdBail
330    .type   dvmMterpStdBail, %function
331
332/*
333 * Restore the stack pointer and PC from the save point established on entry.
334 * This is essentially the same as a longjmp, but should be cheaper.  The
335 * last instruction causes us to return to whoever called dvmMterpStdRun.
336 *
337 * We pushed some registers on the stack in dvmMterpStdRun, then saved
338 * SP and LR.  Here we restore SP, restore the registers, and then restore
339 * LR to PC.
340 *
341 * On entry:
342 *  r0  Thread* self
343 */
344dvmMterpStdBail:
345    ldr     sp, [r0, #offThread_bailPtr]    @ sp<- saved SP
346    add     sp, sp, #4                      @ un-align 64
347    ldmfd   sp!, {r4-r10,fp,pc}             @ restore 9 regs and return
348
349
350/*
351 * String references.
352 */
353strBadEntryPoint:
354    .word   .LstrBadEntryPoint
355
356
357    .global dvmAsmInstructionStart
358    .type   dvmAsmInstructionStart, %function
359dvmAsmInstructionStart = .L_OP_NOP
360    .text
361
362/* ------------------------------ */
363    .balign 64
364.L_OP_NOP: /* 0x00 */
365/* File: armv5te/OP_NOP.S */
366    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
367    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
368    GOTO_OPCODE(ip)                     @ execute it
369
370#ifdef ASSIST_DEBUGGER
371    /* insert fake function header to help gdb find the stack frame */
372    .type   dalvik_inst, %function
373dalvik_inst:
374    .fnstart
375    MTERP_ENTRY1
376    MTERP_ENTRY2
377    .fnend
378#endif
379
380/* ------------------------------ */
381    .balign 64
382.L_OP_MOVE: /* 0x01 */
383/* File: armv5te/OP_MOVE.S */
384    /* for move, move-object, long-to-int */
385    /* op vA, vB */
386    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
387    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
388    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
389    GET_VREG(r2, r1)                    @ r2<- fp[B]
390    and     r0, r0, #15
391    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
392    SET_VREG(r2, r0)                    @ fp[A]<- r2
393    GOTO_OPCODE(ip)                     @ execute next instruction
394
395/* ------------------------------ */
396    .balign 64
397.L_OP_MOVE_FROM16: /* 0x02 */
398/* File: armv5te/OP_MOVE_FROM16.S */
399    /* for: move/from16, move-object/from16 */
400    /* op vAA, vBBBB */
401    FETCH(r1, 1)                        @ r1<- BBBB
402    mov     r0, rINST, lsr #8           @ r0<- AA
403    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
404    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
405    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
406    SET_VREG(r2, r0)                    @ fp[AA]<- r2
407    GOTO_OPCODE(ip)                     @ jump to next instruction
408
409/* ------------------------------ */
410    .balign 64
411.L_OP_MOVE_16: /* 0x03 */
412/* File: armv5te/OP_MOVE_16.S */
413    /* for: move/16, move-object/16 */
414    /* op vAAAA, vBBBB */
415    FETCH(r1, 2)                        @ r1<- BBBB
416    FETCH(r0, 1)                        @ r0<- AAAA
417    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
418    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
419    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
420    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
421    GOTO_OPCODE(ip)                     @ jump to next instruction
422
423/* ------------------------------ */
424    .balign 64
425.L_OP_MOVE_WIDE: /* 0x04 */
426/* File: armv5te/OP_MOVE_WIDE.S */
427    /* move-wide vA, vB */
428    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
429    mov     r2, rINST, lsr #8           @ r2<- A(+)
430    mov     r3, rINST, lsr #12          @ r3<- B
431    and     r2, r2, #15
432    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
433    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
434    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
435    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
436    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
437    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
438    GOTO_OPCODE(ip)                     @ jump to next instruction
439
440/* ------------------------------ */
441    .balign 64
442.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
443/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
444    /* move-wide/from16 vAA, vBBBB */
445    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
446    FETCH(r3, 1)                        @ r3<- BBBB
447    mov     r2, rINST, lsr #8           @ r2<- AA
448    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
449    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
450    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
451    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
452    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
453    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
454    GOTO_OPCODE(ip)                     @ jump to next instruction
455
456/* ------------------------------ */
457    .balign 64
458.L_OP_MOVE_WIDE_16: /* 0x06 */
459/* File: armv5te/OP_MOVE_WIDE_16.S */
460    /* move-wide/16 vAAAA, vBBBB */
461    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
462    FETCH(r3, 2)                        @ r3<- BBBB
463    FETCH(r2, 1)                        @ r2<- AAAA
464    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
465    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
466    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
467    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
468    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
469    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
470    GOTO_OPCODE(ip)                     @ jump to next instruction
471
472/* ------------------------------ */
473    .balign 64
474.L_OP_MOVE_OBJECT: /* 0x07 */
475/* File: armv5te/OP_MOVE_OBJECT.S */
476/* File: armv5te/OP_MOVE.S */
477    /* for move, move-object, long-to-int */
478    /* op vA, vB */
479    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
480    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
481    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
482    GET_VREG(r2, r1)                    @ r2<- fp[B]
483    and     r0, r0, #15
484    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
485    SET_VREG(r2, r0)                    @ fp[A]<- r2
486    GOTO_OPCODE(ip)                     @ execute next instruction
487
488
489/* ------------------------------ */
490    .balign 64
491.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
492/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
493/* File: armv5te/OP_MOVE_FROM16.S */
494    /* for: move/from16, move-object/from16 */
495    /* op vAA, vBBBB */
496    FETCH(r1, 1)                        @ r1<- BBBB
497    mov     r0, rINST, lsr #8           @ r0<- AA
498    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
499    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
500    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
501    SET_VREG(r2, r0)                    @ fp[AA]<- r2
502    GOTO_OPCODE(ip)                     @ jump to next instruction
503
504
505/* ------------------------------ */
506    .balign 64
507.L_OP_MOVE_OBJECT_16: /* 0x09 */
508/* File: armv5te/OP_MOVE_OBJECT_16.S */
509/* File: armv5te/OP_MOVE_16.S */
510    /* for: move/16, move-object/16 */
511    /* op vAAAA, vBBBB */
512    FETCH(r1, 2)                        @ r1<- BBBB
513    FETCH(r0, 1)                        @ r0<- AAAA
514    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
515    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
516    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
517    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
518    GOTO_OPCODE(ip)                     @ jump to next instruction
519
520
521/* ------------------------------ */
522    .balign 64
523.L_OP_MOVE_RESULT: /* 0x0a */
524/* File: armv5te/OP_MOVE_RESULT.S */
525    /* for: move-result, move-result-object */
526    /* op vAA */
527    mov     r2, rINST, lsr #8           @ r2<- AA
528    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
529    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
530    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
531    SET_VREG(r0, r2)                    @ fp[AA]<- r0
532    GOTO_OPCODE(ip)                     @ jump to next instruction
533
534/* ------------------------------ */
535    .balign 64
536.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
537/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
538    /* move-result-wide vAA */
539    mov     r2, rINST, lsr #8           @ r2<- AA
540    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
541    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
542    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
543    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
544    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
545    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
546    GOTO_OPCODE(ip)                     @ jump to next instruction
547
548/* ------------------------------ */
549    .balign 64
550.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
551/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
552/* File: armv5te/OP_MOVE_RESULT.S */
553    /* for: move-result, move-result-object */
554    /* op vAA */
555    mov     r2, rINST, lsr #8           @ r2<- AA
556    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
557    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
558    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
559    SET_VREG(r0, r2)                    @ fp[AA]<- r0
560    GOTO_OPCODE(ip)                     @ jump to next instruction
561
562
563/* ------------------------------ */
564    .balign 64
565.L_OP_MOVE_EXCEPTION: /* 0x0d */
566/* File: armv5te/OP_MOVE_EXCEPTION.S */
567    /* move-exception vAA */
568    mov     r2, rINST, lsr #8           @ r2<- AA
569    ldr     r3, [rSELF, #offThread_exception]  @ r3<- dvmGetException bypass
570    mov     r1, #0                      @ r1<- 0
571    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
572    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
573    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
574    str     r1, [rSELF, #offThread_exception]  @ dvmClearException bypass
575    GOTO_OPCODE(ip)                     @ jump to next instruction
576
577/* ------------------------------ */
578    .balign 64
579.L_OP_RETURN_VOID: /* 0x0e */
580/* File: armv5te/OP_RETURN_VOID.S */
581    b       common_returnFromMethod
582
583/* ------------------------------ */
584    .balign 64
585.L_OP_RETURN: /* 0x0f */
586/* File: armv5te/OP_RETURN.S */
587    /*
588     * Return a 32-bit value.  Copies the return value into the "thread"
589     * structure, then jumps to the return handler.
590     *
591     * for: return, return-object
592     */
593    /* op vAA */
594    mov     r2, rINST, lsr #8           @ r2<- AA
595    GET_VREG(r0, r2)                    @ r0<- vAA
596    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
597    b       common_returnFromMethod
598
599/* ------------------------------ */
600    .balign 64
601.L_OP_RETURN_WIDE: /* 0x10 */
602/* File: armv5te/OP_RETURN_WIDE.S */
603    /*
604     * Return a 64-bit value.  Copies the return value into the "thread"
605     * structure, then jumps to the return handler.
606     */
607    /* return-wide vAA */
608    mov     r2, rINST, lsr #8           @ r2<- AA
609    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
610    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
611    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
612    stmia   r3, {r0-r1}                 @ retval<- r0/r1
613    b       common_returnFromMethod
614
615/* ------------------------------ */
616    .balign 64
617.L_OP_RETURN_OBJECT: /* 0x11 */
618/* File: armv5te/OP_RETURN_OBJECT.S */
619/* File: armv5te/OP_RETURN.S */
620    /*
621     * Return a 32-bit value.  Copies the return value into the "thread"
622     * structure, then jumps to the return handler.
623     *
624     * for: return, return-object
625     */
626    /* op vAA */
627    mov     r2, rINST, lsr #8           @ r2<- AA
628    GET_VREG(r0, r2)                    @ r0<- vAA
629    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
630    b       common_returnFromMethod
631
632
633/* ------------------------------ */
634    .balign 64
635.L_OP_CONST_4: /* 0x12 */
636/* File: armv5te/OP_CONST_4.S */
637    /* const/4 vA, #+B */
638    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
639    mov     r0, rINST, lsr #8           @ r0<- A+
640    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
641    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
642    and     r0, r0, #15
643    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
644    SET_VREG(r1, r0)                    @ fp[A]<- r1
645    GOTO_OPCODE(ip)                     @ execute next instruction
646
647/* ------------------------------ */
648    .balign 64
649.L_OP_CONST_16: /* 0x13 */
650/* File: armv5te/OP_CONST_16.S */
651    /* const/16 vAA, #+BBBB */
652    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
653    mov     r3, rINST, lsr #8           @ r3<- AA
654    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
655    SET_VREG(r0, r3)                    @ vAA<- r0
656    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
657    GOTO_OPCODE(ip)                     @ jump to next instruction
658
659/* ------------------------------ */
660    .balign 64
661.L_OP_CONST: /* 0x14 */
662/* File: armv5te/OP_CONST.S */
663    /* const vAA, #+BBBBbbbb */
664    mov     r3, rINST, lsr #8           @ r3<- AA
665    FETCH(r0, 1)                        @ r0<- bbbb (low)
666    FETCH(r1, 2)                        @ r1<- BBBB (high)
667    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
668    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
669    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
670    SET_VREG(r0, r3)                    @ vAA<- r0
671    GOTO_OPCODE(ip)                     @ jump to next instruction
672
673/* ------------------------------ */
674    .balign 64
675.L_OP_CONST_HIGH16: /* 0x15 */
676/* File: armv5te/OP_CONST_HIGH16.S */
677    /* const/high16 vAA, #+BBBB0000 */
678    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
679    mov     r3, rINST, lsr #8           @ r3<- AA
680    mov     r0, r0, lsl #16             @ r0<- BBBB0000
681    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
682    SET_VREG(r0, r3)                    @ vAA<- r0
683    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
684    GOTO_OPCODE(ip)                     @ jump to next instruction
685
686/* ------------------------------ */
687    .balign 64
688.L_OP_CONST_WIDE_16: /* 0x16 */
689/* File: armv5te/OP_CONST_WIDE_16.S */
690    /* const-wide/16 vAA, #+BBBB */
691    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
692    mov     r3, rINST, lsr #8           @ r3<- AA
693    mov     r1, r0, asr #31             @ r1<- ssssssss
694    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
695    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
697    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
698    GOTO_OPCODE(ip)                     @ jump to next instruction
699
700/* ------------------------------ */
701    .balign 64
702.L_OP_CONST_WIDE_32: /* 0x17 */
703/* File: armv5te/OP_CONST_WIDE_32.S */
704    /* const-wide/32 vAA, #+BBBBbbbb */
705    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
706    mov     r3, rINST, lsr #8           @ r3<- AA
707    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
708    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
709    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
710    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
711    mov     r1, r0, asr #31             @ r1<- ssssssss
712    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
713    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
714    GOTO_OPCODE(ip)                     @ jump to next instruction
715
716/* ------------------------------ */
717    .balign 64
718.L_OP_CONST_WIDE: /* 0x18 */
719/* File: armv5te/OP_CONST_WIDE.S */
720    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
721    FETCH(r0, 1)                        @ r0<- bbbb (low)
722    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
723    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
724    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
725    FETCH(r3, 4)                        @ r3<- HHHH (high)
726    mov     r9, rINST, lsr #8           @ r9<- AA
727    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
728    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
729    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
730    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
731    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
732    GOTO_OPCODE(ip)                     @ jump to next instruction
733
734/* ------------------------------ */
735    .balign 64
736.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
737/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
738    /* const-wide/high16 vAA, #+BBBB000000000000 */
739    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
740    mov     r3, rINST, lsr #8           @ r3<- AA
741    mov     r0, #0                      @ r0<- 00000000
742    mov     r1, r1, lsl #16             @ r1<- BBBB0000
743    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
744    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
745    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
746    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
747    GOTO_OPCODE(ip)                     @ jump to next instruction
748
749/* ------------------------------ */
750    .balign 64
751.L_OP_CONST_STRING: /* 0x1a */
752/* File: armv5te/OP_CONST_STRING.S */
753    /* const/string vAA, String@BBBB */
754    FETCH(r1, 1)                        @ r1<- BBBB
755    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
756    mov     r9, rINST, lsr #8           @ r9<- AA
757    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
758    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
759    cmp     r0, #0                      @ not yet resolved?
760    beq     .LOP_CONST_STRING_resolve
761    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
762    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
763    SET_VREG(r0, r9)                    @ vAA<- r0
764    GOTO_OPCODE(ip)                     @ jump to next instruction
765
766/* ------------------------------ */
767    .balign 64
768.L_OP_CONST_STRING_JUMBO: /* 0x1b */
769/* File: armv5te/OP_CONST_STRING_JUMBO.S */
770    /* const/string vAA, String@BBBBBBBB */
771    FETCH(r0, 1)                        @ r0<- bbbb (low)
772    FETCH(r1, 2)                        @ r1<- BBBB (high)
773    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
774    mov     r9, rINST, lsr #8           @ r9<- AA
775    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
776    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
777    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
778    cmp     r0, #0
779    beq     .LOP_CONST_STRING_JUMBO_resolve
780    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
781    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
782    SET_VREG(r0, r9)                    @ vAA<- r0
783    GOTO_OPCODE(ip)                     @ jump to next instruction
784
785/* ------------------------------ */
786    .balign 64
787.L_OP_CONST_CLASS: /* 0x1c */
788/* File: armv5te/OP_CONST_CLASS.S */
789    /* const/class vAA, Class@BBBB */
790    FETCH(r1, 1)                        @ r1<- BBBB
791    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
792    mov     r9, rINST, lsr #8           @ r9<- AA
793    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
794    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
795    cmp     r0, #0                      @ not yet resolved?
796    beq     .LOP_CONST_CLASS_resolve
797    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
798    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
799    SET_VREG(r0, r9)                    @ vAA<- r0
800    GOTO_OPCODE(ip)                     @ jump to next instruction
801
802/* ------------------------------ */
803    .balign 64
804.L_OP_MONITOR_ENTER: /* 0x1d */
805/* File: armv5te/OP_MONITOR_ENTER.S */
806    /*
807     * Synchronize on an object.
808     */
809    /* monitor-enter vAA */
810    mov     r2, rINST, lsr #8           @ r2<- AA
811    GET_VREG(r1, r2)                    @ r1<- vAA (object)
812    mov     r0, rSELF                   @ r0<- self
813    cmp     r1, #0                      @ null object?
814    EXPORT_PC()                         @ need for precise GC
815    beq     common_errNullObject        @ null object, throw an exception
816    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
817    bl      dvmLockObject               @ call(self, obj)
818    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
819    GOTO_OPCODE(ip)                     @ jump to next instruction
820
821/* ------------------------------ */
822    .balign 64
823.L_OP_MONITOR_EXIT: /* 0x1e */
824/* File: armv5te/OP_MONITOR_EXIT.S */
825    /*
826     * Unlock an object.
827     *
828     * Exceptions that occur when unlocking a monitor need to appear as
829     * if they happened at the following instruction.  See the Dalvik
830     * instruction spec.
831     */
832    /* monitor-exit vAA */
833    mov     r2, rINST, lsr #8           @ r2<- AA
834    EXPORT_PC()                         @ before fetch: export the PC
835    GET_VREG(r1, r2)                    @ r1<- vAA (object)
836    cmp     r1, #0                      @ null object?
837    beq     1f                          @ yes
838    mov     r0, rSELF                   @ r0<- self
839    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
840    cmp     r0, #0                      @ failed?
841    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
842    beq     common_exceptionThrown      @ yes, exception is pending
843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
844    GOTO_OPCODE(ip)                     @ jump to next instruction
8451:
846    FETCH_ADVANCE_INST(1)               @ advance before throw
847    b      common_errNullObject
848
849/* ------------------------------ */
850    .balign 64
851.L_OP_CHECK_CAST: /* 0x1f */
852/* File: armv5te/OP_CHECK_CAST.S */
853    /*
854     * Check to see if a cast from one class to another is allowed.
855     */
856    /* check-cast vAA, class@BBBB */
857    mov     r3, rINST, lsr #8           @ r3<- AA
858    FETCH(r2, 1)                        @ r2<- BBBB
859    GET_VREG(r9, r3)                    @ r9<- object
860    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
861    cmp     r9, #0                      @ is object null?
862    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
863    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
864    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
865    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
866    cmp     r1, #0                      @ have we resolved this before?
867    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
868.LOP_CHECK_CAST_resolved:
869    cmp     r0, r1                      @ same class (trivial success)?
870    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
871.LOP_CHECK_CAST_okay:
872    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
873    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
874    GOTO_OPCODE(ip)                     @ jump to next instruction
875
876/* ------------------------------ */
877    .balign 64
878.L_OP_INSTANCE_OF: /* 0x20 */
879/* File: armv5te/OP_INSTANCE_OF.S */
880    /*
881     * Check to see if an object reference is an instance of a class.
882     *
883     * Most common situation is a non-null object, being compared against
884     * an already-resolved class.
885     */
886    /* instance-of vA, vB, class@CCCC */
887    mov     r3, rINST, lsr #12          @ r3<- B
888    mov     r9, rINST, lsr #8           @ r9<- A+
889    GET_VREG(r0, r3)                    @ r0<- vB (object)
890    and     r9, r9, #15                 @ r9<- A
891    cmp     r0, #0                      @ is object null?
892    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
893    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
894    FETCH(r3, 1)                        @ r3<- CCCC
895    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
896    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
897    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
898    cmp     r1, #0                      @ have we resolved this before?
899    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
900.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
901    cmp     r0, r1                      @ same class (trivial success)?
902    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
903    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
904
905/* ------------------------------ */
906    .balign 64
907.L_OP_ARRAY_LENGTH: /* 0x21 */
908/* File: armv5te/OP_ARRAY_LENGTH.S */
909    /*
910     * Return the length of an array.
911     */
912    mov     r1, rINST, lsr #12          @ r1<- B
913    mov     r2, rINST, lsr #8           @ r2<- A+
914    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
915    and     r2, r2, #15                 @ r2<- A
916    cmp     r0, #0                      @ is object null?
917    beq     common_errNullObject        @ yup, fail
918    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
919    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
920    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
921    SET_VREG(r3, r2)                    @ vB<- length
922    GOTO_OPCODE(ip)                     @ jump to next instruction
923
924/* ------------------------------ */
925    .balign 64
926.L_OP_NEW_INSTANCE: /* 0x22 */
927/* File: armv5te/OP_NEW_INSTANCE.S */
928    /*
929     * Create a new instance of a class.
930     */
931    /* new-instance vAA, class@BBBB */
932    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
933    FETCH(r1, 1)                        @ r1<- BBBB
934    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
935    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
936#if defined(WITH_JIT)
937    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
938#endif
939    EXPORT_PC()                         @ req'd for init, resolve, alloc
940    cmp     r0, #0                      @ already resolved?
941    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
942.LOP_NEW_INSTANCE_resolved:   @ r0=class
943    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
944    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
945    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
946.LOP_NEW_INSTANCE_initialized: @ r0=class
947    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
948    bl      dvmAllocObject              @ r0<- new object
949    b       .LOP_NEW_INSTANCE_finish          @ continue
950
951/* ------------------------------ */
952    .balign 64
953.L_OP_NEW_ARRAY: /* 0x23 */
954/* File: armv5te/OP_NEW_ARRAY.S */
955    /*
956     * Allocate an array of objects, specified with the array class
957     * and a count.
958     *
959     * The verifier guarantees that this is an array class, so we don't
960     * check for it here.
961     */
962    /* new-array vA, vB, class@CCCC */
963    mov     r0, rINST, lsr #12          @ r0<- B
964    FETCH(r2, 1)                        @ r2<- CCCC
965    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
966    GET_VREG(r1, r0)                    @ r1<- vB (array length)
967    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
968    cmp     r1, #0                      @ check length
969    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
970    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
971    cmp     r0, #0                      @ already resolved?
972    EXPORT_PC()                         @ req'd for resolve, alloc
973    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
974    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
975
976/* ------------------------------ */
977    .balign 64
978.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
979/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
980    /*
981     * Create a new array with elements filled from registers.
982     *
983     * for: filled-new-array, filled-new-array/range
984     */
985    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
986    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
987    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
988    FETCH(r1, 1)                        @ r1<- BBBB
989    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
990    EXPORT_PC()                         @ need for resolve and alloc
991    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
992    mov     r10, rINST, lsr #8          @ r10<- AA or BA
993    cmp     r0, #0                      @ already resolved?
994    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
9958:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
996    mov     r2, #0                      @ r2<- false
997    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
998    bl      dvmResolveClass             @ r0<- call(clazz, ref)
999    cmp     r0, #0                      @ got null?
1000    beq     common_exceptionThrown      @ yes, handle exception
1001    b       .LOP_FILLED_NEW_ARRAY_continue
1002
1003/* ------------------------------ */
1004    .balign 64
1005.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1006/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1007/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1008    /*
1009     * Create a new array with elements filled from registers.
1010     *
1011     * for: filled-new-array, filled-new-array/range
1012     */
1013    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1014    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1015    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
1016    FETCH(r1, 1)                        @ r1<- BBBB
1017    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1018    EXPORT_PC()                         @ need for resolve and alloc
1019    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1020    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1021    cmp     r0, #0                      @ already resolved?
1022    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
10238:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1024    mov     r2, #0                      @ r2<- false
1025    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1026    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1027    cmp     r0, #0                      @ got null?
1028    beq     common_exceptionThrown      @ yes, handle exception
1029    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1030
1031
1032/* ------------------------------ */
1033    .balign 64
1034.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1035/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1036    /* fill-array-data vAA, +BBBBBBBB */
1037    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1038    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1039    mov     r3, rINST, lsr #8           @ r3<- AA
1040    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1041    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1042    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1043    EXPORT_PC();
1044    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1045    cmp     r0, #0                      @ 0 means an exception is thrown
1046    beq     common_exceptionThrown      @ has exception
1047    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1048    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1049    GOTO_OPCODE(ip)                     @ jump to next instruction
1050
1051/* ------------------------------ */
1052    .balign 64
1053.L_OP_THROW: /* 0x27 */
1054/* File: armv5te/OP_THROW.S */
1055    /*
1056     * Throw an exception object in the current thread.
1057     */
1058    /* throw vAA */
1059    mov     r2, rINST, lsr #8           @ r2<- AA
1060    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1061    EXPORT_PC()                         @ exception handler can throw
1062    cmp     r1, #0                      @ null object?
1063    beq     common_errNullObject        @ yes, throw an NPE instead
1064    @ bypass dvmSetException, just store it
1065    str     r1, [rSELF, #offThread_exception]  @ thread->exception<- obj
1066    b       common_exceptionThrown
1067
1068/* ------------------------------ */
1069    .balign 64
1070.L_OP_GOTO: /* 0x28 */
1071/* File: armv5te/OP_GOTO.S */
1072    /*
1073     * Unconditional branch, 8-bit offset.
1074     *
1075     * The branch distance is a signed code-unit offset, which we need to
1076     * double to get a byte offset.
1077     */
1078    /* goto +AA */
1079    /* tuning: use sbfx for 6t2+ targets */
1080    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1081    movs    r1, r0, asr #24             @ r1<- ssssssAA (sign-extended)
1082    add     r2, r1, r1                  @ r2<- byte offset, set flags
1083       @ If backwards branch refresh rIBASE
1084    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1085    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1086#if defined(WITH_JIT)
1087    ldr     r0, [rSELF, #offThread_pJitProfTable]
1088    bmi     common_testUpdateProfile    @ (r0) check for trace hotness
1089#endif
1090    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1091    GOTO_OPCODE(ip)                     @ jump to next instruction
1092
1093/* ------------------------------ */
1094    .balign 64
1095.L_OP_GOTO_16: /* 0x29 */
1096/* File: armv5te/OP_GOTO_16.S */
1097    /*
1098     * Unconditional branch, 16-bit offset.
1099     *
1100     * The branch distance is a signed code-unit offset, which we need to
1101     * double to get a byte offset.
1102     */
1103    /* goto/16 +AAAA */
1104    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1105    adds    r1, r0, r0                  @ r1<- byte offset, flags set
1106    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1107    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1108#if defined(WITH_JIT)
1109    ldr     r0, [rSELF, #offThread_pJitProfTable]
1110    bmi     common_testUpdateProfile    @ (r0) hot trace head?
1111#endif
1112    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1113    GOTO_OPCODE(ip)                     @ jump to next instruction
1114
1115/* ------------------------------ */
1116    .balign 64
1117.L_OP_GOTO_32: /* 0x2a */
1118/* File: armv5te/OP_GOTO_32.S */
1119    /*
1120     * Unconditional branch, 32-bit offset.
1121     *
1122     * The branch distance is a signed code-unit offset, which we need to
1123     * double to get a byte offset.
1124     *
1125     * Unlike most opcodes, this one is allowed to branch to itself, so
1126     * our "backward branch" test must be "<=0" instead of "<0".  Because
1127     * we need the V bit set, we'll use an adds to convert from Dalvik
1128     * offset to byte offset.
1129     */
1130    /* goto/32 +AAAAAAAA */
1131    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1132    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1133    orr     r0, r0, r1, lsl #16         @ r0<- AAAAaaaa
1134    adds    r1, r0, r0                  @ r1<- byte offset
1135#if defined(WITH_JIT)
1136    ldr     r0, [rSELF, #offThread_pJitProfTable]
1137    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1138    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1139    ble     common_testUpdateProfile    @ (r0) hot trace head?
1140#else
1141    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1142    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1143#endif
1144    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1145    GOTO_OPCODE(ip)                     @ jump to next instruction
1146
1147/* ------------------------------ */
1148    .balign 64
1149.L_OP_PACKED_SWITCH: /* 0x2b */
1150/* File: armv5te/OP_PACKED_SWITCH.S */
1151    /*
1152     * Handle a packed-switch or sparse-switch instruction.  In both cases
1153     * we decode it and hand it off to a helper function.
1154     *
1155     * We don't really expect backward branches in a switch statement, but
1156     * they're perfectly legal, so we check for them here.
1157     *
1158     * When the JIT is present, all targets are considered treated as
1159     * a potential trace heads regardless of branch direction.
1160     *
1161     * for: packed-switch, sparse-switch
1162     */
1163    /* op vAA, +BBBB */
1164    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1165    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1166    mov     r3, rINST, lsr #8           @ r3<- AA
1167    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1168    GET_VREG(r1, r3)                    @ r1<- vAA
1169    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1170    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1171    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1172#if defined(WITH_JIT)
1173    ldr     r0, [rSELF, #offThread_pJitProfTable]
1174    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1175    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1176    cmp     r0, #0
1177    bne     common_updateProfile
1178#else
1179    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1180    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1181#endif
1182    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1183    GOTO_OPCODE(ip)                     @ jump to next instruction
1184
1185/* ------------------------------ */
1186    .balign 64
1187.L_OP_SPARSE_SWITCH: /* 0x2c */
1188/* File: armv5te/OP_SPARSE_SWITCH.S */
1189/* File: armv5te/OP_PACKED_SWITCH.S */
1190    /*
1191     * Handle a packed-switch or sparse-switch instruction.  In both cases
1192     * we decode it and hand it off to a helper function.
1193     *
1194     * We don't really expect backward branches in a switch statement, but
1195     * they're perfectly legal, so we check for them here.
1196     *
1197     * When the JIT is present, all targets are considered treated as
1198     * a potential trace heads regardless of branch direction.
1199     *
1200     * for: packed-switch, sparse-switch
1201     */
1202    /* op vAA, +BBBB */
1203    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1204    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1205    mov     r3, rINST, lsr #8           @ r3<- AA
1206    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1207    GET_VREG(r1, r3)                    @ r1<- vAA
1208    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1209    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1210    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1211#if defined(WITH_JIT)
1212    ldr     r0, [rSELF, #offThread_pJitProfTable]
1213    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1214    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1215    cmp     r0, #0
1216    bne     common_updateProfile
1217#else
1218    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1219    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1220#endif
1221    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1222    GOTO_OPCODE(ip)                     @ jump to next instruction
1223
1224
1225/* ------------------------------ */
1226    .balign 64
1227.L_OP_CMPL_FLOAT: /* 0x2d */
1228/* File: armv5te/OP_CMPL_FLOAT.S */
1229    /*
1230     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1231     * destination register based on the results of the comparison.
1232     *
1233     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1234     * on what value we'd like to return when one of the operands is NaN.
1235     *
1236     * The operation we're implementing is:
1237     *   if (x == y)
1238     *     return 0;
1239     *   else if (x < y)
1240     *     return -1;
1241     *   else if (x > y)
1242     *     return 1;
1243     *   else
1244     *     return {-1,1};  // one or both operands was NaN
1245     *
1246     * The straightforward implementation requires 3 calls to functions
1247     * that return a result in r0.  We can do it with two calls if our
1248     * EABI library supports __aeabi_cfcmple (only one if we want to check
1249     * for NaN directly):
1250     *   check x <= y
1251     *     if <, return -1
1252     *     if ==, return 0
1253     *   check y <= x
1254     *     if <, return 1
1255     *   return {-1,1}
1256     *
1257     * for: cmpl-float, cmpg-float
1258     */
1259    /* op vAA, vBB, vCC */
1260    FETCH(r0, 1)                        @ r0<- CCBB
1261    and     r2, r0, #255                @ r2<- BB
1262    mov     r3, r0, lsr #8              @ r3<- CC
1263    GET_VREG(r9, r2)                    @ r9<- vBB
1264    GET_VREG(r10, r3)                   @ r10<- vCC
1265    mov     r0, r9                      @ copy to arg registers
1266    mov     r1, r10
1267    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1268    bhi     .LOP_CMPL_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1269    mvncc   r1, #0                      @ (less than) r1<- -1
1270    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1271.LOP_CMPL_FLOAT_finish:
1272    mov     r3, rINST, lsr #8           @ r3<- AA
1273    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1274    SET_VREG(r1, r3)                    @ vAA<- r1
1275    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1276    GOTO_OPCODE(ip)                     @ jump to next instruction
1277
1278/* ------------------------------ */
1279    .balign 64
1280.L_OP_CMPG_FLOAT: /* 0x2e */
1281/* File: armv5te/OP_CMPG_FLOAT.S */
1282/* File: armv5te/OP_CMPL_FLOAT.S */
1283    /*
1284     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1285     * destination register based on the results of the comparison.
1286     *
1287     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1288     * on what value we'd like to return when one of the operands is NaN.
1289     *
1290     * The operation we're implementing is:
1291     *   if (x == y)
1292     *     return 0;
1293     *   else if (x < y)
1294     *     return -1;
1295     *   else if (x > y)
1296     *     return 1;
1297     *   else
1298     *     return {-1,1};  // one or both operands was NaN
1299     *
1300     * The straightforward implementation requires 3 calls to functions
1301     * that return a result in r0.  We can do it with two calls if our
1302     * EABI library supports __aeabi_cfcmple (only one if we want to check
1303     * for NaN directly):
1304     *   check x <= y
1305     *     if <, return -1
1306     *     if ==, return 0
1307     *   check y <= x
1308     *     if <, return 1
1309     *   return {-1,1}
1310     *
1311     * for: cmpl-float, cmpg-float
1312     */
1313    /* op vAA, vBB, vCC */
1314    FETCH(r0, 1)                        @ r0<- CCBB
1315    and     r2, r0, #255                @ r2<- BB
1316    mov     r3, r0, lsr #8              @ r3<- CC
1317    GET_VREG(r9, r2)                    @ r9<- vBB
1318    GET_VREG(r10, r3)                   @ r10<- vCC
1319    mov     r0, r9                      @ copy to arg registers
1320    mov     r1, r10
1321    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1322    bhi     .LOP_CMPG_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1323    mvncc   r1, #0                      @ (less than) r1<- -1
1324    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1325.LOP_CMPG_FLOAT_finish:
1326    mov     r3, rINST, lsr #8           @ r3<- AA
1327    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1328    SET_VREG(r1, r3)                    @ vAA<- r1
1329    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1330    GOTO_OPCODE(ip)                     @ jump to next instruction
1331
1332
1333/* ------------------------------ */
1334    .balign 64
1335.L_OP_CMPL_DOUBLE: /* 0x2f */
1336/* File: armv5te/OP_CMPL_DOUBLE.S */
1337    /*
1338     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1339     * destination register based on the results of the comparison.
1340     *
1341     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1342     * on what value we'd like to return when one of the operands is NaN.
1343     *
1344     * See OP_CMPL_FLOAT for an explanation.
1345     *
1346     * For: cmpl-double, cmpg-double
1347     */
1348    /* op vAA, vBB, vCC */
1349    FETCH(r0, 1)                        @ r0<- CCBB
1350    and     r9, r0, #255                @ r9<- BB
1351    mov     r10, r0, lsr #8             @ r10<- CC
1352    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1353    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1354    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1355    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1356    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1357    bhi     .LOP_CMPL_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1358    mvncc   r1, #0                      @ (less than) r1<- -1
1359    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1360.LOP_CMPL_DOUBLE_finish:
1361    mov     r3, rINST, lsr #8           @ r3<- AA
1362    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1363    SET_VREG(r1, r3)                    @ vAA<- r1
1364    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1365    GOTO_OPCODE(ip)                     @ jump to next instruction
1366
1367/* ------------------------------ */
1368    .balign 64
1369.L_OP_CMPG_DOUBLE: /* 0x30 */
1370/* File: armv5te/OP_CMPG_DOUBLE.S */
1371/* File: armv5te/OP_CMPL_DOUBLE.S */
1372    /*
1373     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1374     * destination register based on the results of the comparison.
1375     *
1376     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1377     * on what value we'd like to return when one of the operands is NaN.
1378     *
1379     * See OP_CMPL_FLOAT for an explanation.
1380     *
1381     * For: cmpl-double, cmpg-double
1382     */
1383    /* op vAA, vBB, vCC */
1384    FETCH(r0, 1)                        @ r0<- CCBB
1385    and     r9, r0, #255                @ r9<- BB
1386    mov     r10, r0, lsr #8             @ r10<- CC
1387    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1388    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1389    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1390    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1391    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1392    bhi     .LOP_CMPG_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1393    mvncc   r1, #0                      @ (less than) r1<- -1
1394    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1395.LOP_CMPG_DOUBLE_finish:
1396    mov     r3, rINST, lsr #8           @ r3<- AA
1397    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1398    SET_VREG(r1, r3)                    @ vAA<- r1
1399    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1400    GOTO_OPCODE(ip)                     @ jump to next instruction
1401
1402
1403/* ------------------------------ */
1404    .balign 64
1405.L_OP_CMP_LONG: /* 0x31 */
1406/* File: armv5te/OP_CMP_LONG.S */
1407    /*
1408     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1409     * register based on the results of the comparison.
1410     *
1411     * We load the full values with LDM, but in practice many values could
1412     * be resolved by only looking at the high word.  This could be made
1413     * faster or slower by splitting the LDM into a pair of LDRs.
1414     *
1415     * If we just wanted to set condition flags, we could do this:
1416     *  subs    ip, r0, r2
1417     *  sbcs    ip, r1, r3
1418     *  subeqs  ip, r0, r2
1419     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1420     * integer value, which we can do with 2 conditional mov/mvn instructions
1421     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1422     * us a constant 5-cycle path plus a branch at the end to the
1423     * instruction epilogue code.  The multi-compare approach below needs
1424     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1425     * in the worst case (the 64-bit values are equal).
1426     */
1427    /* cmp-long vAA, vBB, vCC */
1428    FETCH(r0, 1)                        @ r0<- CCBB
1429    mov     r9, rINST, lsr #8           @ r9<- AA
1430    and     r2, r0, #255                @ r2<- BB
1431    mov     r3, r0, lsr #8              @ r3<- CC
1432    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1433    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1434    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1435    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1436    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1437    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1438    bgt     .LOP_CMP_LONG_greater
1439    subs    r1, r0, r2                  @ r1<- r0 - r2
1440    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1441    bne     .LOP_CMP_LONG_less
1442    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1443
1444/* ------------------------------ */
1445    .balign 64
1446.L_OP_IF_EQ: /* 0x32 */
1447/* File: armv5te/OP_IF_EQ.S */
1448/* File: armv5te/bincmp.S */
1449    /*
1450     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1451     * fragment that specifies the *reverse* comparison to perform, e.g.
1452     * for "if-le" you would use "gt".
1453     *
1454     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1455     */
1456    /* if-cmp vA, vB, +CCCC */
1457    mov     r0, rINST, lsr #8           @ r0<- A+
1458    mov     r1, rINST, lsr #12          @ r1<- B
1459    and     r0, r0, #15
1460    GET_VREG(r3, r1)                    @ r3<- vB
1461    GET_VREG(r2, r0)                    @ r2<- vA
1462    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1463    cmp     r2, r3                      @ compare (vA, vB)
1464    movne r1, #2                 @ r1<- BYTE branch dist for not-taken
1465    adds    r2, r1, r1                  @ convert to bytes, check sign
1466    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1467#if defined(WITH_JIT)
1468    ldr     r0, [rSELF, #offThread_pJitProfTable]
1469    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1470    cmp     r0,#0
1471    bne     common_updateProfile
1472#else
1473    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1474#endif
1475    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1476    GOTO_OPCODE(ip)                     @ jump to next instruction
1477
1478
1479/* ------------------------------ */
1480    .balign 64
1481.L_OP_IF_NE: /* 0x33 */
1482/* File: armv5te/OP_IF_NE.S */
1483/* File: armv5te/bincmp.S */
1484    /*
1485     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1486     * fragment that specifies the *reverse* comparison to perform, e.g.
1487     * for "if-le" you would use "gt".
1488     *
1489     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1490     */
1491    /* if-cmp vA, vB, +CCCC */
1492    mov     r0, rINST, lsr #8           @ r0<- A+
1493    mov     r1, rINST, lsr #12          @ r1<- B
1494    and     r0, r0, #15
1495    GET_VREG(r3, r1)                    @ r3<- vB
1496    GET_VREG(r2, r0)                    @ r2<- vA
1497    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1498    cmp     r2, r3                      @ compare (vA, vB)
1499    moveq r1, #2                 @ r1<- BYTE branch dist for not-taken
1500    adds    r2, r1, r1                  @ convert to bytes, check sign
1501    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1502#if defined(WITH_JIT)
1503    ldr     r0, [rSELF, #offThread_pJitProfTable]
1504    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1505    cmp     r0,#0
1506    bne     common_updateProfile
1507#else
1508    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1509#endif
1510    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1511    GOTO_OPCODE(ip)                     @ jump to next instruction
1512
1513
1514/* ------------------------------ */
1515    .balign 64
1516.L_OP_IF_LT: /* 0x34 */
1517/* File: armv5te/OP_IF_LT.S */
1518/* File: armv5te/bincmp.S */
1519    /*
1520     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1521     * fragment that specifies the *reverse* comparison to perform, e.g.
1522     * for "if-le" you would use "gt".
1523     *
1524     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1525     */
1526    /* if-cmp vA, vB, +CCCC */
1527    mov     r0, rINST, lsr #8           @ r0<- A+
1528    mov     r1, rINST, lsr #12          @ r1<- B
1529    and     r0, r0, #15
1530    GET_VREG(r3, r1)                    @ r3<- vB
1531    GET_VREG(r2, r0)                    @ r2<- vA
1532    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1533    cmp     r2, r3                      @ compare (vA, vB)
1534    movge r1, #2                 @ r1<- BYTE branch dist for not-taken
1535    adds    r2, r1, r1                  @ convert to bytes, check sign
1536    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1537#if defined(WITH_JIT)
1538    ldr     r0, [rSELF, #offThread_pJitProfTable]
1539    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1540    cmp     r0,#0
1541    bne     common_updateProfile
1542#else
1543    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1544#endif
1545    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1546    GOTO_OPCODE(ip)                     @ jump to next instruction
1547
1548
1549/* ------------------------------ */
1550    .balign 64
1551.L_OP_IF_GE: /* 0x35 */
1552/* File: armv5te/OP_IF_GE.S */
1553/* File: armv5te/bincmp.S */
1554    /*
1555     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1556     * fragment that specifies the *reverse* comparison to perform, e.g.
1557     * for "if-le" you would use "gt".
1558     *
1559     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1560     */
1561    /* if-cmp vA, vB, +CCCC */
1562    mov     r0, rINST, lsr #8           @ r0<- A+
1563    mov     r1, rINST, lsr #12          @ r1<- B
1564    and     r0, r0, #15
1565    GET_VREG(r3, r1)                    @ r3<- vB
1566    GET_VREG(r2, r0)                    @ r2<- vA
1567    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1568    cmp     r2, r3                      @ compare (vA, vB)
1569    movlt r1, #2                 @ r1<- BYTE branch dist for not-taken
1570    adds    r2, r1, r1                  @ convert to bytes, check sign
1571    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1572#if defined(WITH_JIT)
1573    ldr     r0, [rSELF, #offThread_pJitProfTable]
1574    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1575    cmp     r0,#0
1576    bne     common_updateProfile
1577#else
1578    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1579#endif
1580    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1581    GOTO_OPCODE(ip)                     @ jump to next instruction
1582
1583
1584/* ------------------------------ */
1585    .balign 64
1586.L_OP_IF_GT: /* 0x36 */
1587/* File: armv5te/OP_IF_GT.S */
1588/* File: armv5te/bincmp.S */
1589    /*
1590     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1591     * fragment that specifies the *reverse* comparison to perform, e.g.
1592     * for "if-le" you would use "gt".
1593     *
1594     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1595     */
1596    /* if-cmp vA, vB, +CCCC */
1597    mov     r0, rINST, lsr #8           @ r0<- A+
1598    mov     r1, rINST, lsr #12          @ r1<- B
1599    and     r0, r0, #15
1600    GET_VREG(r3, r1)                    @ r3<- vB
1601    GET_VREG(r2, r0)                    @ r2<- vA
1602    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1603    cmp     r2, r3                      @ compare (vA, vB)
1604    movle r1, #2                 @ r1<- BYTE branch dist for not-taken
1605    adds    r2, r1, r1                  @ convert to bytes, check sign
1606    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1607#if defined(WITH_JIT)
1608    ldr     r0, [rSELF, #offThread_pJitProfTable]
1609    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1610    cmp     r0,#0
1611    bne     common_updateProfile
1612#else
1613    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1614#endif
1615    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1616    GOTO_OPCODE(ip)                     @ jump to next instruction
1617
1618
1619/* ------------------------------ */
1620    .balign 64
1621.L_OP_IF_LE: /* 0x37 */
1622/* File: armv5te/OP_IF_LE.S */
1623/* File: armv5te/bincmp.S */
1624    /*
1625     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1626     * fragment that specifies the *reverse* comparison to perform, e.g.
1627     * for "if-le" you would use "gt".
1628     *
1629     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1630     */
1631    /* if-cmp vA, vB, +CCCC */
1632    mov     r0, rINST, lsr #8           @ r0<- A+
1633    mov     r1, rINST, lsr #12          @ r1<- B
1634    and     r0, r0, #15
1635    GET_VREG(r3, r1)                    @ r3<- vB
1636    GET_VREG(r2, r0)                    @ r2<- vA
1637    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1638    cmp     r2, r3                      @ compare (vA, vB)
1639    movgt r1, #2                 @ r1<- BYTE branch dist for not-taken
1640    adds    r2, r1, r1                  @ convert to bytes, check sign
1641    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1642#if defined(WITH_JIT)
1643    ldr     r0, [rSELF, #offThread_pJitProfTable]
1644    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1645    cmp     r0,#0
1646    bne     common_updateProfile
1647#else
1648    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1649#endif
1650    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1651    GOTO_OPCODE(ip)                     @ jump to next instruction
1652
1653
1654/* ------------------------------ */
1655    .balign 64
1656.L_OP_IF_EQZ: /* 0x38 */
1657/* File: armv5te/OP_IF_EQZ.S */
1658/* File: armv5te/zcmp.S */
1659    /*
1660     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1661     * fragment that specifies the *reverse* comparison to perform, e.g.
1662     * for "if-le" you would use "gt".
1663     *
1664     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1665     */
1666    /* if-cmp vAA, +BBBB */
1667    mov     r0, rINST, lsr #8           @ r0<- AA
1668    GET_VREG(r2, r0)                    @ r2<- vAA
1669    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1670    cmp     r2, #0                      @ compare (vA, 0)
1671    movne r1, #2                 @ r1<- inst branch dist for not-taken
1672    adds    r1, r1, r1                  @ convert to bytes & set flags
1673    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1674#if defined(WITH_JIT)
1675    ldr     r0, [rSELF, #offThread_pJitProfTable]
1676    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1677    cmp     r0,#0
1678    bne     common_updateProfile        @ test for JIT off at target
1679#else
1680    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1681#endif
1682    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1683    GOTO_OPCODE(ip)                     @ jump to next instruction
1684
1685
1686/* ------------------------------ */
1687    .balign 64
1688.L_OP_IF_NEZ: /* 0x39 */
1689/* File: armv5te/OP_IF_NEZ.S */
1690/* File: armv5te/zcmp.S */
1691    /*
1692     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1693     * fragment that specifies the *reverse* comparison to perform, e.g.
1694     * for "if-le" you would use "gt".
1695     *
1696     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1697     */
1698    /* if-cmp vAA, +BBBB */
1699    mov     r0, rINST, lsr #8           @ r0<- AA
1700    GET_VREG(r2, r0)                    @ r2<- vAA
1701    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1702    cmp     r2, #0                      @ compare (vA, 0)
1703    moveq r1, #2                 @ r1<- inst branch dist for not-taken
1704    adds    r1, r1, r1                  @ convert to bytes & set flags
1705    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1706#if defined(WITH_JIT)
1707    ldr     r0, [rSELF, #offThread_pJitProfTable]
1708    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1709    cmp     r0,#0
1710    bne     common_updateProfile        @ test for JIT off at target
1711#else
1712    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1713#endif
1714    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1715    GOTO_OPCODE(ip)                     @ jump to next instruction
1716
1717
1718/* ------------------------------ */
1719    .balign 64
1720.L_OP_IF_LTZ: /* 0x3a */
1721/* File: armv5te/OP_IF_LTZ.S */
1722/* File: armv5te/zcmp.S */
1723    /*
1724     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1725     * fragment that specifies the *reverse* comparison to perform, e.g.
1726     * for "if-le" you would use "gt".
1727     *
1728     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1729     */
1730    /* if-cmp vAA, +BBBB */
1731    mov     r0, rINST, lsr #8           @ r0<- AA
1732    GET_VREG(r2, r0)                    @ r2<- vAA
1733    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1734    cmp     r2, #0                      @ compare (vA, 0)
1735    movge r1, #2                 @ r1<- inst branch dist for not-taken
1736    adds    r1, r1, r1                  @ convert to bytes & set flags
1737    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1738#if defined(WITH_JIT)
1739    ldr     r0, [rSELF, #offThread_pJitProfTable]
1740    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1741    cmp     r0,#0
1742    bne     common_updateProfile        @ test for JIT off at target
1743#else
1744    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1745#endif
1746    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1747    GOTO_OPCODE(ip)                     @ jump to next instruction
1748
1749
1750/* ------------------------------ */
1751    .balign 64
1752.L_OP_IF_GEZ: /* 0x3b */
1753/* File: armv5te/OP_IF_GEZ.S */
1754/* File: armv5te/zcmp.S */
1755    /*
1756     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1757     * fragment that specifies the *reverse* comparison to perform, e.g.
1758     * for "if-le" you would use "gt".
1759     *
1760     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1761     */
1762    /* if-cmp vAA, +BBBB */
1763    mov     r0, rINST, lsr #8           @ r0<- AA
1764    GET_VREG(r2, r0)                    @ r2<- vAA
1765    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1766    cmp     r2, #0                      @ compare (vA, 0)
1767    movlt r1, #2                 @ r1<- inst branch dist for not-taken
1768    adds    r1, r1, r1                  @ convert to bytes & set flags
1769    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1770#if defined(WITH_JIT)
1771    ldr     r0, [rSELF, #offThread_pJitProfTable]
1772    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1773    cmp     r0,#0
1774    bne     common_updateProfile        @ test for JIT off at target
1775#else
1776    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1777#endif
1778    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1779    GOTO_OPCODE(ip)                     @ jump to next instruction
1780
1781
1782/* ------------------------------ */
1783    .balign 64
1784.L_OP_IF_GTZ: /* 0x3c */
1785/* File: armv5te/OP_IF_GTZ.S */
1786/* File: armv5te/zcmp.S */
1787    /*
1788     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1789     * fragment that specifies the *reverse* comparison to perform, e.g.
1790     * for "if-le" you would use "gt".
1791     *
1792     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1793     */
1794    /* if-cmp vAA, +BBBB */
1795    mov     r0, rINST, lsr #8           @ r0<- AA
1796    GET_VREG(r2, r0)                    @ r2<- vAA
1797    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1798    cmp     r2, #0                      @ compare (vA, 0)
1799    movle r1, #2                 @ r1<- inst branch dist for not-taken
1800    adds    r1, r1, r1                  @ convert to bytes & set flags
1801    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1802#if defined(WITH_JIT)
1803    ldr     r0, [rSELF, #offThread_pJitProfTable]
1804    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1805    cmp     r0,#0
1806    bne     common_updateProfile        @ test for JIT off at target
1807#else
1808    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1809#endif
1810    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1811    GOTO_OPCODE(ip)                     @ jump to next instruction
1812
1813
1814/* ------------------------------ */
1815    .balign 64
1816.L_OP_IF_LEZ: /* 0x3d */
1817/* File: armv5te/OP_IF_LEZ.S */
1818/* File: armv5te/zcmp.S */
1819    /*
1820     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1821     * fragment that specifies the *reverse* comparison to perform, e.g.
1822     * for "if-le" you would use "gt".
1823     *
1824     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1825     */
1826    /* if-cmp vAA, +BBBB */
1827    mov     r0, rINST, lsr #8           @ r0<- AA
1828    GET_VREG(r2, r0)                    @ r2<- vAA
1829    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1830    cmp     r2, #0                      @ compare (vA, 0)
1831    movgt r1, #2                 @ r1<- inst branch dist for not-taken
1832    adds    r1, r1, r1                  @ convert to bytes & set flags
1833    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1834#if defined(WITH_JIT)
1835    ldr     r0, [rSELF, #offThread_pJitProfTable]
1836    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1837    cmp     r0,#0
1838    bne     common_updateProfile        @ test for JIT off at target
1839#else
1840    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1841#endif
1842    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1843    GOTO_OPCODE(ip)                     @ jump to next instruction
1844
1845
1846/* ------------------------------ */
1847    .balign 64
1848.L_OP_UNUSED_3E: /* 0x3e */
1849/* File: armv5te/OP_UNUSED_3E.S */
1850/* File: armv5te/unused.S */
1851    bl      common_abort
1852
1853
1854/* ------------------------------ */
1855    .balign 64
1856.L_OP_UNUSED_3F: /* 0x3f */
1857/* File: armv5te/OP_UNUSED_3F.S */
1858/* File: armv5te/unused.S */
1859    bl      common_abort
1860
1861
1862/* ------------------------------ */
1863    .balign 64
1864.L_OP_UNUSED_40: /* 0x40 */
1865/* File: armv5te/OP_UNUSED_40.S */
1866/* File: armv5te/unused.S */
1867    bl      common_abort
1868
1869
1870/* ------------------------------ */
1871    .balign 64
1872.L_OP_UNUSED_41: /* 0x41 */
1873/* File: armv5te/OP_UNUSED_41.S */
1874/* File: armv5te/unused.S */
1875    bl      common_abort
1876
1877
1878/* ------------------------------ */
1879    .balign 64
1880.L_OP_UNUSED_42: /* 0x42 */
1881/* File: armv5te/OP_UNUSED_42.S */
1882/* File: armv5te/unused.S */
1883    bl      common_abort
1884
1885
1886/* ------------------------------ */
1887    .balign 64
1888.L_OP_UNUSED_43: /* 0x43 */
1889/* File: armv5te/OP_UNUSED_43.S */
1890/* File: armv5te/unused.S */
1891    bl      common_abort
1892
1893
1894/* ------------------------------ */
1895    .balign 64
1896.L_OP_AGET: /* 0x44 */
1897/* File: armv5te/OP_AGET.S */
1898    /*
1899     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1900     *
1901     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1902     * instructions.  We use a pair of FETCH_Bs instead.
1903     *
1904     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1905     */
1906    /* op vAA, vBB, vCC */
1907    FETCH_B(r2, 1, 0)                   @ r2<- BB
1908    mov     r9, rINST, lsr #8           @ r9<- AA
1909    FETCH_B(r3, 1, 1)                   @ r3<- CC
1910    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1911    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1912    cmp     r0, #0                      @ null array object?
1913    beq     common_errNullObject        @ yes, bail
1914    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1915    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1916    cmp     r1, r3                      @ compare unsigned index, length
1917    bcs     common_errArrayIndex        @ index >= length, bail
1918    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1919    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1920    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1921    SET_VREG(r2, r9)                    @ vAA<- r2
1922    GOTO_OPCODE(ip)                     @ jump to next instruction
1923
1924/* ------------------------------ */
1925    .balign 64
1926.L_OP_AGET_WIDE: /* 0x45 */
1927/* File: armv5te/OP_AGET_WIDE.S */
1928    /*
1929     * Array get, 64 bits.  vAA <- vBB[vCC].
1930     *
1931     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
1932     */
1933    /* aget-wide vAA, vBB, vCC */
1934    FETCH(r0, 1)                        @ r0<- CCBB
1935    mov     r9, rINST, lsr #8           @ r9<- AA
1936    and     r2, r0, #255                @ r2<- BB
1937    mov     r3, r0, lsr #8              @ r3<- CC
1938    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1939    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1940    cmp     r0, #0                      @ null array object?
1941    beq     common_errNullObject        @ yes, bail
1942    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1943    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
1944    cmp     r1, r3                      @ compare unsigned index, length
1945    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
1946    b       common_errArrayIndex        @ index >= length, bail
1947    @ May want to swap the order of these two branches depending on how the
1948    @ branch prediction (if any) handles conditional forward branches vs.
1949    @ unconditional forward branches.
1950
1951/* ------------------------------ */
1952    .balign 64
1953.L_OP_AGET_OBJECT: /* 0x46 */
1954/* File: armv5te/OP_AGET_OBJECT.S */
1955/* File: armv5te/OP_AGET.S */
1956    /*
1957     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1958     *
1959     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1960     * instructions.  We use a pair of FETCH_Bs instead.
1961     *
1962     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1963     */
1964    /* op vAA, vBB, vCC */
1965    FETCH_B(r2, 1, 0)                   @ r2<- BB
1966    mov     r9, rINST, lsr #8           @ r9<- AA
1967    FETCH_B(r3, 1, 1)                   @ r3<- CC
1968    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1969    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1970    cmp     r0, #0                      @ null array object?
1971    beq     common_errNullObject        @ yes, bail
1972    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1973    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1974    cmp     r1, r3                      @ compare unsigned index, length
1975    bcs     common_errArrayIndex        @ index >= length, bail
1976    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1977    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1978    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1979    SET_VREG(r2, r9)                    @ vAA<- r2
1980    GOTO_OPCODE(ip)                     @ jump to next instruction
1981
1982
1983/* ------------------------------ */
1984    .balign 64
1985.L_OP_AGET_BOOLEAN: /* 0x47 */
1986/* File: armv5te/OP_AGET_BOOLEAN.S */
1987/* File: armv5te/OP_AGET.S */
1988    /*
1989     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1990     *
1991     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1992     * instructions.  We use a pair of FETCH_Bs instead.
1993     *
1994     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1995     */
1996    /* op vAA, vBB, vCC */
1997    FETCH_B(r2, 1, 0)                   @ r2<- BB
1998    mov     r9, rINST, lsr #8           @ r9<- AA
1999    FETCH_B(r3, 1, 1)                   @ r3<- CC
2000    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2001    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2002    cmp     r0, #0                      @ null array object?
2003    beq     common_errNullObject        @ yes, bail
2004    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2005    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2006    cmp     r1, r3                      @ compare unsigned index, length
2007    bcs     common_errArrayIndex        @ index >= length, bail
2008    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2009    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2010    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2011    SET_VREG(r2, r9)                    @ vAA<- r2
2012    GOTO_OPCODE(ip)                     @ jump to next instruction
2013
2014
2015/* ------------------------------ */
2016    .balign 64
2017.L_OP_AGET_BYTE: /* 0x48 */
2018/* File: armv5te/OP_AGET_BYTE.S */
2019/* File: armv5te/OP_AGET.S */
2020    /*
2021     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2022     *
2023     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2024     * instructions.  We use a pair of FETCH_Bs instead.
2025     *
2026     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2027     */
2028    /* op vAA, vBB, vCC */
2029    FETCH_B(r2, 1, 0)                   @ r2<- BB
2030    mov     r9, rINST, lsr #8           @ r9<- AA
2031    FETCH_B(r3, 1, 1)                   @ r3<- CC
2032    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2033    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2034    cmp     r0, #0                      @ null array object?
2035    beq     common_errNullObject        @ yes, bail
2036    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2037    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2038    cmp     r1, r3                      @ compare unsigned index, length
2039    bcs     common_errArrayIndex        @ index >= length, bail
2040    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2041    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2042    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2043    SET_VREG(r2, r9)                    @ vAA<- r2
2044    GOTO_OPCODE(ip)                     @ jump to next instruction
2045
2046
2047/* ------------------------------ */
2048    .balign 64
2049.L_OP_AGET_CHAR: /* 0x49 */
2050/* File: armv5te/OP_AGET_CHAR.S */
2051/* File: armv5te/OP_AGET.S */
2052    /*
2053     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2054     *
2055     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2056     * instructions.  We use a pair of FETCH_Bs instead.
2057     *
2058     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2059     */
2060    /* op vAA, vBB, vCC */
2061    FETCH_B(r2, 1, 0)                   @ r2<- BB
2062    mov     r9, rINST, lsr #8           @ r9<- AA
2063    FETCH_B(r3, 1, 1)                   @ r3<- CC
2064    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2065    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2066    cmp     r0, #0                      @ null array object?
2067    beq     common_errNullObject        @ yes, bail
2068    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2069    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2070    cmp     r1, r3                      @ compare unsigned index, length
2071    bcs     common_errArrayIndex        @ index >= length, bail
2072    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2073    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2074    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2075    SET_VREG(r2, r9)                    @ vAA<- r2
2076    GOTO_OPCODE(ip)                     @ jump to next instruction
2077
2078
2079/* ------------------------------ */
2080    .balign 64
2081.L_OP_AGET_SHORT: /* 0x4a */
2082/* File: armv5te/OP_AGET_SHORT.S */
2083/* File: armv5te/OP_AGET.S */
2084    /*
2085     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2086     *
2087     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2088     * instructions.  We use a pair of FETCH_Bs instead.
2089     *
2090     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2091     */
2092    /* op vAA, vBB, vCC */
2093    FETCH_B(r2, 1, 0)                   @ r2<- BB
2094    mov     r9, rINST, lsr #8           @ r9<- AA
2095    FETCH_B(r3, 1, 1)                   @ r3<- CC
2096    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2097    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2098    cmp     r0, #0                      @ null array object?
2099    beq     common_errNullObject        @ yes, bail
2100    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2101    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2102    cmp     r1, r3                      @ compare unsigned index, length
2103    bcs     common_errArrayIndex        @ index >= length, bail
2104    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2105    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2106    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2107    SET_VREG(r2, r9)                    @ vAA<- r2
2108    GOTO_OPCODE(ip)                     @ jump to next instruction
2109
2110
2111/* ------------------------------ */
2112    .balign 64
2113.L_OP_APUT: /* 0x4b */
2114/* File: armv5te/OP_APUT.S */
2115    /*
2116     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2117     *
2118     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2119     * instructions.  We use a pair of FETCH_Bs instead.
2120     *
2121     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2122     */
2123    /* op vAA, vBB, vCC */
2124    FETCH_B(r2, 1, 0)                   @ r2<- BB
2125    mov     r9, rINST, lsr #8           @ r9<- AA
2126    FETCH_B(r3, 1, 1)                   @ r3<- CC
2127    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2128    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2129    cmp     r0, #0                      @ null array object?
2130    beq     common_errNullObject        @ yes, bail
2131    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2132    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2133    cmp     r1, r3                      @ compare unsigned index, length
2134    bcs     common_errArrayIndex        @ index >= length, bail
2135    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2136    GET_VREG(r2, r9)                    @ r2<- vAA
2137    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2138    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2139    GOTO_OPCODE(ip)                     @ jump to next instruction
2140
2141/* ------------------------------ */
2142    .balign 64
2143.L_OP_APUT_WIDE: /* 0x4c */
2144/* File: armv5te/OP_APUT_WIDE.S */
2145    /*
2146     * Array put, 64 bits.  vBB[vCC] <- vAA.
2147     *
2148     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2149     */
2150    /* aput-wide vAA, vBB, vCC */
2151    FETCH(r0, 1)                        @ r0<- CCBB
2152    mov     r9, rINST, lsr #8           @ r9<- AA
2153    and     r2, r0, #255                @ r2<- BB
2154    mov     r3, r0, lsr #8              @ r3<- CC
2155    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2156    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2157    cmp     r0, #0                      @ null array object?
2158    beq     common_errNullObject        @ yes, bail
2159    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2160    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2161    cmp     r1, r3                      @ compare unsigned index, length
2162    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2163    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2164    b       common_errArrayIndex        @ index >= length, bail
2165    @ May want to swap the order of these two branches depending on how the
2166    @ branch prediction (if any) handles conditional forward branches vs.
2167    @ unconditional forward branches.
2168
2169/* ------------------------------ */
2170    .balign 64
2171.L_OP_APUT_OBJECT: /* 0x4d */
2172/* File: armv5te/OP_APUT_OBJECT.S */
2173    /*
2174     * Store an object into an array.  vBB[vCC] <- vAA.
2175     */
2176    /* op vAA, vBB, vCC */
2177    FETCH(r0, 1)                        @ r0<- CCBB
2178    mov     r9, rINST, lsr #8           @ r9<- AA
2179    and     r2, r0, #255                @ r2<- BB
2180    mov     r3, r0, lsr #8              @ r3<- CC
2181    GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
2182    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2183    cmp     rINST, #0                   @ null array object?
2184    GET_VREG(r9, r9)                    @ r9<- vAA
2185    beq     common_errNullObject        @ yes, bail
2186    ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
2187    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
2188    cmp     r1, r3                      @ compare unsigned index, length
2189    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2190    b       common_errArrayIndex        @ index >= length, bail
2191
2192
2193/* ------------------------------ */
2194    .balign 64
2195.L_OP_APUT_BOOLEAN: /* 0x4e */
2196/* File: armv5te/OP_APUT_BOOLEAN.S */
2197/* File: armv5te/OP_APUT.S */
2198    /*
2199     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2200     *
2201     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2202     * instructions.  We use a pair of FETCH_Bs instead.
2203     *
2204     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2205     */
2206    /* op vAA, vBB, vCC */
2207    FETCH_B(r2, 1, 0)                   @ r2<- BB
2208    mov     r9, rINST, lsr #8           @ r9<- AA
2209    FETCH_B(r3, 1, 1)                   @ r3<- CC
2210    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2211    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2212    cmp     r0, #0                      @ null array object?
2213    beq     common_errNullObject        @ yes, bail
2214    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2215    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2216    cmp     r1, r3                      @ compare unsigned index, length
2217    bcs     common_errArrayIndex        @ index >= length, bail
2218    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2219    GET_VREG(r2, r9)                    @ r2<- vAA
2220    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2221    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2222    GOTO_OPCODE(ip)                     @ jump to next instruction
2223
2224
2225/* ------------------------------ */
2226    .balign 64
2227.L_OP_APUT_BYTE: /* 0x4f */
2228/* File: armv5te/OP_APUT_BYTE.S */
2229/* File: armv5te/OP_APUT.S */
2230    /*
2231     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2232     *
2233     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2234     * instructions.  We use a pair of FETCH_Bs instead.
2235     *
2236     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2237     */
2238    /* op vAA, vBB, vCC */
2239    FETCH_B(r2, 1, 0)                   @ r2<- BB
2240    mov     r9, rINST, lsr #8           @ r9<- AA
2241    FETCH_B(r3, 1, 1)                   @ r3<- CC
2242    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2243    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2244    cmp     r0, #0                      @ null array object?
2245    beq     common_errNullObject        @ yes, bail
2246    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2247    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2248    cmp     r1, r3                      @ compare unsigned index, length
2249    bcs     common_errArrayIndex        @ index >= length, bail
2250    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2251    GET_VREG(r2, r9)                    @ r2<- vAA
2252    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2253    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2254    GOTO_OPCODE(ip)                     @ jump to next instruction
2255
2256
2257/* ------------------------------ */
2258    .balign 64
2259.L_OP_APUT_CHAR: /* 0x50 */
2260/* File: armv5te/OP_APUT_CHAR.S */
2261/* File: armv5te/OP_APUT.S */
2262    /*
2263     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2264     *
2265     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2266     * instructions.  We use a pair of FETCH_Bs instead.
2267     *
2268     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2269     */
2270    /* op vAA, vBB, vCC */
2271    FETCH_B(r2, 1, 0)                   @ r2<- BB
2272    mov     r9, rINST, lsr #8           @ r9<- AA
2273    FETCH_B(r3, 1, 1)                   @ r3<- CC
2274    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2275    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2276    cmp     r0, #0                      @ null array object?
2277    beq     common_errNullObject        @ yes, bail
2278    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2279    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2280    cmp     r1, r3                      @ compare unsigned index, length
2281    bcs     common_errArrayIndex        @ index >= length, bail
2282    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2283    GET_VREG(r2, r9)                    @ r2<- vAA
2284    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2285    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2286    GOTO_OPCODE(ip)                     @ jump to next instruction
2287
2288
2289/* ------------------------------ */
2290    .balign 64
2291.L_OP_APUT_SHORT: /* 0x51 */
2292/* File: armv5te/OP_APUT_SHORT.S */
2293/* File: armv5te/OP_APUT.S */
2294    /*
2295     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2296     *
2297     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2298     * instructions.  We use a pair of FETCH_Bs instead.
2299     *
2300     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2301     */
2302    /* op vAA, vBB, vCC */
2303    FETCH_B(r2, 1, 0)                   @ r2<- BB
2304    mov     r9, rINST, lsr #8           @ r9<- AA
2305    FETCH_B(r3, 1, 1)                   @ r3<- CC
2306    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2307    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2308    cmp     r0, #0                      @ null array object?
2309    beq     common_errNullObject        @ yes, bail
2310    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2311    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2312    cmp     r1, r3                      @ compare unsigned index, length
2313    bcs     common_errArrayIndex        @ index >= length, bail
2314    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2315    GET_VREG(r2, r9)                    @ r2<- vAA
2316    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2317    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2318    GOTO_OPCODE(ip)                     @ jump to next instruction
2319
2320
2321/* ------------------------------ */
2322    .balign 64
2323.L_OP_IGET: /* 0x52 */
2324/* File: armv5te/OP_IGET.S */
2325    /*
2326     * General 32-bit instance field get.
2327     *
2328     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2329     */
2330    /* op vA, vB, field@CCCC */
2331    mov     r0, rINST, lsr #12          @ r0<- B
2332    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2333    FETCH(r1, 1)                        @ r1<- field ref CCCC
2334    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2335    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2336    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2337    cmp     r0, #0                      @ is resolved entry null?
2338    bne     .LOP_IGET_finish          @ no, already resolved
23398:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2340    EXPORT_PC()                         @ resolve() could throw
2341    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2342    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2343    cmp     r0, #0
2344    bne     .LOP_IGET_finish
2345    b       common_exceptionThrown
2346
2347/* ------------------------------ */
2348    .balign 64
2349.L_OP_IGET_WIDE: /* 0x53 */
2350/* File: armv5te/OP_IGET_WIDE.S */
2351    /*
2352     * Wide 32-bit instance field get.
2353     */
2354    /* iget-wide vA, vB, field@CCCC */
2355    mov     r0, rINST, lsr #12          @ r0<- B
2356    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2357    FETCH(r1, 1)                        @ r1<- field ref CCCC
2358    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2359    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2360    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2361    cmp     r0, #0                      @ is resolved entry null?
2362    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
23638:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2364    EXPORT_PC()                         @ resolve() could throw
2365    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2366    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2367    cmp     r0, #0
2368    bne     .LOP_IGET_WIDE_finish
2369    b       common_exceptionThrown
2370
2371/* ------------------------------ */
2372    .balign 64
2373.L_OP_IGET_OBJECT: /* 0x54 */
2374/* File: armv5te/OP_IGET_OBJECT.S */
2375/* File: armv5te/OP_IGET.S */
2376    /*
2377     * General 32-bit instance field get.
2378     *
2379     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2380     */
2381    /* op vA, vB, field@CCCC */
2382    mov     r0, rINST, lsr #12          @ r0<- B
2383    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2384    FETCH(r1, 1)                        @ r1<- field ref CCCC
2385    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2386    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2387    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2388    cmp     r0, #0                      @ is resolved entry null?
2389    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
23908:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2391    EXPORT_PC()                         @ resolve() could throw
2392    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2393    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2394    cmp     r0, #0
2395    bne     .LOP_IGET_OBJECT_finish
2396    b       common_exceptionThrown
2397
2398
2399/* ------------------------------ */
2400    .balign 64
2401.L_OP_IGET_BOOLEAN: /* 0x55 */
2402/* File: armv5te/OP_IGET_BOOLEAN.S */
2403@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2404/* File: armv5te/OP_IGET.S */
2405    /*
2406     * General 32-bit instance field get.
2407     *
2408     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2409     */
2410    /* op vA, vB, field@CCCC */
2411    mov     r0, rINST, lsr #12          @ r0<- B
2412    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2413    FETCH(r1, 1)                        @ r1<- field ref CCCC
2414    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2415    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2416    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2417    cmp     r0, #0                      @ is resolved entry null?
2418    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
24198:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2420    EXPORT_PC()                         @ resolve() could throw
2421    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2422    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2423    cmp     r0, #0
2424    bne     .LOP_IGET_BOOLEAN_finish
2425    b       common_exceptionThrown
2426
2427
2428/* ------------------------------ */
2429    .balign 64
2430.L_OP_IGET_BYTE: /* 0x56 */
2431/* File: armv5te/OP_IGET_BYTE.S */
2432@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2433/* File: armv5te/OP_IGET.S */
2434    /*
2435     * General 32-bit instance field get.
2436     *
2437     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2438     */
2439    /* op vA, vB, field@CCCC */
2440    mov     r0, rINST, lsr #12          @ r0<- B
2441    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2442    FETCH(r1, 1)                        @ r1<- field ref CCCC
2443    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2444    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2445    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2446    cmp     r0, #0                      @ is resolved entry null?
2447    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
24488:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2449    EXPORT_PC()                         @ resolve() could throw
2450    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2451    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2452    cmp     r0, #0
2453    bne     .LOP_IGET_BYTE_finish
2454    b       common_exceptionThrown
2455
2456
2457/* ------------------------------ */
2458    .balign 64
2459.L_OP_IGET_CHAR: /* 0x57 */
2460/* File: armv5te/OP_IGET_CHAR.S */
2461@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2462/* File: armv5te/OP_IGET.S */
2463    /*
2464     * General 32-bit instance field get.
2465     *
2466     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2467     */
2468    /* op vA, vB, field@CCCC */
2469    mov     r0, rINST, lsr #12          @ r0<- B
2470    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2471    FETCH(r1, 1)                        @ r1<- field ref CCCC
2472    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2473    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2474    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2475    cmp     r0, #0                      @ is resolved entry null?
2476    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
24778:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2478    EXPORT_PC()                         @ resolve() could throw
2479    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2480    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2481    cmp     r0, #0
2482    bne     .LOP_IGET_CHAR_finish
2483    b       common_exceptionThrown
2484
2485
2486/* ------------------------------ */
2487    .balign 64
2488.L_OP_IGET_SHORT: /* 0x58 */
2489/* File: armv5te/OP_IGET_SHORT.S */
2490@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2491/* File: armv5te/OP_IGET.S */
2492    /*
2493     * General 32-bit instance field get.
2494     *
2495     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2496     */
2497    /* op vA, vB, field@CCCC */
2498    mov     r0, rINST, lsr #12          @ r0<- B
2499    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2500    FETCH(r1, 1)                        @ r1<- field ref CCCC
2501    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2502    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2503    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2504    cmp     r0, #0                      @ is resolved entry null?
2505    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
25068:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2507    EXPORT_PC()                         @ resolve() could throw
2508    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2509    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2510    cmp     r0, #0
2511    bne     .LOP_IGET_SHORT_finish
2512    b       common_exceptionThrown
2513
2514
2515/* ------------------------------ */
2516    .balign 64
2517.L_OP_IPUT: /* 0x59 */
2518/* File: armv5te/OP_IPUT.S */
2519    /*
2520     * General 32-bit instance field put.
2521     *
2522     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2523     */
2524    /* op vA, vB, field@CCCC */
2525    mov     r0, rINST, lsr #12          @ r0<- B
2526    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2527    FETCH(r1, 1)                        @ r1<- field ref CCCC
2528    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2529    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2530    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2531    cmp     r0, #0                      @ is resolved entry null?
2532    bne     .LOP_IPUT_finish          @ no, already resolved
25338:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2534    EXPORT_PC()                         @ resolve() could throw
2535    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2536    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2537    cmp     r0, #0                      @ success?
2538    bne     .LOP_IPUT_finish          @ yes, finish up
2539    b       common_exceptionThrown
2540
2541/* ------------------------------ */
2542    .balign 64
2543.L_OP_IPUT_WIDE: /* 0x5a */
2544/* File: armv5te/OP_IPUT_WIDE.S */
2545    /* iput-wide vA, vB, field@CCCC */
2546    mov     r0, rINST, lsr #12          @ r0<- B
2547    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2548    FETCH(r1, 1)                        @ r1<- field ref CCCC
2549    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2550    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2551    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2552    cmp     r0, #0                      @ is resolved entry null?
2553    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
25548:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2555    EXPORT_PC()                         @ resolve() could throw
2556    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2557    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2558    cmp     r0, #0                      @ success?
2559    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2560    b       common_exceptionThrown
2561
2562/* ------------------------------ */
2563    .balign 64
2564.L_OP_IPUT_OBJECT: /* 0x5b */
2565/* File: armv5te/OP_IPUT_OBJECT.S */
2566    /*
2567     * 32-bit instance field put.
2568     *
2569     * for: iput-object, iput-object-volatile
2570     */
2571    /* op vA, vB, field@CCCC */
2572    mov     r0, rINST, lsr #12          @ r0<- B
2573    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2574    FETCH(r1, 1)                        @ r1<- field ref CCCC
2575    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2576    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2577    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2578    cmp     r0, #0                      @ is resolved entry null?
2579    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
25808:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2581    EXPORT_PC()                         @ resolve() could throw
2582    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2583    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2584    cmp     r0, #0                      @ success?
2585    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2586    b       common_exceptionThrown
2587
2588/* ------------------------------ */
2589    .balign 64
2590.L_OP_IPUT_BOOLEAN: /* 0x5c */
2591/* File: armv5te/OP_IPUT_BOOLEAN.S */
2592@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2593/* File: armv5te/OP_IPUT.S */
2594    /*
2595     * General 32-bit instance field put.
2596     *
2597     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2598     */
2599    /* op vA, vB, field@CCCC */
2600    mov     r0, rINST, lsr #12          @ r0<- B
2601    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2602    FETCH(r1, 1)                        @ r1<- field ref CCCC
2603    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2604    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2605    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2606    cmp     r0, #0                      @ is resolved entry null?
2607    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
26088:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2609    EXPORT_PC()                         @ resolve() could throw
2610    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2611    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2612    cmp     r0, #0                      @ success?
2613    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2614    b       common_exceptionThrown
2615
2616
2617/* ------------------------------ */
2618    .balign 64
2619.L_OP_IPUT_BYTE: /* 0x5d */
2620/* File: armv5te/OP_IPUT_BYTE.S */
2621@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2622/* File: armv5te/OP_IPUT.S */
2623    /*
2624     * General 32-bit instance field put.
2625     *
2626     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2627     */
2628    /* op vA, vB, field@CCCC */
2629    mov     r0, rINST, lsr #12          @ r0<- B
2630    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2631    FETCH(r1, 1)                        @ r1<- field ref CCCC
2632    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2633    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2634    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2635    cmp     r0, #0                      @ is resolved entry null?
2636    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
26378:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2638    EXPORT_PC()                         @ resolve() could throw
2639    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2640    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2641    cmp     r0, #0                      @ success?
2642    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2643    b       common_exceptionThrown
2644
2645
2646/* ------------------------------ */
2647    .balign 64
2648.L_OP_IPUT_CHAR: /* 0x5e */
2649/* File: armv5te/OP_IPUT_CHAR.S */
2650@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2651/* File: armv5te/OP_IPUT.S */
2652    /*
2653     * General 32-bit instance field put.
2654     *
2655     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2656     */
2657    /* op vA, vB, field@CCCC */
2658    mov     r0, rINST, lsr #12          @ r0<- B
2659    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2660    FETCH(r1, 1)                        @ r1<- field ref CCCC
2661    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2662    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2663    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2664    cmp     r0, #0                      @ is resolved entry null?
2665    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
26668:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2667    EXPORT_PC()                         @ resolve() could throw
2668    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2669    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2670    cmp     r0, #0                      @ success?
2671    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2672    b       common_exceptionThrown
2673
2674
2675/* ------------------------------ */
2676    .balign 64
2677.L_OP_IPUT_SHORT: /* 0x5f */
2678/* File: armv5te/OP_IPUT_SHORT.S */
2679@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2680/* File: armv5te/OP_IPUT.S */
2681    /*
2682     * General 32-bit instance field put.
2683     *
2684     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2685     */
2686    /* op vA, vB, field@CCCC */
2687    mov     r0, rINST, lsr #12          @ r0<- B
2688    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2689    FETCH(r1, 1)                        @ r1<- field ref CCCC
2690    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2691    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2692    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2693    cmp     r0, #0                      @ is resolved entry null?
2694    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
26958:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2696    EXPORT_PC()                         @ resolve() could throw
2697    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2698    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2699    cmp     r0, #0                      @ success?
2700    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2701    b       common_exceptionThrown
2702
2703
2704/* ------------------------------ */
2705    .balign 64
2706.L_OP_SGET: /* 0x60 */
2707/* File: armv5te/OP_SGET.S */
2708    /*
2709     * General 32-bit SGET handler.
2710     *
2711     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2712     */
2713    /* op vAA, field@BBBB */
2714    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2715    FETCH(r1, 1)                        @ r1<- field ref BBBB
2716    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2717    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2718    cmp     r0, #0                      @ is resolved entry null?
2719    beq     .LOP_SGET_resolve         @ yes, do resolve
2720.LOP_SGET_finish: @ field ptr in r0
2721    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2722    @ no-op                             @ acquiring load
2723    mov     r2, rINST, lsr #8           @ r2<- AA
2724    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2725    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2726    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2727    GOTO_OPCODE(ip)                     @ jump to next instruction
2728
2729/* ------------------------------ */
2730    .balign 64
2731.L_OP_SGET_WIDE: /* 0x61 */
2732/* File: armv5te/OP_SGET_WIDE.S */
2733    /*
2734     * 64-bit SGET handler.
2735     */
2736    /* sget-wide vAA, field@BBBB */
2737    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2738    FETCH(r1, 1)                        @ r1<- field ref BBBB
2739    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2740    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2741    cmp     r0, #0                      @ is resolved entry null?
2742    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2743.LOP_SGET_WIDE_finish:
2744    mov     r9, rINST, lsr #8           @ r9<- AA
2745    .if 0
2746    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2747    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
2748    .else
2749    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2750    .endif
2751    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2752    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2753    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2754    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2755    GOTO_OPCODE(ip)                     @ jump to next instruction
2756
2757/* ------------------------------ */
2758    .balign 64
2759.L_OP_SGET_OBJECT: /* 0x62 */
2760/* File: armv5te/OP_SGET_OBJECT.S */
2761/* File: armv5te/OP_SGET.S */
2762    /*
2763     * General 32-bit SGET handler.
2764     *
2765     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2766     */
2767    /* op vAA, field@BBBB */
2768    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2769    FETCH(r1, 1)                        @ r1<- field ref BBBB
2770    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2771    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2772    cmp     r0, #0                      @ is resolved entry null?
2773    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2774.LOP_SGET_OBJECT_finish: @ field ptr in r0
2775    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2776    @ no-op                             @ acquiring load
2777    mov     r2, rINST, lsr #8           @ r2<- AA
2778    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2779    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2780    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2781    GOTO_OPCODE(ip)                     @ jump to next instruction
2782
2783
2784/* ------------------------------ */
2785    .balign 64
2786.L_OP_SGET_BOOLEAN: /* 0x63 */
2787/* File: armv5te/OP_SGET_BOOLEAN.S */
2788/* File: armv5te/OP_SGET.S */
2789    /*
2790     * General 32-bit SGET handler.
2791     *
2792     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2793     */
2794    /* op vAA, field@BBBB */
2795    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2796    FETCH(r1, 1)                        @ r1<- field ref BBBB
2797    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2798    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2799    cmp     r0, #0                      @ is resolved entry null?
2800    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2801.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2802    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2803    @ no-op                             @ acquiring load
2804    mov     r2, rINST, lsr #8           @ r2<- AA
2805    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2806    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2807    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2808    GOTO_OPCODE(ip)                     @ jump to next instruction
2809
2810
2811/* ------------------------------ */
2812    .balign 64
2813.L_OP_SGET_BYTE: /* 0x64 */
2814/* File: armv5te/OP_SGET_BYTE.S */
2815/* File: armv5te/OP_SGET.S */
2816    /*
2817     * General 32-bit SGET handler.
2818     *
2819     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2820     */
2821    /* op vAA, field@BBBB */
2822    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2823    FETCH(r1, 1)                        @ r1<- field ref BBBB
2824    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2825    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2826    cmp     r0, #0                      @ is resolved entry null?
2827    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2828.LOP_SGET_BYTE_finish: @ field ptr in r0
2829    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2830    @ no-op                             @ acquiring load
2831    mov     r2, rINST, lsr #8           @ r2<- AA
2832    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2833    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2834    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2835    GOTO_OPCODE(ip)                     @ jump to next instruction
2836
2837
2838/* ------------------------------ */
2839    .balign 64
2840.L_OP_SGET_CHAR: /* 0x65 */
2841/* File: armv5te/OP_SGET_CHAR.S */
2842/* File: armv5te/OP_SGET.S */
2843    /*
2844     * General 32-bit SGET handler.
2845     *
2846     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2847     */
2848    /* op vAA, field@BBBB */
2849    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2850    FETCH(r1, 1)                        @ r1<- field ref BBBB
2851    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2852    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2853    cmp     r0, #0                      @ is resolved entry null?
2854    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2855.LOP_SGET_CHAR_finish: @ field ptr in r0
2856    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2857    @ no-op                             @ acquiring load
2858    mov     r2, rINST, lsr #8           @ r2<- AA
2859    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2860    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2861    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2862    GOTO_OPCODE(ip)                     @ jump to next instruction
2863
2864
2865/* ------------------------------ */
2866    .balign 64
2867.L_OP_SGET_SHORT: /* 0x66 */
2868/* File: armv5te/OP_SGET_SHORT.S */
2869/* File: armv5te/OP_SGET.S */
2870    /*
2871     * General 32-bit SGET handler.
2872     *
2873     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2874     */
2875    /* op vAA, field@BBBB */
2876    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2877    FETCH(r1, 1)                        @ r1<- field ref BBBB
2878    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2879    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2880    cmp     r0, #0                      @ is resolved entry null?
2881    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
2882.LOP_SGET_SHORT_finish: @ field ptr in r0
2883    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2884    @ no-op                             @ acquiring load
2885    mov     r2, rINST, lsr #8           @ r2<- AA
2886    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2887    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2888    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2889    GOTO_OPCODE(ip)                     @ jump to next instruction
2890
2891
2892/* ------------------------------ */
2893    .balign 64
2894.L_OP_SPUT: /* 0x67 */
2895/* File: armv5te/OP_SPUT.S */
2896    /*
2897     * General 32-bit SPUT handler.
2898     *
2899     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2900     */
2901    /* op vAA, field@BBBB */
2902    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2903    FETCH(r1, 1)                        @ r1<- field ref BBBB
2904    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2905    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2906    cmp     r0, #0                      @ is resolved entry null?
2907    beq     .LOP_SPUT_resolve         @ yes, do resolve
2908.LOP_SPUT_finish:   @ field ptr in r0
2909    mov     r2, rINST, lsr #8           @ r2<- AA
2910    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2911    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2912    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2913    @ no-op                             @ releasing store
2914    str     r1, [r0, #offStaticField_value] @ field<- vAA
2915    GOTO_OPCODE(ip)                     @ jump to next instruction
2916
2917/* ------------------------------ */
2918    .balign 64
2919.L_OP_SPUT_WIDE: /* 0x68 */
2920/* File: armv5te/OP_SPUT_WIDE.S */
2921    /*
2922     * 64-bit SPUT handler.
2923     */
2924    /* sput-wide vAA, field@BBBB */
2925    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
2926    FETCH(r1, 1)                        @ r1<- field ref BBBB
2927    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2928    mov     r9, rINST, lsr #8           @ r9<- AA
2929    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
2930    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2931    cmp     r2, #0                      @ is resolved entry null?
2932    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
2933.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
2934    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2935    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
2936    GET_INST_OPCODE(r10)                @ extract opcode from rINST
2937    .if 0
2938    add     r2, r2, #offStaticField_value @ r2<- pointer to data
2939    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
2940    .else
2941    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
2942    .endif
2943    GOTO_OPCODE(r10)                    @ jump to next instruction
2944
2945/* ------------------------------ */
2946    .balign 64
2947.L_OP_SPUT_OBJECT: /* 0x69 */
2948/* File: armv5te/OP_SPUT_OBJECT.S */
2949    /*
2950     * 32-bit SPUT handler for objects
2951     *
2952     * for: sput-object, sput-object-volatile
2953     */
2954    /* op vAA, field@BBBB */
2955    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2956    FETCH(r1, 1)                        @ r1<- field ref BBBB
2957    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2958    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2959    cmp     r0, #0                      @ is resolved entry null?
2960    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
2961.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
2962    mov     r2, rINST, lsr #8           @ r2<- AA
2963    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2964    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2965    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
2966    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
2967    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2968    @ no-op                             @ releasing store
2969    b       .LOP_SPUT_OBJECT_end
2970
2971/* ------------------------------ */
2972    .balign 64
2973.L_OP_SPUT_BOOLEAN: /* 0x6a */
2974/* File: armv5te/OP_SPUT_BOOLEAN.S */
2975/* File: armv5te/OP_SPUT.S */
2976    /*
2977     * General 32-bit SPUT handler.
2978     *
2979     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2980     */
2981    /* op vAA, field@BBBB */
2982    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2983    FETCH(r1, 1)                        @ r1<- field ref BBBB
2984    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2985    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2986    cmp     r0, #0                      @ is resolved entry null?
2987    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
2988.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
2989    mov     r2, rINST, lsr #8           @ r2<- AA
2990    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2991    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2992    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2993    @ no-op                             @ releasing store
2994    str     r1, [r0, #offStaticField_value] @ field<- vAA
2995    GOTO_OPCODE(ip)                     @ jump to next instruction
2996
2997
2998/* ------------------------------ */
2999    .balign 64
3000.L_OP_SPUT_BYTE: /* 0x6b */
3001/* File: armv5te/OP_SPUT_BYTE.S */
3002/* File: armv5te/OP_SPUT.S */
3003    /*
3004     * General 32-bit SPUT handler.
3005     *
3006     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3007     */
3008    /* op vAA, field@BBBB */
3009    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3010    FETCH(r1, 1)                        @ r1<- field ref BBBB
3011    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3012    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3013    cmp     r0, #0                      @ is resolved entry null?
3014    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
3015.LOP_SPUT_BYTE_finish:   @ field ptr in r0
3016    mov     r2, rINST, lsr #8           @ r2<- AA
3017    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3018    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3019    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3020    @ no-op                             @ releasing store
3021    str     r1, [r0, #offStaticField_value] @ field<- vAA
3022    GOTO_OPCODE(ip)                     @ jump to next instruction
3023
3024
3025/* ------------------------------ */
3026    .balign 64
3027.L_OP_SPUT_CHAR: /* 0x6c */
3028/* File: armv5te/OP_SPUT_CHAR.S */
3029/* File: armv5te/OP_SPUT.S */
3030    /*
3031     * General 32-bit SPUT handler.
3032     *
3033     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3034     */
3035    /* op vAA, field@BBBB */
3036    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3037    FETCH(r1, 1)                        @ r1<- field ref BBBB
3038    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3039    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3040    cmp     r0, #0                      @ is resolved entry null?
3041    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3042.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3043    mov     r2, rINST, lsr #8           @ r2<- AA
3044    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3045    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3046    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3047    @ no-op                             @ releasing store
3048    str     r1, [r0, #offStaticField_value] @ field<- vAA
3049    GOTO_OPCODE(ip)                     @ jump to next instruction
3050
3051
3052/* ------------------------------ */
3053    .balign 64
3054.L_OP_SPUT_SHORT: /* 0x6d */
3055/* File: armv5te/OP_SPUT_SHORT.S */
3056/* File: armv5te/OP_SPUT.S */
3057    /*
3058     * General 32-bit SPUT handler.
3059     *
3060     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3061     */
3062    /* op vAA, field@BBBB */
3063    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3064    FETCH(r1, 1)                        @ r1<- field ref BBBB
3065    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3066    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3067    cmp     r0, #0                      @ is resolved entry null?
3068    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3069.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3070    mov     r2, rINST, lsr #8           @ r2<- AA
3071    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3072    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3073    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3074    @ no-op                             @ releasing store
3075    str     r1, [r0, #offStaticField_value] @ field<- vAA
3076    GOTO_OPCODE(ip)                     @ jump to next instruction
3077
3078
3079/* ------------------------------ */
3080    .balign 64
3081.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3082/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3083    /*
3084     * Handle a virtual method call.
3085     *
3086     * for: invoke-virtual, invoke-virtual/range
3087     */
3088    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3089    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3090    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3091    FETCH(r1, 1)                        @ r1<- BBBB
3092    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3093    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3094    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3095    .if     (!0)
3096    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3097    .endif
3098    cmp     r0, #0                      @ already resolved?
3099    EXPORT_PC()                         @ must export for invoke
3100    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3101    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3102    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3103    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3104    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3105    cmp     r0, #0                      @ got null?
3106    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3107    b       common_exceptionThrown      @ yes, handle exception
3108
3109/* ------------------------------ */
3110    .balign 64
3111.L_OP_INVOKE_SUPER: /* 0x6f */
3112/* File: armv5te/OP_INVOKE_SUPER.S */
3113    /*
3114     * Handle a "super" method call.
3115     *
3116     * for: invoke-super, invoke-super/range
3117     */
3118    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3119    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3120    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3121    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3122    .if     (!0)
3123    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3124    .endif
3125    FETCH(r1, 1)                        @ r1<- BBBB
3126    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3127    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3128    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3129    cmp     r9, #0                      @ null "this"?
3130    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3131    beq     common_errNullObject        @ null "this", throw exception
3132    cmp     r0, #0                      @ already resolved?
3133    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3134    EXPORT_PC()                         @ must export for invoke
3135    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3136    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3137
3138/* ------------------------------ */
3139    .balign 64
3140.L_OP_INVOKE_DIRECT: /* 0x70 */
3141/* File: armv5te/OP_INVOKE_DIRECT.S */
3142    /*
3143     * Handle a direct method call.
3144     *
3145     * (We could defer the "is 'this' pointer null" test to the common
3146     * method invocation code, and use a flag to indicate that static
3147     * calls don't count.  If we do this as part of copying the arguments
3148     * out we could avoiding loading the first arg twice.)
3149     *
3150     * for: invoke-direct, invoke-direct/range
3151     */
3152    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3153    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3154    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3155    FETCH(r1, 1)                        @ r1<- BBBB
3156    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3157    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3158    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3159    .if     (!0)
3160    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3161    .endif
3162    cmp     r0, #0                      @ already resolved?
3163    EXPORT_PC()                         @ must export for invoke
3164    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3165    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3166.LOP_INVOKE_DIRECT_finish:
3167    cmp     r9, #0                      @ null "this" ref?
3168    bne     common_invokeMethodNoRange   @ r0=method, r9="this"
3169    b       common_errNullObject        @ yes, throw exception
3170
3171/* ------------------------------ */
3172    .balign 64
3173.L_OP_INVOKE_STATIC: /* 0x71 */
3174/* File: armv5te/OP_INVOKE_STATIC.S */
3175    /*
3176     * Handle a static method call.
3177     *
3178     * for: invoke-static, invoke-static/range
3179     */
3180    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3181    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3182    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3183    FETCH(r1, 1)                        @ r1<- BBBB
3184    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3185    mov     r9, #0                      @ null "this" in delay slot
3186    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3187#if defined(WITH_JIT)
3188    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3189#endif
3190    cmp     r0, #0                      @ already resolved?
3191    EXPORT_PC()                         @ must export for invoke
3192    bne     common_invokeMethodNoRange @ yes, continue on
3193    b       .LOP_INVOKE_STATIC_resolve
3194
3195/* ------------------------------ */
3196    .balign 64
3197.L_OP_INVOKE_INTERFACE: /* 0x72 */
3198/* File: armv5te/OP_INVOKE_INTERFACE.S */
3199    /*
3200     * Handle an interface method call.
3201     *
3202     * for: invoke-interface, invoke-interface/range
3203     */
3204    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3205    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3206    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3207    FETCH(r1, 1)                        @ r1<- BBBB
3208    .if     (!0)
3209    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3210    .endif
3211    EXPORT_PC()                         @ must export for invoke
3212    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3213    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3214    cmp     r9, #0                      @ null obj?
3215    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3216    beq     common_errNullObject        @ yes, fail
3217    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3218    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3219    cmp     r0, #0                      @ failed?
3220    beq     common_exceptionThrown      @ yes, handle exception
3221    b       common_invokeMethodNoRange @ (r0=method, r9="this")
3222
3223/* ------------------------------ */
3224    .balign 64
3225.L_OP_UNUSED_73: /* 0x73 */
3226/* File: armv5te/OP_UNUSED_73.S */
3227/* File: armv5te/unused.S */
3228    bl      common_abort
3229
3230
3231/* ------------------------------ */
3232    .balign 64
3233.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3234/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3235/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3236    /*
3237     * Handle a virtual method call.
3238     *
3239     * for: invoke-virtual, invoke-virtual/range
3240     */
3241    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3242    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3243    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3244    FETCH(r1, 1)                        @ r1<- BBBB
3245    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3246    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3247    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3248    .if     (!1)
3249    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3250    .endif
3251    cmp     r0, #0                      @ already resolved?
3252    EXPORT_PC()                         @ must export for invoke
3253    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3254    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3255    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3256    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3257    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3258    cmp     r0, #0                      @ got null?
3259    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3260    b       common_exceptionThrown      @ yes, handle exception
3261
3262
3263/* ------------------------------ */
3264    .balign 64
3265.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3266/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3267/* File: armv5te/OP_INVOKE_SUPER.S */
3268    /*
3269     * Handle a "super" method call.
3270     *
3271     * for: invoke-super, invoke-super/range
3272     */
3273    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3274    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3275    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3276    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3277    .if     (!1)
3278    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3279    .endif
3280    FETCH(r1, 1)                        @ r1<- BBBB
3281    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3282    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3283    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3284    cmp     r9, #0                      @ null "this"?
3285    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3286    beq     common_errNullObject        @ null "this", throw exception
3287    cmp     r0, #0                      @ already resolved?
3288    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3289    EXPORT_PC()                         @ must export for invoke
3290    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3291    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3292
3293
3294/* ------------------------------ */
3295    .balign 64
3296.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3297/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3298/* File: armv5te/OP_INVOKE_DIRECT.S */
3299    /*
3300     * Handle a direct method call.
3301     *
3302     * (We could defer the "is 'this' pointer null" test to the common
3303     * method invocation code, and use a flag to indicate that static
3304     * calls don't count.  If we do this as part of copying the arguments
3305     * out we could avoiding loading the first arg twice.)
3306     *
3307     * for: invoke-direct, invoke-direct/range
3308     */
3309    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3310    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3311    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3312    FETCH(r1, 1)                        @ r1<- BBBB
3313    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3314    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3315    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3316    .if     (!1)
3317    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3318    .endif
3319    cmp     r0, #0                      @ already resolved?
3320    EXPORT_PC()                         @ must export for invoke
3321    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3322    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3323.LOP_INVOKE_DIRECT_RANGE_finish:
3324    cmp     r9, #0                      @ null "this" ref?
3325    bne     common_invokeMethodRange   @ r0=method, r9="this"
3326    b       common_errNullObject        @ yes, throw exception
3327
3328
3329/* ------------------------------ */
3330    .balign 64
3331.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3332/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3333/* File: armv5te/OP_INVOKE_STATIC.S */
3334    /*
3335     * Handle a static method call.
3336     *
3337     * for: invoke-static, invoke-static/range
3338     */
3339    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3340    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3341    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3342    FETCH(r1, 1)                        @ r1<- BBBB
3343    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3344    mov     r9, #0                      @ null "this" in delay slot
3345    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3346#if defined(WITH_JIT)
3347    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3348#endif
3349    cmp     r0, #0                      @ already resolved?
3350    EXPORT_PC()                         @ must export for invoke
3351    bne     common_invokeMethodRange @ yes, continue on
3352    b       .LOP_INVOKE_STATIC_RANGE_resolve
3353
3354
3355/* ------------------------------ */
3356    .balign 64
3357.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3358/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3359/* File: armv5te/OP_INVOKE_INTERFACE.S */
3360    /*
3361     * Handle an interface method call.
3362     *
3363     * for: invoke-interface, invoke-interface/range
3364     */
3365    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3366    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3367    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3368    FETCH(r1, 1)                        @ r1<- BBBB
3369    .if     (!1)
3370    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3371    .endif
3372    EXPORT_PC()                         @ must export for invoke
3373    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3374    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3375    cmp     r9, #0                      @ null obj?
3376    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3377    beq     common_errNullObject        @ yes, fail
3378    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3379    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3380    cmp     r0, #0                      @ failed?
3381    beq     common_exceptionThrown      @ yes, handle exception
3382    b       common_invokeMethodRange @ (r0=method, r9="this")
3383
3384
3385/* ------------------------------ */
3386    .balign 64
3387.L_OP_UNUSED_79: /* 0x79 */
3388/* File: armv5te/OP_UNUSED_79.S */
3389/* File: armv5te/unused.S */
3390    bl      common_abort
3391
3392
3393/* ------------------------------ */
3394    .balign 64
3395.L_OP_UNUSED_7A: /* 0x7a */
3396/* File: armv5te/OP_UNUSED_7A.S */
3397/* File: armv5te/unused.S */
3398    bl      common_abort
3399
3400
3401/* ------------------------------ */
3402    .balign 64
3403.L_OP_NEG_INT: /* 0x7b */
3404/* File: armv5te/OP_NEG_INT.S */
3405/* File: armv5te/unop.S */
3406    /*
3407     * Generic 32-bit unary operation.  Provide an "instr" line that
3408     * specifies an instruction that performs "result = op r0".
3409     * This could be an ARM instruction or a function call.
3410     *
3411     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3412     *      int-to-byte, int-to-char, int-to-short
3413     */
3414    /* unop vA, vB */
3415    mov     r3, rINST, lsr #12          @ r3<- B
3416    mov     r9, rINST, lsr #8           @ r9<- A+
3417    GET_VREG(r0, r3)                    @ r0<- vB
3418    and     r9, r9, #15
3419                               @ optional op; may set condition codes
3420    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3421    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3422    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3423    SET_VREG(r0, r9)                    @ vAA<- r0
3424    GOTO_OPCODE(ip)                     @ jump to next instruction
3425    /* 9-10 instructions */
3426
3427
3428/* ------------------------------ */
3429    .balign 64
3430.L_OP_NOT_INT: /* 0x7c */
3431/* File: armv5te/OP_NOT_INT.S */
3432/* File: armv5te/unop.S */
3433    /*
3434     * Generic 32-bit unary operation.  Provide an "instr" line that
3435     * specifies an instruction that performs "result = op r0".
3436     * This could be an ARM instruction or a function call.
3437     *
3438     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3439     *      int-to-byte, int-to-char, int-to-short
3440     */
3441    /* unop vA, vB */
3442    mov     r3, rINST, lsr #12          @ r3<- B
3443    mov     r9, rINST, lsr #8           @ r9<- A+
3444    GET_VREG(r0, r3)                    @ r0<- vB
3445    and     r9, r9, #15
3446                               @ optional op; may set condition codes
3447    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3448    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3449    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3450    SET_VREG(r0, r9)                    @ vAA<- r0
3451    GOTO_OPCODE(ip)                     @ jump to next instruction
3452    /* 9-10 instructions */
3453
3454
3455/* ------------------------------ */
3456    .balign 64
3457.L_OP_NEG_LONG: /* 0x7d */
3458/* File: armv5te/OP_NEG_LONG.S */
3459/* File: armv5te/unopWide.S */
3460    /*
3461     * Generic 64-bit unary operation.  Provide an "instr" line that
3462     * specifies an instruction that performs "result = op r0/r1".
3463     * This could be an ARM instruction or a function call.
3464     *
3465     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3466     */
3467    /* unop vA, vB */
3468    mov     r9, rINST, lsr #8           @ r9<- A+
3469    mov     r3, rINST, lsr #12          @ r3<- B
3470    and     r9, r9, #15
3471    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3472    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3473    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3474    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3475    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3476    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3477    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3478    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3479    GOTO_OPCODE(ip)                     @ jump to next instruction
3480    /* 12-13 instructions */
3481
3482
3483/* ------------------------------ */
3484    .balign 64
3485.L_OP_NOT_LONG: /* 0x7e */
3486/* File: armv5te/OP_NOT_LONG.S */
3487/* File: armv5te/unopWide.S */
3488    /*
3489     * Generic 64-bit unary operation.  Provide an "instr" line that
3490     * specifies an instruction that performs "result = op r0/r1".
3491     * This could be an ARM instruction or a function call.
3492     *
3493     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3494     */
3495    /* unop vA, vB */
3496    mov     r9, rINST, lsr #8           @ r9<- A+
3497    mov     r3, rINST, lsr #12          @ r3<- B
3498    and     r9, r9, #15
3499    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3500    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3501    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3502    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3503    mvn     r0, r0                           @ optional op; may set condition codes
3504    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3505    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3506    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3507    GOTO_OPCODE(ip)                     @ jump to next instruction
3508    /* 12-13 instructions */
3509
3510
3511/* ------------------------------ */
3512    .balign 64
3513.L_OP_NEG_FLOAT: /* 0x7f */
3514/* File: armv5te/OP_NEG_FLOAT.S */
3515/* File: armv5te/unop.S */
3516    /*
3517     * Generic 32-bit unary operation.  Provide an "instr" line that
3518     * specifies an instruction that performs "result = op r0".
3519     * This could be an ARM instruction or a function call.
3520     *
3521     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3522     *      int-to-byte, int-to-char, int-to-short
3523     */
3524    /* unop vA, vB */
3525    mov     r3, rINST, lsr #12          @ r3<- B
3526    mov     r9, rINST, lsr #8           @ r9<- A+
3527    GET_VREG(r0, r3)                    @ r0<- vB
3528    and     r9, r9, #15
3529                               @ optional op; may set condition codes
3530    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3531    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3532    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3533    SET_VREG(r0, r9)                    @ vAA<- r0
3534    GOTO_OPCODE(ip)                     @ jump to next instruction
3535    /* 9-10 instructions */
3536
3537
3538/* ------------------------------ */
3539    .balign 64
3540.L_OP_NEG_DOUBLE: /* 0x80 */
3541/* File: armv5te/OP_NEG_DOUBLE.S */
3542/* File: armv5te/unopWide.S */
3543    /*
3544     * Generic 64-bit unary operation.  Provide an "instr" line that
3545     * specifies an instruction that performs "result = op r0/r1".
3546     * This could be an ARM instruction or a function call.
3547     *
3548     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3549     */
3550    /* unop vA, vB */
3551    mov     r9, rINST, lsr #8           @ r9<- A+
3552    mov     r3, rINST, lsr #12          @ r3<- B
3553    and     r9, r9, #15
3554    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3555    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3556    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3557    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3558                               @ optional op; may set condition codes
3559    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3560    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3561    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3562    GOTO_OPCODE(ip)                     @ jump to next instruction
3563    /* 12-13 instructions */
3564
3565
3566/* ------------------------------ */
3567    .balign 64
3568.L_OP_INT_TO_LONG: /* 0x81 */
3569/* File: armv5te/OP_INT_TO_LONG.S */
3570/* File: armv5te/unopWider.S */
3571    /*
3572     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3573     * that specifies an instruction that performs "result = op r0", where
3574     * "result" is a 64-bit quantity in r0/r1.
3575     *
3576     * For: int-to-long, int-to-double, float-to-long, float-to-double
3577     */
3578    /* unop vA, vB */
3579    mov     r9, rINST, lsr #8           @ r9<- A+
3580    mov     r3, rINST, lsr #12          @ r3<- B
3581    and     r9, r9, #15
3582    GET_VREG(r0, r3)                    @ r0<- vB
3583    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3584                               @ optional op; may set condition codes
3585    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3586    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3587    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3588    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3589    GOTO_OPCODE(ip)                     @ jump to next instruction
3590    /* 10-11 instructions */
3591
3592
3593/* ------------------------------ */
3594    .balign 64
3595.L_OP_INT_TO_FLOAT: /* 0x82 */
3596/* File: armv5te/OP_INT_TO_FLOAT.S */
3597/* File: armv5te/unop.S */
3598    /*
3599     * Generic 32-bit unary operation.  Provide an "instr" line that
3600     * specifies an instruction that performs "result = op r0".
3601     * This could be an ARM instruction or a function call.
3602     *
3603     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3604     *      int-to-byte, int-to-char, int-to-short
3605     */
3606    /* unop vA, vB */
3607    mov     r3, rINST, lsr #12          @ r3<- B
3608    mov     r9, rINST, lsr #8           @ r9<- A+
3609    GET_VREG(r0, r3)                    @ r0<- vB
3610    and     r9, r9, #15
3611                               @ optional op; may set condition codes
3612    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3613    bl      __aeabi_i2f                              @ r0<- op, r0-r3 changed
3614    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3615    SET_VREG(r0, r9)                    @ vAA<- r0
3616    GOTO_OPCODE(ip)                     @ jump to next instruction
3617    /* 9-10 instructions */
3618
3619
3620/* ------------------------------ */
3621    .balign 64
3622.L_OP_INT_TO_DOUBLE: /* 0x83 */
3623/* File: armv5te/OP_INT_TO_DOUBLE.S */
3624/* File: armv5te/unopWider.S */
3625    /*
3626     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3627     * that specifies an instruction that performs "result = op r0", where
3628     * "result" is a 64-bit quantity in r0/r1.
3629     *
3630     * For: int-to-long, int-to-double, float-to-long, float-to-double
3631     */
3632    /* unop vA, vB */
3633    mov     r9, rINST, lsr #8           @ r9<- A+
3634    mov     r3, rINST, lsr #12          @ r3<- B
3635    and     r9, r9, #15
3636    GET_VREG(r0, r3)                    @ r0<- vB
3637    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3638                               @ optional op; may set condition codes
3639    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3640    bl      __aeabi_i2d                              @ r0<- op, r0-r3 changed
3641    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3642    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3643    GOTO_OPCODE(ip)                     @ jump to next instruction
3644    /* 10-11 instructions */
3645
3646
3647/* ------------------------------ */
3648    .balign 64
3649.L_OP_LONG_TO_INT: /* 0x84 */
3650/* File: armv5te/OP_LONG_TO_INT.S */
3651/* we ignore the high word, making this equivalent to a 32-bit reg move */
3652/* File: armv5te/OP_MOVE.S */
3653    /* for move, move-object, long-to-int */
3654    /* op vA, vB */
3655    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3656    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3657    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3658    GET_VREG(r2, r1)                    @ r2<- fp[B]
3659    and     r0, r0, #15
3660    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3661    SET_VREG(r2, r0)                    @ fp[A]<- r2
3662    GOTO_OPCODE(ip)                     @ execute next instruction
3663
3664
3665/* ------------------------------ */
3666    .balign 64
3667.L_OP_LONG_TO_FLOAT: /* 0x85 */
3668/* File: armv5te/OP_LONG_TO_FLOAT.S */
3669/* File: armv5te/unopNarrower.S */
3670    /*
3671     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3672     * that specifies an instruction that performs "result = op r0/r1", where
3673     * "result" is a 32-bit quantity in r0.
3674     *
3675     * For: long-to-float, double-to-int, double-to-float
3676     *
3677     * (This would work for long-to-int, but that instruction is actually
3678     * an exact match for OP_MOVE.)
3679     */
3680    /* unop vA, vB */
3681    mov     r3, rINST, lsr #12          @ r3<- B
3682    mov     r9, rINST, lsr #8           @ r9<- A+
3683    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3684    and     r9, r9, #15
3685    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3686    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3687                               @ optional op; may set condition codes
3688    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3689    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3690    SET_VREG(r0, r9)                    @ vA<- r0
3691    GOTO_OPCODE(ip)                     @ jump to next instruction
3692    /* 10-11 instructions */
3693
3694
3695/* ------------------------------ */
3696    .balign 64
3697.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3698/* File: armv5te/OP_LONG_TO_DOUBLE.S */
3699/* File: armv5te/unopWide.S */
3700    /*
3701     * Generic 64-bit unary operation.  Provide an "instr" line that
3702     * specifies an instruction that performs "result = op r0/r1".
3703     * This could be an ARM instruction or a function call.
3704     *
3705     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3706     */
3707    /* unop vA, vB */
3708    mov     r9, rINST, lsr #8           @ r9<- A+
3709    mov     r3, rINST, lsr #12          @ r3<- B
3710    and     r9, r9, #15
3711    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3712    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3713    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3714    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3715                               @ optional op; may set condition codes
3716    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3717    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3718    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3719    GOTO_OPCODE(ip)                     @ jump to next instruction
3720    /* 12-13 instructions */
3721
3722
3723/* ------------------------------ */
3724    .balign 64
3725.L_OP_FLOAT_TO_INT: /* 0x87 */
3726/* File: armv5te/OP_FLOAT_TO_INT.S */
3727/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3728/* File: armv5te/unop.S */
3729    /*
3730     * Generic 32-bit unary operation.  Provide an "instr" line that
3731     * specifies an instruction that performs "result = op r0".
3732     * This could be an ARM instruction or a function call.
3733     *
3734     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3735     *      int-to-byte, int-to-char, int-to-short
3736     */
3737    /* unop vA, vB */
3738    mov     r3, rINST, lsr #12          @ r3<- B
3739    mov     r9, rINST, lsr #8           @ r9<- A+
3740    GET_VREG(r0, r3)                    @ r0<- vB
3741    and     r9, r9, #15
3742                               @ optional op; may set condition codes
3743    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3744    bl      __aeabi_f2iz                              @ r0<- op, r0-r3 changed
3745    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3746    SET_VREG(r0, r9)                    @ vAA<- r0
3747    GOTO_OPCODE(ip)                     @ jump to next instruction
3748    /* 9-10 instructions */
3749
3750
3751#if 0
3752@include "armv5te/unop.S" {"instr":"bl      f2i_doconv"}
3753@break
3754/*
3755 * Convert the float in r0 to an int in r0.
3756 *
3757 * We have to clip values to int min/max per the specification.  The
3758 * expected common case is a "reasonable" value that converts directly
3759 * to modest integer.  The EABI convert function isn't doing this for us.
3760 */
3761f2i_doconv:
3762    stmfd   sp!, {r4, lr}
3763    mov     r1, #0x4f000000             @ (float)maxint
3764    mov     r4, r0
3765    bl      __aeabi_fcmpge              @ is arg >= maxint?
3766    cmp     r0, #0                      @ nonzero == yes
3767    mvnne   r0, #0x80000000             @ return maxint (7fffffff)
3768    ldmnefd sp!, {r4, pc}
3769
3770    mov     r0, r4                      @ recover arg
3771    mov     r1, #0xcf000000             @ (float)minint
3772    bl      __aeabi_fcmple              @ is arg <= minint?
3773    cmp     r0, #0                      @ nonzero == yes
3774    movne   r0, #0x80000000             @ return minint (80000000)
3775    ldmnefd sp!, {r4, pc}
3776
3777    mov     r0, r4                      @ recover arg
3778    mov     r1, r4
3779    bl      __aeabi_fcmpeq              @ is arg == self?
3780    cmp     r0, #0                      @ zero == no
3781    ldmeqfd sp!, {r4, pc}               @ return zero for NaN
3782
3783    mov     r0, r4                      @ recover arg
3784    bl      __aeabi_f2iz                @ convert float to int
3785    ldmfd   sp!, {r4, pc}
3786#endif
3787
3788/* ------------------------------ */
3789    .balign 64
3790.L_OP_FLOAT_TO_LONG: /* 0x88 */
3791/* File: armv5te/OP_FLOAT_TO_LONG.S */
3792@include "armv5te/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3793/* File: armv5te/unopWider.S */
3794    /*
3795     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3796     * that specifies an instruction that performs "result = op r0", where
3797     * "result" is a 64-bit quantity in r0/r1.
3798     *
3799     * For: int-to-long, int-to-double, float-to-long, float-to-double
3800     */
3801    /* unop vA, vB */
3802    mov     r9, rINST, lsr #8           @ r9<- A+
3803    mov     r3, rINST, lsr #12          @ r3<- B
3804    and     r9, r9, #15
3805    GET_VREG(r0, r3)                    @ r0<- vB
3806    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3807                               @ optional op; may set condition codes
3808    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3809    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3810    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3811    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3812    GOTO_OPCODE(ip)                     @ jump to next instruction
3813    /* 10-11 instructions */
3814
3815
3816
3817/* ------------------------------ */
3818    .balign 64
3819.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3820/* File: armv5te/OP_FLOAT_TO_DOUBLE.S */
3821/* File: armv5te/unopWider.S */
3822    /*
3823     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3824     * that specifies an instruction that performs "result = op r0", where
3825     * "result" is a 64-bit quantity in r0/r1.
3826     *
3827     * For: int-to-long, int-to-double, float-to-long, float-to-double
3828     */
3829    /* unop vA, vB */
3830    mov     r9, rINST, lsr #8           @ r9<- A+
3831    mov     r3, rINST, lsr #12          @ r3<- B
3832    and     r9, r9, #15
3833    GET_VREG(r0, r3)                    @ r0<- vB
3834    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3835                               @ optional op; may set condition codes
3836    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3837    bl      __aeabi_f2d                              @ r0<- op, r0-r3 changed
3838    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3839    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3840    GOTO_OPCODE(ip)                     @ jump to next instruction
3841    /* 10-11 instructions */
3842
3843
3844/* ------------------------------ */
3845    .balign 64
3846.L_OP_DOUBLE_TO_INT: /* 0x8a */
3847/* File: armv5te/OP_DOUBLE_TO_INT.S */
3848/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3849/* File: armv5te/unopNarrower.S */
3850    /*
3851     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3852     * that specifies an instruction that performs "result = op r0/r1", where
3853     * "result" is a 32-bit quantity in r0.
3854     *
3855     * For: long-to-float, double-to-int, double-to-float
3856     *
3857     * (This would work for long-to-int, but that instruction is actually
3858     * an exact match for OP_MOVE.)
3859     */
3860    /* unop vA, vB */
3861    mov     r3, rINST, lsr #12          @ r3<- B
3862    mov     r9, rINST, lsr #8           @ r9<- A+
3863    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3864    and     r9, r9, #15
3865    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3866    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3867                               @ optional op; may set condition codes
3868    bl      __aeabi_d2iz                              @ r0<- op, r0-r3 changed
3869    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3870    SET_VREG(r0, r9)                    @ vA<- r0
3871    GOTO_OPCODE(ip)                     @ jump to next instruction
3872    /* 10-11 instructions */
3873
3874
3875#if 0
3876@include "armv5te/unopNarrower.S" {"instr":"bl      d2i_doconv"}
3877@break
3878/*
3879 * Convert the double in r0/r1 to an int in r0.
3880 *
3881 * We have to clip values to int min/max per the specification.  The
3882 * expected common case is a "reasonable" value that converts directly
3883 * to modest integer.  The EABI convert function isn't doing this for us.
3884 */
3885d2i_doconv:
3886    stmfd   sp!, {r4, r5, lr}           @ save regs
3887    mov     r2, #0x80000000             @ maxint, as a double (low word)
3888    mov     r2, r2, asr #9              @  0xffc00000
3889    sub     sp, sp, #4                  @ align for EABI
3890    mvn     r3, #0xbe000000             @ maxint, as a double (high word)
3891    sub     r3, r3, #0x00200000         @  0x41dfffff
3892    mov     r4, r0                      @ save a copy of r0
3893    mov     r5, r1                      @  and r1
3894    bl      __aeabi_dcmpge              @ is arg >= maxint?
3895    cmp     r0, #0                      @ nonzero == yes
3896    mvnne   r0, #0x80000000             @ return maxint (0x7fffffff)
3897    bne     1f
3898
3899    mov     r0, r4                      @ recover arg
3900    mov     r1, r5
3901    mov     r3, #0xc1000000             @ minint, as a double (high word)
3902    add     r3, r3, #0x00e00000         @  0xc1e00000
3903    mov     r2, #0                      @ minint, as a double (low word)
3904    bl      __aeabi_dcmple              @ is arg <= minint?
3905    cmp     r0, #0                      @ nonzero == yes
3906    movne   r0, #0x80000000             @ return minint (80000000)
3907    bne     1f
3908
3909    mov     r0, r4                      @ recover arg
3910    mov     r1, r5
3911    mov     r2, r4                      @ compare against self
3912    mov     r3, r5
3913    bl      __aeabi_dcmpeq              @ is arg == self?
3914    cmp     r0, #0                      @ zero == no
3915    beq     1f                          @ return zero for NaN
3916
3917    mov     r0, r4                      @ recover arg
3918    mov     r1, r5
3919    bl      __aeabi_d2iz                @ convert double to int
3920
39211:
3922    add     sp, sp, #4
3923    ldmfd   sp!, {r4, r5, pc}
3924#endif
3925
3926/* ------------------------------ */
3927    .balign 64
3928.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3929/* File: armv5te/OP_DOUBLE_TO_LONG.S */
3930@include "armv5te/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
3931/* File: armv5te/unopWide.S */
3932    /*
3933     * Generic 64-bit unary operation.  Provide an "instr" line that
3934     * specifies an instruction that performs "result = op r0/r1".
3935     * This could be an ARM instruction or a function call.
3936     *
3937     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3938     */
3939    /* unop vA, vB */
3940    mov     r9, rINST, lsr #8           @ r9<- A+
3941    mov     r3, rINST, lsr #12          @ r3<- B
3942    and     r9, r9, #15
3943    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3944    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3945    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3946    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3947                               @ optional op; may set condition codes
3948    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
3949    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3950    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3951    GOTO_OPCODE(ip)                     @ jump to next instruction
3952    /* 12-13 instructions */
3953
3954
3955
3956/* ------------------------------ */
3957    .balign 64
3958.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3959/* File: armv5te/OP_DOUBLE_TO_FLOAT.S */
3960/* File: armv5te/unopNarrower.S */
3961    /*
3962     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3963     * that specifies an instruction that performs "result = op r0/r1", where
3964     * "result" is a 32-bit quantity in r0.
3965     *
3966     * For: long-to-float, double-to-int, double-to-float
3967     *
3968     * (This would work for long-to-int, but that instruction is actually
3969     * an exact match for OP_MOVE.)
3970     */
3971    /* unop vA, vB */
3972    mov     r3, rINST, lsr #12          @ r3<- B
3973    mov     r9, rINST, lsr #8           @ r9<- A+
3974    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3975    and     r9, r9, #15
3976    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3977    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3978                               @ optional op; may set condition codes
3979    bl      __aeabi_d2f                              @ r0<- op, r0-r3 changed
3980    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3981    SET_VREG(r0, r9)                    @ vA<- r0
3982    GOTO_OPCODE(ip)                     @ jump to next instruction
3983    /* 10-11 instructions */
3984
3985
3986/* ------------------------------ */
3987    .balign 64
3988.L_OP_INT_TO_BYTE: /* 0x8d */
3989/* File: armv5te/OP_INT_TO_BYTE.S */
3990/* File: armv5te/unop.S */
3991    /*
3992     * Generic 32-bit unary operation.  Provide an "instr" line that
3993     * specifies an instruction that performs "result = op r0".
3994     * This could be an ARM instruction or a function call.
3995     *
3996     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3997     *      int-to-byte, int-to-char, int-to-short
3998     */
3999    /* unop vA, vB */
4000    mov     r3, rINST, lsr #12          @ r3<- B
4001    mov     r9, rINST, lsr #8           @ r9<- A+
4002    GET_VREG(r0, r3)                    @ r0<- vB
4003    and     r9, r9, #15
4004    mov     r0, r0, asl #24                           @ optional op; may set condition codes
4005    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4006    mov     r0, r0, asr #24                              @ r0<- op, r0-r3 changed
4007    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4008    SET_VREG(r0, r9)                    @ vAA<- r0
4009    GOTO_OPCODE(ip)                     @ jump to next instruction
4010    /* 9-10 instructions */
4011
4012
4013/* ------------------------------ */
4014    .balign 64
4015.L_OP_INT_TO_CHAR: /* 0x8e */
4016/* File: armv5te/OP_INT_TO_CHAR.S */
4017/* File: armv5te/unop.S */
4018    /*
4019     * Generic 32-bit unary operation.  Provide an "instr" line that
4020     * specifies an instruction that performs "result = op r0".
4021     * This could be an ARM instruction or a function call.
4022     *
4023     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4024     *      int-to-byte, int-to-char, int-to-short
4025     */
4026    /* unop vA, vB */
4027    mov     r3, rINST, lsr #12          @ r3<- B
4028    mov     r9, rINST, lsr #8           @ r9<- A+
4029    GET_VREG(r0, r3)                    @ r0<- vB
4030    and     r9, r9, #15
4031    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4032    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4033    mov     r0, r0, lsr #16                              @ r0<- op, r0-r3 changed
4034    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4035    SET_VREG(r0, r9)                    @ vAA<- r0
4036    GOTO_OPCODE(ip)                     @ jump to next instruction
4037    /* 9-10 instructions */
4038
4039
4040/* ------------------------------ */
4041    .balign 64
4042.L_OP_INT_TO_SHORT: /* 0x8f */
4043/* File: armv5te/OP_INT_TO_SHORT.S */
4044/* File: armv5te/unop.S */
4045    /*
4046     * Generic 32-bit unary operation.  Provide an "instr" line that
4047     * specifies an instruction that performs "result = op r0".
4048     * This could be an ARM instruction or a function call.
4049     *
4050     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4051     *      int-to-byte, int-to-char, int-to-short
4052     */
4053    /* unop vA, vB */
4054    mov     r3, rINST, lsr #12          @ r3<- B
4055    mov     r9, rINST, lsr #8           @ r9<- A+
4056    GET_VREG(r0, r3)                    @ r0<- vB
4057    and     r9, r9, #15
4058    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4059    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4060    mov     r0, r0, asr #16                              @ r0<- op, r0-r3 changed
4061    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4062    SET_VREG(r0, r9)                    @ vAA<- r0
4063    GOTO_OPCODE(ip)                     @ jump to next instruction
4064    /* 9-10 instructions */
4065
4066
4067/* ------------------------------ */
4068    .balign 64
4069.L_OP_ADD_INT: /* 0x90 */
4070/* File: armv5te/OP_ADD_INT.S */
4071/* File: armv5te/binop.S */
4072    /*
4073     * Generic 32-bit binary operation.  Provide an "instr" line that
4074     * specifies an instruction that performs "result = r0 op r1".
4075     * This could be an ARM instruction or a function call.  (If the result
4076     * comes back in a register other than r0, you can override "result".)
4077     *
4078     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4079     * vCC (r1).  Useful for integer division and modulus.  Note that we
4080     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4081     * handles it correctly.
4082     *
4083     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4084     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4085     *      mul-float, div-float, rem-float
4086     */
4087    /* binop vAA, vBB, vCC */
4088    FETCH(r0, 1)                        @ r0<- CCBB
4089    mov     r9, rINST, lsr #8           @ r9<- AA
4090    mov     r3, r0, lsr #8              @ r3<- CC
4091    and     r2, r0, #255                @ r2<- BB
4092    GET_VREG(r1, r3)                    @ r1<- vCC
4093    GET_VREG(r0, r2)                    @ r0<- vBB
4094    .if 0
4095    cmp     r1, #0                      @ is second operand zero?
4096    beq     common_errDivideByZero
4097    .endif
4098
4099    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4100                               @ optional op; may set condition codes
4101    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
4102    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4103    SET_VREG(r0, r9)               @ vAA<- r0
4104    GOTO_OPCODE(ip)                     @ jump to next instruction
4105    /* 11-14 instructions */
4106
4107
4108/* ------------------------------ */
4109    .balign 64
4110.L_OP_SUB_INT: /* 0x91 */
4111/* File: armv5te/OP_SUB_INT.S */
4112/* File: armv5te/binop.S */
4113    /*
4114     * Generic 32-bit binary operation.  Provide an "instr" line that
4115     * specifies an instruction that performs "result = r0 op r1".
4116     * This could be an ARM instruction or a function call.  (If the result
4117     * comes back in a register other than r0, you can override "result".)
4118     *
4119     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4120     * vCC (r1).  Useful for integer division and modulus.  Note that we
4121     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4122     * handles it correctly.
4123     *
4124     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4125     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4126     *      mul-float, div-float, rem-float
4127     */
4128    /* binop vAA, vBB, vCC */
4129    FETCH(r0, 1)                        @ r0<- CCBB
4130    mov     r9, rINST, lsr #8           @ r9<- AA
4131    mov     r3, r0, lsr #8              @ r3<- CC
4132    and     r2, r0, #255                @ r2<- BB
4133    GET_VREG(r1, r3)                    @ r1<- vCC
4134    GET_VREG(r0, r2)                    @ r0<- vBB
4135    .if 0
4136    cmp     r1, #0                      @ is second operand zero?
4137    beq     common_errDivideByZero
4138    .endif
4139
4140    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4141                               @ optional op; may set condition codes
4142    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4143    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4144    SET_VREG(r0, r9)               @ vAA<- r0
4145    GOTO_OPCODE(ip)                     @ jump to next instruction
4146    /* 11-14 instructions */
4147
4148
4149/* ------------------------------ */
4150    .balign 64
4151.L_OP_MUL_INT: /* 0x92 */
4152/* File: armv5te/OP_MUL_INT.S */
4153/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4154/* File: armv5te/binop.S */
4155    /*
4156     * Generic 32-bit binary operation.  Provide an "instr" line that
4157     * specifies an instruction that performs "result = r0 op r1".
4158     * This could be an ARM instruction or a function call.  (If the result
4159     * comes back in a register other than r0, you can override "result".)
4160     *
4161     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4162     * vCC (r1).  Useful for integer division and modulus.  Note that we
4163     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4164     * handles it correctly.
4165     *
4166     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4167     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4168     *      mul-float, div-float, rem-float
4169     */
4170    /* binop vAA, vBB, vCC */
4171    FETCH(r0, 1)                        @ r0<- CCBB
4172    mov     r9, rINST, lsr #8           @ r9<- AA
4173    mov     r3, r0, lsr #8              @ r3<- CC
4174    and     r2, r0, #255                @ r2<- BB
4175    GET_VREG(r1, r3)                    @ r1<- vCC
4176    GET_VREG(r0, r2)                    @ r0<- vBB
4177    .if 0
4178    cmp     r1, #0                      @ is second operand zero?
4179    beq     common_errDivideByZero
4180    .endif
4181
4182    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4183                               @ optional op; may set condition codes
4184    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4185    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4186    SET_VREG(r0, r9)               @ vAA<- r0
4187    GOTO_OPCODE(ip)                     @ jump to next instruction
4188    /* 11-14 instructions */
4189
4190
4191/* ------------------------------ */
4192    .balign 64
4193.L_OP_DIV_INT: /* 0x93 */
4194/* File: armv5te/OP_DIV_INT.S */
4195/* File: armv5te/binop.S */
4196    /*
4197     * Generic 32-bit binary operation.  Provide an "instr" line that
4198     * specifies an instruction that performs "result = r0 op r1".
4199     * This could be an ARM instruction or a function call.  (If the result
4200     * comes back in a register other than r0, you can override "result".)
4201     *
4202     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4203     * vCC (r1).  Useful for integer division and modulus.  Note that we
4204     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4205     * handles it correctly.
4206     *
4207     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4208     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4209     *      mul-float, div-float, rem-float
4210     */
4211    /* binop vAA, vBB, vCC */
4212    FETCH(r0, 1)                        @ r0<- CCBB
4213    mov     r9, rINST, lsr #8           @ r9<- AA
4214    mov     r3, r0, lsr #8              @ r3<- CC
4215    and     r2, r0, #255                @ r2<- BB
4216    GET_VREG(r1, r3)                    @ r1<- vCC
4217    GET_VREG(r0, r2)                    @ r0<- vBB
4218    .if 1
4219    cmp     r1, #0                      @ is second operand zero?
4220    beq     common_errDivideByZero
4221    .endif
4222
4223    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4224                               @ optional op; may set condition codes
4225    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4226    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4227    SET_VREG(r0, r9)               @ vAA<- r0
4228    GOTO_OPCODE(ip)                     @ jump to next instruction
4229    /* 11-14 instructions */
4230
4231
4232/* ------------------------------ */
4233    .balign 64
4234.L_OP_REM_INT: /* 0x94 */
4235/* File: armv5te/OP_REM_INT.S */
4236/* idivmod returns quotient in r0 and remainder in r1 */
4237/* File: armv5te/binop.S */
4238    /*
4239     * Generic 32-bit binary operation.  Provide an "instr" line that
4240     * specifies an instruction that performs "result = r0 op r1".
4241     * This could be an ARM instruction or a function call.  (If the result
4242     * comes back in a register other than r0, you can override "result".)
4243     *
4244     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4245     * vCC (r1).  Useful for integer division and modulus.  Note that we
4246     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4247     * handles it correctly.
4248     *
4249     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4250     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4251     *      mul-float, div-float, rem-float
4252     */
4253    /* binop vAA, vBB, vCC */
4254    FETCH(r0, 1)                        @ r0<- CCBB
4255    mov     r9, rINST, lsr #8           @ r9<- AA
4256    mov     r3, r0, lsr #8              @ r3<- CC
4257    and     r2, r0, #255                @ r2<- BB
4258    GET_VREG(r1, r3)                    @ r1<- vCC
4259    GET_VREG(r0, r2)                    @ r0<- vBB
4260    .if 1
4261    cmp     r1, #0                      @ is second operand zero?
4262    beq     common_errDivideByZero
4263    .endif
4264
4265    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4266                               @ optional op; may set condition codes
4267    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4268    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4269    SET_VREG(r1, r9)               @ vAA<- r1
4270    GOTO_OPCODE(ip)                     @ jump to next instruction
4271    /* 11-14 instructions */
4272
4273
4274/* ------------------------------ */
4275    .balign 64
4276.L_OP_AND_INT: /* 0x95 */
4277/* File: armv5te/OP_AND_INT.S */
4278/* File: armv5te/binop.S */
4279    /*
4280     * Generic 32-bit binary operation.  Provide an "instr" line that
4281     * specifies an instruction that performs "result = r0 op r1".
4282     * This could be an ARM instruction or a function call.  (If the result
4283     * comes back in a register other than r0, you can override "result".)
4284     *
4285     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4286     * vCC (r1).  Useful for integer division and modulus.  Note that we
4287     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4288     * handles it correctly.
4289     *
4290     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4291     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4292     *      mul-float, div-float, rem-float
4293     */
4294    /* binop vAA, vBB, vCC */
4295    FETCH(r0, 1)                        @ r0<- CCBB
4296    mov     r9, rINST, lsr #8           @ r9<- AA
4297    mov     r3, r0, lsr #8              @ r3<- CC
4298    and     r2, r0, #255                @ r2<- BB
4299    GET_VREG(r1, r3)                    @ r1<- vCC
4300    GET_VREG(r0, r2)                    @ r0<- vBB
4301    .if 0
4302    cmp     r1, #0                      @ is second operand zero?
4303    beq     common_errDivideByZero
4304    .endif
4305
4306    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4307                               @ optional op; may set condition codes
4308    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4309    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4310    SET_VREG(r0, r9)               @ vAA<- r0
4311    GOTO_OPCODE(ip)                     @ jump to next instruction
4312    /* 11-14 instructions */
4313
4314
4315/* ------------------------------ */
4316    .balign 64
4317.L_OP_OR_INT: /* 0x96 */
4318/* File: armv5te/OP_OR_INT.S */
4319/* File: armv5te/binop.S */
4320    /*
4321     * Generic 32-bit binary operation.  Provide an "instr" line that
4322     * specifies an instruction that performs "result = r0 op r1".
4323     * This could be an ARM instruction or a function call.  (If the result
4324     * comes back in a register other than r0, you can override "result".)
4325     *
4326     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4327     * vCC (r1).  Useful for integer division and modulus.  Note that we
4328     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4329     * handles it correctly.
4330     *
4331     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4332     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4333     *      mul-float, div-float, rem-float
4334     */
4335    /* binop vAA, vBB, vCC */
4336    FETCH(r0, 1)                        @ r0<- CCBB
4337    mov     r9, rINST, lsr #8           @ r9<- AA
4338    mov     r3, r0, lsr #8              @ r3<- CC
4339    and     r2, r0, #255                @ r2<- BB
4340    GET_VREG(r1, r3)                    @ r1<- vCC
4341    GET_VREG(r0, r2)                    @ r0<- vBB
4342    .if 0
4343    cmp     r1, #0                      @ is second operand zero?
4344    beq     common_errDivideByZero
4345    .endif
4346
4347    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4348                               @ optional op; may set condition codes
4349    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4350    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4351    SET_VREG(r0, r9)               @ vAA<- r0
4352    GOTO_OPCODE(ip)                     @ jump to next instruction
4353    /* 11-14 instructions */
4354
4355
4356/* ------------------------------ */
4357    .balign 64
4358.L_OP_XOR_INT: /* 0x97 */
4359/* File: armv5te/OP_XOR_INT.S */
4360/* File: armv5te/binop.S */
4361    /*
4362     * Generic 32-bit binary operation.  Provide an "instr" line that
4363     * specifies an instruction that performs "result = r0 op r1".
4364     * This could be an ARM instruction or a function call.  (If the result
4365     * comes back in a register other than r0, you can override "result".)
4366     *
4367     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4368     * vCC (r1).  Useful for integer division and modulus.  Note that we
4369     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4370     * handles it correctly.
4371     *
4372     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4373     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4374     *      mul-float, div-float, rem-float
4375     */
4376    /* binop vAA, vBB, vCC */
4377    FETCH(r0, 1)                        @ r0<- CCBB
4378    mov     r9, rINST, lsr #8           @ r9<- AA
4379    mov     r3, r0, lsr #8              @ r3<- CC
4380    and     r2, r0, #255                @ r2<- BB
4381    GET_VREG(r1, r3)                    @ r1<- vCC
4382    GET_VREG(r0, r2)                    @ r0<- vBB
4383    .if 0
4384    cmp     r1, #0                      @ is second operand zero?
4385    beq     common_errDivideByZero
4386    .endif
4387
4388    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4389                               @ optional op; may set condition codes
4390    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4391    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4392    SET_VREG(r0, r9)               @ vAA<- r0
4393    GOTO_OPCODE(ip)                     @ jump to next instruction
4394    /* 11-14 instructions */
4395
4396
4397/* ------------------------------ */
4398    .balign 64
4399.L_OP_SHL_INT: /* 0x98 */
4400/* File: armv5te/OP_SHL_INT.S */
4401/* File: armv5te/binop.S */
4402    /*
4403     * Generic 32-bit binary operation.  Provide an "instr" line that
4404     * specifies an instruction that performs "result = r0 op r1".
4405     * This could be an ARM instruction or a function call.  (If the result
4406     * comes back in a register other than r0, you can override "result".)
4407     *
4408     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4409     * vCC (r1).  Useful for integer division and modulus.  Note that we
4410     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4411     * handles it correctly.
4412     *
4413     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4414     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4415     *      mul-float, div-float, rem-float
4416     */
4417    /* binop vAA, vBB, vCC */
4418    FETCH(r0, 1)                        @ r0<- CCBB
4419    mov     r9, rINST, lsr #8           @ r9<- AA
4420    mov     r3, r0, lsr #8              @ r3<- CC
4421    and     r2, r0, #255                @ r2<- BB
4422    GET_VREG(r1, r3)                    @ r1<- vCC
4423    GET_VREG(r0, r2)                    @ r0<- vBB
4424    .if 0
4425    cmp     r1, #0                      @ is second operand zero?
4426    beq     common_errDivideByZero
4427    .endif
4428
4429    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4430    and     r1, r1, #31                           @ optional op; may set condition codes
4431    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4432    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4433    SET_VREG(r0, r9)               @ vAA<- r0
4434    GOTO_OPCODE(ip)                     @ jump to next instruction
4435    /* 11-14 instructions */
4436
4437
4438/* ------------------------------ */
4439    .balign 64
4440.L_OP_SHR_INT: /* 0x99 */
4441/* File: armv5te/OP_SHR_INT.S */
4442/* File: armv5te/binop.S */
4443    /*
4444     * Generic 32-bit binary operation.  Provide an "instr" line that
4445     * specifies an instruction that performs "result = r0 op r1".
4446     * This could be an ARM instruction or a function call.  (If the result
4447     * comes back in a register other than r0, you can override "result".)
4448     *
4449     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4450     * vCC (r1).  Useful for integer division and modulus.  Note that we
4451     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4452     * handles it correctly.
4453     *
4454     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4455     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4456     *      mul-float, div-float, rem-float
4457     */
4458    /* binop vAA, vBB, vCC */
4459    FETCH(r0, 1)                        @ r0<- CCBB
4460    mov     r9, rINST, lsr #8           @ r9<- AA
4461    mov     r3, r0, lsr #8              @ r3<- CC
4462    and     r2, r0, #255                @ r2<- BB
4463    GET_VREG(r1, r3)                    @ r1<- vCC
4464    GET_VREG(r0, r2)                    @ r0<- vBB
4465    .if 0
4466    cmp     r1, #0                      @ is second operand zero?
4467    beq     common_errDivideByZero
4468    .endif
4469
4470    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4471    and     r1, r1, #31                           @ optional op; may set condition codes
4472    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4473    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4474    SET_VREG(r0, r9)               @ vAA<- r0
4475    GOTO_OPCODE(ip)                     @ jump to next instruction
4476    /* 11-14 instructions */
4477
4478
4479/* ------------------------------ */
4480    .balign 64
4481.L_OP_USHR_INT: /* 0x9a */
4482/* File: armv5te/OP_USHR_INT.S */
4483/* File: armv5te/binop.S */
4484    /*
4485     * Generic 32-bit binary operation.  Provide an "instr" line that
4486     * specifies an instruction that performs "result = r0 op r1".
4487     * This could be an ARM instruction or a function call.  (If the result
4488     * comes back in a register other than r0, you can override "result".)
4489     *
4490     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4491     * vCC (r1).  Useful for integer division and modulus.  Note that we
4492     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4493     * handles it correctly.
4494     *
4495     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4496     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4497     *      mul-float, div-float, rem-float
4498     */
4499    /* binop vAA, vBB, vCC */
4500    FETCH(r0, 1)                        @ r0<- CCBB
4501    mov     r9, rINST, lsr #8           @ r9<- AA
4502    mov     r3, r0, lsr #8              @ r3<- CC
4503    and     r2, r0, #255                @ r2<- BB
4504    GET_VREG(r1, r3)                    @ r1<- vCC
4505    GET_VREG(r0, r2)                    @ r0<- vBB
4506    .if 0
4507    cmp     r1, #0                      @ is second operand zero?
4508    beq     common_errDivideByZero
4509    .endif
4510
4511    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4512    and     r1, r1, #31                           @ optional op; may set condition codes
4513    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4514    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4515    SET_VREG(r0, r9)               @ vAA<- r0
4516    GOTO_OPCODE(ip)                     @ jump to next instruction
4517    /* 11-14 instructions */
4518
4519
4520/* ------------------------------ */
4521    .balign 64
4522.L_OP_ADD_LONG: /* 0x9b */
4523/* File: armv5te/OP_ADD_LONG.S */
4524/* File: armv5te/binopWide.S */
4525    /*
4526     * Generic 64-bit binary operation.  Provide an "instr" line that
4527     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4528     * This could be an ARM instruction or a function call.  (If the result
4529     * comes back in a register other than r0, you can override "result".)
4530     *
4531     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4532     * vCC (r1).  Useful for integer division and modulus.
4533     *
4534     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4535     *      xor-long, add-double, sub-double, mul-double, div-double,
4536     *      rem-double
4537     *
4538     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4539     */
4540    /* binop vAA, vBB, vCC */
4541    FETCH(r0, 1)                        @ r0<- CCBB
4542    mov     r9, rINST, lsr #8           @ r9<- AA
4543    and     r2, r0, #255                @ r2<- BB
4544    mov     r3, r0, lsr #8              @ r3<- CC
4545    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4546    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4547    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4548    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4549    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4550    .if 0
4551    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4552    beq     common_errDivideByZero
4553    .endif
4554    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4555
4556    adds    r0, r0, r2                           @ optional op; may set condition codes
4557    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4558    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4559    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4560    GOTO_OPCODE(ip)                     @ jump to next instruction
4561    /* 14-17 instructions */
4562
4563
4564/* ------------------------------ */
4565    .balign 64
4566.L_OP_SUB_LONG: /* 0x9c */
4567/* File: armv5te/OP_SUB_LONG.S */
4568/* File: armv5te/binopWide.S */
4569    /*
4570     * Generic 64-bit binary operation.  Provide an "instr" line that
4571     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4572     * This could be an ARM instruction or a function call.  (If the result
4573     * comes back in a register other than r0, you can override "result".)
4574     *
4575     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4576     * vCC (r1).  Useful for integer division and modulus.
4577     *
4578     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4579     *      xor-long, add-double, sub-double, mul-double, div-double,
4580     *      rem-double
4581     *
4582     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4583     */
4584    /* binop vAA, vBB, vCC */
4585    FETCH(r0, 1)                        @ r0<- CCBB
4586    mov     r9, rINST, lsr #8           @ r9<- AA
4587    and     r2, r0, #255                @ r2<- BB
4588    mov     r3, r0, lsr #8              @ r3<- CC
4589    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4590    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4591    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4592    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4593    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4594    .if 0
4595    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4596    beq     common_errDivideByZero
4597    .endif
4598    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4599
4600    subs    r0, r0, r2                           @ optional op; may set condition codes
4601    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4602    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4603    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4604    GOTO_OPCODE(ip)                     @ jump to next instruction
4605    /* 14-17 instructions */
4606
4607
4608/* ------------------------------ */
4609    .balign 64
4610.L_OP_MUL_LONG: /* 0x9d */
4611/* File: armv5te/OP_MUL_LONG.S */
4612    /*
4613     * Signed 64-bit integer multiply.
4614     *
4615     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4616     *        WX
4617     *      x YZ
4618     *  --------
4619     *     ZW ZX
4620     *  YW YX
4621     *
4622     * The low word of the result holds ZX, the high word holds
4623     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4624     * it doesn't fit in the low 64 bits.
4625     *
4626     * Unlike most ARM math operations, multiply instructions have
4627     * restrictions on using the same register more than once (Rd and Rm
4628     * cannot be the same).
4629     */
4630    /* mul-long vAA, vBB, vCC */
4631    FETCH(r0, 1)                        @ r0<- CCBB
4632    and     r2, r0, #255                @ r2<- BB
4633    mov     r3, r0, lsr #8              @ r3<- CC
4634    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4635    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4636    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4637    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4638    mul     ip, r2, r1                  @  ip<- ZxW
4639    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4640    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4641    mov     r0, rINST, lsr #8           @ r0<- AA
4642    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4643    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4644    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4645    b       .LOP_MUL_LONG_finish
4646
4647/* ------------------------------ */
4648    .balign 64
4649.L_OP_DIV_LONG: /* 0x9e */
4650/* File: armv5te/OP_DIV_LONG.S */
4651/* File: armv5te/binopWide.S */
4652    /*
4653     * Generic 64-bit binary operation.  Provide an "instr" line that
4654     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4655     * This could be an ARM instruction or a function call.  (If the result
4656     * comes back in a register other than r0, you can override "result".)
4657     *
4658     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4659     * vCC (r1).  Useful for integer division and modulus.
4660     *
4661     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4662     *      xor-long, add-double, sub-double, mul-double, div-double,
4663     *      rem-double
4664     *
4665     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4666     */
4667    /* binop vAA, vBB, vCC */
4668    FETCH(r0, 1)                        @ r0<- CCBB
4669    mov     r9, rINST, lsr #8           @ r9<- AA
4670    and     r2, r0, #255                @ r2<- BB
4671    mov     r3, r0, lsr #8              @ r3<- CC
4672    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4673    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4674    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4675    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4676    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4677    .if 1
4678    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4679    beq     common_errDivideByZero
4680    .endif
4681    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4682
4683                               @ optional op; may set condition codes
4684    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4685    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4686    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4687    GOTO_OPCODE(ip)                     @ jump to next instruction
4688    /* 14-17 instructions */
4689
4690
4691/* ------------------------------ */
4692    .balign 64
4693.L_OP_REM_LONG: /* 0x9f */
4694/* File: armv5te/OP_REM_LONG.S */
4695/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4696/* File: armv5te/binopWide.S */
4697    /*
4698     * Generic 64-bit binary operation.  Provide an "instr" line that
4699     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4700     * This could be an ARM instruction or a function call.  (If the result
4701     * comes back in a register other than r0, you can override "result".)
4702     *
4703     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4704     * vCC (r1).  Useful for integer division and modulus.
4705     *
4706     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4707     *      xor-long, add-double, sub-double, mul-double, div-double,
4708     *      rem-double
4709     *
4710     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4711     */
4712    /* binop vAA, vBB, vCC */
4713    FETCH(r0, 1)                        @ r0<- CCBB
4714    mov     r9, rINST, lsr #8           @ r9<- AA
4715    and     r2, r0, #255                @ r2<- BB
4716    mov     r3, r0, lsr #8              @ r3<- CC
4717    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4718    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4719    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4720    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4721    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4722    .if 1
4723    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4724    beq     common_errDivideByZero
4725    .endif
4726    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4727
4728                               @ optional op; may set condition codes
4729    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4730    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4731    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4732    GOTO_OPCODE(ip)                     @ jump to next instruction
4733    /* 14-17 instructions */
4734
4735
4736/* ------------------------------ */
4737    .balign 64
4738.L_OP_AND_LONG: /* 0xa0 */
4739/* File: armv5te/OP_AND_LONG.S */
4740/* File: armv5te/binopWide.S */
4741    /*
4742     * Generic 64-bit binary operation.  Provide an "instr" line that
4743     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4744     * This could be an ARM instruction or a function call.  (If the result
4745     * comes back in a register other than r0, you can override "result".)
4746     *
4747     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4748     * vCC (r1).  Useful for integer division and modulus.
4749     *
4750     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4751     *      xor-long, add-double, sub-double, mul-double, div-double,
4752     *      rem-double
4753     *
4754     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4755     */
4756    /* binop vAA, vBB, vCC */
4757    FETCH(r0, 1)                        @ r0<- CCBB
4758    mov     r9, rINST, lsr #8           @ r9<- AA
4759    and     r2, r0, #255                @ r2<- BB
4760    mov     r3, r0, lsr #8              @ r3<- CC
4761    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4762    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4763    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4764    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4765    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4766    .if 0
4767    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4768    beq     common_errDivideByZero
4769    .endif
4770    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4771
4772    and     r0, r0, r2                           @ optional op; may set condition codes
4773    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4774    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4775    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4776    GOTO_OPCODE(ip)                     @ jump to next instruction
4777    /* 14-17 instructions */
4778
4779
4780/* ------------------------------ */
4781    .balign 64
4782.L_OP_OR_LONG: /* 0xa1 */
4783/* File: armv5te/OP_OR_LONG.S */
4784/* File: armv5te/binopWide.S */
4785    /*
4786     * Generic 64-bit binary operation.  Provide an "instr" line that
4787     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4788     * This could be an ARM instruction or a function call.  (If the result
4789     * comes back in a register other than r0, you can override "result".)
4790     *
4791     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4792     * vCC (r1).  Useful for integer division and modulus.
4793     *
4794     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4795     *      xor-long, add-double, sub-double, mul-double, div-double,
4796     *      rem-double
4797     *
4798     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4799     */
4800    /* binop vAA, vBB, vCC */
4801    FETCH(r0, 1)                        @ r0<- CCBB
4802    mov     r9, rINST, lsr #8           @ r9<- AA
4803    and     r2, r0, #255                @ r2<- BB
4804    mov     r3, r0, lsr #8              @ r3<- CC
4805    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4806    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4807    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4808    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4809    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4810    .if 0
4811    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4812    beq     common_errDivideByZero
4813    .endif
4814    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4815
4816    orr     r0, r0, r2                           @ optional op; may set condition codes
4817    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4818    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4819    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4820    GOTO_OPCODE(ip)                     @ jump to next instruction
4821    /* 14-17 instructions */
4822
4823
4824/* ------------------------------ */
4825    .balign 64
4826.L_OP_XOR_LONG: /* 0xa2 */
4827/* File: armv5te/OP_XOR_LONG.S */
4828/* File: armv5te/binopWide.S */
4829    /*
4830     * Generic 64-bit binary operation.  Provide an "instr" line that
4831     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4832     * This could be an ARM instruction or a function call.  (If the result
4833     * comes back in a register other than r0, you can override "result".)
4834     *
4835     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4836     * vCC (r1).  Useful for integer division and modulus.
4837     *
4838     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4839     *      xor-long, add-double, sub-double, mul-double, div-double,
4840     *      rem-double
4841     *
4842     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4843     */
4844    /* binop vAA, vBB, vCC */
4845    FETCH(r0, 1)                        @ r0<- CCBB
4846    mov     r9, rINST, lsr #8           @ r9<- AA
4847    and     r2, r0, #255                @ r2<- BB
4848    mov     r3, r0, lsr #8              @ r3<- CC
4849    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4850    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4851    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4852    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4853    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4854    .if 0
4855    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4856    beq     common_errDivideByZero
4857    .endif
4858    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4859
4860    eor     r0, r0, r2                           @ optional op; may set condition codes
4861    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4862    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4863    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4864    GOTO_OPCODE(ip)                     @ jump to next instruction
4865    /* 14-17 instructions */
4866
4867
4868/* ------------------------------ */
4869    .balign 64
4870.L_OP_SHL_LONG: /* 0xa3 */
4871/* File: armv5te/OP_SHL_LONG.S */
4872    /*
4873     * Long integer shift.  This is different from the generic 32/64-bit
4874     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4875     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4876     * 6 bits of the shift distance.
4877     */
4878    /* shl-long vAA, vBB, vCC */
4879    FETCH(r0, 1)                        @ r0<- CCBB
4880    mov     r9, rINST, lsr #8           @ r9<- AA
4881    and     r3, r0, #255                @ r3<- BB
4882    mov     r0, r0, lsr #8              @ r0<- CC
4883    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4884    GET_VREG(r2, r0)                    @ r2<- vCC
4885    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4886    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4887    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4888
4889    mov     r1, r1, asl r2              @  r1<- r1 << r2
4890    rsb     r3, r2, #32                 @  r3<- 32 - r2
4891    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
4892    subs    ip, r2, #32                 @  ip<- r2 - 32
4893    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
4894    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4895    b       .LOP_SHL_LONG_finish
4896
4897/* ------------------------------ */
4898    .balign 64
4899.L_OP_SHR_LONG: /* 0xa4 */
4900/* File: armv5te/OP_SHR_LONG.S */
4901    /*
4902     * Long integer shift.  This is different from the generic 32/64-bit
4903     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4904     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4905     * 6 bits of the shift distance.
4906     */
4907    /* shr-long vAA, vBB, vCC */
4908    FETCH(r0, 1)                        @ r0<- CCBB
4909    mov     r9, rINST, lsr #8           @ r9<- AA
4910    and     r3, r0, #255                @ r3<- BB
4911    mov     r0, r0, lsr #8              @ r0<- CC
4912    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4913    GET_VREG(r2, r0)                    @ r2<- vCC
4914    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4915    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4916    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4917
4918    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4919    rsb     r3, r2, #32                 @  r3<- 32 - r2
4920    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4921    subs    ip, r2, #32                 @  ip<- r2 - 32
4922    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
4923    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4924    b       .LOP_SHR_LONG_finish
4925
4926/* ------------------------------ */
4927    .balign 64
4928.L_OP_USHR_LONG: /* 0xa5 */
4929/* File: armv5te/OP_USHR_LONG.S */
4930    /*
4931     * Long integer shift.  This is different from the generic 32/64-bit
4932     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4933     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4934     * 6 bits of the shift distance.
4935     */
4936    /* ushr-long vAA, vBB, vCC */
4937    FETCH(r0, 1)                        @ r0<- CCBB
4938    mov     r9, rINST, lsr #8           @ r9<- AA
4939    and     r3, r0, #255                @ r3<- BB
4940    mov     r0, r0, lsr #8              @ r0<- CC
4941    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4942    GET_VREG(r2, r0)                    @ r2<- vCC
4943    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4944    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4945    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4946
4947    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4948    rsb     r3, r2, #32                 @  r3<- 32 - r2
4949    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4950    subs    ip, r2, #32                 @  ip<- r2 - 32
4951    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
4952    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4953    b       .LOP_USHR_LONG_finish
4954
4955/* ------------------------------ */
4956    .balign 64
4957.L_OP_ADD_FLOAT: /* 0xa6 */
4958/* File: armv5te/OP_ADD_FLOAT.S */
4959/* File: armv5te/binop.S */
4960    /*
4961     * Generic 32-bit binary operation.  Provide an "instr" line that
4962     * specifies an instruction that performs "result = r0 op r1".
4963     * This could be an ARM instruction or a function call.  (If the result
4964     * comes back in a register other than r0, you can override "result".)
4965     *
4966     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4967     * vCC (r1).  Useful for integer division and modulus.  Note that we
4968     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4969     * handles it correctly.
4970     *
4971     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4972     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4973     *      mul-float, div-float, rem-float
4974     */
4975    /* binop vAA, vBB, vCC */
4976    FETCH(r0, 1)                        @ r0<- CCBB
4977    mov     r9, rINST, lsr #8           @ r9<- AA
4978    mov     r3, r0, lsr #8              @ r3<- CC
4979    and     r2, r0, #255                @ r2<- BB
4980    GET_VREG(r1, r3)                    @ r1<- vCC
4981    GET_VREG(r0, r2)                    @ r0<- vBB
4982    .if 0
4983    cmp     r1, #0                      @ is second operand zero?
4984    beq     common_errDivideByZero
4985    .endif
4986
4987    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4988                               @ optional op; may set condition codes
4989    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
4990    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4991    SET_VREG(r0, r9)               @ vAA<- r0
4992    GOTO_OPCODE(ip)                     @ jump to next instruction
4993    /* 11-14 instructions */
4994
4995
4996/* ------------------------------ */
4997    .balign 64
4998.L_OP_SUB_FLOAT: /* 0xa7 */
4999/* File: armv5te/OP_SUB_FLOAT.S */
5000/* File: armv5te/binop.S */
5001    /*
5002     * Generic 32-bit binary operation.  Provide an "instr" line that
5003     * specifies an instruction that performs "result = r0 op r1".
5004     * This could be an ARM instruction or a function call.  (If the result
5005     * comes back in a register other than r0, you can override "result".)
5006     *
5007     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5008     * vCC (r1).  Useful for integer division and modulus.  Note that we
5009     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5010     * handles it correctly.
5011     *
5012     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5013     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5014     *      mul-float, div-float, rem-float
5015     */
5016    /* binop vAA, vBB, vCC */
5017    FETCH(r0, 1)                        @ r0<- CCBB
5018    mov     r9, rINST, lsr #8           @ r9<- AA
5019    mov     r3, r0, lsr #8              @ r3<- CC
5020    and     r2, r0, #255                @ r2<- BB
5021    GET_VREG(r1, r3)                    @ r1<- vCC
5022    GET_VREG(r0, r2)                    @ r0<- vBB
5023    .if 0
5024    cmp     r1, #0                      @ is second operand zero?
5025    beq     common_errDivideByZero
5026    .endif
5027
5028    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5029                               @ optional op; may set condition codes
5030    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
5031    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5032    SET_VREG(r0, r9)               @ vAA<- r0
5033    GOTO_OPCODE(ip)                     @ jump to next instruction
5034    /* 11-14 instructions */
5035
5036
5037/* ------------------------------ */
5038    .balign 64
5039.L_OP_MUL_FLOAT: /* 0xa8 */
5040/* File: armv5te/OP_MUL_FLOAT.S */
5041/* File: armv5te/binop.S */
5042    /*
5043     * Generic 32-bit binary operation.  Provide an "instr" line that
5044     * specifies an instruction that performs "result = r0 op r1".
5045     * This could be an ARM instruction or a function call.  (If the result
5046     * comes back in a register other than r0, you can override "result".)
5047     *
5048     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5049     * vCC (r1).  Useful for integer division and modulus.  Note that we
5050     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5051     * handles it correctly.
5052     *
5053     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5054     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5055     *      mul-float, div-float, rem-float
5056     */
5057    /* binop vAA, vBB, vCC */
5058    FETCH(r0, 1)                        @ r0<- CCBB
5059    mov     r9, rINST, lsr #8           @ r9<- AA
5060    mov     r3, r0, lsr #8              @ r3<- CC
5061    and     r2, r0, #255                @ r2<- BB
5062    GET_VREG(r1, r3)                    @ r1<- vCC
5063    GET_VREG(r0, r2)                    @ r0<- vBB
5064    .if 0
5065    cmp     r1, #0                      @ is second operand zero?
5066    beq     common_errDivideByZero
5067    .endif
5068
5069    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5070                               @ optional op; may set condition codes
5071    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
5072    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5073    SET_VREG(r0, r9)               @ vAA<- r0
5074    GOTO_OPCODE(ip)                     @ jump to next instruction
5075    /* 11-14 instructions */
5076
5077
5078/* ------------------------------ */
5079    .balign 64
5080.L_OP_DIV_FLOAT: /* 0xa9 */
5081/* File: armv5te/OP_DIV_FLOAT.S */
5082/* File: armv5te/binop.S */
5083    /*
5084     * Generic 32-bit binary operation.  Provide an "instr" line that
5085     * specifies an instruction that performs "result = r0 op r1".
5086     * This could be an ARM instruction or a function call.  (If the result
5087     * comes back in a register other than r0, you can override "result".)
5088     *
5089     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5090     * vCC (r1).  Useful for integer division and modulus.  Note that we
5091     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5092     * handles it correctly.
5093     *
5094     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5095     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5096     *      mul-float, div-float, rem-float
5097     */
5098    /* binop vAA, vBB, vCC */
5099    FETCH(r0, 1)                        @ r0<- CCBB
5100    mov     r9, rINST, lsr #8           @ r9<- AA
5101    mov     r3, r0, lsr #8              @ r3<- CC
5102    and     r2, r0, #255                @ r2<- BB
5103    GET_VREG(r1, r3)                    @ r1<- vCC
5104    GET_VREG(r0, r2)                    @ r0<- vBB
5105    .if 0
5106    cmp     r1, #0                      @ is second operand zero?
5107    beq     common_errDivideByZero
5108    .endif
5109
5110    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5111                               @ optional op; may set condition codes
5112    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
5113    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5114    SET_VREG(r0, r9)               @ vAA<- r0
5115    GOTO_OPCODE(ip)                     @ jump to next instruction
5116    /* 11-14 instructions */
5117
5118
5119/* ------------------------------ */
5120    .balign 64
5121.L_OP_REM_FLOAT: /* 0xaa */
5122/* File: armv5te/OP_REM_FLOAT.S */
5123/* EABI doesn't define a float remainder function, but libm does */
5124/* File: armv5te/binop.S */
5125    /*
5126     * Generic 32-bit binary operation.  Provide an "instr" line that
5127     * specifies an instruction that performs "result = r0 op r1".
5128     * This could be an ARM instruction or a function call.  (If the result
5129     * comes back in a register other than r0, you can override "result".)
5130     *
5131     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5132     * vCC (r1).  Useful for integer division and modulus.  Note that we
5133     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5134     * handles it correctly.
5135     *
5136     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5137     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5138     *      mul-float, div-float, rem-float
5139     */
5140    /* binop vAA, vBB, vCC */
5141    FETCH(r0, 1)                        @ r0<- CCBB
5142    mov     r9, rINST, lsr #8           @ r9<- AA
5143    mov     r3, r0, lsr #8              @ r3<- CC
5144    and     r2, r0, #255                @ r2<- BB
5145    GET_VREG(r1, r3)                    @ r1<- vCC
5146    GET_VREG(r0, r2)                    @ r0<- vBB
5147    .if 0
5148    cmp     r1, #0                      @ is second operand zero?
5149    beq     common_errDivideByZero
5150    .endif
5151
5152    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5153                               @ optional op; may set condition codes
5154    bl      fmodf                              @ r0<- op, r0-r3 changed
5155    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5156    SET_VREG(r0, r9)               @ vAA<- r0
5157    GOTO_OPCODE(ip)                     @ jump to next instruction
5158    /* 11-14 instructions */
5159
5160
5161/* ------------------------------ */
5162    .balign 64
5163.L_OP_ADD_DOUBLE: /* 0xab */
5164/* File: armv5te/OP_ADD_DOUBLE.S */
5165/* File: armv5te/binopWide.S */
5166    /*
5167     * Generic 64-bit binary operation.  Provide an "instr" line that
5168     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5169     * This could be an ARM instruction or a function call.  (If the result
5170     * comes back in a register other than r0, you can override "result".)
5171     *
5172     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5173     * vCC (r1).  Useful for integer division and modulus.
5174     *
5175     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5176     *      xor-long, add-double, sub-double, mul-double, div-double,
5177     *      rem-double
5178     *
5179     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5180     */
5181    /* binop vAA, vBB, vCC */
5182    FETCH(r0, 1)                        @ r0<- CCBB
5183    mov     r9, rINST, lsr #8           @ r9<- AA
5184    and     r2, r0, #255                @ r2<- BB
5185    mov     r3, r0, lsr #8              @ r3<- CC
5186    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5187    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5188    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5189    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5190    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5191    .if 0
5192    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5193    beq     common_errDivideByZero
5194    .endif
5195    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5196
5197                               @ optional op; may set condition codes
5198    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
5199    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5200    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5201    GOTO_OPCODE(ip)                     @ jump to next instruction
5202    /* 14-17 instructions */
5203
5204
5205/* ------------------------------ */
5206    .balign 64
5207.L_OP_SUB_DOUBLE: /* 0xac */
5208/* File: armv5te/OP_SUB_DOUBLE.S */
5209/* File: armv5te/binopWide.S */
5210    /*
5211     * Generic 64-bit binary operation.  Provide an "instr" line that
5212     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5213     * This could be an ARM instruction or a function call.  (If the result
5214     * comes back in a register other than r0, you can override "result".)
5215     *
5216     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5217     * vCC (r1).  Useful for integer division and modulus.
5218     *
5219     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5220     *      xor-long, add-double, sub-double, mul-double, div-double,
5221     *      rem-double
5222     *
5223     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5224     */
5225    /* binop vAA, vBB, vCC */
5226    FETCH(r0, 1)                        @ r0<- CCBB
5227    mov     r9, rINST, lsr #8           @ r9<- AA
5228    and     r2, r0, #255                @ r2<- BB
5229    mov     r3, r0, lsr #8              @ r3<- CC
5230    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5231    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5232    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5233    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5234    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5235    .if 0
5236    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5237    beq     common_errDivideByZero
5238    .endif
5239    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5240
5241                               @ optional op; may set condition codes
5242    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
5243    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5244    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5245    GOTO_OPCODE(ip)                     @ jump to next instruction
5246    /* 14-17 instructions */
5247
5248
5249/* ------------------------------ */
5250    .balign 64
5251.L_OP_MUL_DOUBLE: /* 0xad */
5252/* File: armv5te/OP_MUL_DOUBLE.S */
5253/* File: armv5te/binopWide.S */
5254    /*
5255     * Generic 64-bit binary operation.  Provide an "instr" line that
5256     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5257     * This could be an ARM instruction or a function call.  (If the result
5258     * comes back in a register other than r0, you can override "result".)
5259     *
5260     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5261     * vCC (r1).  Useful for integer division and modulus.
5262     *
5263     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5264     *      xor-long, add-double, sub-double, mul-double, div-double,
5265     *      rem-double
5266     *
5267     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5268     */
5269    /* binop vAA, vBB, vCC */
5270    FETCH(r0, 1)                        @ r0<- CCBB
5271    mov     r9, rINST, lsr #8           @ r9<- AA
5272    and     r2, r0, #255                @ r2<- BB
5273    mov     r3, r0, lsr #8              @ r3<- CC
5274    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5275    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5276    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5277    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5278    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5279    .if 0
5280    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5281    beq     common_errDivideByZero
5282    .endif
5283    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5284
5285                               @ optional op; may set condition codes
5286    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
5287    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5288    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5289    GOTO_OPCODE(ip)                     @ jump to next instruction
5290    /* 14-17 instructions */
5291
5292
5293/* ------------------------------ */
5294    .balign 64
5295.L_OP_DIV_DOUBLE: /* 0xae */
5296/* File: armv5te/OP_DIV_DOUBLE.S */
5297/* File: armv5te/binopWide.S */
5298    /*
5299     * Generic 64-bit binary operation.  Provide an "instr" line that
5300     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5301     * This could be an ARM instruction or a function call.  (If the result
5302     * comes back in a register other than r0, you can override "result".)
5303     *
5304     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5305     * vCC (r1).  Useful for integer division and modulus.
5306     *
5307     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5308     *      xor-long, add-double, sub-double, mul-double, div-double,
5309     *      rem-double
5310     *
5311     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5312     */
5313    /* binop vAA, vBB, vCC */
5314    FETCH(r0, 1)                        @ r0<- CCBB
5315    mov     r9, rINST, lsr #8           @ r9<- AA
5316    and     r2, r0, #255                @ r2<- BB
5317    mov     r3, r0, lsr #8              @ r3<- CC
5318    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5319    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5320    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5321    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5322    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5323    .if 0
5324    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5325    beq     common_errDivideByZero
5326    .endif
5327    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5328
5329                               @ optional op; may set condition codes
5330    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
5331    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5332    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5333    GOTO_OPCODE(ip)                     @ jump to next instruction
5334    /* 14-17 instructions */
5335
5336
5337/* ------------------------------ */
5338    .balign 64
5339.L_OP_REM_DOUBLE: /* 0xaf */
5340/* File: armv5te/OP_REM_DOUBLE.S */
5341/* EABI doesn't define a double remainder function, but libm does */
5342/* File: armv5te/binopWide.S */
5343    /*
5344     * Generic 64-bit binary operation.  Provide an "instr" line that
5345     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5346     * This could be an ARM instruction or a function call.  (If the result
5347     * comes back in a register other than r0, you can override "result".)
5348     *
5349     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5350     * vCC (r1).  Useful for integer division and modulus.
5351     *
5352     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5353     *      xor-long, add-double, sub-double, mul-double, div-double,
5354     *      rem-double
5355     *
5356     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5357     */
5358    /* binop vAA, vBB, vCC */
5359    FETCH(r0, 1)                        @ r0<- CCBB
5360    mov     r9, rINST, lsr #8           @ r9<- AA
5361    and     r2, r0, #255                @ r2<- BB
5362    mov     r3, r0, lsr #8              @ r3<- CC
5363    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5364    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5365    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5366    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5367    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5368    .if 0
5369    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5370    beq     common_errDivideByZero
5371    .endif
5372    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5373
5374                               @ optional op; may set condition codes
5375    bl      fmod                              @ result<- op, r0-r3 changed
5376    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5377    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5378    GOTO_OPCODE(ip)                     @ jump to next instruction
5379    /* 14-17 instructions */
5380
5381
5382/* ------------------------------ */
5383    .balign 64
5384.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5385/* File: armv5te/OP_ADD_INT_2ADDR.S */
5386/* File: armv5te/binop2addr.S */
5387    /*
5388     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5389     * that specifies an instruction that performs "result = r0 op r1".
5390     * This could be an ARM instruction or a function call.  (If the result
5391     * comes back in a register other than r0, you can override "result".)
5392     *
5393     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5394     * vCC (r1).  Useful for integer division and modulus.
5395     *
5396     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5397     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5398     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5399     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5400     */
5401    /* binop/2addr vA, vB */
5402    mov     r9, rINST, lsr #8           @ r9<- A+
5403    mov     r3, rINST, lsr #12          @ r3<- B
5404    and     r9, r9, #15
5405    GET_VREG(r1, r3)                    @ r1<- vB
5406    GET_VREG(r0, r9)                    @ r0<- vA
5407    .if 0
5408    cmp     r1, #0                      @ is second operand zero?
5409    beq     common_errDivideByZero
5410    .endif
5411    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5412
5413                               @ optional op; may set condition codes
5414    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5415    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5416    SET_VREG(r0, r9)               @ vAA<- r0
5417    GOTO_OPCODE(ip)                     @ jump to next instruction
5418    /* 10-13 instructions */
5419
5420
5421/* ------------------------------ */
5422    .balign 64
5423.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5424/* File: armv5te/OP_SUB_INT_2ADDR.S */
5425/* File: armv5te/binop2addr.S */
5426    /*
5427     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5428     * that specifies an instruction that performs "result = r0 op r1".
5429     * This could be an ARM instruction or a function call.  (If the result
5430     * comes back in a register other than r0, you can override "result".)
5431     *
5432     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5433     * vCC (r1).  Useful for integer division and modulus.
5434     *
5435     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5436     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5437     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5438     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5439     */
5440    /* binop/2addr vA, vB */
5441    mov     r9, rINST, lsr #8           @ r9<- A+
5442    mov     r3, rINST, lsr #12          @ r3<- B
5443    and     r9, r9, #15
5444    GET_VREG(r1, r3)                    @ r1<- vB
5445    GET_VREG(r0, r9)                    @ r0<- vA
5446    .if 0
5447    cmp     r1, #0                      @ is second operand zero?
5448    beq     common_errDivideByZero
5449    .endif
5450    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5451
5452                               @ optional op; may set condition codes
5453    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5454    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5455    SET_VREG(r0, r9)               @ vAA<- r0
5456    GOTO_OPCODE(ip)                     @ jump to next instruction
5457    /* 10-13 instructions */
5458
5459
5460/* ------------------------------ */
5461    .balign 64
5462.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5463/* File: armv5te/OP_MUL_INT_2ADDR.S */
5464/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5465/* File: armv5te/binop2addr.S */
5466    /*
5467     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5468     * that specifies an instruction that performs "result = r0 op r1".
5469     * This could be an ARM instruction or a function call.  (If the result
5470     * comes back in a register other than r0, you can override "result".)
5471     *
5472     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5473     * vCC (r1).  Useful for integer division and modulus.
5474     *
5475     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5476     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5477     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5478     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5479     */
5480    /* binop/2addr vA, vB */
5481    mov     r9, rINST, lsr #8           @ r9<- A+
5482    mov     r3, rINST, lsr #12          @ r3<- B
5483    and     r9, r9, #15
5484    GET_VREG(r1, r3)                    @ r1<- vB
5485    GET_VREG(r0, r9)                    @ r0<- vA
5486    .if 0
5487    cmp     r1, #0                      @ is second operand zero?
5488    beq     common_errDivideByZero
5489    .endif
5490    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5491
5492                               @ optional op; may set condition codes
5493    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5494    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5495    SET_VREG(r0, r9)               @ vAA<- r0
5496    GOTO_OPCODE(ip)                     @ jump to next instruction
5497    /* 10-13 instructions */
5498
5499
5500/* ------------------------------ */
5501    .balign 64
5502.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5503/* File: armv5te/OP_DIV_INT_2ADDR.S */
5504/* File: armv5te/binop2addr.S */
5505    /*
5506     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5507     * that specifies an instruction that performs "result = r0 op r1".
5508     * This could be an ARM instruction or a function call.  (If the result
5509     * comes back in a register other than r0, you can override "result".)
5510     *
5511     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5512     * vCC (r1).  Useful for integer division and modulus.
5513     *
5514     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5515     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5516     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5517     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5518     */
5519    /* binop/2addr vA, vB */
5520    mov     r9, rINST, lsr #8           @ r9<- A+
5521    mov     r3, rINST, lsr #12          @ r3<- B
5522    and     r9, r9, #15
5523    GET_VREG(r1, r3)                    @ r1<- vB
5524    GET_VREG(r0, r9)                    @ r0<- vA
5525    .if 1
5526    cmp     r1, #0                      @ is second operand zero?
5527    beq     common_errDivideByZero
5528    .endif
5529    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5530
5531                               @ optional op; may set condition codes
5532    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5533    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5534    SET_VREG(r0, r9)               @ vAA<- r0
5535    GOTO_OPCODE(ip)                     @ jump to next instruction
5536    /* 10-13 instructions */
5537
5538
5539/* ------------------------------ */
5540    .balign 64
5541.L_OP_REM_INT_2ADDR: /* 0xb4 */
5542/* File: armv5te/OP_REM_INT_2ADDR.S */
5543/* idivmod returns quotient in r0 and remainder in r1 */
5544/* File: armv5te/binop2addr.S */
5545    /*
5546     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5547     * that specifies an instruction that performs "result = r0 op r1".
5548     * This could be an ARM instruction or a function call.  (If the result
5549     * comes back in a register other than r0, you can override "result".)
5550     *
5551     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5552     * vCC (r1).  Useful for integer division and modulus.
5553     *
5554     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5555     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5556     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5557     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5558     */
5559    /* binop/2addr vA, vB */
5560    mov     r9, rINST, lsr #8           @ r9<- A+
5561    mov     r3, rINST, lsr #12          @ r3<- B
5562    and     r9, r9, #15
5563    GET_VREG(r1, r3)                    @ r1<- vB
5564    GET_VREG(r0, r9)                    @ r0<- vA
5565    .if 1
5566    cmp     r1, #0                      @ is second operand zero?
5567    beq     common_errDivideByZero
5568    .endif
5569    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5570
5571                               @ optional op; may set condition codes
5572    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5573    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5574    SET_VREG(r1, r9)               @ vAA<- r1
5575    GOTO_OPCODE(ip)                     @ jump to next instruction
5576    /* 10-13 instructions */
5577
5578
5579/* ------------------------------ */
5580    .balign 64
5581.L_OP_AND_INT_2ADDR: /* 0xb5 */
5582/* File: armv5te/OP_AND_INT_2ADDR.S */
5583/* File: armv5te/binop2addr.S */
5584    /*
5585     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5586     * that specifies an instruction that performs "result = r0 op r1".
5587     * This could be an ARM instruction or a function call.  (If the result
5588     * comes back in a register other than r0, you can override "result".)
5589     *
5590     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5591     * vCC (r1).  Useful for integer division and modulus.
5592     *
5593     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5594     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5595     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5596     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5597     */
5598    /* binop/2addr vA, vB */
5599    mov     r9, rINST, lsr #8           @ r9<- A+
5600    mov     r3, rINST, lsr #12          @ r3<- B
5601    and     r9, r9, #15
5602    GET_VREG(r1, r3)                    @ r1<- vB
5603    GET_VREG(r0, r9)                    @ r0<- vA
5604    .if 0
5605    cmp     r1, #0                      @ is second operand zero?
5606    beq     common_errDivideByZero
5607    .endif
5608    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5609
5610                               @ optional op; may set condition codes
5611    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5612    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5613    SET_VREG(r0, r9)               @ vAA<- r0
5614    GOTO_OPCODE(ip)                     @ jump to next instruction
5615    /* 10-13 instructions */
5616
5617
5618/* ------------------------------ */
5619    .balign 64
5620.L_OP_OR_INT_2ADDR: /* 0xb6 */
5621/* File: armv5te/OP_OR_INT_2ADDR.S */
5622/* File: armv5te/binop2addr.S */
5623    /*
5624     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5625     * that specifies an instruction that performs "result = r0 op r1".
5626     * This could be an ARM instruction or a function call.  (If the result
5627     * comes back in a register other than r0, you can override "result".)
5628     *
5629     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5630     * vCC (r1).  Useful for integer division and modulus.
5631     *
5632     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5633     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5634     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5635     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5636     */
5637    /* binop/2addr vA, vB */
5638    mov     r9, rINST, lsr #8           @ r9<- A+
5639    mov     r3, rINST, lsr #12          @ r3<- B
5640    and     r9, r9, #15
5641    GET_VREG(r1, r3)                    @ r1<- vB
5642    GET_VREG(r0, r9)                    @ r0<- vA
5643    .if 0
5644    cmp     r1, #0                      @ is second operand zero?
5645    beq     common_errDivideByZero
5646    .endif
5647    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5648
5649                               @ optional op; may set condition codes
5650    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5651    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5652    SET_VREG(r0, r9)               @ vAA<- r0
5653    GOTO_OPCODE(ip)                     @ jump to next instruction
5654    /* 10-13 instructions */
5655
5656
5657/* ------------------------------ */
5658    .balign 64
5659.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5660/* File: armv5te/OP_XOR_INT_2ADDR.S */
5661/* File: armv5te/binop2addr.S */
5662    /*
5663     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5664     * that specifies an instruction that performs "result = r0 op r1".
5665     * This could be an ARM instruction or a function call.  (If the result
5666     * comes back in a register other than r0, you can override "result".)
5667     *
5668     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5669     * vCC (r1).  Useful for integer division and modulus.
5670     *
5671     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5672     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5673     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5674     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5675     */
5676    /* binop/2addr vA, vB */
5677    mov     r9, rINST, lsr #8           @ r9<- A+
5678    mov     r3, rINST, lsr #12          @ r3<- B
5679    and     r9, r9, #15
5680    GET_VREG(r1, r3)                    @ r1<- vB
5681    GET_VREG(r0, r9)                    @ r0<- vA
5682    .if 0
5683    cmp     r1, #0                      @ is second operand zero?
5684    beq     common_errDivideByZero
5685    .endif
5686    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5687
5688                               @ optional op; may set condition codes
5689    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5690    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5691    SET_VREG(r0, r9)               @ vAA<- r0
5692    GOTO_OPCODE(ip)                     @ jump to next instruction
5693    /* 10-13 instructions */
5694
5695
5696/* ------------------------------ */
5697    .balign 64
5698.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5699/* File: armv5te/OP_SHL_INT_2ADDR.S */
5700/* File: armv5te/binop2addr.S */
5701    /*
5702     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5703     * that specifies an instruction that performs "result = r0 op r1".
5704     * This could be an ARM instruction or a function call.  (If the result
5705     * comes back in a register other than r0, you can override "result".)
5706     *
5707     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5708     * vCC (r1).  Useful for integer division and modulus.
5709     *
5710     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5711     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5712     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5713     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5714     */
5715    /* binop/2addr vA, vB */
5716    mov     r9, rINST, lsr #8           @ r9<- A+
5717    mov     r3, rINST, lsr #12          @ r3<- B
5718    and     r9, r9, #15
5719    GET_VREG(r1, r3)                    @ r1<- vB
5720    GET_VREG(r0, r9)                    @ r0<- vA
5721    .if 0
5722    cmp     r1, #0                      @ is second operand zero?
5723    beq     common_errDivideByZero
5724    .endif
5725    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5726
5727    and     r1, r1, #31                           @ optional op; may set condition codes
5728    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5729    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5730    SET_VREG(r0, r9)               @ vAA<- r0
5731    GOTO_OPCODE(ip)                     @ jump to next instruction
5732    /* 10-13 instructions */
5733
5734
5735/* ------------------------------ */
5736    .balign 64
5737.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5738/* File: armv5te/OP_SHR_INT_2ADDR.S */
5739/* File: armv5te/binop2addr.S */
5740    /*
5741     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5742     * that specifies an instruction that performs "result = r0 op r1".
5743     * This could be an ARM instruction or a function call.  (If the result
5744     * comes back in a register other than r0, you can override "result".)
5745     *
5746     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5747     * vCC (r1).  Useful for integer division and modulus.
5748     *
5749     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5750     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5751     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5752     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5753     */
5754    /* binop/2addr vA, vB */
5755    mov     r9, rINST, lsr #8           @ r9<- A+
5756    mov     r3, rINST, lsr #12          @ r3<- B
5757    and     r9, r9, #15
5758    GET_VREG(r1, r3)                    @ r1<- vB
5759    GET_VREG(r0, r9)                    @ r0<- vA
5760    .if 0
5761    cmp     r1, #0                      @ is second operand zero?
5762    beq     common_errDivideByZero
5763    .endif
5764    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5765
5766    and     r1, r1, #31                           @ optional op; may set condition codes
5767    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5768    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5769    SET_VREG(r0, r9)               @ vAA<- r0
5770    GOTO_OPCODE(ip)                     @ jump to next instruction
5771    /* 10-13 instructions */
5772
5773
5774/* ------------------------------ */
5775    .balign 64
5776.L_OP_USHR_INT_2ADDR: /* 0xba */
5777/* File: armv5te/OP_USHR_INT_2ADDR.S */
5778/* File: armv5te/binop2addr.S */
5779    /*
5780     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5781     * that specifies an instruction that performs "result = r0 op r1".
5782     * This could be an ARM instruction or a function call.  (If the result
5783     * comes back in a register other than r0, you can override "result".)
5784     *
5785     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5786     * vCC (r1).  Useful for integer division and modulus.
5787     *
5788     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5789     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5790     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5791     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5792     */
5793    /* binop/2addr vA, vB */
5794    mov     r9, rINST, lsr #8           @ r9<- A+
5795    mov     r3, rINST, lsr #12          @ r3<- B
5796    and     r9, r9, #15
5797    GET_VREG(r1, r3)                    @ r1<- vB
5798    GET_VREG(r0, r9)                    @ r0<- vA
5799    .if 0
5800    cmp     r1, #0                      @ is second operand zero?
5801    beq     common_errDivideByZero
5802    .endif
5803    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5804
5805    and     r1, r1, #31                           @ optional op; may set condition codes
5806    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5807    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5808    SET_VREG(r0, r9)               @ vAA<- r0
5809    GOTO_OPCODE(ip)                     @ jump to next instruction
5810    /* 10-13 instructions */
5811
5812
5813/* ------------------------------ */
5814    .balign 64
5815.L_OP_ADD_LONG_2ADDR: /* 0xbb */
5816/* File: armv5te/OP_ADD_LONG_2ADDR.S */
5817/* File: armv5te/binopWide2addr.S */
5818    /*
5819     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5820     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5821     * This could be an ARM instruction or a function call.  (If the result
5822     * comes back in a register other than r0, you can override "result".)
5823     *
5824     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5825     * vCC (r1).  Useful for integer division and modulus.
5826     *
5827     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5828     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5829     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5830     *      rem-double/2addr
5831     */
5832    /* binop/2addr vA, vB */
5833    mov     r9, rINST, lsr #8           @ r9<- A+
5834    mov     r1, rINST, lsr #12          @ r1<- B
5835    and     r9, r9, #15
5836    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5837    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5838    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5839    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5840    .if 0
5841    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5842    beq     common_errDivideByZero
5843    .endif
5844    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5845
5846    adds    r0, r0, r2                           @ optional op; may set condition codes
5847    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5848    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5849    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5850    GOTO_OPCODE(ip)                     @ jump to next instruction
5851    /* 12-15 instructions */
5852
5853
5854/* ------------------------------ */
5855    .balign 64
5856.L_OP_SUB_LONG_2ADDR: /* 0xbc */
5857/* File: armv5te/OP_SUB_LONG_2ADDR.S */
5858/* File: armv5te/binopWide2addr.S */
5859    /*
5860     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5861     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5862     * This could be an ARM instruction or a function call.  (If the result
5863     * comes back in a register other than r0, you can override "result".)
5864     *
5865     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5866     * vCC (r1).  Useful for integer division and modulus.
5867     *
5868     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5869     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5870     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5871     *      rem-double/2addr
5872     */
5873    /* binop/2addr vA, vB */
5874    mov     r9, rINST, lsr #8           @ r9<- A+
5875    mov     r1, rINST, lsr #12          @ r1<- B
5876    and     r9, r9, #15
5877    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5878    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5879    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5880    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5881    .if 0
5882    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5883    beq     common_errDivideByZero
5884    .endif
5885    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5886
5887    subs    r0, r0, r2                           @ optional op; may set condition codes
5888    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5889    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5890    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5891    GOTO_OPCODE(ip)                     @ jump to next instruction
5892    /* 12-15 instructions */
5893
5894
5895/* ------------------------------ */
5896    .balign 64
5897.L_OP_MUL_LONG_2ADDR: /* 0xbd */
5898/* File: armv5te/OP_MUL_LONG_2ADDR.S */
5899    /*
5900     * Signed 64-bit integer multiply, "/2addr" version.
5901     *
5902     * See OP_MUL_LONG for an explanation.
5903     *
5904     * We get a little tight on registers, so to avoid looking up &fp[A]
5905     * again we stuff it into rINST.
5906     */
5907    /* mul-long/2addr vA, vB */
5908    mov     r9, rINST, lsr #8           @ r9<- A+
5909    mov     r1, rINST, lsr #12          @ r1<- B
5910    and     r9, r9, #15
5911    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5912    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
5913    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5914    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
5915    mul     ip, r2, r1                  @  ip<- ZxW
5916    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
5917    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
5918    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
5919    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5920    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
5921    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5922    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
5923    GOTO_OPCODE(ip)                     @ jump to next instruction
5924
5925/* ------------------------------ */
5926    .balign 64
5927.L_OP_DIV_LONG_2ADDR: /* 0xbe */
5928/* File: armv5te/OP_DIV_LONG_2ADDR.S */
5929/* File: armv5te/binopWide2addr.S */
5930    /*
5931     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5932     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5933     * This could be an ARM instruction or a function call.  (If the result
5934     * comes back in a register other than r0, you can override "result".)
5935     *
5936     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5937     * vCC (r1).  Useful for integer division and modulus.
5938     *
5939     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5940     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5941     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5942     *      rem-double/2addr
5943     */
5944    /* binop/2addr vA, vB */
5945    mov     r9, rINST, lsr #8           @ r9<- A+
5946    mov     r1, rINST, lsr #12          @ r1<- B
5947    and     r9, r9, #15
5948    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5949    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5950    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5951    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5952    .if 1
5953    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5954    beq     common_errDivideByZero
5955    .endif
5956    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5957
5958                               @ optional op; may set condition codes
5959    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5960    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5961    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5962    GOTO_OPCODE(ip)                     @ jump to next instruction
5963    /* 12-15 instructions */
5964
5965
5966/* ------------------------------ */
5967    .balign 64
5968.L_OP_REM_LONG_2ADDR: /* 0xbf */
5969/* File: armv5te/OP_REM_LONG_2ADDR.S */
5970/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5971/* File: armv5te/binopWide2addr.S */
5972    /*
5973     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5974     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5975     * This could be an ARM instruction or a function call.  (If the result
5976     * comes back in a register other than r0, you can override "result".)
5977     *
5978     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5979     * vCC (r1).  Useful for integer division and modulus.
5980     *
5981     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5982     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5983     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5984     *      rem-double/2addr
5985     */
5986    /* binop/2addr vA, vB */
5987    mov     r9, rINST, lsr #8           @ r9<- A+
5988    mov     r1, rINST, lsr #12          @ r1<- B
5989    and     r9, r9, #15
5990    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5991    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5992    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5993    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5994    .if 1
5995    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5996    beq     common_errDivideByZero
5997    .endif
5998    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5999
6000                               @ optional op; may set condition codes
6001    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
6002    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6003    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
6004    GOTO_OPCODE(ip)                     @ jump to next instruction
6005    /* 12-15 instructions */
6006
6007
6008/* ------------------------------ */
6009    .balign 64
6010.L_OP_AND_LONG_2ADDR: /* 0xc0 */
6011/* File: armv5te/OP_AND_LONG_2ADDR.S */
6012/* File: armv5te/binopWide2addr.S */
6013    /*
6014     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6015     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6016     * This could be an ARM instruction or a function call.  (If the result
6017     * comes back in a register other than r0, you can override "result".)
6018     *
6019     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6020     * vCC (r1).  Useful for integer division and modulus.
6021     *
6022     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6023     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6024     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6025     *      rem-double/2addr
6026     */
6027    /* binop/2addr vA, vB */
6028    mov     r9, rINST, lsr #8           @ r9<- A+
6029    mov     r1, rINST, lsr #12          @ r1<- B
6030    and     r9, r9, #15
6031    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6032    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6033    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6034    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6035    .if 0
6036    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6037    beq     common_errDivideByZero
6038    .endif
6039    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6040
6041    and     r0, r0, r2                           @ optional op; may set condition codes
6042    and     r1, r1, r3                              @ result<- op, r0-r3 changed
6043    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6044    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6045    GOTO_OPCODE(ip)                     @ jump to next instruction
6046    /* 12-15 instructions */
6047
6048
6049/* ------------------------------ */
6050    .balign 64
6051.L_OP_OR_LONG_2ADDR: /* 0xc1 */
6052/* File: armv5te/OP_OR_LONG_2ADDR.S */
6053/* File: armv5te/binopWide2addr.S */
6054    /*
6055     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6056     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6057     * This could be an ARM instruction or a function call.  (If the result
6058     * comes back in a register other than r0, you can override "result".)
6059     *
6060     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6061     * vCC (r1).  Useful for integer division and modulus.
6062     *
6063     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6064     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6065     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6066     *      rem-double/2addr
6067     */
6068    /* binop/2addr vA, vB */
6069    mov     r9, rINST, lsr #8           @ r9<- A+
6070    mov     r1, rINST, lsr #12          @ r1<- B
6071    and     r9, r9, #15
6072    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6073    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6074    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6075    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6076    .if 0
6077    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6078    beq     common_errDivideByZero
6079    .endif
6080    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6081
6082    orr     r0, r0, r2                           @ optional op; may set condition codes
6083    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
6084    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6085    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6086    GOTO_OPCODE(ip)                     @ jump to next instruction
6087    /* 12-15 instructions */
6088
6089
6090/* ------------------------------ */
6091    .balign 64
6092.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
6093/* File: armv5te/OP_XOR_LONG_2ADDR.S */
6094/* File: armv5te/binopWide2addr.S */
6095    /*
6096     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6097     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6098     * This could be an ARM instruction or a function call.  (If the result
6099     * comes back in a register other than r0, you can override "result".)
6100     *
6101     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6102     * vCC (r1).  Useful for integer division and modulus.
6103     *
6104     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6105     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6106     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6107     *      rem-double/2addr
6108     */
6109    /* binop/2addr vA, vB */
6110    mov     r9, rINST, lsr #8           @ r9<- A+
6111    mov     r1, rINST, lsr #12          @ r1<- B
6112    and     r9, r9, #15
6113    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6114    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6115    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6116    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6117    .if 0
6118    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6119    beq     common_errDivideByZero
6120    .endif
6121    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6122
6123    eor     r0, r0, r2                           @ optional op; may set condition codes
6124    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
6125    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6126    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6127    GOTO_OPCODE(ip)                     @ jump to next instruction
6128    /* 12-15 instructions */
6129
6130
6131/* ------------------------------ */
6132    .balign 64
6133.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
6134/* File: armv5te/OP_SHL_LONG_2ADDR.S */
6135    /*
6136     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6137     * 32-bit shift distance.
6138     */
6139    /* shl-long/2addr vA, vB */
6140    mov     r9, rINST, lsr #8           @ r9<- A+
6141    mov     r3, rINST, lsr #12          @ r3<- B
6142    and     r9, r9, #15
6143    GET_VREG(r2, r3)                    @ r2<- vB
6144    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6145    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6146    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6147
6148    mov     r1, r1, asl r2              @  r1<- r1 << r2
6149    rsb     r3, r2, #32                 @  r3<- 32 - r2
6150    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
6151    subs    ip, r2, #32                 @  ip<- r2 - 32
6152    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6153    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
6154    mov     r0, r0, asl r2              @  r0<- r0 << r2
6155    b       .LOP_SHL_LONG_2ADDR_finish
6156
6157/* ------------------------------ */
6158    .balign 64
6159.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
6160/* File: armv5te/OP_SHR_LONG_2ADDR.S */
6161    /*
6162     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6163     * 32-bit shift distance.
6164     */
6165    /* shr-long/2addr vA, vB */
6166    mov     r9, rINST, lsr #8           @ r9<- A+
6167    mov     r3, rINST, lsr #12          @ r3<- B
6168    and     r9, r9, #15
6169    GET_VREG(r2, r3)                    @ r2<- vB
6170    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6171    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6172    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6173
6174    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6175    rsb     r3, r2, #32                 @  r3<- 32 - r2
6176    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6177    subs    ip, r2, #32                 @  ip<- r2 - 32
6178    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6179    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
6180    mov     r1, r1, asr r2              @  r1<- r1 >> r2
6181    b       .LOP_SHR_LONG_2ADDR_finish
6182
6183/* ------------------------------ */
6184    .balign 64
6185.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
6186/* File: armv5te/OP_USHR_LONG_2ADDR.S */
6187    /*
6188     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6189     * 32-bit shift distance.
6190     */
6191    /* ushr-long/2addr vA, vB */
6192    mov     r9, rINST, lsr #8           @ r9<- A+
6193    mov     r3, rINST, lsr #12          @ r3<- B
6194    and     r9, r9, #15
6195    GET_VREG(r2, r3)                    @ r2<- vB
6196    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6197    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6198    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6199
6200    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6201    rsb     r3, r2, #32                 @  r3<- 32 - r2
6202    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6203    subs    ip, r2, #32                 @  ip<- r2 - 32
6204    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6205    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
6206    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
6207    b       .LOP_USHR_LONG_2ADDR_finish
6208
6209/* ------------------------------ */
6210    .balign 64
6211.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
6212/* File: armv5te/OP_ADD_FLOAT_2ADDR.S */
6213/* File: armv5te/binop2addr.S */
6214    /*
6215     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6216     * that specifies an instruction that performs "result = r0 op r1".
6217     * This could be an ARM instruction or a function call.  (If the result
6218     * comes back in a register other than r0, you can override "result".)
6219     *
6220     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6221     * vCC (r1).  Useful for integer division and modulus.
6222     *
6223     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6224     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6225     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6226     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6227     */
6228    /* binop/2addr vA, vB */
6229    mov     r9, rINST, lsr #8           @ r9<- A+
6230    mov     r3, rINST, lsr #12          @ r3<- B
6231    and     r9, r9, #15
6232    GET_VREG(r1, r3)                    @ r1<- vB
6233    GET_VREG(r0, r9)                    @ r0<- vA
6234    .if 0
6235    cmp     r1, #0                      @ is second operand zero?
6236    beq     common_errDivideByZero
6237    .endif
6238    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6239
6240                               @ optional op; may set condition codes
6241    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
6242    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6243    SET_VREG(r0, r9)               @ vAA<- r0
6244    GOTO_OPCODE(ip)                     @ jump to next instruction
6245    /* 10-13 instructions */
6246
6247
6248/* ------------------------------ */
6249    .balign 64
6250.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6251/* File: armv5te/OP_SUB_FLOAT_2ADDR.S */
6252/* File: armv5te/binop2addr.S */
6253    /*
6254     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6255     * that specifies an instruction that performs "result = r0 op r1".
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-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6263     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6264     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6265     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6266     */
6267    /* binop/2addr vA, vB */
6268    mov     r9, rINST, lsr #8           @ r9<- A+
6269    mov     r3, rINST, lsr #12          @ r3<- B
6270    and     r9, r9, #15
6271    GET_VREG(r1, r3)                    @ r1<- vB
6272    GET_VREG(r0, r9)                    @ r0<- vA
6273    .if 0
6274    cmp     r1, #0                      @ is second operand zero?
6275    beq     common_errDivideByZero
6276    .endif
6277    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6278
6279                               @ optional op; may set condition codes
6280    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
6281    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6282    SET_VREG(r0, r9)               @ vAA<- r0
6283    GOTO_OPCODE(ip)                     @ jump to next instruction
6284    /* 10-13 instructions */
6285
6286
6287/* ------------------------------ */
6288    .balign 64
6289.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6290/* File: armv5te/OP_MUL_FLOAT_2ADDR.S */
6291/* File: armv5te/binop2addr.S */
6292    /*
6293     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6294     * that specifies an instruction that performs "result = r0 op r1".
6295     * This could be an ARM instruction or a function call.  (If the result
6296     * comes back in a register other than r0, you can override "result".)
6297     *
6298     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6299     * vCC (r1).  Useful for integer division and modulus.
6300     *
6301     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6302     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6303     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6304     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6305     */
6306    /* binop/2addr vA, vB */
6307    mov     r9, rINST, lsr #8           @ r9<- A+
6308    mov     r3, rINST, lsr #12          @ r3<- B
6309    and     r9, r9, #15
6310    GET_VREG(r1, r3)                    @ r1<- vB
6311    GET_VREG(r0, r9)                    @ r0<- vA
6312    .if 0
6313    cmp     r1, #0                      @ is second operand zero?
6314    beq     common_errDivideByZero
6315    .endif
6316    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6317
6318                               @ optional op; may set condition codes
6319    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
6320    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6321    SET_VREG(r0, r9)               @ vAA<- r0
6322    GOTO_OPCODE(ip)                     @ jump to next instruction
6323    /* 10-13 instructions */
6324
6325
6326/* ------------------------------ */
6327    .balign 64
6328.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6329/* File: armv5te/OP_DIV_FLOAT_2ADDR.S */
6330/* File: armv5te/binop2addr.S */
6331    /*
6332     * Generic 32-bit "/2addr" 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/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6341     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6342     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6343     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6344     */
6345    /* binop/2addr vA, vB */
6346    mov     r9, rINST, lsr #8           @ r9<- A+
6347    mov     r3, rINST, lsr #12          @ r3<- B
6348    and     r9, r9, #15
6349    GET_VREG(r1, r3)                    @ r1<- vB
6350    GET_VREG(r0, r9)                    @ r0<- vA
6351    .if 0
6352    cmp     r1, #0                      @ is second operand zero?
6353    beq     common_errDivideByZero
6354    .endif
6355    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6356
6357                               @ optional op; may set condition codes
6358    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
6359    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6360    SET_VREG(r0, r9)               @ vAA<- r0
6361    GOTO_OPCODE(ip)                     @ jump to next instruction
6362    /* 10-13 instructions */
6363
6364
6365/* ------------------------------ */
6366    .balign 64
6367.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6368/* File: armv5te/OP_REM_FLOAT_2ADDR.S */
6369/* EABI doesn't define a float remainder function, but libm does */
6370/* File: armv5te/binop2addr.S */
6371    /*
6372     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6373     * that specifies an instruction that performs "result = r0 op r1".
6374     * This could be an ARM instruction or a function call.  (If the result
6375     * comes back in a register other than r0, you can override "result".)
6376     *
6377     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6378     * vCC (r1).  Useful for integer division and modulus.
6379     *
6380     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6381     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6382     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6383     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6384     */
6385    /* binop/2addr vA, vB */
6386    mov     r9, rINST, lsr #8           @ r9<- A+
6387    mov     r3, rINST, lsr #12          @ r3<- B
6388    and     r9, r9, #15
6389    GET_VREG(r1, r3)                    @ r1<- vB
6390    GET_VREG(r0, r9)                    @ r0<- vA
6391    .if 0
6392    cmp     r1, #0                      @ is second operand zero?
6393    beq     common_errDivideByZero
6394    .endif
6395    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6396
6397                               @ optional op; may set condition codes
6398    bl      fmodf                              @ r0<- op, r0-r3 changed
6399    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6400    SET_VREG(r0, r9)               @ vAA<- r0
6401    GOTO_OPCODE(ip)                     @ jump to next instruction
6402    /* 10-13 instructions */
6403
6404
6405/* ------------------------------ */
6406    .balign 64
6407.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6408/* File: armv5te/OP_ADD_DOUBLE_2ADDR.S */
6409/* File: armv5te/binopWide2addr.S */
6410    /*
6411     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6412     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6413     * This could be an ARM instruction or a function call.  (If the result
6414     * comes back in a register other than r0, you can override "result".)
6415     *
6416     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6417     * vCC (r1).  Useful for integer division and modulus.
6418     *
6419     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6420     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6421     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6422     *      rem-double/2addr
6423     */
6424    /* binop/2addr vA, vB */
6425    mov     r9, rINST, lsr #8           @ r9<- A+
6426    mov     r1, rINST, lsr #12          @ r1<- B
6427    and     r9, r9, #15
6428    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6429    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6430    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6431    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6432    .if 0
6433    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6434    beq     common_errDivideByZero
6435    .endif
6436    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6437
6438                               @ optional op; may set condition codes
6439    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
6440    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6441    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6442    GOTO_OPCODE(ip)                     @ jump to next instruction
6443    /* 12-15 instructions */
6444
6445
6446/* ------------------------------ */
6447    .balign 64
6448.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6449/* File: armv5te/OP_SUB_DOUBLE_2ADDR.S */
6450/* File: armv5te/binopWide2addr.S */
6451    /*
6452     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6453     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6454     * This could be an ARM instruction or a function call.  (If the result
6455     * comes back in a register other than r0, you can override "result".)
6456     *
6457     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6458     * vCC (r1).  Useful for integer division and modulus.
6459     *
6460     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6461     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6462     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6463     *      rem-double/2addr
6464     */
6465    /* binop/2addr vA, vB */
6466    mov     r9, rINST, lsr #8           @ r9<- A+
6467    mov     r1, rINST, lsr #12          @ r1<- B
6468    and     r9, r9, #15
6469    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6470    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6471    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6472    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6473    .if 0
6474    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6475    beq     common_errDivideByZero
6476    .endif
6477    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6478
6479                               @ optional op; may set condition codes
6480    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
6481    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6482    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6483    GOTO_OPCODE(ip)                     @ jump to next instruction
6484    /* 12-15 instructions */
6485
6486
6487/* ------------------------------ */
6488    .balign 64
6489.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6490/* File: armv5te/OP_MUL_DOUBLE_2ADDR.S */
6491/* File: armv5te/binopWide2addr.S */
6492    /*
6493     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6494     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6495     * This could be an ARM instruction or a function call.  (If the result
6496     * comes back in a register other than r0, you can override "result".)
6497     *
6498     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6499     * vCC (r1).  Useful for integer division and modulus.
6500     *
6501     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6502     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6503     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6504     *      rem-double/2addr
6505     */
6506    /* binop/2addr vA, vB */
6507    mov     r9, rINST, lsr #8           @ r9<- A+
6508    mov     r1, rINST, lsr #12          @ r1<- B
6509    and     r9, r9, #15
6510    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6511    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6512    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6513    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6514    .if 0
6515    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6516    beq     common_errDivideByZero
6517    .endif
6518    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6519
6520                               @ optional op; may set condition codes
6521    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
6522    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6523    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6524    GOTO_OPCODE(ip)                     @ jump to next instruction
6525    /* 12-15 instructions */
6526
6527
6528/* ------------------------------ */
6529    .balign 64
6530.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6531/* File: armv5te/OP_DIV_DOUBLE_2ADDR.S */
6532/* File: armv5te/binopWide2addr.S */
6533    /*
6534     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6535     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6536     * This could be an ARM instruction or a function call.  (If the result
6537     * comes back in a register other than r0, you can override "result".)
6538     *
6539     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6540     * vCC (r1).  Useful for integer division and modulus.
6541     *
6542     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6543     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6544     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6545     *      rem-double/2addr
6546     */
6547    /* binop/2addr vA, vB */
6548    mov     r9, rINST, lsr #8           @ r9<- A+
6549    mov     r1, rINST, lsr #12          @ r1<- B
6550    and     r9, r9, #15
6551    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6552    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6553    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6554    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6555    .if 0
6556    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6557    beq     common_errDivideByZero
6558    .endif
6559    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6560
6561                               @ optional op; may set condition codes
6562    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
6563    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6564    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6565    GOTO_OPCODE(ip)                     @ jump to next instruction
6566    /* 12-15 instructions */
6567
6568
6569/* ------------------------------ */
6570    .balign 64
6571.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6572/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */
6573/* EABI doesn't define a double remainder function, but libm does */
6574/* File: armv5te/binopWide2addr.S */
6575    /*
6576     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6577     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6578     * This could be an ARM instruction or a function call.  (If the result
6579     * comes back in a register other than r0, you can override "result".)
6580     *
6581     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6582     * vCC (r1).  Useful for integer division and modulus.
6583     *
6584     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6585     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6586     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6587     *      rem-double/2addr
6588     */
6589    /* binop/2addr vA, vB */
6590    mov     r9, rINST, lsr #8           @ r9<- A+
6591    mov     r1, rINST, lsr #12          @ r1<- B
6592    and     r9, r9, #15
6593    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6594    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6595    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6596    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6597    .if 0
6598    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6599    beq     common_errDivideByZero
6600    .endif
6601    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6602
6603                               @ optional op; may set condition codes
6604    bl      fmod                              @ result<- op, r0-r3 changed
6605    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6606    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6607    GOTO_OPCODE(ip)                     @ jump to next instruction
6608    /* 12-15 instructions */
6609
6610
6611/* ------------------------------ */
6612    .balign 64
6613.L_OP_ADD_INT_LIT16: /* 0xd0 */
6614/* File: armv5te/OP_ADD_INT_LIT16.S */
6615/* File: armv5te/binopLit16.S */
6616    /*
6617     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6618     * that specifies an instruction that performs "result = r0 op r1".
6619     * This could be an ARM instruction or a function call.  (If the result
6620     * comes back in a register other than r0, you can override "result".)
6621     *
6622     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6623     * vCC (r1).  Useful for integer division and modulus.
6624     *
6625     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6626     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6627     */
6628    /* binop/lit16 vA, vB, #+CCCC */
6629    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6630    mov     r2, rINST, lsr #12          @ r2<- B
6631    mov     r9, rINST, lsr #8           @ r9<- A+
6632    GET_VREG(r0, r2)                    @ r0<- vB
6633    and     r9, r9, #15
6634    .if 0
6635    cmp     r1, #0                      @ is second operand zero?
6636    beq     common_errDivideByZero
6637    .endif
6638    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6639
6640    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6641    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6642    SET_VREG(r0, r9)               @ vAA<- r0
6643    GOTO_OPCODE(ip)                     @ jump to next instruction
6644    /* 10-13 instructions */
6645
6646
6647/* ------------------------------ */
6648    .balign 64
6649.L_OP_RSUB_INT: /* 0xd1 */
6650/* File: armv5te/OP_RSUB_INT.S */
6651/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6652/* File: armv5te/binopLit16.S */
6653    /*
6654     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6655     * that specifies an instruction that performs "result = r0 op r1".
6656     * This could be an ARM instruction or a function call.  (If the result
6657     * comes back in a register other than r0, you can override "result".)
6658     *
6659     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6660     * vCC (r1).  Useful for integer division and modulus.
6661     *
6662     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6663     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6664     */
6665    /* binop/lit16 vA, vB, #+CCCC */
6666    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6667    mov     r2, rINST, lsr #12          @ r2<- B
6668    mov     r9, rINST, lsr #8           @ r9<- A+
6669    GET_VREG(r0, r2)                    @ r0<- vB
6670    and     r9, r9, #15
6671    .if 0
6672    cmp     r1, #0                      @ is second operand zero?
6673    beq     common_errDivideByZero
6674    .endif
6675    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6676
6677    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6678    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6679    SET_VREG(r0, r9)               @ vAA<- r0
6680    GOTO_OPCODE(ip)                     @ jump to next instruction
6681    /* 10-13 instructions */
6682
6683
6684/* ------------------------------ */
6685    .balign 64
6686.L_OP_MUL_INT_LIT16: /* 0xd2 */
6687/* File: armv5te/OP_MUL_INT_LIT16.S */
6688/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6689/* File: armv5te/binopLit16.S */
6690    /*
6691     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6692     * that specifies an instruction that performs "result = r0 op r1".
6693     * This could be an ARM instruction or a function call.  (If the result
6694     * comes back in a register other than r0, you can override "result".)
6695     *
6696     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6697     * vCC (r1).  Useful for integer division and modulus.
6698     *
6699     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6700     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6701     */
6702    /* binop/lit16 vA, vB, #+CCCC */
6703    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6704    mov     r2, rINST, lsr #12          @ r2<- B
6705    mov     r9, rINST, lsr #8           @ r9<- A+
6706    GET_VREG(r0, r2)                    @ r0<- vB
6707    and     r9, r9, #15
6708    .if 0
6709    cmp     r1, #0                      @ is second operand zero?
6710    beq     common_errDivideByZero
6711    .endif
6712    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6713
6714    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6715    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6716    SET_VREG(r0, r9)               @ vAA<- r0
6717    GOTO_OPCODE(ip)                     @ jump to next instruction
6718    /* 10-13 instructions */
6719
6720
6721/* ------------------------------ */
6722    .balign 64
6723.L_OP_DIV_INT_LIT16: /* 0xd3 */
6724/* File: armv5te/OP_DIV_INT_LIT16.S */
6725/* File: armv5te/binopLit16.S */
6726    /*
6727     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6728     * that specifies an instruction that performs "result = r0 op r1".
6729     * This could be an ARM instruction or a function call.  (If the result
6730     * comes back in a register other than r0, you can override "result".)
6731     *
6732     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6733     * vCC (r1).  Useful for integer division and modulus.
6734     *
6735     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6736     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6737     */
6738    /* binop/lit16 vA, vB, #+CCCC */
6739    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6740    mov     r2, rINST, lsr #12          @ r2<- B
6741    mov     r9, rINST, lsr #8           @ r9<- A+
6742    GET_VREG(r0, r2)                    @ r0<- vB
6743    and     r9, r9, #15
6744    .if 1
6745    cmp     r1, #0                      @ is second operand zero?
6746    beq     common_errDivideByZero
6747    .endif
6748    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6749
6750    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6751    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6752    SET_VREG(r0, r9)               @ vAA<- r0
6753    GOTO_OPCODE(ip)                     @ jump to next instruction
6754    /* 10-13 instructions */
6755
6756
6757/* ------------------------------ */
6758    .balign 64
6759.L_OP_REM_INT_LIT16: /* 0xd4 */
6760/* File: armv5te/OP_REM_INT_LIT16.S */
6761/* idivmod returns quotient in r0 and remainder in r1 */
6762/* File: armv5te/binopLit16.S */
6763    /*
6764     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6765     * that specifies an instruction that performs "result = r0 op r1".
6766     * This could be an ARM instruction or a function call.  (If the result
6767     * comes back in a register other than r0, you can override "result".)
6768     *
6769     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6770     * vCC (r1).  Useful for integer division and modulus.
6771     *
6772     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6773     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6774     */
6775    /* binop/lit16 vA, vB, #+CCCC */
6776    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6777    mov     r2, rINST, lsr #12          @ r2<- B
6778    mov     r9, rINST, lsr #8           @ r9<- A+
6779    GET_VREG(r0, r2)                    @ r0<- vB
6780    and     r9, r9, #15
6781    .if 1
6782    cmp     r1, #0                      @ is second operand zero?
6783    beq     common_errDivideByZero
6784    .endif
6785    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6786
6787    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6788    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6789    SET_VREG(r1, r9)               @ vAA<- r1
6790    GOTO_OPCODE(ip)                     @ jump to next instruction
6791    /* 10-13 instructions */
6792
6793
6794/* ------------------------------ */
6795    .balign 64
6796.L_OP_AND_INT_LIT16: /* 0xd5 */
6797/* File: armv5te/OP_AND_INT_LIT16.S */
6798/* File: armv5te/binopLit16.S */
6799    /*
6800     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6801     * that specifies an instruction that performs "result = r0 op r1".
6802     * This could be an ARM instruction or a function call.  (If the result
6803     * comes back in a register other than r0, you can override "result".)
6804     *
6805     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6806     * vCC (r1).  Useful for integer division and modulus.
6807     *
6808     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6809     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6810     */
6811    /* binop/lit16 vA, vB, #+CCCC */
6812    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6813    mov     r2, rINST, lsr #12          @ r2<- B
6814    mov     r9, rINST, lsr #8           @ r9<- A+
6815    GET_VREG(r0, r2)                    @ r0<- vB
6816    and     r9, r9, #15
6817    .if 0
6818    cmp     r1, #0                      @ is second operand zero?
6819    beq     common_errDivideByZero
6820    .endif
6821    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6822
6823    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6824    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6825    SET_VREG(r0, r9)               @ vAA<- r0
6826    GOTO_OPCODE(ip)                     @ jump to next instruction
6827    /* 10-13 instructions */
6828
6829
6830/* ------------------------------ */
6831    .balign 64
6832.L_OP_OR_INT_LIT16: /* 0xd6 */
6833/* File: armv5te/OP_OR_INT_LIT16.S */
6834/* File: armv5te/binopLit16.S */
6835    /*
6836     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6837     * that specifies an instruction that performs "result = r0 op r1".
6838     * This could be an ARM instruction or a function call.  (If the result
6839     * comes back in a register other than r0, you can override "result".)
6840     *
6841     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6842     * vCC (r1).  Useful for integer division and modulus.
6843     *
6844     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6845     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6846     */
6847    /* binop/lit16 vA, vB, #+CCCC */
6848    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6849    mov     r2, rINST, lsr #12          @ r2<- B
6850    mov     r9, rINST, lsr #8           @ r9<- A+
6851    GET_VREG(r0, r2)                    @ r0<- vB
6852    and     r9, r9, #15
6853    .if 0
6854    cmp     r1, #0                      @ is second operand zero?
6855    beq     common_errDivideByZero
6856    .endif
6857    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6858
6859    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6860    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6861    SET_VREG(r0, r9)               @ vAA<- r0
6862    GOTO_OPCODE(ip)                     @ jump to next instruction
6863    /* 10-13 instructions */
6864
6865
6866/* ------------------------------ */
6867    .balign 64
6868.L_OP_XOR_INT_LIT16: /* 0xd7 */
6869/* File: armv5te/OP_XOR_INT_LIT16.S */
6870/* File: armv5te/binopLit16.S */
6871    /*
6872     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6873     * that specifies an instruction that performs "result = r0 op r1".
6874     * This could be an ARM instruction or a function call.  (If the result
6875     * comes back in a register other than r0, you can override "result".)
6876     *
6877     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6878     * vCC (r1).  Useful for integer division and modulus.
6879     *
6880     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6881     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6882     */
6883    /* binop/lit16 vA, vB, #+CCCC */
6884    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6885    mov     r2, rINST, lsr #12          @ r2<- B
6886    mov     r9, rINST, lsr #8           @ r9<- A+
6887    GET_VREG(r0, r2)                    @ r0<- vB
6888    and     r9, r9, #15
6889    .if 0
6890    cmp     r1, #0                      @ is second operand zero?
6891    beq     common_errDivideByZero
6892    .endif
6893    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6894
6895    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6896    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6897    SET_VREG(r0, r9)               @ vAA<- r0
6898    GOTO_OPCODE(ip)                     @ jump to next instruction
6899    /* 10-13 instructions */
6900
6901
6902/* ------------------------------ */
6903    .balign 64
6904.L_OP_ADD_INT_LIT8: /* 0xd8 */
6905/* File: armv5te/OP_ADD_INT_LIT8.S */
6906/* File: armv5te/binopLit8.S */
6907    /*
6908     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6909     * that specifies an instruction that performs "result = r0 op r1".
6910     * This could be an ARM instruction or a function call.  (If the result
6911     * comes back in a register other than r0, you can override "result".)
6912     *
6913     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6914     * vCC (r1).  Useful for integer division and modulus.
6915     *
6916     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6917     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6918     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6919     */
6920    /* binop/lit8 vAA, vBB, #+CC */
6921    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6922    mov     r9, rINST, lsr #8           @ r9<- AA
6923    and     r2, r3, #255                @ r2<- BB
6924    GET_VREG(r0, r2)                    @ r0<- vBB
6925    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6926    .if 0
6927    @cmp     r1, #0                      @ is second operand zero?
6928    beq     common_errDivideByZero
6929    .endif
6930    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6931
6932                               @ optional op; may set condition codes
6933    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6934    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6935    SET_VREG(r0, r9)               @ vAA<- r0
6936    GOTO_OPCODE(ip)                     @ jump to next instruction
6937    /* 10-12 instructions */
6938
6939
6940/* ------------------------------ */
6941    .balign 64
6942.L_OP_RSUB_INT_LIT8: /* 0xd9 */
6943/* File: armv5te/OP_RSUB_INT_LIT8.S */
6944/* File: armv5te/binopLit8.S */
6945    /*
6946     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6947     * that specifies an instruction that performs "result = r0 op r1".
6948     * This could be an ARM instruction or a function call.  (If the result
6949     * comes back in a register other than r0, you can override "result".)
6950     *
6951     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6952     * vCC (r1).  Useful for integer division and modulus.
6953     *
6954     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6955     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6956     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6957     */
6958    /* binop/lit8 vAA, vBB, #+CC */
6959    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6960    mov     r9, rINST, lsr #8           @ r9<- AA
6961    and     r2, r3, #255                @ r2<- BB
6962    GET_VREG(r0, r2)                    @ r0<- vBB
6963    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6964    .if 0
6965    @cmp     r1, #0                      @ is second operand zero?
6966    beq     common_errDivideByZero
6967    .endif
6968    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6969
6970                               @ optional op; may set condition codes
6971    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6972    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6973    SET_VREG(r0, r9)               @ vAA<- r0
6974    GOTO_OPCODE(ip)                     @ jump to next instruction
6975    /* 10-12 instructions */
6976
6977
6978/* ------------------------------ */
6979    .balign 64
6980.L_OP_MUL_INT_LIT8: /* 0xda */
6981/* File: armv5te/OP_MUL_INT_LIT8.S */
6982/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6983/* File: armv5te/binopLit8.S */
6984    /*
6985     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6986     * that specifies an instruction that performs "result = r0 op r1".
6987     * This could be an ARM instruction or a function call.  (If the result
6988     * comes back in a register other than r0, you can override "result".)
6989     *
6990     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6991     * vCC (r1).  Useful for integer division and modulus.
6992     *
6993     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6994     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6995     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6996     */
6997    /* binop/lit8 vAA, vBB, #+CC */
6998    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6999    mov     r9, rINST, lsr #8           @ r9<- AA
7000    and     r2, r3, #255                @ r2<- BB
7001    GET_VREG(r0, r2)                    @ r0<- vBB
7002    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7003    .if 0
7004    @cmp     r1, #0                      @ is second operand zero?
7005    beq     common_errDivideByZero
7006    .endif
7007    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7008
7009                               @ optional op; may set condition codes
7010    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
7011    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7012    SET_VREG(r0, r9)               @ vAA<- r0
7013    GOTO_OPCODE(ip)                     @ jump to next instruction
7014    /* 10-12 instructions */
7015
7016
7017/* ------------------------------ */
7018    .balign 64
7019.L_OP_DIV_INT_LIT8: /* 0xdb */
7020/* File: armv5te/OP_DIV_INT_LIT8.S */
7021/* File: armv5te/binopLit8.S */
7022    /*
7023     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7024     * that specifies an instruction that performs "result = r0 op r1".
7025     * This could be an ARM instruction or a function call.  (If the result
7026     * comes back in a register other than r0, you can override "result".)
7027     *
7028     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7029     * vCC (r1).  Useful for integer division and modulus.
7030     *
7031     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7032     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7033     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7034     */
7035    /* binop/lit8 vAA, vBB, #+CC */
7036    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7037    mov     r9, rINST, lsr #8           @ r9<- AA
7038    and     r2, r3, #255                @ r2<- BB
7039    GET_VREG(r0, r2)                    @ r0<- vBB
7040    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7041    .if 1
7042    @cmp     r1, #0                      @ is second operand zero?
7043    beq     common_errDivideByZero
7044    .endif
7045    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7046
7047                               @ optional op; may set condition codes
7048    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
7049    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7050    SET_VREG(r0, r9)               @ vAA<- r0
7051    GOTO_OPCODE(ip)                     @ jump to next instruction
7052    /* 10-12 instructions */
7053
7054
7055/* ------------------------------ */
7056    .balign 64
7057.L_OP_REM_INT_LIT8: /* 0xdc */
7058/* File: armv5te/OP_REM_INT_LIT8.S */
7059/* idivmod returns quotient in r0 and remainder in r1 */
7060/* File: armv5te/binopLit8.S */
7061    /*
7062     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7063     * that specifies an instruction that performs "result = r0 op r1".
7064     * This could be an ARM instruction or a function call.  (If the result
7065     * comes back in a register other than r0, you can override "result".)
7066     *
7067     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7068     * vCC (r1).  Useful for integer division and modulus.
7069     *
7070     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7071     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7072     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7073     */
7074    /* binop/lit8 vAA, vBB, #+CC */
7075    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7076    mov     r9, rINST, lsr #8           @ r9<- AA
7077    and     r2, r3, #255                @ r2<- BB
7078    GET_VREG(r0, r2)                    @ r0<- vBB
7079    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7080    .if 1
7081    @cmp     r1, #0                      @ is second operand zero?
7082    beq     common_errDivideByZero
7083    .endif
7084    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7085
7086                               @ optional op; may set condition codes
7087    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
7088    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7089    SET_VREG(r1, r9)               @ vAA<- r1
7090    GOTO_OPCODE(ip)                     @ jump to next instruction
7091    /* 10-12 instructions */
7092
7093
7094/* ------------------------------ */
7095    .balign 64
7096.L_OP_AND_INT_LIT8: /* 0xdd */
7097/* File: armv5te/OP_AND_INT_LIT8.S */
7098/* File: armv5te/binopLit8.S */
7099    /*
7100     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7101     * that specifies an instruction that performs "result = r0 op r1".
7102     * This could be an ARM instruction or a function call.  (If the result
7103     * comes back in a register other than r0, you can override "result".)
7104     *
7105     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7106     * vCC (r1).  Useful for integer division and modulus.
7107     *
7108     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7109     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7110     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7111     */
7112    /* binop/lit8 vAA, vBB, #+CC */
7113    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7114    mov     r9, rINST, lsr #8           @ r9<- AA
7115    and     r2, r3, #255                @ r2<- BB
7116    GET_VREG(r0, r2)                    @ r0<- vBB
7117    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7118    .if 0
7119    @cmp     r1, #0                      @ is second operand zero?
7120    beq     common_errDivideByZero
7121    .endif
7122    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7123
7124                               @ optional op; may set condition codes
7125    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
7126    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7127    SET_VREG(r0, r9)               @ vAA<- r0
7128    GOTO_OPCODE(ip)                     @ jump to next instruction
7129    /* 10-12 instructions */
7130
7131
7132/* ------------------------------ */
7133    .balign 64
7134.L_OP_OR_INT_LIT8: /* 0xde */
7135/* File: armv5te/OP_OR_INT_LIT8.S */
7136/* File: armv5te/binopLit8.S */
7137    /*
7138     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7139     * that specifies an instruction that performs "result = r0 op r1".
7140     * This could be an ARM instruction or a function call.  (If the result
7141     * comes back in a register other than r0, you can override "result".)
7142     *
7143     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7144     * vCC (r1).  Useful for integer division and modulus.
7145     *
7146     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7147     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7148     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7149     */
7150    /* binop/lit8 vAA, vBB, #+CC */
7151    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7152    mov     r9, rINST, lsr #8           @ r9<- AA
7153    and     r2, r3, #255                @ r2<- BB
7154    GET_VREG(r0, r2)                    @ r0<- vBB
7155    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7156    .if 0
7157    @cmp     r1, #0                      @ is second operand zero?
7158    beq     common_errDivideByZero
7159    .endif
7160    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7161
7162                               @ optional op; may set condition codes
7163    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
7164    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7165    SET_VREG(r0, r9)               @ vAA<- r0
7166    GOTO_OPCODE(ip)                     @ jump to next instruction
7167    /* 10-12 instructions */
7168
7169
7170/* ------------------------------ */
7171    .balign 64
7172.L_OP_XOR_INT_LIT8: /* 0xdf */
7173/* File: armv5te/OP_XOR_INT_LIT8.S */
7174/* File: armv5te/binopLit8.S */
7175    /*
7176     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7177     * that specifies an instruction that performs "result = r0 op r1".
7178     * This could be an ARM instruction or a function call.  (If the result
7179     * comes back in a register other than r0, you can override "result".)
7180     *
7181     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7182     * vCC (r1).  Useful for integer division and modulus.
7183     *
7184     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7185     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7186     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7187     */
7188    /* binop/lit8 vAA, vBB, #+CC */
7189    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7190    mov     r9, rINST, lsr #8           @ r9<- AA
7191    and     r2, r3, #255                @ r2<- BB
7192    GET_VREG(r0, r2)                    @ r0<- vBB
7193    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7194    .if 0
7195    @cmp     r1, #0                      @ is second operand zero?
7196    beq     common_errDivideByZero
7197    .endif
7198    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7199
7200                               @ optional op; may set condition codes
7201    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7202    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7203    SET_VREG(r0, r9)               @ vAA<- r0
7204    GOTO_OPCODE(ip)                     @ jump to next instruction
7205    /* 10-12 instructions */
7206
7207
7208/* ------------------------------ */
7209    .balign 64
7210.L_OP_SHL_INT_LIT8: /* 0xe0 */
7211/* File: armv5te/OP_SHL_INT_LIT8.S */
7212/* File: armv5te/binopLit8.S */
7213    /*
7214     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7215     * that specifies an instruction that performs "result = r0 op r1".
7216     * This could be an ARM instruction or a function call.  (If the result
7217     * comes back in a register other than r0, you can override "result".)
7218     *
7219     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7220     * vCC (r1).  Useful for integer division and modulus.
7221     *
7222     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7223     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7224     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7225     */
7226    /* binop/lit8 vAA, vBB, #+CC */
7227    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7228    mov     r9, rINST, lsr #8           @ r9<- AA
7229    and     r2, r3, #255                @ r2<- BB
7230    GET_VREG(r0, r2)                    @ r0<- vBB
7231    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7232    .if 0
7233    @cmp     r1, #0                      @ is second operand zero?
7234    beq     common_errDivideByZero
7235    .endif
7236    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7237
7238    and     r1, r1, #31                           @ optional op; may set condition codes
7239    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
7240    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7241    SET_VREG(r0, r9)               @ vAA<- r0
7242    GOTO_OPCODE(ip)                     @ jump to next instruction
7243    /* 10-12 instructions */
7244
7245
7246/* ------------------------------ */
7247    .balign 64
7248.L_OP_SHR_INT_LIT8: /* 0xe1 */
7249/* File: armv5te/OP_SHR_INT_LIT8.S */
7250/* File: armv5te/binopLit8.S */
7251    /*
7252     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7253     * that specifies an instruction that performs "result = r0 op r1".
7254     * This could be an ARM instruction or a function call.  (If the result
7255     * comes back in a register other than r0, you can override "result".)
7256     *
7257     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7258     * vCC (r1).  Useful for integer division and modulus.
7259     *
7260     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7261     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7262     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7263     */
7264    /* binop/lit8 vAA, vBB, #+CC */
7265    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7266    mov     r9, rINST, lsr #8           @ r9<- AA
7267    and     r2, r3, #255                @ r2<- BB
7268    GET_VREG(r0, r2)                    @ r0<- vBB
7269    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7270    .if 0
7271    @cmp     r1, #0                      @ is second operand zero?
7272    beq     common_errDivideByZero
7273    .endif
7274    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7275
7276    and     r1, r1, #31                           @ optional op; may set condition codes
7277    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
7278    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7279    SET_VREG(r0, r9)               @ vAA<- r0
7280    GOTO_OPCODE(ip)                     @ jump to next instruction
7281    /* 10-12 instructions */
7282
7283
7284/* ------------------------------ */
7285    .balign 64
7286.L_OP_USHR_INT_LIT8: /* 0xe2 */
7287/* File: armv5te/OP_USHR_INT_LIT8.S */
7288/* File: armv5te/binopLit8.S */
7289    /*
7290     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7291     * that specifies an instruction that performs "result = r0 op r1".
7292     * This could be an ARM instruction or a function call.  (If the result
7293     * comes back in a register other than r0, you can override "result".)
7294     *
7295     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7296     * vCC (r1).  Useful for integer division and modulus.
7297     *
7298     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7299     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7300     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7301     */
7302    /* binop/lit8 vAA, vBB, #+CC */
7303    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7304    mov     r9, rINST, lsr #8           @ r9<- AA
7305    and     r2, r3, #255                @ r2<- BB
7306    GET_VREG(r0, r2)                    @ r0<- vBB
7307    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7308    .if 0
7309    @cmp     r1, #0                      @ is second operand zero?
7310    beq     common_errDivideByZero
7311    .endif
7312    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7313
7314    and     r1, r1, #31                           @ optional op; may set condition codes
7315    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
7316    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7317    SET_VREG(r0, r9)               @ vAA<- r0
7318    GOTO_OPCODE(ip)                     @ jump to next instruction
7319    /* 10-12 instructions */
7320
7321
7322/* ------------------------------ */
7323    .balign 64
7324.L_OP_IGET_VOLATILE: /* 0xe3 */
7325/* File: armv5te/OP_IGET_VOLATILE.S */
7326/* File: armv5te/OP_IGET.S */
7327    /*
7328     * General 32-bit instance field get.
7329     *
7330     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7331     */
7332    /* op vA, vB, field@CCCC */
7333    mov     r0, rINST, lsr #12          @ r0<- B
7334    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7335    FETCH(r1, 1)                        @ r1<- field ref CCCC
7336    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7337    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7338    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7339    cmp     r0, #0                      @ is resolved entry null?
7340    bne     .LOP_IGET_VOLATILE_finish          @ no, already resolved
73418:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7342    EXPORT_PC()                         @ resolve() could throw
7343    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7344    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7345    cmp     r0, #0
7346    bne     .LOP_IGET_VOLATILE_finish
7347    b       common_exceptionThrown
7348
7349
7350/* ------------------------------ */
7351    .balign 64
7352.L_OP_IPUT_VOLATILE: /* 0xe4 */
7353/* File: armv5te/OP_IPUT_VOLATILE.S */
7354/* File: armv5te/OP_IPUT.S */
7355    /*
7356     * General 32-bit instance field put.
7357     *
7358     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
7359     */
7360    /* op vA, vB, field@CCCC */
7361    mov     r0, rINST, lsr #12          @ r0<- B
7362    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7363    FETCH(r1, 1)                        @ r1<- field ref CCCC
7364    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7365    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7366    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7367    cmp     r0, #0                      @ is resolved entry null?
7368    bne     .LOP_IPUT_VOLATILE_finish          @ no, already resolved
73698:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7370    EXPORT_PC()                         @ resolve() could throw
7371    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7372    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7373    cmp     r0, #0                      @ success?
7374    bne     .LOP_IPUT_VOLATILE_finish          @ yes, finish up
7375    b       common_exceptionThrown
7376
7377
7378/* ------------------------------ */
7379    .balign 64
7380.L_OP_SGET_VOLATILE: /* 0xe5 */
7381/* File: armv5te/OP_SGET_VOLATILE.S */
7382/* File: armv5te/OP_SGET.S */
7383    /*
7384     * General 32-bit SGET handler.
7385     *
7386     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7387     */
7388    /* op vAA, field@BBBB */
7389    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7390    FETCH(r1, 1)                        @ r1<- field ref BBBB
7391    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7392    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7393    cmp     r0, #0                      @ is resolved entry null?
7394    beq     .LOP_SGET_VOLATILE_resolve         @ yes, do resolve
7395.LOP_SGET_VOLATILE_finish: @ field ptr in r0
7396    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7397    SMP_DMB                            @ acquiring load
7398    mov     r2, rINST, lsr #8           @ r2<- AA
7399    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7400    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7401    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7402    GOTO_OPCODE(ip)                     @ jump to next instruction
7403
7404
7405/* ------------------------------ */
7406    .balign 64
7407.L_OP_SPUT_VOLATILE: /* 0xe6 */
7408/* File: armv5te/OP_SPUT_VOLATILE.S */
7409/* File: armv5te/OP_SPUT.S */
7410    /*
7411     * General 32-bit SPUT handler.
7412     *
7413     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
7414     */
7415    /* op vAA, field@BBBB */
7416    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7417    FETCH(r1, 1)                        @ r1<- field ref BBBB
7418    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7419    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7420    cmp     r0, #0                      @ is resolved entry null?
7421    beq     .LOP_SPUT_VOLATILE_resolve         @ yes, do resolve
7422.LOP_SPUT_VOLATILE_finish:   @ field ptr in r0
7423    mov     r2, rINST, lsr #8           @ r2<- AA
7424    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7425    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7426    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7427    SMP_DMB                            @ releasing store
7428    str     r1, [r0, #offStaticField_value] @ field<- vAA
7429    GOTO_OPCODE(ip)                     @ jump to next instruction
7430
7431
7432/* ------------------------------ */
7433    .balign 64
7434.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
7435/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */
7436/* File: armv5te/OP_IGET.S */
7437    /*
7438     * General 32-bit instance field get.
7439     *
7440     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7441     */
7442    /* op vA, vB, field@CCCC */
7443    mov     r0, rINST, lsr #12          @ r0<- B
7444    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7445    FETCH(r1, 1)                        @ r1<- field ref CCCC
7446    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7447    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7448    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7449    cmp     r0, #0                      @ is resolved entry null?
7450    bne     .LOP_IGET_OBJECT_VOLATILE_finish          @ no, already resolved
74518:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7452    EXPORT_PC()                         @ resolve() could throw
7453    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7454    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7455    cmp     r0, #0
7456    bne     .LOP_IGET_OBJECT_VOLATILE_finish
7457    b       common_exceptionThrown
7458
7459
7460/* ------------------------------ */
7461    .balign 64
7462.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
7463/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */
7464/* File: armv5te/OP_IGET_WIDE.S */
7465    /*
7466     * Wide 32-bit instance field get.
7467     */
7468    /* iget-wide vA, vB, field@CCCC */
7469    mov     r0, rINST, lsr #12          @ r0<- B
7470    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7471    FETCH(r1, 1)                        @ r1<- field ref CCCC
7472    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7473    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7474    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7475    cmp     r0, #0                      @ is resolved entry null?
7476    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
74778:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7478    EXPORT_PC()                         @ resolve() could throw
7479    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7480    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7481    cmp     r0, #0
7482    bne     .LOP_IGET_WIDE_VOLATILE_finish
7483    b       common_exceptionThrown
7484
7485
7486/* ------------------------------ */
7487    .balign 64
7488.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
7489/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */
7490/* File: armv5te/OP_IPUT_WIDE.S */
7491    /* iput-wide vA, vB, field@CCCC */
7492    mov     r0, rINST, lsr #12          @ r0<- B
7493    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7494    FETCH(r1, 1)                        @ r1<- field ref CCCC
7495    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7496    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7497    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7498    cmp     r0, #0                      @ is resolved entry null?
7499    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
75008:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7501    EXPORT_PC()                         @ resolve() could throw
7502    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7503    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7504    cmp     r0, #0                      @ success?
7505    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
7506    b       common_exceptionThrown
7507
7508
7509/* ------------------------------ */
7510    .balign 64
7511.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
7512/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */
7513/* File: armv5te/OP_SGET_WIDE.S */
7514    /*
7515     * 64-bit SGET handler.
7516     */
7517    /* sget-wide vAA, field@BBBB */
7518    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7519    FETCH(r1, 1)                        @ r1<- field ref BBBB
7520    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7521    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7522    cmp     r0, #0                      @ is resolved entry null?
7523    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
7524.LOP_SGET_WIDE_VOLATILE_finish:
7525    mov     r9, rINST, lsr #8           @ r9<- AA
7526    .if 1
7527    add     r0, r0, #offStaticField_value @ r0<- pointer to data
7528    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
7529    .else
7530    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
7531    .endif
7532    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7533    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7534    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
7535    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7536    GOTO_OPCODE(ip)                     @ jump to next instruction
7537
7538
7539/* ------------------------------ */
7540    .balign 64
7541.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
7542/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */
7543/* File: armv5te/OP_SPUT_WIDE.S */
7544    /*
7545     * 64-bit SPUT handler.
7546     */
7547    /* sput-wide vAA, field@BBBB */
7548    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
7549    FETCH(r1, 1)                        @ r1<- field ref BBBB
7550    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7551    mov     r9, rINST, lsr #8           @ r9<- AA
7552    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
7553    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7554    cmp     r2, #0                      @ is resolved entry null?
7555    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7556.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
7557    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7558    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7559    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7560    .if 1
7561    add     r2, r2, #offStaticField_value @ r2<- pointer to data
7562    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
7563    .else
7564    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
7565    .endif
7566    GOTO_OPCODE(r10)                    @ jump to next instruction
7567
7568
7569/* ------------------------------ */
7570    .balign 64
7571.L_OP_BREAKPOINT: /* 0xec */
7572/* File: armv5te/OP_BREAKPOINT.S */
7573    /*
7574     * Breakpoint handler.
7575     *
7576     * Restart this instruction with the original opcode.  By
7577     * the time we get here, the breakpoint will have already been
7578     * handled.
7579     */
7580    mov     r0, rPC
7581    bl      dvmGetOriginalOpcode        @ (rPC)
7582    FETCH(rINST, 0)                     @ reload OP_BREAKPOINT + rest of inst
7583    ldr     r1, [rSELF, #offThread_mainHandlerTable]
7584    and     rINST, #0xff00
7585    orr     rINST, rINST, r0
7586    GOTO_OPCODE_BASE(r1, r0)
7587
7588/* ------------------------------ */
7589    .balign 64
7590.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
7591/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
7592    /*
7593     * Handle a throw-verification-error instruction.  This throws an
7594     * exception for an error discovered during verification.  The
7595     * exception is indicated by AA, with some detail provided by BBBB.
7596     */
7597    /* op AA, ref@BBBB */
7598    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
7599    FETCH(r2, 1)                        @ r2<- BBBB
7600    EXPORT_PC()                         @ export the PC
7601    mov     r1, rINST, lsr #8           @ r1<- AA
7602    bl      dvmThrowVerificationError   @ always throws
7603    b       common_exceptionThrown      @ handle exception
7604
7605/* ------------------------------ */
7606    .balign 64
7607.L_OP_EXECUTE_INLINE: /* 0xee */
7608/* File: armv5te/OP_EXECUTE_INLINE.S */
7609    /*
7610     * Execute a "native inline" instruction.
7611     *
7612     * We need to call an InlineOp4Func:
7613     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7614     *
7615     * The first four args are in r0-r3, pointer to return value storage
7616     * is on the stack.  The function's return value is a flag that tells
7617     * us if an exception was thrown.
7618     *
7619     * TUNING: could maintain two tables, pointer in Thread and
7620     * swap if profiler/debuggger active.
7621     */
7622    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7623    ldrh    r2, [rSELF, #offThread_subMode]
7624    FETCH(r10, 1)                       @ r10<- BBBB
7625    EXPORT_PC()                         @ can throw
7626    ands    r2, #kSubModeDebugProfile   @ Any going on?
7627    bne     .LOP_EXECUTE_INLINE_debugmode       @ yes - take slow path
7628.LOP_EXECUTE_INLINE_resume:
7629    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7630    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7631    mov     r0, rINST, lsr #12          @ r0<- B
7632    str     r1, [sp]                    @ push &self->retval
7633    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7634    add     sp, sp, #8                  @ pop stack
7635    cmp     r0, #0                      @ test boolean result of inline
7636    beq     common_exceptionThrown      @ returned false, handle exception
7637    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7638    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7639    GOTO_OPCODE(ip)                     @ jump to next instruction
7640
7641/* ------------------------------ */
7642    .balign 64
7643.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7644/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7645    /*
7646     * Execute a "native inline" instruction, using "/range" semantics.
7647     * Same idea as execute-inline, but we get the args differently.
7648     *
7649     * We need to call an InlineOp4Func:
7650     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7651     *
7652     * The first four args are in r0-r3, pointer to return value storage
7653     * is on the stack.  The function's return value is a flag that tells
7654     * us if an exception was thrown.
7655     */
7656    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7657    ldrh    r2, [rSELF, #offThread_subMode]
7658    FETCH(r10, 1)                       @ r10<- BBBB
7659    EXPORT_PC()                         @ can throw
7660    ands    r2, #kSubModeDebugProfile   @ Any going on?
7661    bne     .LOP_EXECUTE_INLINE_RANGE_debugmode       @ yes - take slow path
7662.LOP_EXECUTE_INLINE_RANGE_resume:
7663    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7664    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7665    mov     r0, rINST, lsr #8           @ r0<- AA
7666    str     r1, [sp]                    @ push &self->retval
7667    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7668    add     sp, sp, #8                  @ pop stack
7669    cmp     r0, #0                      @ test boolean result of inline
7670    beq     common_exceptionThrown      @ returned false, handle exception
7671    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7672    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7673    GOTO_OPCODE(ip)                     @ jump to next instruction
7674
7675/* ------------------------------ */
7676    .balign 64
7677.L_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
7678/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
7679    /*
7680     * Invoke Object.<init> on an object.  In practice we know that
7681     * Object's nullary constructor doesn't do anything, so we just
7682     * skip it unless a debugger is active.
7683     */
7684    FETCH(r1, 2)                  @ r1<- CCCC
7685    GET_VREG(r0, r1)                    @ r0<- "this" ptr
7686    cmp     r0, #0                      @ check for NULL
7687    beq     common_errNullObject        @ export PC and throw NPE
7688    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
7689    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
7690    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
7691    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_setFinal        @ yes, go
7692.LOP_INVOKE_OBJECT_INIT_RANGE_finish:
7693    ldrh    r1, [rSELF, #offThread_subMode]
7694    ands    r1, #kSubModeDebuggerActive @ debugger active?
7695    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_debugger        @ Yes - skip optimization
7696    FETCH_ADVANCE_INST(2+1)       @ advance to next instr, load rINST
7697    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7698    GOTO_OPCODE(ip)                     @ execute it
7699
7700/* ------------------------------ */
7701    .balign 64
7702.L_OP_RETURN_VOID_BARRIER: /* 0xf1 */
7703/* File: armv5te/OP_RETURN_VOID_BARRIER.S */
7704    SMP_DMB_ST
7705    b       common_returnFromMethod
7706
7707/* ------------------------------ */
7708    .balign 64
7709.L_OP_IGET_QUICK: /* 0xf2 */
7710/* File: armv5te/OP_IGET_QUICK.S */
7711    /* For: iget-quick, iget-object-quick */
7712    /* op vA, vB, offset@CCCC */
7713    mov     r2, rINST, lsr #12          @ r2<- B
7714    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7715    FETCH(r1, 1)                        @ r1<- field byte offset
7716    cmp     r3, #0                      @ check object for null
7717    mov     r2, rINST, lsr #8           @ r2<- A(+)
7718    beq     common_errNullObject        @ object was null
7719    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7720    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7721    and     r2, r2, #15
7722    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7723    SET_VREG(r0, r2)                    @ fp[A]<- r0
7724    GOTO_OPCODE(ip)                     @ jump to next instruction
7725
7726/* ------------------------------ */
7727    .balign 64
7728.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7729/* File: armv5te/OP_IGET_WIDE_QUICK.S */
7730    /* iget-wide-quick vA, vB, offset@CCCC */
7731    mov     r2, rINST, lsr #12          @ r2<- B
7732    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7733    FETCH(ip, 1)                        @ ip<- field byte offset
7734    cmp     r3, #0                      @ check object for null
7735    mov     r2, rINST, lsr #8           @ r2<- A(+)
7736    beq     common_errNullObject        @ object was null
7737    ldrd    r0, [r3, ip]                @ r0<- obj.field (64 bits, aligned)
7738    and     r2, r2, #15
7739    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7740    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7741    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7742    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7743    GOTO_OPCODE(ip)                     @ jump to next instruction
7744
7745/* ------------------------------ */
7746    .balign 64
7747.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7748/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7749/* File: armv5te/OP_IGET_QUICK.S */
7750    /* For: iget-quick, iget-object-quick */
7751    /* op vA, vB, offset@CCCC */
7752    mov     r2, rINST, lsr #12          @ r2<- B
7753    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7754    FETCH(r1, 1)                        @ r1<- field byte offset
7755    cmp     r3, #0                      @ check object for null
7756    mov     r2, rINST, lsr #8           @ r2<- A(+)
7757    beq     common_errNullObject        @ object was null
7758    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7759    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7760    and     r2, r2, #15
7761    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7762    SET_VREG(r0, r2)                    @ fp[A]<- r0
7763    GOTO_OPCODE(ip)                     @ jump to next instruction
7764
7765
7766/* ------------------------------ */
7767    .balign 64
7768.L_OP_IPUT_QUICK: /* 0xf5 */
7769/* File: armv5te/OP_IPUT_QUICK.S */
7770    /* For: iput-quick */
7771    /* op vA, vB, offset@CCCC */
7772    mov     r2, rINST, lsr #12          @ r2<- B
7773    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7774    FETCH(r1, 1)                        @ r1<- field byte offset
7775    cmp     r3, #0                      @ check object for null
7776    mov     r2, rINST, lsr #8           @ r2<- A(+)
7777    beq     common_errNullObject        @ object was null
7778    and     r2, r2, #15
7779    GET_VREG(r0, r2)                    @ r0<- fp[A]
7780    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7781    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7782    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7783    GOTO_OPCODE(ip)                     @ jump to next instruction
7784
7785/* ------------------------------ */
7786    .balign 64
7787.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7788/* File: armv5te/OP_IPUT_WIDE_QUICK.S */
7789    /* iput-wide-quick vA, vB, offset@CCCC */
7790    mov     r0, rINST, lsr #8           @ r0<- A(+)
7791    mov     r1, rINST, lsr #12          @ r1<- B
7792    and     r0, r0, #15
7793    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7794    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7795    cmp     r2, #0                      @ check object for null
7796    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7797    beq     common_errNullObject        @ object was null
7798    FETCH(r3, 1)                        @ r3<- field byte offset
7799    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7800    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7801    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7802    GOTO_OPCODE(ip)                     @ jump to next instruction
7803
7804/* ------------------------------ */
7805    .balign 64
7806.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7807/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7808    /* For: iput-object-quick */
7809    /* op vA, vB, offset@CCCC */
7810    mov     r2, rINST, lsr #12          @ r2<- B
7811    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7812    FETCH(r1, 1)                        @ r1<- field byte offset
7813    cmp     r3, #0                      @ check object for null
7814    mov     r2, rINST, lsr #8           @ r2<- A(+)
7815    beq     common_errNullObject        @ object was null
7816    and     r2, r2, #15
7817    GET_VREG(r0, r2)                    @ r0<- fp[A]
7818    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7819    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7820    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7821    cmp     r0, #0
7822    strneb  r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
7823    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7824    GOTO_OPCODE(ip)                     @ jump to next instruction
7825
7826/* ------------------------------ */
7827    .balign 64
7828.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7829/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7830    /*
7831     * Handle an optimized virtual method call.
7832     *
7833     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7834     */
7835    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7836    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7837    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7838    FETCH(r1, 1)                        @ r1<- BBBB
7839    .if     (!0)
7840    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7841    .endif
7842    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7843    cmp     r9, #0                      @ is "this" null?
7844    beq     common_errNullObject        @ null "this", throw exception
7845    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7846    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7847    EXPORT_PC()                         @ invoke must export
7848    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7849    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7850
7851/* ------------------------------ */
7852    .balign 64
7853.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7854/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7855/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7856    /*
7857     * Handle an optimized virtual method call.
7858     *
7859     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7860     */
7861    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7862    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7863    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7864    FETCH(r1, 1)                        @ r1<- BBBB
7865    .if     (!1)
7866    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7867    .endif
7868    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7869    cmp     r9, #0                      @ is "this" null?
7870    beq     common_errNullObject        @ null "this", throw exception
7871    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7872    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7873    EXPORT_PC()                         @ invoke must export
7874    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7875    bl      common_invokeMethodRange @ (r0=method, r9="this")
7876
7877
7878/* ------------------------------ */
7879    .balign 64
7880.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7881/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7882    /*
7883     * Handle an optimized "super" method call.
7884     *
7885     * for: [opt] invoke-super-quick, invoke-super-quick/range
7886     */
7887    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7888    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7889    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7890    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7891    .if     (!0)
7892    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7893    .endif
7894    FETCH(r1, 1)                        @ r1<- BBBB
7895    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7896    EXPORT_PC()                         @ must export for invoke
7897    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7898    GET_VREG(r9, r10)                   @ r9<- "this"
7899    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7900    cmp     r9, #0                      @ null "this" ref?
7901    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7902    beq     common_errNullObject        @ "this" is null, throw exception
7903    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7904
7905/* ------------------------------ */
7906    .balign 64
7907.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7908/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
7909/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7910    /*
7911     * Handle an optimized "super" method call.
7912     *
7913     * for: [opt] invoke-super-quick, invoke-super-quick/range
7914     */
7915    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7916    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7917    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7918    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7919    .if     (!1)
7920    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7921    .endif
7922    FETCH(r1, 1)                        @ r1<- BBBB
7923    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7924    EXPORT_PC()                         @ must export for invoke
7925    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7926    GET_VREG(r9, r10)                   @ r9<- "this"
7927    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7928    cmp     r9, #0                      @ null "this" ref?
7929    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7930    beq     common_errNullObject        @ "this" is null, throw exception
7931    bl      common_invokeMethodRange @ (r0=method, r9="this")
7932
7933
7934/* ------------------------------ */
7935    .balign 64
7936.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
7937/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */
7938/* File: armv5te/OP_IPUT_OBJECT.S */
7939    /*
7940     * 32-bit instance field put.
7941     *
7942     * for: iput-object, iput-object-volatile
7943     */
7944    /* op vA, vB, field@CCCC */
7945    mov     r0, rINST, lsr #12          @ r0<- B
7946    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7947    FETCH(r1, 1)                        @ r1<- field ref CCCC
7948    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7949    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7950    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7951    cmp     r0, #0                      @ is resolved entry null?
7952    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ no, already resolved
79538:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7954    EXPORT_PC()                         @ resolve() could throw
7955    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7956    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7957    cmp     r0, #0                      @ success?
7958    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ yes, finish up
7959    b       common_exceptionThrown
7960
7961
7962/* ------------------------------ */
7963    .balign 64
7964.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
7965/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */
7966/* File: armv5te/OP_SGET.S */
7967    /*
7968     * General 32-bit SGET handler.
7969     *
7970     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7971     */
7972    /* op vAA, field@BBBB */
7973    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7974    FETCH(r1, 1)                        @ r1<- field ref BBBB
7975    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7976    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7977    cmp     r0, #0                      @ is resolved entry null?
7978    beq     .LOP_SGET_OBJECT_VOLATILE_resolve         @ yes, do resolve
7979.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0
7980    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7981    SMP_DMB                            @ acquiring load
7982    mov     r2, rINST, lsr #8           @ r2<- AA
7983    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7984    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7985    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7986    GOTO_OPCODE(ip)                     @ jump to next instruction
7987
7988
7989/* ------------------------------ */
7990    .balign 64
7991.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
7992/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */
7993/* File: armv5te/OP_SPUT_OBJECT.S */
7994    /*
7995     * 32-bit SPUT handler for objects
7996     *
7997     * for: sput-object, sput-object-volatile
7998     */
7999    /* op vAA, field@BBBB */
8000    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8001    FETCH(r1, 1)                        @ r1<- field ref BBBB
8002    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8003    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8004    cmp     r0, #0                      @ is resolved entry null?
8005    beq     .LOP_SPUT_OBJECT_VOLATILE_resolve         @ yes, do resolve
8006.LOP_SPUT_OBJECT_VOLATILE_finish:   @ field ptr in r0
8007    mov     r2, rINST, lsr #8           @ r2<- AA
8008    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8009    GET_VREG(r1, r2)                    @ r1<- fp[AA]
8010    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8011    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
8012    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8013    SMP_DMB                            @ releasing store
8014    b       .LOP_SPUT_OBJECT_VOLATILE_end
8015
8016
8017/* ------------------------------ */
8018    .balign 64
8019.L_OP_DISPATCH_FF: /* 0xff */
8020/* File: armv5te/OP_DISPATCH_FF.S */
8021    mov     ip, rINST, lsr #8           @ ip<- extended opcode
8022    add     ip, ip, #256                @ add offset for extended opcodes
8023    GOTO_OPCODE(ip)                     @ go to proper extended handler
8024
8025
8026/* ------------------------------ */
8027    .balign 64
8028.L_OP_CONST_CLASS_JUMBO: /* 0x100 */
8029/* File: armv5te/OP_CONST_CLASS_JUMBO.S */
8030    /* const-class/jumbo vBBBB, Class@AAAAAAAA */
8031    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8032    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<-self>methodClassDex
8033    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8034    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
8035    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8036    FETCH(r9, 3)                        @ r9<- BBBB
8037    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[AAAAaaaa]
8038    cmp     r0, #0                      @ not yet resolved?
8039    beq     .LOP_CONST_CLASS_JUMBO_resolve
8040    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8041    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8042    SET_VREG(r0, r9)                    @ vBBBB<- r0
8043    GOTO_OPCODE(ip)                     @ jump to next instruction
8044
8045/* ------------------------------ */
8046    .balign 64
8047.L_OP_CHECK_CAST_JUMBO: /* 0x101 */
8048/* File: armv5te/OP_CHECK_CAST_JUMBO.S */
8049    /*
8050     * Check to see if a cast from one class to another is allowed.
8051     */
8052    /* check-cast/jumbo vBBBB, class@AAAAAAAA */
8053    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8054    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8055    FETCH(r3, 3)                        @ r3<- BBBB
8056    orr     r2, r0, r2, lsl #16         @ r2<- AAAAaaaa
8057    GET_VREG(r9, r3)                    @ r9<- object
8058    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
8059    cmp     r9, #0                      @ is object null?
8060    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
8061    beq     .LOP_CHECK_CAST_JUMBO_okay            @ null obj, cast always succeeds
8062    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
8063    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8064    cmp     r1, #0                      @ have we resolved this before?
8065    beq     .LOP_CHECK_CAST_JUMBO_resolve         @ not resolved, do it now
8066.LOP_CHECK_CAST_JUMBO_resolved:
8067    cmp     r0, r1                      @ same class (trivial success)?
8068    bne     .LOP_CHECK_CAST_JUMBO_fullcheck       @ no, do full check
8069    b       .LOP_CHECK_CAST_JUMBO_okay            @ yes, finish up
8070
8071/* ------------------------------ */
8072    .balign 64
8073.L_OP_INSTANCE_OF_JUMBO: /* 0x102 */
8074/* File: armv5te/OP_INSTANCE_OF_JUMBO.S */
8075    /*
8076     * Check to see if an object reference is an instance of a class.
8077     *
8078     * Most common situation is a non-null object, being compared against
8079     * an already-resolved class.
8080     *
8081     * TODO: convert most of this into a common subroutine, shared with
8082     *       OP_INSTANCE_OF.S.
8083     */
8084    /* instance-of/jumbo vBBBB, vCCCC, class@AAAAAAAA */
8085    FETCH(r3, 4)                        @ r3<- vCCCC
8086    FETCH(r9, 3)                        @ r9<- vBBBB
8087    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
8088    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
8089    cmp     r0, #0                      @ is object null?
8090    beq     .LOP_INSTANCE_OF_JUMBO_store           @ null obj, not an instance, store r0
8091    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8092    FETCH(r3, 2)                        @ r3<- AAAA (hi)
8093    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
8094    orr     r3, r1, r3, lsl #16         @ r3<- AAAAaaaa
8095    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
8096    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
8097    cmp     r1, #0                      @ have we resolved this before?
8098    beq     .LOP_INSTANCE_OF_JUMBO_resolve         @ not resolved, do it now
8099    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ resolved, continue
8100
8101/* ------------------------------ */
8102    .balign 64
8103.L_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
8104/* File: armv5te/OP_NEW_INSTANCE_JUMBO.S */
8105    /*
8106     * Create a new instance of a class.
8107     */
8108    /* new-instance/jumbo vBBBB, class@AAAAAAAA */
8109    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8110    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8111    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8112    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8113    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
8114    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
8115#if defined(WITH_JIT)
8116    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
8117#endif
8118    EXPORT_PC()                         @ req'd for init, resolve, alloc
8119    cmp     r0, #0                      @ already resolved?
8120    beq     .LOP_NEW_INSTANCE_JUMBO_resolve         @ no, resolve it now
8121.LOP_NEW_INSTANCE_JUMBO_resolved:   @ r0=class
8122    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
8123    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
8124    bne     .LOP_NEW_INSTANCE_JUMBO_needinit        @ no, init class now
8125.LOP_NEW_INSTANCE_JUMBO_initialized: @ r0=class
8126    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
8127    bl      dvmAllocObject              @ r0<- new object
8128    b       .LOP_NEW_INSTANCE_JUMBO_finish          @ continue
8129
8130/* ------------------------------ */
8131    .balign 64
8132.L_OP_NEW_ARRAY_JUMBO: /* 0x104 */
8133/* File: armv5te/OP_NEW_ARRAY_JUMBO.S */
8134    /*
8135     * Allocate an array of objects, specified with the array class
8136     * and a count.
8137     *
8138     * The verifier guarantees that this is an array class, so we don't
8139     * check for it here.
8140     */
8141    /* new-array/jumbo vBBBB, vCCCC, class@AAAAAAAA */
8142    FETCH(r2, 1)                        @ r2<- aaaa (lo)
8143    FETCH(r3, 2)                        @ r3<- AAAA (hi)
8144    FETCH(r0, 4)                        @ r0<- vCCCC
8145    orr     r2, r2, r3, lsl #16         @ r2<- AAAAaaaa
8146    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8147    GET_VREG(r1, r0)                    @ r1<- vCCCC (array length)
8148    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
8149    cmp     r1, #0                      @ check length
8150    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
8151    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
8152    cmp     r0, #0                      @ already resolved?
8153    EXPORT_PC()                         @ req'd for resolve, alloc
8154    bne     .LOP_NEW_ARRAY_JUMBO_finish          @ resolved, continue
8155    b       .LOP_NEW_ARRAY_JUMBO_resolve         @ do resolve now
8156
8157/* ------------------------------ */
8158    .balign 64
8159.L_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
8160/* File: armv5te/OP_FILLED_NEW_ARRAY_JUMBO.S */
8161    /*
8162     * Create a new array with elements filled from registers.
8163     *
8164     * TODO: convert most of this into a common subroutine, shared with
8165     *       OP_FILLED_NEW_ARRAY.S.
8166     */
8167    /* filled-new-array/jumbo {vCCCC..v(CCCC+BBBB-1)}, type@AAAAAAAA */
8168    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8169    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8170    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8171    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
8172    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8173    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
8174    EXPORT_PC()                         @ need for resolve and alloc
8175    cmp     r0, #0                      @ already resolved?
8176    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_continue        @ yes, continue on
81778:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
8178    mov     r2, #0                      @ r2<- false
8179    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8180    bl      dvmResolveClass             @ r0<- call(clazz, ref)
8181    cmp     r0, #0                      @ got null?
8182    beq     common_exceptionThrown      @ yes, handle exception
8183    b       .LOP_FILLED_NEW_ARRAY_JUMBO_continue
8184
8185/* ------------------------------ */
8186    .balign 64
8187.L_OP_IGET_JUMBO: /* 0x106 */
8188/* File: armv5te/OP_IGET_JUMBO.S */
8189    /*
8190     * Jumbo 32-bit instance field get.
8191     *
8192     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8193     *      iget-char/jumbo, iget-short/jumbo
8194     */
8195    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8196    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8197    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8198    FETCH(r0, 4)                        @ r0<- CCCC
8199    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8200    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8201    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8202    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8203    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8204    cmp     r0, #0                      @ is resolved entry null?
8205    bne     .LOP_IGET_JUMBO_finish          @ no, already resolved
82068:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8207    EXPORT_PC()                         @ resolve() could throw
8208    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8209    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8210    b       .LOP_IGET_JUMBO_resolved        @ resolved, continue
8211
8212/* ------------------------------ */
8213    .balign 64
8214.L_OP_IGET_WIDE_JUMBO: /* 0x107 */
8215/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
8216    /*
8217     * Jumbo 64-bit instance field get.
8218     */
8219    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8220    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8221    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8222    FETCH(r0, 4)                        @ r0<- CCCC
8223    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8224    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8225    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
8226    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8227    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8228    cmp     r0, #0                      @ is resolved entry null?
8229    bne     .LOP_IGET_WIDE_JUMBO_finish          @ no, already resolved
8230    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
8231    EXPORT_PC()                         @ resolve() could throw
8232    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8233    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8234    b       .LOP_IGET_WIDE_JUMBO_resolved        @ resolved, continue
8235
8236/* ------------------------------ */
8237    .balign 64
8238.L_OP_IGET_OBJECT_JUMBO: /* 0x108 */
8239/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
8240/* File: armv5te/OP_IGET_JUMBO.S */
8241    /*
8242     * Jumbo 32-bit instance field get.
8243     *
8244     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8245     *      iget-char/jumbo, iget-short/jumbo
8246     */
8247    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8248    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8249    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8250    FETCH(r0, 4)                        @ r0<- CCCC
8251    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8252    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8253    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8254    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8255    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8256    cmp     r0, #0                      @ is resolved entry null?
8257    bne     .LOP_IGET_OBJECT_JUMBO_finish          @ no, already resolved
82588:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8259    EXPORT_PC()                         @ resolve() could throw
8260    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8261    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8262    b       .LOP_IGET_OBJECT_JUMBO_resolved        @ resolved, continue
8263
8264
8265/* ------------------------------ */
8266    .balign 64
8267.L_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
8268/* File: armv5te/OP_IGET_BOOLEAN_JUMBO.S */
8269@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrb", "sqnum":"1" }
8270/* File: armv5te/OP_IGET_JUMBO.S */
8271    /*
8272     * Jumbo 32-bit instance field get.
8273     *
8274     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8275     *      iget-char/jumbo, iget-short/jumbo
8276     */
8277    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8278    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8279    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8280    FETCH(r0, 4)                        @ r0<- CCCC
8281    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8282    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8283    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8284    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8285    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8286    cmp     r0, #0                      @ is resolved entry null?
8287    bne     .LOP_IGET_BOOLEAN_JUMBO_finish          @ no, already resolved
82888:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8289    EXPORT_PC()                         @ resolve() could throw
8290    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8291    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8292    b       .LOP_IGET_BOOLEAN_JUMBO_resolved        @ resolved, continue
8293
8294
8295/* ------------------------------ */
8296    .balign 64
8297.L_OP_IGET_BYTE_JUMBO: /* 0x10a */
8298/* File: armv5te/OP_IGET_BYTE_JUMBO.S */
8299@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsb", "sqnum":"2" }
8300/* File: armv5te/OP_IGET_JUMBO.S */
8301    /*
8302     * Jumbo 32-bit instance field get.
8303     *
8304     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8305     *      iget-char/jumbo, iget-short/jumbo
8306     */
8307    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8308    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8309    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8310    FETCH(r0, 4)                        @ r0<- CCCC
8311    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8312    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8313    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8314    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8315    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8316    cmp     r0, #0                      @ is resolved entry null?
8317    bne     .LOP_IGET_BYTE_JUMBO_finish          @ no, already resolved
83188:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8319    EXPORT_PC()                         @ resolve() could throw
8320    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8321    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8322    b       .LOP_IGET_BYTE_JUMBO_resolved        @ resolved, continue
8323
8324
8325/* ------------------------------ */
8326    .balign 64
8327.L_OP_IGET_CHAR_JUMBO: /* 0x10b */
8328/* File: armv5te/OP_IGET_CHAR_JUMBO.S */
8329@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrh", "sqnum":"3" }
8330/* File: armv5te/OP_IGET_JUMBO.S */
8331    /*
8332     * Jumbo 32-bit instance field get.
8333     *
8334     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8335     *      iget-char/jumbo, iget-short/jumbo
8336     */
8337    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8338    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8339    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8340    FETCH(r0, 4)                        @ r0<- CCCC
8341    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8342    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8343    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8344    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8345    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8346    cmp     r0, #0                      @ is resolved entry null?
8347    bne     .LOP_IGET_CHAR_JUMBO_finish          @ no, already resolved
83488:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8349    EXPORT_PC()                         @ resolve() could throw
8350    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8351    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8352    b       .LOP_IGET_CHAR_JUMBO_resolved        @ resolved, continue
8353
8354
8355/* ------------------------------ */
8356    .balign 64
8357.L_OP_IGET_SHORT_JUMBO: /* 0x10c */
8358/* File: armv5te/OP_IGET_SHORT_JUMBO.S */
8359@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsh", "sqnum":"4" }
8360/* File: armv5te/OP_IGET_JUMBO.S */
8361    /*
8362     * Jumbo 32-bit instance field get.
8363     *
8364     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8365     *      iget-char/jumbo, iget-short/jumbo
8366     */
8367    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8368    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8369    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8370    FETCH(r0, 4)                        @ r0<- CCCC
8371    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8372    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8373    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8374    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8375    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8376    cmp     r0, #0                      @ is resolved entry null?
8377    bne     .LOP_IGET_SHORT_JUMBO_finish          @ no, already resolved
83788:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8379    EXPORT_PC()                         @ resolve() could throw
8380    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8381    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8382    b       .LOP_IGET_SHORT_JUMBO_resolved        @ resolved, continue
8383
8384
8385/* ------------------------------ */
8386    .balign 64
8387.L_OP_IPUT_JUMBO: /* 0x10d */
8388/* File: armv5te/OP_IPUT_JUMBO.S */
8389    /*
8390     * Jumbo 32-bit instance field put.
8391     *
8392     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8393     *      iput-short/jumbo
8394     */
8395    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8396    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8397    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8398    FETCH(r0, 4)                        @ r0<- CCCC
8399    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8400    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8401    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8402    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8403    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8404    cmp     r0, #0                      @ is resolved entry null?
8405    bne     .LOP_IPUT_JUMBO_finish          @ no, already resolved
84068:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8407    EXPORT_PC()                         @ resolve() could throw
8408    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8409    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8410    b       .LOP_IPUT_JUMBO_resolved        @ resolved, continue
8411
8412/* ------------------------------ */
8413    .balign 64
8414.L_OP_IPUT_WIDE_JUMBO: /* 0x10e */
8415/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
8416    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8417    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8418    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8419    FETCH(r0, 4)                        @ r0<- CCCC
8420    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8421    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8422    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
8423    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
8424    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8425    cmp     r0, #0                      @ is resolved entry null?
8426    bne     .LOP_IPUT_WIDE_JUMBO_finish          @ no, already resolved
84278:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
8428    EXPORT_PC()                         @ resolve() could throw
8429    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8430    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8431    b       .LOP_IPUT_WIDE_JUMBO_resolved        @ resolved, continue
8432
8433/* ------------------------------ */
8434    .balign 64
8435.L_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
8436/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
8437    /*
8438     * Jumbo 32-bit instance field put.
8439     */
8440    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8441    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8442    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8443    FETCH(r0, 4)                        @ r0<- CCCC
8444    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8445    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8446    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8447    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8448    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8449    cmp     r0, #0                      @ is resolved entry null?
8450    bne     .LOP_IPUT_OBJECT_JUMBO_finish          @ no, already resolved
84518:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8452    EXPORT_PC()                         @ resolve() could throw
8453    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8454    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8455    b       .LOP_IPUT_OBJECT_JUMBO_resolved        @ resolved, continue
8456
8457/* ------------------------------ */
8458    .balign 64
8459.L_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
8460/* File: armv5te/OP_IPUT_BOOLEAN_JUMBO.S */
8461@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"1" }
8462/* File: armv5te/OP_IPUT_JUMBO.S */
8463    /*
8464     * Jumbo 32-bit instance field put.
8465     *
8466     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8467     *      iput-short/jumbo
8468     */
8469    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8470    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8471    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8472    FETCH(r0, 4)                        @ r0<- CCCC
8473    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8474    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8475    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8476    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8477    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8478    cmp     r0, #0                      @ is resolved entry null?
8479    bne     .LOP_IPUT_BOOLEAN_JUMBO_finish          @ no, already resolved
84808:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8481    EXPORT_PC()                         @ resolve() could throw
8482    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8483    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8484    b       .LOP_IPUT_BOOLEAN_JUMBO_resolved        @ resolved, continue
8485
8486
8487/* ------------------------------ */
8488    .balign 64
8489.L_OP_IPUT_BYTE_JUMBO: /* 0x111 */
8490/* File: armv5te/OP_IPUT_BYTE_JUMBO.S */
8491@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"2" }
8492/* File: armv5te/OP_IPUT_JUMBO.S */
8493    /*
8494     * Jumbo 32-bit instance field put.
8495     *
8496     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8497     *      iput-short/jumbo
8498     */
8499    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8500    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8501    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8502    FETCH(r0, 4)                        @ r0<- CCCC
8503    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8504    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8505    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8506    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8507    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8508    cmp     r0, #0                      @ is resolved entry null?
8509    bne     .LOP_IPUT_BYTE_JUMBO_finish          @ no, already resolved
85108:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8511    EXPORT_PC()                         @ resolve() could throw
8512    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8513    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8514    b       .LOP_IPUT_BYTE_JUMBO_resolved        @ resolved, continue
8515
8516
8517/* ------------------------------ */
8518    .balign 64
8519.L_OP_IPUT_CHAR_JUMBO: /* 0x112 */
8520/* File: armv5te/OP_IPUT_CHAR_JUMBO.S */
8521@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"3" }
8522/* File: armv5te/OP_IPUT_JUMBO.S */
8523    /*
8524     * Jumbo 32-bit instance field put.
8525     *
8526     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8527     *      iput-short/jumbo
8528     */
8529    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8530    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8531    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8532    FETCH(r0, 4)                        @ r0<- CCCC
8533    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8534    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8535    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8536    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8537    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8538    cmp     r0, #0                      @ is resolved entry null?
8539    bne     .LOP_IPUT_CHAR_JUMBO_finish          @ no, already resolved
85408:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8541    EXPORT_PC()                         @ resolve() could throw
8542    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8543    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8544    b       .LOP_IPUT_CHAR_JUMBO_resolved        @ resolved, continue
8545
8546
8547/* ------------------------------ */
8548    .balign 64
8549.L_OP_IPUT_SHORT_JUMBO: /* 0x113 */
8550/* File: armv5te/OP_IPUT_SHORT_JUMBO.S */
8551@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"4" }
8552/* File: armv5te/OP_IPUT_JUMBO.S */
8553    /*
8554     * Jumbo 32-bit instance field put.
8555     *
8556     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8557     *      iput-short/jumbo
8558     */
8559    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8560    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8561    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8562    FETCH(r0, 4)                        @ r0<- CCCC
8563    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8564    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8565    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8566    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8567    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8568    cmp     r0, #0                      @ is resolved entry null?
8569    bne     .LOP_IPUT_SHORT_JUMBO_finish          @ no, already resolved
85708:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8571    EXPORT_PC()                         @ resolve() could throw
8572    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8573    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8574    b       .LOP_IPUT_SHORT_JUMBO_resolved        @ resolved, continue
8575
8576
8577/* ------------------------------ */
8578    .balign 64
8579.L_OP_SGET_JUMBO: /* 0x114 */
8580/* File: armv5te/OP_SGET_JUMBO.S */
8581    /*
8582     * Jumbo 32-bit SGET handler.
8583     *
8584     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8585     *      sget-char/jumbo, sget-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_SGET_JUMBO_resolve         @ yes, do resolve
8596.LOP_SGET_JUMBO_finish: @ field ptr in r0
8597    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8598    @ no-op                             @ acquiring load
8599    FETCH(r2, 3)                        @ r2<- BBBB
8600    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8601    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8602    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8603    GOTO_OPCODE(ip)                     @ jump to next instruction
8604
8605/* ------------------------------ */
8606    .balign 64
8607.L_OP_SGET_WIDE_JUMBO: /* 0x115 */
8608/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
8609    /*
8610     * Jumbo 64-bit SGET handler.
8611     */
8612    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
8613    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8614    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8615    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8616    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
8617    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8618    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
8619    cmp     r0, #0                      @ is resolved entry null?
8620    beq     .LOP_SGET_WIDE_JUMBO_resolve         @ yes, do resolve
8621.LOP_SGET_WIDE_JUMBO_finish:
8622    FETCH(r9, 3)                        @ r9<- BBBB
8623    .if 0
8624    add     r0, r0, #offStaticField_value @ r0<- pointer to data
8625    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
8626    .else
8627    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
8628    .endif
8629    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8630    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8631    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
8632    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8633    GOTO_OPCODE(ip)                     @ jump to next instruction
8634
8635/* ------------------------------ */
8636    .balign 64
8637.L_OP_SGET_OBJECT_JUMBO: /* 0x116 */
8638/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
8639/* File: armv5te/OP_SGET_JUMBO.S */
8640    /*
8641     * Jumbo 32-bit SGET handler.
8642     *
8643     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8644     *      sget-char/jumbo, sget-short/jumbo
8645     */
8646    /* exop vBBBB, field@AAAAAAAA */
8647    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8648    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8649    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8650    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8651    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8652    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8653    cmp     r0, #0                      @ is resolved entry null?
8654    beq     .LOP_SGET_OBJECT_JUMBO_resolve         @ yes, do resolve
8655.LOP_SGET_OBJECT_JUMBO_finish: @ field ptr in r0
8656    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8657    @ no-op                             @ acquiring load
8658    FETCH(r2, 3)                        @ r2<- BBBB
8659    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8660    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8661    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8662    GOTO_OPCODE(ip)                     @ jump to next instruction
8663
8664
8665/* ------------------------------ */
8666    .balign 64
8667.L_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
8668/* File: armv5te/OP_SGET_BOOLEAN_JUMBO.S */
8669/* File: armv5te/OP_SGET_JUMBO.S */
8670    /*
8671     * Jumbo 32-bit SGET handler.
8672     *
8673     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8674     *      sget-char/jumbo, sget-short/jumbo
8675     */
8676    /* exop vBBBB, field@AAAAAAAA */
8677    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8678    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8679    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8680    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8681    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8682    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8683    cmp     r0, #0                      @ is resolved entry null?
8684    beq     .LOP_SGET_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8685.LOP_SGET_BOOLEAN_JUMBO_finish: @ field ptr in r0
8686    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8687    @ no-op                             @ acquiring load
8688    FETCH(r2, 3)                        @ r2<- BBBB
8689    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8690    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8691    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8692    GOTO_OPCODE(ip)                     @ jump to next instruction
8693
8694
8695/* ------------------------------ */
8696    .balign 64
8697.L_OP_SGET_BYTE_JUMBO: /* 0x118 */
8698/* File: armv5te/OP_SGET_BYTE_JUMBO.S */
8699/* File: armv5te/OP_SGET_JUMBO.S */
8700    /*
8701     * Jumbo 32-bit SGET handler.
8702     *
8703     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8704     *      sget-char/jumbo, sget-short/jumbo
8705     */
8706    /* exop vBBBB, field@AAAAAAAA */
8707    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8708    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8709    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8710    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8711    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8712    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8713    cmp     r0, #0                      @ is resolved entry null?
8714    beq     .LOP_SGET_BYTE_JUMBO_resolve         @ yes, do resolve
8715.LOP_SGET_BYTE_JUMBO_finish: @ field ptr in r0
8716    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8717    @ no-op                             @ acquiring load
8718    FETCH(r2, 3)                        @ r2<- BBBB
8719    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8720    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8721    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8722    GOTO_OPCODE(ip)                     @ jump to next instruction
8723
8724
8725/* ------------------------------ */
8726    .balign 64
8727.L_OP_SGET_CHAR_JUMBO: /* 0x119 */
8728/* File: armv5te/OP_SGET_CHAR_JUMBO.S */
8729/* File: armv5te/OP_SGET_JUMBO.S */
8730    /*
8731     * Jumbo 32-bit SGET handler.
8732     *
8733     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8734     *      sget-char/jumbo, sget-short/jumbo
8735     */
8736    /* exop vBBBB, field@AAAAAAAA */
8737    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8738    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8739    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8740    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8741    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8742    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8743    cmp     r0, #0                      @ is resolved entry null?
8744    beq     .LOP_SGET_CHAR_JUMBO_resolve         @ yes, do resolve
8745.LOP_SGET_CHAR_JUMBO_finish: @ field ptr in r0
8746    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8747    @ no-op                             @ acquiring load
8748    FETCH(r2, 3)                        @ r2<- BBBB
8749    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8750    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8751    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8752    GOTO_OPCODE(ip)                     @ jump to next instruction
8753
8754
8755/* ------------------------------ */
8756    .balign 64
8757.L_OP_SGET_SHORT_JUMBO: /* 0x11a */
8758/* File: armv5te/OP_SGET_SHORT_JUMBO.S */
8759/* File: armv5te/OP_SGET_JUMBO.S */
8760    /*
8761     * Jumbo 32-bit SGET handler.
8762     *
8763     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8764     *      sget-char/jumbo, sget-short/jumbo
8765     */
8766    /* exop vBBBB, field@AAAAAAAA */
8767    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8768    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8769    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8770    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8771    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8772    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8773    cmp     r0, #0                      @ is resolved entry null?
8774    beq     .LOP_SGET_SHORT_JUMBO_resolve         @ yes, do resolve
8775.LOP_SGET_SHORT_JUMBO_finish: @ field ptr in r0
8776    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8777    @ no-op                             @ acquiring load
8778    FETCH(r2, 3)                        @ r2<- BBBB
8779    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8780    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8781    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8782    GOTO_OPCODE(ip)                     @ jump to next instruction
8783
8784
8785/* ------------------------------ */
8786    .balign 64
8787.L_OP_SPUT_JUMBO: /* 0x11b */
8788/* File: armv5te/OP_SPUT_JUMBO.S */
8789    /*
8790     * Jumbo 32-bit SPUT handler.
8791     *
8792     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8793     *      sput-short/jumbo
8794     */
8795    /* exop vBBBB, field@AAAAAAAA */
8796    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8797    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8798    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8799    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8800    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8801    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8802    cmp     r0, #0                      @ is resolved entry null?
8803    beq     .LOP_SPUT_JUMBO_resolve         @ yes, do resolve
8804.LOP_SPUT_JUMBO_finish:   @ field ptr in r0
8805    FETCH(r2, 3)                        @ r2<- BBBB
8806    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8807    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8808    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8809    @ no-op                             @ releasing store
8810    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8811    GOTO_OPCODE(ip)                     @ jump to next instruction
8812
8813/* ------------------------------ */
8814    .balign 64
8815.L_OP_SPUT_WIDE_JUMBO: /* 0x11c */
8816/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
8817    /*
8818     * Jumbo 64-bit SPUT handler.
8819     */
8820    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
8821    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
8822    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8823    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8824    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8825    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8826    FETCH(r9, 3)                        @ r9<- BBBB
8827    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
8828    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8829    cmp     r2, #0                      @ is resolved entry null?
8830    beq     .LOP_SPUT_WIDE_JUMBO_resolve         @ yes, do resolve
8831.LOP_SPUT_WIDE_JUMBO_finish: @ field ptr in r2, BBBB in r9
8832    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8833    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
8834    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8835    .if 0
8836    add     r2, r2, #offStaticField_value @ r2<- pointer to data
8837    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
8838    .else
8839    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
8840    .endif
8841    GOTO_OPCODE(r10)                    @ jump to next instruction
8842
8843/* ------------------------------ */
8844    .balign 64
8845.L_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
8846/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
8847    /*
8848     * Jumbo 32-bit SPUT handler for objects
8849     */
8850    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
8851    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8852    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8853    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8854    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8855    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8856    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8857    cmp     r0, #0                      @ is resolved entry null?
8858    beq     .LOP_SPUT_OBJECT_JUMBO_resolve         @ yes, do resolve
8859.LOP_SPUT_OBJECT_JUMBO_finish:   @ field ptr in r0
8860    FETCH(r2, 3)                        @ r2<- BBBB
8861    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8862    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8863    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8864    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
8865    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8866    @ no-op                             @ releasing store
8867    b       .LOP_SPUT_OBJECT_JUMBO_end
8868
8869/* ------------------------------ */
8870    .balign 64
8871.L_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
8872/* File: armv5te/OP_SPUT_BOOLEAN_JUMBO.S */
8873/* File: armv5te/OP_SPUT_JUMBO.S */
8874    /*
8875     * Jumbo 32-bit SPUT handler.
8876     *
8877     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8878     *      sput-short/jumbo
8879     */
8880    /* exop vBBBB, field@AAAAAAAA */
8881    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8882    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8883    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8884    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8885    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8886    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8887    cmp     r0, #0                      @ is resolved entry null?
8888    beq     .LOP_SPUT_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8889.LOP_SPUT_BOOLEAN_JUMBO_finish:   @ field ptr in r0
8890    FETCH(r2, 3)                        @ r2<- BBBB
8891    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8892    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8893    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8894    @ no-op                             @ releasing store
8895    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8896    GOTO_OPCODE(ip)                     @ jump to next instruction
8897
8898
8899/* ------------------------------ */
8900    .balign 64
8901.L_OP_SPUT_BYTE_JUMBO: /* 0x11f */
8902/* File: armv5te/OP_SPUT_BYTE_JUMBO.S */
8903/* File: armv5te/OP_SPUT_JUMBO.S */
8904    /*
8905     * Jumbo 32-bit SPUT handler.
8906     *
8907     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8908     *      sput-short/jumbo
8909     */
8910    /* exop vBBBB, field@AAAAAAAA */
8911    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8912    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8913    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8914    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8915    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8916    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8917    cmp     r0, #0                      @ is resolved entry null?
8918    beq     .LOP_SPUT_BYTE_JUMBO_resolve         @ yes, do resolve
8919.LOP_SPUT_BYTE_JUMBO_finish:   @ field ptr in r0
8920    FETCH(r2, 3)                        @ r2<- BBBB
8921    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8922    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8923    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8924    @ no-op                             @ releasing store
8925    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8926    GOTO_OPCODE(ip)                     @ jump to next instruction
8927
8928
8929/* ------------------------------ */
8930    .balign 64
8931.L_OP_SPUT_CHAR_JUMBO: /* 0x120 */
8932/* File: armv5te/OP_SPUT_CHAR_JUMBO.S */
8933/* File: armv5te/OP_SPUT_JUMBO.S */
8934    /*
8935     * Jumbo 32-bit SPUT handler.
8936     *
8937     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8938     *      sput-short/jumbo
8939     */
8940    /* exop vBBBB, field@AAAAAAAA */
8941    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8942    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8943    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8944    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8945    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8946    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8947    cmp     r0, #0                      @ is resolved entry null?
8948    beq     .LOP_SPUT_CHAR_JUMBO_resolve         @ yes, do resolve
8949.LOP_SPUT_CHAR_JUMBO_finish:   @ field ptr in r0
8950    FETCH(r2, 3)                        @ r2<- BBBB
8951    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8952    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8953    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8954    @ no-op                             @ releasing store
8955    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8956    GOTO_OPCODE(ip)                     @ jump to next instruction
8957
8958
8959/* ------------------------------ */
8960    .balign 64
8961.L_OP_SPUT_SHORT_JUMBO: /* 0x121 */
8962/* File: armv5te/OP_SPUT_SHORT_JUMBO.S */
8963/* File: armv5te/OP_SPUT_JUMBO.S */
8964    /*
8965     * Jumbo 32-bit SPUT handler.
8966     *
8967     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8968     *      sput-short/jumbo
8969     */
8970    /* exop vBBBB, field@AAAAAAAA */
8971    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8972    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8973    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8974    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8975    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8976    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8977    cmp     r0, #0                      @ is resolved entry null?
8978    beq     .LOP_SPUT_SHORT_JUMBO_resolve         @ yes, do resolve
8979.LOP_SPUT_SHORT_JUMBO_finish:   @ field ptr in r0
8980    FETCH(r2, 3)                        @ r2<- BBBB
8981    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8982    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8983    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8984    @ no-op                             @ releasing store
8985    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8986    GOTO_OPCODE(ip)                     @ jump to next instruction
8987
8988
8989/* ------------------------------ */
8990    .balign 64
8991.L_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
8992/* File: armv5te/OP_INVOKE_VIRTUAL_JUMBO.S */
8993    /*
8994     * Handle a virtual method call.
8995     */
8996    /* invoke-virtual/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8997    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8998    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8999    FETCH(r1, 2)                        @ r1<- AAAA (hi)
9000    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
9001    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
9002    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
9003    cmp     r0, #0                      @ already resolved?
9004    EXPORT_PC()                         @ must export for invoke
9005    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ yes, continue on
9006    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
9007    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9008    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9009    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9010    cmp     r0, #0                      @ got null?
9011    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ no, continue
9012    b       common_exceptionThrown      @ yes, handle exception
9013
9014/* ------------------------------ */
9015    .balign 64
9016.L_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
9017/* File: armv5te/OP_INVOKE_SUPER_JUMBO.S */
9018    /*
9019     * Handle a "super" method call.
9020     */
9021    /* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9022    FETCH(r10, 4)                       @ r10<- CCCC
9023    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
9024    FETCH(r0, 1)                        @ r1<- aaaa (lo)
9025    FETCH(r1, 2)                        @ r1<- AAAA (hi)
9026    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
9027    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
9028    GET_VREG(r9, r10)                   @ r9<- "this" ptr
9029    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
9030    cmp     r9, #0                      @ null "this"?
9031    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
9032    beq     common_errNullObject        @ null "this", throw exception
9033    cmp     r0, #0                      @ already resolved?
9034    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
9035    EXPORT_PC()                         @ must export for invoke
9036    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ resolved, continue on
9037    b       .LOP_INVOKE_SUPER_JUMBO_resolve         @ do resolve now
9038
9039/* ------------------------------ */
9040    .balign 64
9041.L_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
9042/* File: armv5te/OP_INVOKE_DIRECT_JUMBO.S */
9043    /*
9044     * Handle a direct method call.
9045     *
9046     * (We could defer the "is 'this' pointer null" test to the common
9047     * method invocation code, and use a flag to indicate that static
9048     * calls don't count.  If we do this as part of copying the arguments
9049     * out we could avoiding loading the first arg twice.)
9050     *
9051     */
9052    /* invoke-direct/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9053    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
9054    FETCH(r0, 1)                        @ r1<- aaaa (lo)
9055    FETCH(r1, 2)                        @ r1<- AAAA (hi)
9056    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
9057    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
9058    FETCH(r10, 4)                       @ r10<- CCCC
9059    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
9060    cmp     r0, #0                      @ already resolved?
9061    EXPORT_PC()                         @ must export for invoke
9062    GET_VREG(r9, r10)                   @ r9<- "this" ptr
9063    beq     .LOP_INVOKE_DIRECT_JUMBO_resolve         @ not resolved, do it now
9064.LOP_INVOKE_DIRECT_JUMBO_finish:
9065    cmp     r9, #0                      @ null "this" ref?
9066    bne     common_invokeMethodJumbo    @ (r0=method, r9="this")
9067    b       common_errNullObject        @ yes, throw exception
9068
9069/* ------------------------------ */
9070    .balign 64
9071.L_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
9072/* File: armv5te/OP_INVOKE_STATIC_JUMBO.S */
9073    /*
9074     * Handle a static method call.
9075     */
9076    /* invoke-static/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9077    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
9078    FETCH(r0, 1)                        @ r1<- aaaa (lo)
9079    FETCH(r1, 2)                        @ r1<- AAAA (hi)
9080    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
9081    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
9082    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
9083#if defined(WITH_JIT)
9084    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
9085#endif
9086    cmp     r0, #0                      @ already resolved?
9087    EXPORT_PC()                         @ must export for invoke
9088    bne     common_invokeMethodJumboNoThis   @ (r0=method)
9089    b       .LOP_INVOKE_STATIC_JUMBO_resolve
9090
9091/* ------------------------------ */
9092    .balign 64
9093.L_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
9094/* File: armv5te/OP_INVOKE_INTERFACE_JUMBO.S */
9095    /*
9096     * Handle an interface method call.
9097     */
9098    /* invoke-interface/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
9099    FETCH(r2, 4)                        @ r2<- CCCC
9100    FETCH(r0, 1)                        @ r0<- aaaa (lo)
9101    FETCH(r1, 2)                        @ r1<- AAAA (hi)
9102    EXPORT_PC()                         @ must export for invoke
9103    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
9104    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
9105    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
9106    cmp     r9, #0                      @ null obj?
9107    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
9108    beq     common_errNullObject        @ yes, fail
9109    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
9110    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
9111    cmp     r0, #0                      @ failed?
9112    beq     common_exceptionThrown      @ yes, handle exception
9113    b       common_invokeMethodJumbo    @ (r0=method, r9="this")
9114
9115/* ------------------------------ */
9116    .balign 64
9117.L_OP_UNUSED_27FF: /* 0x127 */
9118/* File: armv5te/OP_UNUSED_27FF.S */
9119/* File: armv5te/unused.S */
9120    bl      common_abort
9121
9122
9123/* ------------------------------ */
9124    .balign 64
9125.L_OP_UNUSED_28FF: /* 0x128 */
9126/* File: armv5te/OP_UNUSED_28FF.S */
9127/* File: armv5te/unused.S */
9128    bl      common_abort
9129
9130
9131/* ------------------------------ */
9132    .balign 64
9133.L_OP_UNUSED_29FF: /* 0x129 */
9134/* File: armv5te/OP_UNUSED_29FF.S */
9135/* File: armv5te/unused.S */
9136    bl      common_abort
9137
9138
9139/* ------------------------------ */
9140    .balign 64
9141.L_OP_UNUSED_2AFF: /* 0x12a */
9142/* File: armv5te/OP_UNUSED_2AFF.S */
9143/* File: armv5te/unused.S */
9144    bl      common_abort
9145
9146
9147/* ------------------------------ */
9148    .balign 64
9149.L_OP_UNUSED_2BFF: /* 0x12b */
9150/* File: armv5te/OP_UNUSED_2BFF.S */
9151/* File: armv5te/unused.S */
9152    bl      common_abort
9153
9154
9155/* ------------------------------ */
9156    .balign 64
9157.L_OP_UNUSED_2CFF: /* 0x12c */
9158/* File: armv5te/OP_UNUSED_2CFF.S */
9159/* File: armv5te/unused.S */
9160    bl      common_abort
9161
9162
9163/* ------------------------------ */
9164    .balign 64
9165.L_OP_UNUSED_2DFF: /* 0x12d */
9166/* File: armv5te/OP_UNUSED_2DFF.S */
9167/* File: armv5te/unused.S */
9168    bl      common_abort
9169
9170
9171/* ------------------------------ */
9172    .balign 64
9173.L_OP_UNUSED_2EFF: /* 0x12e */
9174/* File: armv5te/OP_UNUSED_2EFF.S */
9175/* File: armv5te/unused.S */
9176    bl      common_abort
9177
9178
9179/* ------------------------------ */
9180    .balign 64
9181.L_OP_UNUSED_2FFF: /* 0x12f */
9182/* File: armv5te/OP_UNUSED_2FFF.S */
9183/* File: armv5te/unused.S */
9184    bl      common_abort
9185
9186
9187/* ------------------------------ */
9188    .balign 64
9189.L_OP_UNUSED_30FF: /* 0x130 */
9190/* File: armv5te/OP_UNUSED_30FF.S */
9191/* File: armv5te/unused.S */
9192    bl      common_abort
9193
9194
9195/* ------------------------------ */
9196    .balign 64
9197.L_OP_UNUSED_31FF: /* 0x131 */
9198/* File: armv5te/OP_UNUSED_31FF.S */
9199/* File: armv5te/unused.S */
9200    bl      common_abort
9201
9202
9203/* ------------------------------ */
9204    .balign 64
9205.L_OP_UNUSED_32FF: /* 0x132 */
9206/* File: armv5te/OP_UNUSED_32FF.S */
9207/* File: armv5te/unused.S */
9208    bl      common_abort
9209
9210
9211/* ------------------------------ */
9212    .balign 64
9213.L_OP_UNUSED_33FF: /* 0x133 */
9214/* File: armv5te/OP_UNUSED_33FF.S */
9215/* File: armv5te/unused.S */
9216    bl      common_abort
9217
9218
9219/* ------------------------------ */
9220    .balign 64
9221.L_OP_UNUSED_34FF: /* 0x134 */
9222/* File: armv5te/OP_UNUSED_34FF.S */
9223/* File: armv5te/unused.S */
9224    bl      common_abort
9225
9226
9227/* ------------------------------ */
9228    .balign 64
9229.L_OP_UNUSED_35FF: /* 0x135 */
9230/* File: armv5te/OP_UNUSED_35FF.S */
9231/* File: armv5te/unused.S */
9232    bl      common_abort
9233
9234
9235/* ------------------------------ */
9236    .balign 64
9237.L_OP_UNUSED_36FF: /* 0x136 */
9238/* File: armv5te/OP_UNUSED_36FF.S */
9239/* File: armv5te/unused.S */
9240    bl      common_abort
9241
9242
9243/* ------------------------------ */
9244    .balign 64
9245.L_OP_UNUSED_37FF: /* 0x137 */
9246/* File: armv5te/OP_UNUSED_37FF.S */
9247/* File: armv5te/unused.S */
9248    bl      common_abort
9249
9250
9251/* ------------------------------ */
9252    .balign 64
9253.L_OP_UNUSED_38FF: /* 0x138 */
9254/* File: armv5te/OP_UNUSED_38FF.S */
9255/* File: armv5te/unused.S */
9256    bl      common_abort
9257
9258
9259/* ------------------------------ */
9260    .balign 64
9261.L_OP_UNUSED_39FF: /* 0x139 */
9262/* File: armv5te/OP_UNUSED_39FF.S */
9263/* File: armv5te/unused.S */
9264    bl      common_abort
9265
9266
9267/* ------------------------------ */
9268    .balign 64
9269.L_OP_UNUSED_3AFF: /* 0x13a */
9270/* File: armv5te/OP_UNUSED_3AFF.S */
9271/* File: armv5te/unused.S */
9272    bl      common_abort
9273
9274
9275/* ------------------------------ */
9276    .balign 64
9277.L_OP_UNUSED_3BFF: /* 0x13b */
9278/* File: armv5te/OP_UNUSED_3BFF.S */
9279/* File: armv5te/unused.S */
9280    bl      common_abort
9281
9282
9283/* ------------------------------ */
9284    .balign 64
9285.L_OP_UNUSED_3CFF: /* 0x13c */
9286/* File: armv5te/OP_UNUSED_3CFF.S */
9287/* File: armv5te/unused.S */
9288    bl      common_abort
9289
9290
9291/* ------------------------------ */
9292    .balign 64
9293.L_OP_UNUSED_3DFF: /* 0x13d */
9294/* File: armv5te/OP_UNUSED_3DFF.S */
9295/* File: armv5te/unused.S */
9296    bl      common_abort
9297
9298
9299/* ------------------------------ */
9300    .balign 64
9301.L_OP_UNUSED_3EFF: /* 0x13e */
9302/* File: armv5te/OP_UNUSED_3EFF.S */
9303/* File: armv5te/unused.S */
9304    bl      common_abort
9305
9306
9307/* ------------------------------ */
9308    .balign 64
9309.L_OP_UNUSED_3FFF: /* 0x13f */
9310/* File: armv5te/OP_UNUSED_3FFF.S */
9311/* File: armv5te/unused.S */
9312    bl      common_abort
9313
9314
9315/* ------------------------------ */
9316    .balign 64
9317.L_OP_UNUSED_40FF: /* 0x140 */
9318/* File: armv5te/OP_UNUSED_40FF.S */
9319/* File: armv5te/unused.S */
9320    bl      common_abort
9321
9322
9323/* ------------------------------ */
9324    .balign 64
9325.L_OP_UNUSED_41FF: /* 0x141 */
9326/* File: armv5te/OP_UNUSED_41FF.S */
9327/* File: armv5te/unused.S */
9328    bl      common_abort
9329
9330
9331/* ------------------------------ */
9332    .balign 64
9333.L_OP_UNUSED_42FF: /* 0x142 */
9334/* File: armv5te/OP_UNUSED_42FF.S */
9335/* File: armv5te/unused.S */
9336    bl      common_abort
9337
9338
9339/* ------------------------------ */
9340    .balign 64
9341.L_OP_UNUSED_43FF: /* 0x143 */
9342/* File: armv5te/OP_UNUSED_43FF.S */
9343/* File: armv5te/unused.S */
9344    bl      common_abort
9345
9346
9347/* ------------------------------ */
9348    .balign 64
9349.L_OP_UNUSED_44FF: /* 0x144 */
9350/* File: armv5te/OP_UNUSED_44FF.S */
9351/* File: armv5te/unused.S */
9352    bl      common_abort
9353
9354
9355/* ------------------------------ */
9356    .balign 64
9357.L_OP_UNUSED_45FF: /* 0x145 */
9358/* File: armv5te/OP_UNUSED_45FF.S */
9359/* File: armv5te/unused.S */
9360    bl      common_abort
9361
9362
9363/* ------------------------------ */
9364    .balign 64
9365.L_OP_UNUSED_46FF: /* 0x146 */
9366/* File: armv5te/OP_UNUSED_46FF.S */
9367/* File: armv5te/unused.S */
9368    bl      common_abort
9369
9370
9371/* ------------------------------ */
9372    .balign 64
9373.L_OP_UNUSED_47FF: /* 0x147 */
9374/* File: armv5te/OP_UNUSED_47FF.S */
9375/* File: armv5te/unused.S */
9376    bl      common_abort
9377
9378
9379/* ------------------------------ */
9380    .balign 64
9381.L_OP_UNUSED_48FF: /* 0x148 */
9382/* File: armv5te/OP_UNUSED_48FF.S */
9383/* File: armv5te/unused.S */
9384    bl      common_abort
9385
9386
9387/* ------------------------------ */
9388    .balign 64
9389.L_OP_UNUSED_49FF: /* 0x149 */
9390/* File: armv5te/OP_UNUSED_49FF.S */
9391/* File: armv5te/unused.S */
9392    bl      common_abort
9393
9394
9395/* ------------------------------ */
9396    .balign 64
9397.L_OP_UNUSED_4AFF: /* 0x14a */
9398/* File: armv5te/OP_UNUSED_4AFF.S */
9399/* File: armv5te/unused.S */
9400    bl      common_abort
9401
9402
9403/* ------------------------------ */
9404    .balign 64
9405.L_OP_UNUSED_4BFF: /* 0x14b */
9406/* File: armv5te/OP_UNUSED_4BFF.S */
9407/* File: armv5te/unused.S */
9408    bl      common_abort
9409
9410
9411/* ------------------------------ */
9412    .balign 64
9413.L_OP_UNUSED_4CFF: /* 0x14c */
9414/* File: armv5te/OP_UNUSED_4CFF.S */
9415/* File: armv5te/unused.S */
9416    bl      common_abort
9417
9418
9419/* ------------------------------ */
9420    .balign 64
9421.L_OP_UNUSED_4DFF: /* 0x14d */
9422/* File: armv5te/OP_UNUSED_4DFF.S */
9423/* File: armv5te/unused.S */
9424    bl      common_abort
9425
9426
9427/* ------------------------------ */
9428    .balign 64
9429.L_OP_UNUSED_4EFF: /* 0x14e */
9430/* File: armv5te/OP_UNUSED_4EFF.S */
9431/* File: armv5te/unused.S */
9432    bl      common_abort
9433
9434
9435/* ------------------------------ */
9436    .balign 64
9437.L_OP_UNUSED_4FFF: /* 0x14f */
9438/* File: armv5te/OP_UNUSED_4FFF.S */
9439/* File: armv5te/unused.S */
9440    bl      common_abort
9441
9442
9443/* ------------------------------ */
9444    .balign 64
9445.L_OP_UNUSED_50FF: /* 0x150 */
9446/* File: armv5te/OP_UNUSED_50FF.S */
9447/* File: armv5te/unused.S */
9448    bl      common_abort
9449
9450
9451/* ------------------------------ */
9452    .balign 64
9453.L_OP_UNUSED_51FF: /* 0x151 */
9454/* File: armv5te/OP_UNUSED_51FF.S */
9455/* File: armv5te/unused.S */
9456    bl      common_abort
9457
9458
9459/* ------------------------------ */
9460    .balign 64
9461.L_OP_UNUSED_52FF: /* 0x152 */
9462/* File: armv5te/OP_UNUSED_52FF.S */
9463/* File: armv5te/unused.S */
9464    bl      common_abort
9465
9466
9467/* ------------------------------ */
9468    .balign 64
9469.L_OP_UNUSED_53FF: /* 0x153 */
9470/* File: armv5te/OP_UNUSED_53FF.S */
9471/* File: armv5te/unused.S */
9472    bl      common_abort
9473
9474
9475/* ------------------------------ */
9476    .balign 64
9477.L_OP_UNUSED_54FF: /* 0x154 */
9478/* File: armv5te/OP_UNUSED_54FF.S */
9479/* File: armv5te/unused.S */
9480    bl      common_abort
9481
9482
9483/* ------------------------------ */
9484    .balign 64
9485.L_OP_UNUSED_55FF: /* 0x155 */
9486/* File: armv5te/OP_UNUSED_55FF.S */
9487/* File: armv5te/unused.S */
9488    bl      common_abort
9489
9490
9491/* ------------------------------ */
9492    .balign 64
9493.L_OP_UNUSED_56FF: /* 0x156 */
9494/* File: armv5te/OP_UNUSED_56FF.S */
9495/* File: armv5te/unused.S */
9496    bl      common_abort
9497
9498
9499/* ------------------------------ */
9500    .balign 64
9501.L_OP_UNUSED_57FF: /* 0x157 */
9502/* File: armv5te/OP_UNUSED_57FF.S */
9503/* File: armv5te/unused.S */
9504    bl      common_abort
9505
9506
9507/* ------------------------------ */
9508    .balign 64
9509.L_OP_UNUSED_58FF: /* 0x158 */
9510/* File: armv5te/OP_UNUSED_58FF.S */
9511/* File: armv5te/unused.S */
9512    bl      common_abort
9513
9514
9515/* ------------------------------ */
9516    .balign 64
9517.L_OP_UNUSED_59FF: /* 0x159 */
9518/* File: armv5te/OP_UNUSED_59FF.S */
9519/* File: armv5te/unused.S */
9520    bl      common_abort
9521
9522
9523/* ------------------------------ */
9524    .balign 64
9525.L_OP_UNUSED_5AFF: /* 0x15a */
9526/* File: armv5te/OP_UNUSED_5AFF.S */
9527/* File: armv5te/unused.S */
9528    bl      common_abort
9529
9530
9531/* ------------------------------ */
9532    .balign 64
9533.L_OP_UNUSED_5BFF: /* 0x15b */
9534/* File: armv5te/OP_UNUSED_5BFF.S */
9535/* File: armv5te/unused.S */
9536    bl      common_abort
9537
9538
9539/* ------------------------------ */
9540    .balign 64
9541.L_OP_UNUSED_5CFF: /* 0x15c */
9542/* File: armv5te/OP_UNUSED_5CFF.S */
9543/* File: armv5te/unused.S */
9544    bl      common_abort
9545
9546
9547/* ------------------------------ */
9548    .balign 64
9549.L_OP_UNUSED_5DFF: /* 0x15d */
9550/* File: armv5te/OP_UNUSED_5DFF.S */
9551/* File: armv5te/unused.S */
9552    bl      common_abort
9553
9554
9555/* ------------------------------ */
9556    .balign 64
9557.L_OP_UNUSED_5EFF: /* 0x15e */
9558/* File: armv5te/OP_UNUSED_5EFF.S */
9559/* File: armv5te/unused.S */
9560    bl      common_abort
9561
9562
9563/* ------------------------------ */
9564    .balign 64
9565.L_OP_UNUSED_5FFF: /* 0x15f */
9566/* File: armv5te/OP_UNUSED_5FFF.S */
9567/* File: armv5te/unused.S */
9568    bl      common_abort
9569
9570
9571/* ------------------------------ */
9572    .balign 64
9573.L_OP_UNUSED_60FF: /* 0x160 */
9574/* File: armv5te/OP_UNUSED_60FF.S */
9575/* File: armv5te/unused.S */
9576    bl      common_abort
9577
9578
9579/* ------------------------------ */
9580    .balign 64
9581.L_OP_UNUSED_61FF: /* 0x161 */
9582/* File: armv5te/OP_UNUSED_61FF.S */
9583/* File: armv5te/unused.S */
9584    bl      common_abort
9585
9586
9587/* ------------------------------ */
9588    .balign 64
9589.L_OP_UNUSED_62FF: /* 0x162 */
9590/* File: armv5te/OP_UNUSED_62FF.S */
9591/* File: armv5te/unused.S */
9592    bl      common_abort
9593
9594
9595/* ------------------------------ */
9596    .balign 64
9597.L_OP_UNUSED_63FF: /* 0x163 */
9598/* File: armv5te/OP_UNUSED_63FF.S */
9599/* File: armv5te/unused.S */
9600    bl      common_abort
9601
9602
9603/* ------------------------------ */
9604    .balign 64
9605.L_OP_UNUSED_64FF: /* 0x164 */
9606/* File: armv5te/OP_UNUSED_64FF.S */
9607/* File: armv5te/unused.S */
9608    bl      common_abort
9609
9610
9611/* ------------------------------ */
9612    .balign 64
9613.L_OP_UNUSED_65FF: /* 0x165 */
9614/* File: armv5te/OP_UNUSED_65FF.S */
9615/* File: armv5te/unused.S */
9616    bl      common_abort
9617
9618
9619/* ------------------------------ */
9620    .balign 64
9621.L_OP_UNUSED_66FF: /* 0x166 */
9622/* File: armv5te/OP_UNUSED_66FF.S */
9623/* File: armv5te/unused.S */
9624    bl      common_abort
9625
9626
9627/* ------------------------------ */
9628    .balign 64
9629.L_OP_UNUSED_67FF: /* 0x167 */
9630/* File: armv5te/OP_UNUSED_67FF.S */
9631/* File: armv5te/unused.S */
9632    bl      common_abort
9633
9634
9635/* ------------------------------ */
9636    .balign 64
9637.L_OP_UNUSED_68FF: /* 0x168 */
9638/* File: armv5te/OP_UNUSED_68FF.S */
9639/* File: armv5te/unused.S */
9640    bl      common_abort
9641
9642
9643/* ------------------------------ */
9644    .balign 64
9645.L_OP_UNUSED_69FF: /* 0x169 */
9646/* File: armv5te/OP_UNUSED_69FF.S */
9647/* File: armv5te/unused.S */
9648    bl      common_abort
9649
9650
9651/* ------------------------------ */
9652    .balign 64
9653.L_OP_UNUSED_6AFF: /* 0x16a */
9654/* File: armv5te/OP_UNUSED_6AFF.S */
9655/* File: armv5te/unused.S */
9656    bl      common_abort
9657
9658
9659/* ------------------------------ */
9660    .balign 64
9661.L_OP_UNUSED_6BFF: /* 0x16b */
9662/* File: armv5te/OP_UNUSED_6BFF.S */
9663/* File: armv5te/unused.S */
9664    bl      common_abort
9665
9666
9667/* ------------------------------ */
9668    .balign 64
9669.L_OP_UNUSED_6CFF: /* 0x16c */
9670/* File: armv5te/OP_UNUSED_6CFF.S */
9671/* File: armv5te/unused.S */
9672    bl      common_abort
9673
9674
9675/* ------------------------------ */
9676    .balign 64
9677.L_OP_UNUSED_6DFF: /* 0x16d */
9678/* File: armv5te/OP_UNUSED_6DFF.S */
9679/* File: armv5te/unused.S */
9680    bl      common_abort
9681
9682
9683/* ------------------------------ */
9684    .balign 64
9685.L_OP_UNUSED_6EFF: /* 0x16e */
9686/* File: armv5te/OP_UNUSED_6EFF.S */
9687/* File: armv5te/unused.S */
9688    bl      common_abort
9689
9690
9691/* ------------------------------ */
9692    .balign 64
9693.L_OP_UNUSED_6FFF: /* 0x16f */
9694/* File: armv5te/OP_UNUSED_6FFF.S */
9695/* File: armv5te/unused.S */
9696    bl      common_abort
9697
9698
9699/* ------------------------------ */
9700    .balign 64
9701.L_OP_UNUSED_70FF: /* 0x170 */
9702/* File: armv5te/OP_UNUSED_70FF.S */
9703/* File: armv5te/unused.S */
9704    bl      common_abort
9705
9706
9707/* ------------------------------ */
9708    .balign 64
9709.L_OP_UNUSED_71FF: /* 0x171 */
9710/* File: armv5te/OP_UNUSED_71FF.S */
9711/* File: armv5te/unused.S */
9712    bl      common_abort
9713
9714
9715/* ------------------------------ */
9716    .balign 64
9717.L_OP_UNUSED_72FF: /* 0x172 */
9718/* File: armv5te/OP_UNUSED_72FF.S */
9719/* File: armv5te/unused.S */
9720    bl      common_abort
9721
9722
9723/* ------------------------------ */
9724    .balign 64
9725.L_OP_UNUSED_73FF: /* 0x173 */
9726/* File: armv5te/OP_UNUSED_73FF.S */
9727/* File: armv5te/unused.S */
9728    bl      common_abort
9729
9730
9731/* ------------------------------ */
9732    .balign 64
9733.L_OP_UNUSED_74FF: /* 0x174 */
9734/* File: armv5te/OP_UNUSED_74FF.S */
9735/* File: armv5te/unused.S */
9736    bl      common_abort
9737
9738
9739/* ------------------------------ */
9740    .balign 64
9741.L_OP_UNUSED_75FF: /* 0x175 */
9742/* File: armv5te/OP_UNUSED_75FF.S */
9743/* File: armv5te/unused.S */
9744    bl      common_abort
9745
9746
9747/* ------------------------------ */
9748    .balign 64
9749.L_OP_UNUSED_76FF: /* 0x176 */
9750/* File: armv5te/OP_UNUSED_76FF.S */
9751/* File: armv5te/unused.S */
9752    bl      common_abort
9753
9754
9755/* ------------------------------ */
9756    .balign 64
9757.L_OP_UNUSED_77FF: /* 0x177 */
9758/* File: armv5te/OP_UNUSED_77FF.S */
9759/* File: armv5te/unused.S */
9760    bl      common_abort
9761
9762
9763/* ------------------------------ */
9764    .balign 64
9765.L_OP_UNUSED_78FF: /* 0x178 */
9766/* File: armv5te/OP_UNUSED_78FF.S */
9767/* File: armv5te/unused.S */
9768    bl      common_abort
9769
9770
9771/* ------------------------------ */
9772    .balign 64
9773.L_OP_UNUSED_79FF: /* 0x179 */
9774/* File: armv5te/OP_UNUSED_79FF.S */
9775/* File: armv5te/unused.S */
9776    bl      common_abort
9777
9778
9779/* ------------------------------ */
9780    .balign 64
9781.L_OP_UNUSED_7AFF: /* 0x17a */
9782/* File: armv5te/OP_UNUSED_7AFF.S */
9783/* File: armv5te/unused.S */
9784    bl      common_abort
9785
9786
9787/* ------------------------------ */
9788    .balign 64
9789.L_OP_UNUSED_7BFF: /* 0x17b */
9790/* File: armv5te/OP_UNUSED_7BFF.S */
9791/* File: armv5te/unused.S */
9792    bl      common_abort
9793
9794
9795/* ------------------------------ */
9796    .balign 64
9797.L_OP_UNUSED_7CFF: /* 0x17c */
9798/* File: armv5te/OP_UNUSED_7CFF.S */
9799/* File: armv5te/unused.S */
9800    bl      common_abort
9801
9802
9803/* ------------------------------ */
9804    .balign 64
9805.L_OP_UNUSED_7DFF: /* 0x17d */
9806/* File: armv5te/OP_UNUSED_7DFF.S */
9807/* File: armv5te/unused.S */
9808    bl      common_abort
9809
9810
9811/* ------------------------------ */
9812    .balign 64
9813.L_OP_UNUSED_7EFF: /* 0x17e */
9814/* File: armv5te/OP_UNUSED_7EFF.S */
9815/* File: armv5te/unused.S */
9816    bl      common_abort
9817
9818
9819/* ------------------------------ */
9820    .balign 64
9821.L_OP_UNUSED_7FFF: /* 0x17f */
9822/* File: armv5te/OP_UNUSED_7FFF.S */
9823/* File: armv5te/unused.S */
9824    bl      common_abort
9825
9826
9827/* ------------------------------ */
9828    .balign 64
9829.L_OP_UNUSED_80FF: /* 0x180 */
9830/* File: armv5te/OP_UNUSED_80FF.S */
9831/* File: armv5te/unused.S */
9832    bl      common_abort
9833
9834
9835/* ------------------------------ */
9836    .balign 64
9837.L_OP_UNUSED_81FF: /* 0x181 */
9838/* File: armv5te/OP_UNUSED_81FF.S */
9839/* File: armv5te/unused.S */
9840    bl      common_abort
9841
9842
9843/* ------------------------------ */
9844    .balign 64
9845.L_OP_UNUSED_82FF: /* 0x182 */
9846/* File: armv5te/OP_UNUSED_82FF.S */
9847/* File: armv5te/unused.S */
9848    bl      common_abort
9849
9850
9851/* ------------------------------ */
9852    .balign 64
9853.L_OP_UNUSED_83FF: /* 0x183 */
9854/* File: armv5te/OP_UNUSED_83FF.S */
9855/* File: armv5te/unused.S */
9856    bl      common_abort
9857
9858
9859/* ------------------------------ */
9860    .balign 64
9861.L_OP_UNUSED_84FF: /* 0x184 */
9862/* File: armv5te/OP_UNUSED_84FF.S */
9863/* File: armv5te/unused.S */
9864    bl      common_abort
9865
9866
9867/* ------------------------------ */
9868    .balign 64
9869.L_OP_UNUSED_85FF: /* 0x185 */
9870/* File: armv5te/OP_UNUSED_85FF.S */
9871/* File: armv5te/unused.S */
9872    bl      common_abort
9873
9874
9875/* ------------------------------ */
9876    .balign 64
9877.L_OP_UNUSED_86FF: /* 0x186 */
9878/* File: armv5te/OP_UNUSED_86FF.S */
9879/* File: armv5te/unused.S */
9880    bl      common_abort
9881
9882
9883/* ------------------------------ */
9884    .balign 64
9885.L_OP_UNUSED_87FF: /* 0x187 */
9886/* File: armv5te/OP_UNUSED_87FF.S */
9887/* File: armv5te/unused.S */
9888    bl      common_abort
9889
9890
9891/* ------------------------------ */
9892    .balign 64
9893.L_OP_UNUSED_88FF: /* 0x188 */
9894/* File: armv5te/OP_UNUSED_88FF.S */
9895/* File: armv5te/unused.S */
9896    bl      common_abort
9897
9898
9899/* ------------------------------ */
9900    .balign 64
9901.L_OP_UNUSED_89FF: /* 0x189 */
9902/* File: armv5te/OP_UNUSED_89FF.S */
9903/* File: armv5te/unused.S */
9904    bl      common_abort
9905
9906
9907/* ------------------------------ */
9908    .balign 64
9909.L_OP_UNUSED_8AFF: /* 0x18a */
9910/* File: armv5te/OP_UNUSED_8AFF.S */
9911/* File: armv5te/unused.S */
9912    bl      common_abort
9913
9914
9915/* ------------------------------ */
9916    .balign 64
9917.L_OP_UNUSED_8BFF: /* 0x18b */
9918/* File: armv5te/OP_UNUSED_8BFF.S */
9919/* File: armv5te/unused.S */
9920    bl      common_abort
9921
9922
9923/* ------------------------------ */
9924    .balign 64
9925.L_OP_UNUSED_8CFF: /* 0x18c */
9926/* File: armv5te/OP_UNUSED_8CFF.S */
9927/* File: armv5te/unused.S */
9928    bl      common_abort
9929
9930
9931/* ------------------------------ */
9932    .balign 64
9933.L_OP_UNUSED_8DFF: /* 0x18d */
9934/* File: armv5te/OP_UNUSED_8DFF.S */
9935/* File: armv5te/unused.S */
9936    bl      common_abort
9937
9938
9939/* ------------------------------ */
9940    .balign 64
9941.L_OP_UNUSED_8EFF: /* 0x18e */
9942/* File: armv5te/OP_UNUSED_8EFF.S */
9943/* File: armv5te/unused.S */
9944    bl      common_abort
9945
9946
9947/* ------------------------------ */
9948    .balign 64
9949.L_OP_UNUSED_8FFF: /* 0x18f */
9950/* File: armv5te/OP_UNUSED_8FFF.S */
9951/* File: armv5te/unused.S */
9952    bl      common_abort
9953
9954
9955/* ------------------------------ */
9956    .balign 64
9957.L_OP_UNUSED_90FF: /* 0x190 */
9958/* File: armv5te/OP_UNUSED_90FF.S */
9959/* File: armv5te/unused.S */
9960    bl      common_abort
9961
9962
9963/* ------------------------------ */
9964    .balign 64
9965.L_OP_UNUSED_91FF: /* 0x191 */
9966/* File: armv5te/OP_UNUSED_91FF.S */
9967/* File: armv5te/unused.S */
9968    bl      common_abort
9969
9970
9971/* ------------------------------ */
9972    .balign 64
9973.L_OP_UNUSED_92FF: /* 0x192 */
9974/* File: armv5te/OP_UNUSED_92FF.S */
9975/* File: armv5te/unused.S */
9976    bl      common_abort
9977
9978
9979/* ------------------------------ */
9980    .balign 64
9981.L_OP_UNUSED_93FF: /* 0x193 */
9982/* File: armv5te/OP_UNUSED_93FF.S */
9983/* File: armv5te/unused.S */
9984    bl      common_abort
9985
9986
9987/* ------------------------------ */
9988    .balign 64
9989.L_OP_UNUSED_94FF: /* 0x194 */
9990/* File: armv5te/OP_UNUSED_94FF.S */
9991/* File: armv5te/unused.S */
9992    bl      common_abort
9993
9994
9995/* ------------------------------ */
9996    .balign 64
9997.L_OP_UNUSED_95FF: /* 0x195 */
9998/* File: armv5te/OP_UNUSED_95FF.S */
9999/* File: armv5te/unused.S */
10000    bl      common_abort
10001
10002
10003/* ------------------------------ */
10004    .balign 64
10005.L_OP_UNUSED_96FF: /* 0x196 */
10006/* File: armv5te/OP_UNUSED_96FF.S */
10007/* File: armv5te/unused.S */
10008    bl      common_abort
10009
10010
10011/* ------------------------------ */
10012    .balign 64
10013.L_OP_UNUSED_97FF: /* 0x197 */
10014/* File: armv5te/OP_UNUSED_97FF.S */
10015/* File: armv5te/unused.S */
10016    bl      common_abort
10017
10018
10019/* ------------------------------ */
10020    .balign 64
10021.L_OP_UNUSED_98FF: /* 0x198 */
10022/* File: armv5te/OP_UNUSED_98FF.S */
10023/* File: armv5te/unused.S */
10024    bl      common_abort
10025
10026
10027/* ------------------------------ */
10028    .balign 64
10029.L_OP_UNUSED_99FF: /* 0x199 */
10030/* File: armv5te/OP_UNUSED_99FF.S */
10031/* File: armv5te/unused.S */
10032    bl      common_abort
10033
10034
10035/* ------------------------------ */
10036    .balign 64
10037.L_OP_UNUSED_9AFF: /* 0x19a */
10038/* File: armv5te/OP_UNUSED_9AFF.S */
10039/* File: armv5te/unused.S */
10040    bl      common_abort
10041
10042
10043/* ------------------------------ */
10044    .balign 64
10045.L_OP_UNUSED_9BFF: /* 0x19b */
10046/* File: armv5te/OP_UNUSED_9BFF.S */
10047/* File: armv5te/unused.S */
10048    bl      common_abort
10049
10050
10051/* ------------------------------ */
10052    .balign 64
10053.L_OP_UNUSED_9CFF: /* 0x19c */
10054/* File: armv5te/OP_UNUSED_9CFF.S */
10055/* File: armv5te/unused.S */
10056    bl      common_abort
10057
10058
10059/* ------------------------------ */
10060    .balign 64
10061.L_OP_UNUSED_9DFF: /* 0x19d */
10062/* File: armv5te/OP_UNUSED_9DFF.S */
10063/* File: armv5te/unused.S */
10064    bl      common_abort
10065
10066
10067/* ------------------------------ */
10068    .balign 64
10069.L_OP_UNUSED_9EFF: /* 0x19e */
10070/* File: armv5te/OP_UNUSED_9EFF.S */
10071/* File: armv5te/unused.S */
10072    bl      common_abort
10073
10074
10075/* ------------------------------ */
10076    .balign 64
10077.L_OP_UNUSED_9FFF: /* 0x19f */
10078/* File: armv5te/OP_UNUSED_9FFF.S */
10079/* File: armv5te/unused.S */
10080    bl      common_abort
10081
10082
10083/* ------------------------------ */
10084    .balign 64
10085.L_OP_UNUSED_A0FF: /* 0x1a0 */
10086/* File: armv5te/OP_UNUSED_A0FF.S */
10087/* File: armv5te/unused.S */
10088    bl      common_abort
10089
10090
10091/* ------------------------------ */
10092    .balign 64
10093.L_OP_UNUSED_A1FF: /* 0x1a1 */
10094/* File: armv5te/OP_UNUSED_A1FF.S */
10095/* File: armv5te/unused.S */
10096    bl      common_abort
10097
10098
10099/* ------------------------------ */
10100    .balign 64
10101.L_OP_UNUSED_A2FF: /* 0x1a2 */
10102/* File: armv5te/OP_UNUSED_A2FF.S */
10103/* File: armv5te/unused.S */
10104    bl      common_abort
10105
10106
10107/* ------------------------------ */
10108    .balign 64
10109.L_OP_UNUSED_A3FF: /* 0x1a3 */
10110/* File: armv5te/OP_UNUSED_A3FF.S */
10111/* File: armv5te/unused.S */
10112    bl      common_abort
10113
10114
10115/* ------------------------------ */
10116    .balign 64
10117.L_OP_UNUSED_A4FF: /* 0x1a4 */
10118/* File: armv5te/OP_UNUSED_A4FF.S */
10119/* File: armv5te/unused.S */
10120    bl      common_abort
10121
10122
10123/* ------------------------------ */
10124    .balign 64
10125.L_OP_UNUSED_A5FF: /* 0x1a5 */
10126/* File: armv5te/OP_UNUSED_A5FF.S */
10127/* File: armv5te/unused.S */
10128    bl      common_abort
10129
10130
10131/* ------------------------------ */
10132    .balign 64
10133.L_OP_UNUSED_A6FF: /* 0x1a6 */
10134/* File: armv5te/OP_UNUSED_A6FF.S */
10135/* File: armv5te/unused.S */
10136    bl      common_abort
10137
10138
10139/* ------------------------------ */
10140    .balign 64
10141.L_OP_UNUSED_A7FF: /* 0x1a7 */
10142/* File: armv5te/OP_UNUSED_A7FF.S */
10143/* File: armv5te/unused.S */
10144    bl      common_abort
10145
10146
10147/* ------------------------------ */
10148    .balign 64
10149.L_OP_UNUSED_A8FF: /* 0x1a8 */
10150/* File: armv5te/OP_UNUSED_A8FF.S */
10151/* File: armv5te/unused.S */
10152    bl      common_abort
10153
10154
10155/* ------------------------------ */
10156    .balign 64
10157.L_OP_UNUSED_A9FF: /* 0x1a9 */
10158/* File: armv5te/OP_UNUSED_A9FF.S */
10159/* File: armv5te/unused.S */
10160    bl      common_abort
10161
10162
10163/* ------------------------------ */
10164    .balign 64
10165.L_OP_UNUSED_AAFF: /* 0x1aa */
10166/* File: armv5te/OP_UNUSED_AAFF.S */
10167/* File: armv5te/unused.S */
10168    bl      common_abort
10169
10170
10171/* ------------------------------ */
10172    .balign 64
10173.L_OP_UNUSED_ABFF: /* 0x1ab */
10174/* File: armv5te/OP_UNUSED_ABFF.S */
10175/* File: armv5te/unused.S */
10176    bl      common_abort
10177
10178
10179/* ------------------------------ */
10180    .balign 64
10181.L_OP_UNUSED_ACFF: /* 0x1ac */
10182/* File: armv5te/OP_UNUSED_ACFF.S */
10183/* File: armv5te/unused.S */
10184    bl      common_abort
10185
10186
10187/* ------------------------------ */
10188    .balign 64
10189.L_OP_UNUSED_ADFF: /* 0x1ad */
10190/* File: armv5te/OP_UNUSED_ADFF.S */
10191/* File: armv5te/unused.S */
10192    bl      common_abort
10193
10194
10195/* ------------------------------ */
10196    .balign 64
10197.L_OP_UNUSED_AEFF: /* 0x1ae */
10198/* File: armv5te/OP_UNUSED_AEFF.S */
10199/* File: armv5te/unused.S */
10200    bl      common_abort
10201
10202
10203/* ------------------------------ */
10204    .balign 64
10205.L_OP_UNUSED_AFFF: /* 0x1af */
10206/* File: armv5te/OP_UNUSED_AFFF.S */
10207/* File: armv5te/unused.S */
10208    bl      common_abort
10209
10210
10211/* ------------------------------ */
10212    .balign 64
10213.L_OP_UNUSED_B0FF: /* 0x1b0 */
10214/* File: armv5te/OP_UNUSED_B0FF.S */
10215/* File: armv5te/unused.S */
10216    bl      common_abort
10217
10218
10219/* ------------------------------ */
10220    .balign 64
10221.L_OP_UNUSED_B1FF: /* 0x1b1 */
10222/* File: armv5te/OP_UNUSED_B1FF.S */
10223/* File: armv5te/unused.S */
10224    bl      common_abort
10225
10226
10227/* ------------------------------ */
10228    .balign 64
10229.L_OP_UNUSED_B2FF: /* 0x1b2 */
10230/* File: armv5te/OP_UNUSED_B2FF.S */
10231/* File: armv5te/unused.S */
10232    bl      common_abort
10233
10234
10235/* ------------------------------ */
10236    .balign 64
10237.L_OP_UNUSED_B3FF: /* 0x1b3 */
10238/* File: armv5te/OP_UNUSED_B3FF.S */
10239/* File: armv5te/unused.S */
10240    bl      common_abort
10241
10242
10243/* ------------------------------ */
10244    .balign 64
10245.L_OP_UNUSED_B4FF: /* 0x1b4 */
10246/* File: armv5te/OP_UNUSED_B4FF.S */
10247/* File: armv5te/unused.S */
10248    bl      common_abort
10249
10250
10251/* ------------------------------ */
10252    .balign 64
10253.L_OP_UNUSED_B5FF: /* 0x1b5 */
10254/* File: armv5te/OP_UNUSED_B5FF.S */
10255/* File: armv5te/unused.S */
10256    bl      common_abort
10257
10258
10259/* ------------------------------ */
10260    .balign 64
10261.L_OP_UNUSED_B6FF: /* 0x1b6 */
10262/* File: armv5te/OP_UNUSED_B6FF.S */
10263/* File: armv5te/unused.S */
10264    bl      common_abort
10265
10266
10267/* ------------------------------ */
10268    .balign 64
10269.L_OP_UNUSED_B7FF: /* 0x1b7 */
10270/* File: armv5te/OP_UNUSED_B7FF.S */
10271/* File: armv5te/unused.S */
10272    bl      common_abort
10273
10274
10275/* ------------------------------ */
10276    .balign 64
10277.L_OP_UNUSED_B8FF: /* 0x1b8 */
10278/* File: armv5te/OP_UNUSED_B8FF.S */
10279/* File: armv5te/unused.S */
10280    bl      common_abort
10281
10282
10283/* ------------------------------ */
10284    .balign 64
10285.L_OP_UNUSED_B9FF: /* 0x1b9 */
10286/* File: armv5te/OP_UNUSED_B9FF.S */
10287/* File: armv5te/unused.S */
10288    bl      common_abort
10289
10290
10291/* ------------------------------ */
10292    .balign 64
10293.L_OP_UNUSED_BAFF: /* 0x1ba */
10294/* File: armv5te/OP_UNUSED_BAFF.S */
10295/* File: armv5te/unused.S */
10296    bl      common_abort
10297
10298
10299/* ------------------------------ */
10300    .balign 64
10301.L_OP_UNUSED_BBFF: /* 0x1bb */
10302/* File: armv5te/OP_UNUSED_BBFF.S */
10303/* File: armv5te/unused.S */
10304    bl      common_abort
10305
10306
10307/* ------------------------------ */
10308    .balign 64
10309.L_OP_UNUSED_BCFF: /* 0x1bc */
10310/* File: armv5te/OP_UNUSED_BCFF.S */
10311/* File: armv5te/unused.S */
10312    bl      common_abort
10313
10314
10315/* ------------------------------ */
10316    .balign 64
10317.L_OP_UNUSED_BDFF: /* 0x1bd */
10318/* File: armv5te/OP_UNUSED_BDFF.S */
10319/* File: armv5te/unused.S */
10320    bl      common_abort
10321
10322
10323/* ------------------------------ */
10324    .balign 64
10325.L_OP_UNUSED_BEFF: /* 0x1be */
10326/* File: armv5te/OP_UNUSED_BEFF.S */
10327/* File: armv5te/unused.S */
10328    bl      common_abort
10329
10330
10331/* ------------------------------ */
10332    .balign 64
10333.L_OP_UNUSED_BFFF: /* 0x1bf */
10334/* File: armv5te/OP_UNUSED_BFFF.S */
10335/* File: armv5te/unused.S */
10336    bl      common_abort
10337
10338
10339/* ------------------------------ */
10340    .balign 64
10341.L_OP_UNUSED_C0FF: /* 0x1c0 */
10342/* File: armv5te/OP_UNUSED_C0FF.S */
10343/* File: armv5te/unused.S */
10344    bl      common_abort
10345
10346
10347/* ------------------------------ */
10348    .balign 64
10349.L_OP_UNUSED_C1FF: /* 0x1c1 */
10350/* File: armv5te/OP_UNUSED_C1FF.S */
10351/* File: armv5te/unused.S */
10352    bl      common_abort
10353
10354
10355/* ------------------------------ */
10356    .balign 64
10357.L_OP_UNUSED_C2FF: /* 0x1c2 */
10358/* File: armv5te/OP_UNUSED_C2FF.S */
10359/* File: armv5te/unused.S */
10360    bl      common_abort
10361
10362
10363/* ------------------------------ */
10364    .balign 64
10365.L_OP_UNUSED_C3FF: /* 0x1c3 */
10366/* File: armv5te/OP_UNUSED_C3FF.S */
10367/* File: armv5te/unused.S */
10368    bl      common_abort
10369
10370
10371/* ------------------------------ */
10372    .balign 64
10373.L_OP_UNUSED_C4FF: /* 0x1c4 */
10374/* File: armv5te/OP_UNUSED_C4FF.S */
10375/* File: armv5te/unused.S */
10376    bl      common_abort
10377
10378
10379/* ------------------------------ */
10380    .balign 64
10381.L_OP_UNUSED_C5FF: /* 0x1c5 */
10382/* File: armv5te/OP_UNUSED_C5FF.S */
10383/* File: armv5te/unused.S */
10384    bl      common_abort
10385
10386
10387/* ------------------------------ */
10388    .balign 64
10389.L_OP_UNUSED_C6FF: /* 0x1c6 */
10390/* File: armv5te/OP_UNUSED_C6FF.S */
10391/* File: armv5te/unused.S */
10392    bl      common_abort
10393
10394
10395/* ------------------------------ */
10396    .balign 64
10397.L_OP_UNUSED_C7FF: /* 0x1c7 */
10398/* File: armv5te/OP_UNUSED_C7FF.S */
10399/* File: armv5te/unused.S */
10400    bl      common_abort
10401
10402
10403/* ------------------------------ */
10404    .balign 64
10405.L_OP_UNUSED_C8FF: /* 0x1c8 */
10406/* File: armv5te/OP_UNUSED_C8FF.S */
10407/* File: armv5te/unused.S */
10408    bl      common_abort
10409
10410
10411/* ------------------------------ */
10412    .balign 64
10413.L_OP_UNUSED_C9FF: /* 0x1c9 */
10414/* File: armv5te/OP_UNUSED_C9FF.S */
10415/* File: armv5te/unused.S */
10416    bl      common_abort
10417
10418
10419/* ------------------------------ */
10420    .balign 64
10421.L_OP_UNUSED_CAFF: /* 0x1ca */
10422/* File: armv5te/OP_UNUSED_CAFF.S */
10423/* File: armv5te/unused.S */
10424    bl      common_abort
10425
10426
10427/* ------------------------------ */
10428    .balign 64
10429.L_OP_UNUSED_CBFF: /* 0x1cb */
10430/* File: armv5te/OP_UNUSED_CBFF.S */
10431/* File: armv5te/unused.S */
10432    bl      common_abort
10433
10434
10435/* ------------------------------ */
10436    .balign 64
10437.L_OP_UNUSED_CCFF: /* 0x1cc */
10438/* File: armv5te/OP_UNUSED_CCFF.S */
10439/* File: armv5te/unused.S */
10440    bl      common_abort
10441
10442
10443/* ------------------------------ */
10444    .balign 64
10445.L_OP_UNUSED_CDFF: /* 0x1cd */
10446/* File: armv5te/OP_UNUSED_CDFF.S */
10447/* File: armv5te/unused.S */
10448    bl      common_abort
10449
10450
10451/* ------------------------------ */
10452    .balign 64
10453.L_OP_UNUSED_CEFF: /* 0x1ce */
10454/* File: armv5te/OP_UNUSED_CEFF.S */
10455/* File: armv5te/unused.S */
10456    bl      common_abort
10457
10458
10459/* ------------------------------ */
10460    .balign 64
10461.L_OP_UNUSED_CFFF: /* 0x1cf */
10462/* File: armv5te/OP_UNUSED_CFFF.S */
10463/* File: armv5te/unused.S */
10464    bl      common_abort
10465
10466
10467/* ------------------------------ */
10468    .balign 64
10469.L_OP_UNUSED_D0FF: /* 0x1d0 */
10470/* File: armv5te/OP_UNUSED_D0FF.S */
10471/* File: armv5te/unused.S */
10472    bl      common_abort
10473
10474
10475/* ------------------------------ */
10476    .balign 64
10477.L_OP_UNUSED_D1FF: /* 0x1d1 */
10478/* File: armv5te/OP_UNUSED_D1FF.S */
10479/* File: armv5te/unused.S */
10480    bl      common_abort
10481
10482
10483/* ------------------------------ */
10484    .balign 64
10485.L_OP_UNUSED_D2FF: /* 0x1d2 */
10486/* File: armv5te/OP_UNUSED_D2FF.S */
10487/* File: armv5te/unused.S */
10488    bl      common_abort
10489
10490
10491/* ------------------------------ */
10492    .balign 64
10493.L_OP_UNUSED_D3FF: /* 0x1d3 */
10494/* File: armv5te/OP_UNUSED_D3FF.S */
10495/* File: armv5te/unused.S */
10496    bl      common_abort
10497
10498
10499/* ------------------------------ */
10500    .balign 64
10501.L_OP_UNUSED_D4FF: /* 0x1d4 */
10502/* File: armv5te/OP_UNUSED_D4FF.S */
10503/* File: armv5te/unused.S */
10504    bl      common_abort
10505
10506
10507/* ------------------------------ */
10508    .balign 64
10509.L_OP_UNUSED_D5FF: /* 0x1d5 */
10510/* File: armv5te/OP_UNUSED_D5FF.S */
10511/* File: armv5te/unused.S */
10512    bl      common_abort
10513
10514
10515/* ------------------------------ */
10516    .balign 64
10517.L_OP_UNUSED_D6FF: /* 0x1d6 */
10518/* File: armv5te/OP_UNUSED_D6FF.S */
10519/* File: armv5te/unused.S */
10520    bl      common_abort
10521
10522
10523/* ------------------------------ */
10524    .balign 64
10525.L_OP_UNUSED_D7FF: /* 0x1d7 */
10526/* File: armv5te/OP_UNUSED_D7FF.S */
10527/* File: armv5te/unused.S */
10528    bl      common_abort
10529
10530
10531/* ------------------------------ */
10532    .balign 64
10533.L_OP_UNUSED_D8FF: /* 0x1d8 */
10534/* File: armv5te/OP_UNUSED_D8FF.S */
10535/* File: armv5te/unused.S */
10536    bl      common_abort
10537
10538
10539/* ------------------------------ */
10540    .balign 64
10541.L_OP_UNUSED_D9FF: /* 0x1d9 */
10542/* File: armv5te/OP_UNUSED_D9FF.S */
10543/* File: armv5te/unused.S */
10544    bl      common_abort
10545
10546
10547/* ------------------------------ */
10548    .balign 64
10549.L_OP_UNUSED_DAFF: /* 0x1da */
10550/* File: armv5te/OP_UNUSED_DAFF.S */
10551/* File: armv5te/unused.S */
10552    bl      common_abort
10553
10554
10555/* ------------------------------ */
10556    .balign 64
10557.L_OP_UNUSED_DBFF: /* 0x1db */
10558/* File: armv5te/OP_UNUSED_DBFF.S */
10559/* File: armv5te/unused.S */
10560    bl      common_abort
10561
10562
10563/* ------------------------------ */
10564    .balign 64
10565.L_OP_UNUSED_DCFF: /* 0x1dc */
10566/* File: armv5te/OP_UNUSED_DCFF.S */
10567/* File: armv5te/unused.S */
10568    bl      common_abort
10569
10570
10571/* ------------------------------ */
10572    .balign 64
10573.L_OP_UNUSED_DDFF: /* 0x1dd */
10574/* File: armv5te/OP_UNUSED_DDFF.S */
10575/* File: armv5te/unused.S */
10576    bl      common_abort
10577
10578
10579/* ------------------------------ */
10580    .balign 64
10581.L_OP_UNUSED_DEFF: /* 0x1de */
10582/* File: armv5te/OP_UNUSED_DEFF.S */
10583/* File: armv5te/unused.S */
10584    bl      common_abort
10585
10586
10587/* ------------------------------ */
10588    .balign 64
10589.L_OP_UNUSED_DFFF: /* 0x1df */
10590/* File: armv5te/OP_UNUSED_DFFF.S */
10591/* File: armv5te/unused.S */
10592    bl      common_abort
10593
10594
10595/* ------------------------------ */
10596    .balign 64
10597.L_OP_UNUSED_E0FF: /* 0x1e0 */
10598/* File: armv5te/OP_UNUSED_E0FF.S */
10599/* File: armv5te/unused.S */
10600    bl      common_abort
10601
10602
10603/* ------------------------------ */
10604    .balign 64
10605.L_OP_UNUSED_E1FF: /* 0x1e1 */
10606/* File: armv5te/OP_UNUSED_E1FF.S */
10607/* File: armv5te/unused.S */
10608    bl      common_abort
10609
10610
10611/* ------------------------------ */
10612    .balign 64
10613.L_OP_UNUSED_E2FF: /* 0x1e2 */
10614/* File: armv5te/OP_UNUSED_E2FF.S */
10615/* File: armv5te/unused.S */
10616    bl      common_abort
10617
10618
10619/* ------------------------------ */
10620    .balign 64
10621.L_OP_UNUSED_E3FF: /* 0x1e3 */
10622/* File: armv5te/OP_UNUSED_E3FF.S */
10623/* File: armv5te/unused.S */
10624    bl      common_abort
10625
10626
10627/* ------------------------------ */
10628    .balign 64
10629.L_OP_UNUSED_E4FF: /* 0x1e4 */
10630/* File: armv5te/OP_UNUSED_E4FF.S */
10631/* File: armv5te/unused.S */
10632    bl      common_abort
10633
10634
10635/* ------------------------------ */
10636    .balign 64
10637.L_OP_UNUSED_E5FF: /* 0x1e5 */
10638/* File: armv5te/OP_UNUSED_E5FF.S */
10639/* File: armv5te/unused.S */
10640    bl      common_abort
10641
10642
10643/* ------------------------------ */
10644    .balign 64
10645.L_OP_UNUSED_E6FF: /* 0x1e6 */
10646/* File: armv5te/OP_UNUSED_E6FF.S */
10647/* File: armv5te/unused.S */
10648    bl      common_abort
10649
10650
10651/* ------------------------------ */
10652    .balign 64
10653.L_OP_UNUSED_E7FF: /* 0x1e7 */
10654/* File: armv5te/OP_UNUSED_E7FF.S */
10655/* File: armv5te/unused.S */
10656    bl      common_abort
10657
10658
10659/* ------------------------------ */
10660    .balign 64
10661.L_OP_UNUSED_E8FF: /* 0x1e8 */
10662/* File: armv5te/OP_UNUSED_E8FF.S */
10663/* File: armv5te/unused.S */
10664    bl      common_abort
10665
10666
10667/* ------------------------------ */
10668    .balign 64
10669.L_OP_UNUSED_E9FF: /* 0x1e9 */
10670/* File: armv5te/OP_UNUSED_E9FF.S */
10671/* File: armv5te/unused.S */
10672    bl      common_abort
10673
10674
10675/* ------------------------------ */
10676    .balign 64
10677.L_OP_UNUSED_EAFF: /* 0x1ea */
10678/* File: armv5te/OP_UNUSED_EAFF.S */
10679/* File: armv5te/unused.S */
10680    bl      common_abort
10681
10682
10683/* ------------------------------ */
10684    .balign 64
10685.L_OP_UNUSED_EBFF: /* 0x1eb */
10686/* File: armv5te/OP_UNUSED_EBFF.S */
10687/* File: armv5te/unused.S */
10688    bl      common_abort
10689
10690
10691/* ------------------------------ */
10692    .balign 64
10693.L_OP_UNUSED_ECFF: /* 0x1ec */
10694/* File: armv5te/OP_UNUSED_ECFF.S */
10695/* File: armv5te/unused.S */
10696    bl      common_abort
10697
10698
10699/* ------------------------------ */
10700    .balign 64
10701.L_OP_UNUSED_EDFF: /* 0x1ed */
10702/* File: armv5te/OP_UNUSED_EDFF.S */
10703/* File: armv5te/unused.S */
10704    bl      common_abort
10705
10706
10707/* ------------------------------ */
10708    .balign 64
10709.L_OP_UNUSED_EEFF: /* 0x1ee */
10710/* File: armv5te/OP_UNUSED_EEFF.S */
10711/* File: armv5te/unused.S */
10712    bl      common_abort
10713
10714
10715/* ------------------------------ */
10716    .balign 64
10717.L_OP_UNUSED_EFFF: /* 0x1ef */
10718/* File: armv5te/OP_UNUSED_EFFF.S */
10719/* File: armv5te/unused.S */
10720    bl      common_abort
10721
10722
10723/* ------------------------------ */
10724    .balign 64
10725.L_OP_UNUSED_F0FF: /* 0x1f0 */
10726/* File: armv5te/OP_UNUSED_F0FF.S */
10727/* File: armv5te/unused.S */
10728    bl      common_abort
10729
10730
10731/* ------------------------------ */
10732    .balign 64
10733.L_OP_UNUSED_F1FF: /* 0x1f1 */
10734/* File: armv5te/OP_UNUSED_F1FF.S */
10735/* File: armv5te/unused.S */
10736    bl      common_abort
10737
10738
10739/* ------------------------------ */
10740    .balign 64
10741.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
10742/* File: armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S */
10743/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
10744    /*
10745     * Invoke Object.<init> on an object.  In practice we know that
10746     * Object's nullary constructor doesn't do anything, so we just
10747     * skip it unless a debugger is active.
10748     */
10749    FETCH(r1, 4)                  @ r1<- CCCC
10750    GET_VREG(r0, r1)                    @ r0<- "this" ptr
10751    cmp     r0, #0                      @ check for NULL
10752    beq     common_errNullObject        @ export PC and throw NPE
10753    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
10754    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
10755    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
10756    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal        @ yes, go
10757.LOP_INVOKE_OBJECT_INIT_JUMBO_finish:
10758    ldrh    r1, [rSELF, #offThread_subMode]
10759    ands    r1, #kSubModeDebuggerActive @ debugger active?
10760    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_debugger        @ Yes - skip optimization
10761    FETCH_ADVANCE_INST(4+1)       @ advance to next instr, load rINST
10762    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
10763    GOTO_OPCODE(ip)                     @ execute it
10764
10765
10766/* ------------------------------ */
10767    .balign 64
10768.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
10769/* File: armv5te/OP_IGET_VOLATILE_JUMBO.S */
10770/* File: armv5te/OP_IGET_JUMBO.S */
10771    /*
10772     * Jumbo 32-bit instance field get.
10773     *
10774     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10775     *      iget-char/jumbo, iget-short/jumbo
10776     */
10777    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10778    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10779    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10780    FETCH(r0, 4)                        @ r0<- CCCC
10781    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10782    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10783    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10784    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10785    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10786    cmp     r0, #0                      @ is resolved entry null?
10787    bne     .LOP_IGET_VOLATILE_JUMBO_finish          @ no, already resolved
107888:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10789    EXPORT_PC()                         @ resolve() could throw
10790    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10791    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10792    b       .LOP_IGET_VOLATILE_JUMBO_resolved        @ resolved, continue
10793
10794
10795/* ------------------------------ */
10796    .balign 64
10797.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
10798/* File: armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S */
10799/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
10800    /*
10801     * Jumbo 64-bit instance field get.
10802     */
10803    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10804    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10805    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10806    FETCH(r0, 4)                        @ r0<- CCCC
10807    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10808    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10809    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10810    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10811    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10812    cmp     r0, #0                      @ is resolved entry null?
10813    bne     .LOP_IGET_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
10814    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10815    EXPORT_PC()                         @ resolve() could throw
10816    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10817    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10818    b       .LOP_IGET_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10819
10820
10821/* ------------------------------ */
10822    .balign 64
10823.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
10824/* File: armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S */
10825/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
10826/* File: armv5te/OP_IGET_JUMBO.S */
10827    /*
10828     * Jumbo 32-bit instance field get.
10829     *
10830     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10831     *      iget-char/jumbo, iget-short/jumbo
10832     */
10833    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10834    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10835    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10836    FETCH(r0, 4)                        @ r0<- CCCC
10837    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10838    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10839    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10840    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10841    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10842    cmp     r0, #0                      @ is resolved entry null?
10843    bne     .LOP_IGET_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
108448:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10845    EXPORT_PC()                         @ resolve() could throw
10846    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10847    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10848    b       .LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10849
10850
10851
10852/* ------------------------------ */
10853    .balign 64
10854.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
10855/* File: armv5te/OP_IPUT_VOLATILE_JUMBO.S */
10856/* File: armv5te/OP_IPUT_JUMBO.S */
10857    /*
10858     * Jumbo 32-bit instance field put.
10859     *
10860     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
10861     *      iput-short/jumbo
10862     */
10863    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10864    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10865    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10866    FETCH(r0, 4)                        @ r0<- CCCC
10867    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10868    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10869    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10870    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10871    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10872    cmp     r0, #0                      @ is resolved entry null?
10873    bne     .LOP_IPUT_VOLATILE_JUMBO_finish          @ no, already resolved
108748:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10875    EXPORT_PC()                         @ resolve() could throw
10876    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10877    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10878    b       .LOP_IPUT_VOLATILE_JUMBO_resolved        @ resolved, continue
10879
10880
10881/* ------------------------------ */
10882    .balign 64
10883.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
10884/* File: armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S */
10885/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
10886    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10887    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10888    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10889    FETCH(r0, 4)                        @ r0<- CCCC
10890    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10891    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10892    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10893    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
10894    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10895    cmp     r0, #0                      @ is resolved entry null?
10896    bne     .LOP_IPUT_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
108978:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10898    EXPORT_PC()                         @ resolve() could throw
10899    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10900    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10901    b       .LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10902
10903
10904/* ------------------------------ */
10905    .balign 64
10906.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
10907/* File: armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S */
10908/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
10909    /*
10910     * Jumbo 32-bit instance field put.
10911     */
10912    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10913    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10914    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10915    FETCH(r0, 4)                        @ r0<- CCCC
10916    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10917    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10918    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10919    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10920    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10921    cmp     r0, #0                      @ is resolved entry null?
10922    bne     .LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
109238:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10924    EXPORT_PC()                         @ resolve() could throw
10925    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10926    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10927    b       .LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10928
10929
10930/* ------------------------------ */
10931    .balign 64
10932.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
10933/* File: armv5te/OP_SGET_VOLATILE_JUMBO.S */
10934/* File: armv5te/OP_SGET_JUMBO.S */
10935    /*
10936     * Jumbo 32-bit SGET handler.
10937     *
10938     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
10939     *      sget-char/jumbo, sget-short/jumbo
10940     */
10941    /* exop vBBBB, field@AAAAAAAA */
10942    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10943    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10944    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10945    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10946    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10947    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10948    cmp     r0, #0                      @ is resolved entry null?
10949    beq     .LOP_SGET_VOLATILE_JUMBO_resolve         @ yes, do resolve
10950.LOP_SGET_VOLATILE_JUMBO_finish: @ field ptr in r0
10951    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
10952    SMP_DMB                            @ acquiring load
10953    FETCH(r2, 3)                        @ r2<- BBBB
10954    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10955    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
10956    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10957    GOTO_OPCODE(ip)                     @ jump to next instruction
10958
10959
10960/* ------------------------------ */
10961    .balign 64
10962.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
10963/* File: armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S */
10964/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
10965    /*
10966     * Jumbo 64-bit SGET handler.
10967     */
10968    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
10969    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10970    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10971    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10972    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
10973    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10974    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
10975    cmp     r0, #0                      @ is resolved entry null?
10976    beq     .LOP_SGET_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
10977.LOP_SGET_WIDE_VOLATILE_JUMBO_finish:
10978    FETCH(r9, 3)                        @ r9<- BBBB
10979    .if 1
10980    add     r0, r0, #offStaticField_value @ r0<- pointer to data
10981    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
10982    .else
10983    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
10984    .endif
10985    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
10986    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10987    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
10988    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10989    GOTO_OPCODE(ip)                     @ jump to next instruction
10990
10991
10992/* ------------------------------ */
10993    .balign 64
10994.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
10995/* File: armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S */
10996/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
10997/* File: armv5te/OP_SGET_JUMBO.S */
10998    /*
10999     * Jumbo 32-bit SGET handler.
11000     *
11001     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
11002     *      sget-char/jumbo, sget-short/jumbo
11003     */
11004    /* exop vBBBB, field@AAAAAAAA */
11005    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
11006    FETCH(r0, 1)                        @ r0<- aaaa (lo)
11007    FETCH(r1, 2)                        @ r1<- AAAA (hi)
11008    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
11009    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
11010    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
11011    cmp     r0, #0                      @ is resolved entry null?
11012    beq     .LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
11013.LOP_SGET_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
11014    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
11015    SMP_DMB                            @ acquiring load
11016    FETCH(r2, 3)                        @ r2<- BBBB
11017    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
11018    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
11019    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11020    GOTO_OPCODE(ip)                     @ jump to next instruction
11021
11022
11023
11024/* ------------------------------ */
11025    .balign 64
11026.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
11027/* File: armv5te/OP_SPUT_VOLATILE_JUMBO.S */
11028/* File: armv5te/OP_SPUT_JUMBO.S */
11029    /*
11030     * Jumbo 32-bit SPUT handler.
11031     *
11032     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
11033     *      sput-short/jumbo
11034     */
11035    /* exop vBBBB, field@AAAAAAAA */
11036    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
11037    FETCH(r0, 1)                        @ r0<- aaaa (lo)
11038    FETCH(r1, 2)                        @ r1<- AAAA (hi)
11039    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
11040    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
11041    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
11042    cmp     r0, #0                      @ is resolved entry null?
11043    beq     .LOP_SPUT_VOLATILE_JUMBO_resolve         @ yes, do resolve
11044.LOP_SPUT_VOLATILE_JUMBO_finish:   @ field ptr in r0
11045    FETCH(r2, 3)                        @ r2<- BBBB
11046    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
11047    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
11048    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11049    SMP_DMB                            @ releasing store
11050    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
11051    GOTO_OPCODE(ip)                     @ jump to next instruction
11052
11053
11054/* ------------------------------ */
11055    .balign 64
11056.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
11057/* File: armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S */
11058/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
11059    /*
11060     * Jumbo 64-bit SPUT handler.
11061     */
11062    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
11063    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
11064    FETCH(r1, 1)                        @ r1<- aaaa (lo)
11065    FETCH(r2, 2)                        @ r2<- AAAA (hi)
11066    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
11067    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
11068    FETCH(r9, 3)                        @ r9<- BBBB
11069    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
11070    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
11071    cmp     r2, #0                      @ is resolved entry null?
11072    beq     .LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
11073.LOP_SPUT_WIDE_VOLATILE_JUMBO_finish: @ field ptr in r2, BBBB in r9
11074    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
11075    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
11076    GET_INST_OPCODE(r10)                @ extract opcode from rINST
11077    .if 1
11078    add     r2, r2, #offStaticField_value @ r2<- pointer to data
11079    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
11080    .else
11081    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
11082    .endif
11083    GOTO_OPCODE(r10)                    @ jump to next instruction
11084
11085
11086/* ------------------------------ */
11087    .balign 64
11088.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
11089/* File: armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S */
11090/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
11091    /*
11092     * Jumbo 32-bit SPUT handler for objects
11093     */
11094    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
11095    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
11096    FETCH(r0, 1)                        @ r0<- aaaa (lo)
11097    FETCH(r1, 2)                        @ r1<- AAAA (hi)
11098    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
11099    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
11100    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
11101    cmp     r0, #0                      @ is resolved entry null?
11102    beq     .LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
11103.LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish:   @ field ptr in r0
11104    FETCH(r2, 3)                        @ r2<- BBBB
11105    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
11106    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
11107    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11108    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
11109    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11110    SMP_DMB                            @ releasing store
11111    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_end
11112
11113
11114/* ------------------------------ */
11115    .balign 64
11116.L_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
11117/* File: armv5te/OP_THROW_VERIFICATION_ERROR_JUMBO.S */
11118    /*
11119     * Handle a jumbo throw-verification-error instruction.  This throws an
11120     * exception for an error discovered during verification.  The
11121     * exception is indicated by BBBB, with some detail provided by AAAAAAAA.
11122     */
11123    /* exop BBBB, Class@AAAAAAAA */
11124    FETCH(r1, 1)                        @ r1<- aaaa (lo)
11125    FETCH(r2, 2)                        @ r2<- AAAA (hi)
11126    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
11127    orr     r2, r1, r2, lsl #16         @ r2<- AAAAaaaa
11128    EXPORT_PC()                         @ export the PC
11129    FETCH(r1, 3)                        @ r1<- BBBB
11130    bl      dvmThrowVerificationError   @ always throws
11131    b       common_exceptionThrown      @ handle exception
11132
11133    .balign 64
11134    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
11135    .global dvmAsmInstructionEnd
11136dvmAsmInstructionEnd:
11137
11138/*
11139 * ===========================================================================
11140 *  Sister implementations
11141 * ===========================================================================
11142 */
11143    .global dvmAsmSisterStart
11144    .type   dvmAsmSisterStart, %function
11145    .text
11146    .balign 4
11147dvmAsmSisterStart:
11148
11149/* continuation for OP_CONST_STRING */
11150
11151    /*
11152     * Continuation if the String has not yet been resolved.
11153     *  r1: BBBB (String ref)
11154     *  r9: target register
11155     */
11156.LOP_CONST_STRING_resolve:
11157    EXPORT_PC()
11158    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
11159    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
11160    bl      dvmResolveString            @ r0<- String reference
11161    cmp     r0, #0                      @ failed?
11162    beq     common_exceptionThrown      @ yup, handle the exception
11163    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11164    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11165    SET_VREG(r0, r9)                    @ vAA<- r0
11166    GOTO_OPCODE(ip)                     @ jump to next instruction
11167
11168/* continuation for OP_CONST_STRING_JUMBO */
11169
11170    /*
11171     * Continuation if the String has not yet been resolved.
11172     *  r1: BBBBBBBB (String ref)
11173     *  r9: target register
11174     */
11175.LOP_CONST_STRING_JUMBO_resolve:
11176    EXPORT_PC()
11177    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
11178    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
11179    bl      dvmResolveString            @ r0<- String reference
11180    cmp     r0, #0                      @ failed?
11181    beq     common_exceptionThrown      @ yup, handle the exception
11182    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
11183    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11184    SET_VREG(r0, r9)                    @ vAA<- r0
11185    GOTO_OPCODE(ip)                     @ jump to next instruction
11186
11187/* continuation for OP_CONST_CLASS */
11188
11189    /*
11190     * Continuation if the Class has not yet been resolved.
11191     *  r1: BBBB (Class ref)
11192     *  r9: target register
11193     */
11194.LOP_CONST_CLASS_resolve:
11195    EXPORT_PC()
11196    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
11197    mov     r2, #1                      @ r2<- true
11198    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
11199    bl      dvmResolveClass             @ r0<- Class reference
11200    cmp     r0, #0                      @ failed?
11201    beq     common_exceptionThrown      @ yup, handle the exception
11202    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11203    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11204    SET_VREG(r0, r9)                    @ vAA<- r0
11205    GOTO_OPCODE(ip)                     @ jump to next instruction
11206
11207/* continuation for OP_CHECK_CAST */
11208
11209    /*
11210     * Trivial test failed, need to perform full check.  This is common.
11211     *  r0 holds obj->clazz
11212     *  r1 holds desired class resolved from BBBB
11213     *  r9 holds object
11214     */
11215.LOP_CHECK_CAST_fullcheck:
11216    mov     r10, r1                     @ avoid ClassObject getting clobbered
11217    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
11218    cmp     r0, #0                      @ failed?
11219    bne     .LOP_CHECK_CAST_okay            @ no, success
11220
11221    @ A cast has failed.  We need to throw a ClassCastException.
11222    EXPORT_PC()                         @ about to throw
11223    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
11224    mov     r1, r10                     @ r1<- desired class
11225    bl      dvmThrowClassCastException
11226    b       common_exceptionThrown
11227
11228    /*
11229     * Resolution required.  This is the least-likely path.
11230     *
11231     *  r2 holds BBBB
11232     *  r9 holds object
11233     */
11234.LOP_CHECK_CAST_resolve:
11235    EXPORT_PC()                         @ resolve() could throw
11236    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11237    mov     r1, r2                      @ r1<- BBBB
11238    mov     r2, #0                      @ r2<- false
11239    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11240    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
11241    cmp     r0, #0                      @ got null?
11242    beq     common_exceptionThrown      @ yes, handle exception
11243    mov     r1, r0                      @ r1<- class resolved from BBB
11244    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
11245    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
11246
11247/* continuation for OP_INSTANCE_OF */
11248
11249    /*
11250     * Trivial test failed, need to perform full check.  This is common.
11251     *  r0 holds obj->clazz
11252     *  r1 holds class resolved from BBBB
11253     *  r9 holds A
11254     */
11255.LOP_INSTANCE_OF_fullcheck:
11256    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
11257    @ fall through to OP_INSTANCE_OF_store
11258
11259    /*
11260     * r0 holds boolean result
11261     * r9 holds A
11262     */
11263.LOP_INSTANCE_OF_store:
11264    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11265    SET_VREG(r0, r9)                    @ vA<- r0
11266    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11267    GOTO_OPCODE(ip)                     @ jump to next instruction
11268
11269    /*
11270     * Trivial test succeeded, save and bail.
11271     *  r9 holds A
11272     */
11273.LOP_INSTANCE_OF_trivial:
11274    mov     r0, #1                      @ indicate success
11275    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
11276    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11277    SET_VREG(r0, r9)                    @ vA<- r0
11278    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11279    GOTO_OPCODE(ip)                     @ jump to next instruction
11280
11281    /*
11282     * Resolution required.  This is the least-likely path.
11283     *
11284     *  r3 holds BBBB
11285     *  r9 holds A
11286     */
11287.LOP_INSTANCE_OF_resolve:
11288    EXPORT_PC()                         @ resolve() could throw
11289    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
11290    mov     r1, r3                      @ r1<- BBBB
11291    mov     r2, #1                      @ r2<- true
11292    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
11293    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
11294    cmp     r0, #0                      @ got null?
11295    beq     common_exceptionThrown      @ yes, handle exception
11296    mov     r1, r0                      @ r1<- class resolved from BBB
11297    mov     r3, rINST, lsr #12          @ r3<- B
11298    GET_VREG(r0, r3)                    @ r0<- vB (object)
11299    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
11300    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
11301
11302/* continuation for OP_NEW_INSTANCE */
11303
11304    .balign 32                          @ minimize cache lines
11305.LOP_NEW_INSTANCE_finish: @ r0=new object
11306    mov     r3, rINST, lsr #8           @ r3<- AA
11307    cmp     r0, #0                      @ failed?
11308#if defined(WITH_JIT)
11309    /*
11310     * The JIT needs the class to be fully resolved before it can
11311     * include this instruction in a trace.
11312     */
11313    ldrh    r1, [rSELF, #offThread_subMode]
11314    beq     common_exceptionThrown      @ yes, handle the exception
11315    ands    r1, #kSubModeJitTraceBuild  @ under construction?
11316    bne     .LOP_NEW_INSTANCE_jitCheck
11317#else
11318    beq     common_exceptionThrown      @ yes, handle the exception
11319#endif
11320.LOP_NEW_INSTANCE_end:
11321    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11322    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11323    SET_VREG(r0, r3)                    @ vAA<- r0
11324    GOTO_OPCODE(ip)                     @ jump to next instruction
11325
11326#if defined(WITH_JIT)
11327    /*
11328     * Check to see if we need to stop the trace building early.
11329     * r0: new object
11330     * r3: vAA
11331     */
11332.LOP_NEW_INSTANCE_jitCheck:
11333    ldr     r1, [r10]                   @ reload resolved class
11334    cmp     r1, #0                      @ okay?
11335    bne     .LOP_NEW_INSTANCE_end             @ yes, finish
11336    mov     r9, r0                      @ preserve new object
11337    mov     r10, r3                     @ preserve vAA
11338    mov     r0, rSELF
11339    mov     r1, rPC
11340    bl      dvmJitEndTraceSelect        @ (self, pc)
11341    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11342    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11343    SET_VREG(r9, r10)                   @ vAA<- new object
11344    GOTO_OPCODE(ip)                     @ jump to next instruction
11345#endif
11346
11347    /*
11348     * Class initialization required.
11349     *
11350     *  r0 holds class object
11351     */
11352.LOP_NEW_INSTANCE_needinit:
11353    mov     r9, r0                      @ save r0
11354    bl      dvmInitClass                @ initialize class
11355    cmp     r0, #0                      @ check boolean result
11356    mov     r0, r9                      @ restore r0
11357    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
11358    b       common_exceptionThrown      @ failed, deal with init exception
11359
11360    /*
11361     * Resolution required.  This is the least-likely path.
11362     *
11363     *  r1 holds BBBB
11364     */
11365.LOP_NEW_INSTANCE_resolve:
11366    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11367    mov     r2, #0                      @ r2<- false
11368    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11369    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
11370    cmp     r0, #0                      @ got null?
11371    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
11372    b       common_exceptionThrown      @ yes, handle exception
11373
11374/* continuation for OP_NEW_ARRAY */
11375
11376
11377    /*
11378     * Resolve class.  (This is an uncommon case.)
11379     *
11380     *  r1 holds array length
11381     *  r2 holds class ref CCCC
11382     */
11383.LOP_NEW_ARRAY_resolve:
11384    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11385    mov     r9, r1                      @ r9<- length (save)
11386    mov     r1, r2                      @ r1<- CCCC
11387    mov     r2, #0                      @ r2<- false
11388    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11389    bl      dvmResolveClass             @ r0<- call(clazz, ref)
11390    cmp     r0, #0                      @ got null?
11391    mov     r1, r9                      @ r1<- length (restore)
11392    beq     common_exceptionThrown      @ yes, handle exception
11393    @ fall through to OP_NEW_ARRAY_finish
11394
11395    /*
11396     * Finish allocation.
11397     *
11398     *  r0 holds class
11399     *  r1 holds array length
11400     */
11401.LOP_NEW_ARRAY_finish:
11402    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
11403    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
11404    cmp     r0, #0                      @ failed?
11405    mov     r2, rINST, lsr #8           @ r2<- A+
11406    beq     common_exceptionThrown      @ yes, handle the exception
11407    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11408    and     r2, r2, #15                 @ r2<- A
11409    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11410    SET_VREG(r0, r2)                    @ vA<- r0
11411    GOTO_OPCODE(ip)                     @ jump to next instruction
11412
11413/* continuation for OP_FILLED_NEW_ARRAY */
11414
11415    /*
11416     * On entry:
11417     *  r0 holds array class
11418     *  r10 holds AA or BA
11419     */
11420.LOP_FILLED_NEW_ARRAY_continue:
11421    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11422    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11423    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11424    .if     0
11425    mov     r1, r10                     @ r1<- AA (length)
11426    .else
11427    mov     r1, r10, lsr #4             @ r1<- B (length)
11428    .endif
11429    cmp     rINST, #'I'                 @ array of ints?
11430    cmpne   rINST, #'L'                 @ array of objects?
11431    cmpne   rINST, #'['                 @ array of arrays?
11432    mov     r9, r1                      @ save length in r9
11433    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
11434    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11435    cmp     r0, #0                      @ null return?
11436    beq     common_exceptionThrown      @ alloc failed, handle exception
11437
11438    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11439    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11440    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11441    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11442    subs    r9, r9, #1                  @ length--, check for neg
11443    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11444    bmi     2f                          @ was zero, bail
11445
11446    @ copy values from registers into the array
11447    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11448    .if     0
11449    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
114501:  ldr     r3, [r2], #4                @ r3<- *r2++
11451    subs    r9, r9, #1                  @ count--
11452    str     r3, [r0], #4                @ *contents++ = vX
11453    bpl     1b
11454    @ continue at 2
11455    .else
11456    cmp     r9, #4                      @ length was initially 5?
11457    and     r2, r10, #15                @ r2<- A
11458    bne     1f                          @ <= 4 args, branch
11459    GET_VREG(r3, r2)                    @ r3<- vA
11460    sub     r9, r9, #1                  @ count--
11461    str     r3, [r0, #16]               @ contents[4] = vA
114621:  and     r2, r1, #15                 @ r2<- F/E/D/C
11463    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11464    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11465    subs    r9, r9, #1                  @ count--
11466    str     r3, [r0], #4                @ *contents++ = vX
11467    bpl     1b
11468    @ continue at 2
11469    .endif
11470
114712:
11472    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11473    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11474    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11475    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11476    cmp     r1, #'I'                         @ Is int array?
11477    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11478    GOTO_OPCODE(ip)                          @ execute it
11479
11480    /*
11481     * Throw an exception indicating that we have not implemented this
11482     * mode of filled-new-array.
11483     */
11484.LOP_FILLED_NEW_ARRAY_notimpl:
11485    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY
11486    bl      dvmThrowInternalError
11487    b       common_exceptionThrown
11488
11489    /*
11490     * Ideally we'd only define this once, but depending on layout we can
11491     * exceed the range of the load above.
11492     */
11493
11494.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY:
11495    .word   .LstrFilledNewArrayNotImpl
11496
11497/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
11498
11499    /*
11500     * On entry:
11501     *  r0 holds array class
11502     *  r10 holds AA or BA
11503     */
11504.LOP_FILLED_NEW_ARRAY_RANGE_continue:
11505    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11506    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11507    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11508    .if     1
11509    mov     r1, r10                     @ r1<- AA (length)
11510    .else
11511    mov     r1, r10, lsr #4             @ r1<- B (length)
11512    .endif
11513    cmp     rINST, #'I'                 @ array of ints?
11514    cmpne   rINST, #'L'                 @ array of objects?
11515    cmpne   rINST, #'['                 @ array of arrays?
11516    mov     r9, r1                      @ save length in r9
11517    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
11518    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11519    cmp     r0, #0                      @ null return?
11520    beq     common_exceptionThrown      @ alloc failed, handle exception
11521
11522    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11523    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11524    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11525    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11526    subs    r9, r9, #1                  @ length--, check for neg
11527    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11528    bmi     2f                          @ was zero, bail
11529
11530    @ copy values from registers into the array
11531    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11532    .if     1
11533    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
115341:  ldr     r3, [r2], #4                @ r3<- *r2++
11535    subs    r9, r9, #1                  @ count--
11536    str     r3, [r0], #4                @ *contents++ = vX
11537    bpl     1b
11538    @ continue at 2
11539    .else
11540    cmp     r9, #4                      @ length was initially 5?
11541    and     r2, r10, #15                @ r2<- A
11542    bne     1f                          @ <= 4 args, branch
11543    GET_VREG(r3, r2)                    @ r3<- vA
11544    sub     r9, r9, #1                  @ count--
11545    str     r3, [r0, #16]               @ contents[4] = vA
115461:  and     r2, r1, #15                 @ r2<- F/E/D/C
11547    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11548    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11549    subs    r9, r9, #1                  @ count--
11550    str     r3, [r0], #4                @ *contents++ = vX
11551    bpl     1b
11552    @ continue at 2
11553    .endif
11554
115552:
11556    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11557    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11558    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11559    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11560    cmp     r1, #'I'                         @ Is int array?
11561    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11562    GOTO_OPCODE(ip)                          @ execute it
11563
11564    /*
11565     * Throw an exception indicating that we have not implemented this
11566     * mode of filled-new-array.
11567     */
11568.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
11569    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE
11570    bl      dvmThrowInternalError
11571    b       common_exceptionThrown
11572
11573    /*
11574     * Ideally we'd only define this once, but depending on layout we can
11575     * exceed the range of the load above.
11576     */
11577
11578.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE:
11579    .word   .LstrFilledNewArrayNotImpl
11580
11581/* continuation for OP_CMPL_FLOAT */
11582
11583    @ Test for NaN with a second comparison.  EABI forbids testing bit
11584    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
11585    @ make the library call.
11586.LOP_CMPL_FLOAT_gt_or_nan:
11587    mov     r1, r9                      @ reverse order
11588    mov     r0, r10
11589    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
11590    @bleq    common_abort
11591    movcc   r1, #1                      @ (greater than) r1<- 1
11592    bcc     .LOP_CMPL_FLOAT_finish
11593    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
11594    b       .LOP_CMPL_FLOAT_finish
11595
11596
11597#if 0       /* "clasic" form */
11598    FETCH(r0, 1)                        @ r0<- CCBB
11599    and     r2, r0, #255                @ r2<- BB
11600    mov     r3, r0, lsr #8              @ r3<- CC
11601    GET_VREG(r9, r2)                    @ r9<- vBB
11602    GET_VREG(r10, r3)                   @ r10<- vCC
11603    mov     r0, r9                      @ r0<- vBB
11604    mov     r1, r10                     @ r1<- vCC
11605    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
11606    cmp     r0, #0                      @ equal?
11607    movne   r1, #0                      @ yes, result is 0
11608    bne     OP_CMPL_FLOAT_finish
11609    mov     r0, r9                      @ r0<- vBB
11610    mov     r1, r10                     @ r1<- vCC
11611    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
11612    cmp     r0, #0                      @ less than?
11613    b       OP_CMPL_FLOAT_continue
11614@%break
11615
11616OP_CMPL_FLOAT_continue:
11617    mvnne   r1, #0                      @ yes, result is -1
11618    bne     OP_CMPL_FLOAT_finish
11619    mov     r0, r9                      @ r0<- vBB
11620    mov     r1, r10                     @ r1<- vCC
11621    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
11622    cmp     r0, #0                      @ greater than?
11623    beq     OP_CMPL_FLOAT_nan               @ no, must be NaN
11624    mov     r1, #1                      @ yes, result is 1
11625    @ fall through to _finish
11626
11627OP_CMPL_FLOAT_finish:
11628    mov     r3, rINST, lsr #8           @ r3<- AA
11629    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11630    SET_VREG(r1, r3)                    @ vAA<- r1
11631    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11632    GOTO_OPCODE(ip)                     @ jump to next instruction
11633
11634    /*
11635     * This is expected to be uncommon, so we double-branch (once to here,
11636     * again back to _finish).
11637     */
11638OP_CMPL_FLOAT_nan:
11639    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
11640    b       OP_CMPL_FLOAT_finish
11641
11642#endif
11643
11644/* continuation for OP_CMPG_FLOAT */
11645
11646    @ Test for NaN with a second comparison.  EABI forbids testing bit
11647    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
11648    @ make the library call.
11649.LOP_CMPG_FLOAT_gt_or_nan:
11650    mov     r1, r9                      @ reverse order
11651    mov     r0, r10
11652    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
11653    @bleq    common_abort
11654    movcc   r1, #1                      @ (greater than) r1<- 1
11655    bcc     .LOP_CMPG_FLOAT_finish
11656    mov     r1, #1                            @ r1<- 1 or -1 for NaN
11657    b       .LOP_CMPG_FLOAT_finish
11658
11659
11660#if 0       /* "clasic" form */
11661    FETCH(r0, 1)                        @ r0<- CCBB
11662    and     r2, r0, #255                @ r2<- BB
11663    mov     r3, r0, lsr #8              @ r3<- CC
11664    GET_VREG(r9, r2)                    @ r9<- vBB
11665    GET_VREG(r10, r3)                   @ r10<- vCC
11666    mov     r0, r9                      @ r0<- vBB
11667    mov     r1, r10                     @ r1<- vCC
11668    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
11669    cmp     r0, #0                      @ equal?
11670    movne   r1, #0                      @ yes, result is 0
11671    bne     OP_CMPG_FLOAT_finish
11672    mov     r0, r9                      @ r0<- vBB
11673    mov     r1, r10                     @ r1<- vCC
11674    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
11675    cmp     r0, #0                      @ less than?
11676    b       OP_CMPG_FLOAT_continue
11677@%break
11678
11679OP_CMPG_FLOAT_continue:
11680    mvnne   r1, #0                      @ yes, result is -1
11681    bne     OP_CMPG_FLOAT_finish
11682    mov     r0, r9                      @ r0<- vBB
11683    mov     r1, r10                     @ r1<- vCC
11684    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
11685    cmp     r0, #0                      @ greater than?
11686    beq     OP_CMPG_FLOAT_nan               @ no, must be NaN
11687    mov     r1, #1                      @ yes, result is 1
11688    @ fall through to _finish
11689
11690OP_CMPG_FLOAT_finish:
11691    mov     r3, rINST, lsr #8           @ r3<- AA
11692    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11693    SET_VREG(r1, r3)                    @ vAA<- r1
11694    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11695    GOTO_OPCODE(ip)                     @ jump to next instruction
11696
11697    /*
11698     * This is expected to be uncommon, so we double-branch (once to here,
11699     * again back to _finish).
11700     */
11701OP_CMPG_FLOAT_nan:
11702    mov     r1, #1                            @ r1<- 1 or -1 for NaN
11703    b       OP_CMPG_FLOAT_finish
11704
11705#endif
11706
11707/* continuation for OP_CMPL_DOUBLE */
11708
11709    @ Test for NaN with a second comparison.  EABI forbids testing bit
11710    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
11711    @ make the library call.
11712.LOP_CMPL_DOUBLE_gt_or_nan:
11713    ldmia   r10, {r0-r1}                @ reverse order
11714    ldmia   r9, {r2-r3}
11715    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
11716    @bleq    common_abort
11717    movcc   r1, #1                      @ (greater than) r1<- 1
11718    bcc     .LOP_CMPL_DOUBLE_finish
11719    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
11720    b       .LOP_CMPL_DOUBLE_finish
11721
11722/* continuation for OP_CMPG_DOUBLE */
11723
11724    @ Test for NaN with a second comparison.  EABI forbids testing bit
11725    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
11726    @ make the library call.
11727.LOP_CMPG_DOUBLE_gt_or_nan:
11728    ldmia   r10, {r0-r1}                @ reverse order
11729    ldmia   r9, {r2-r3}
11730    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
11731    @bleq    common_abort
11732    movcc   r1, #1                      @ (greater than) r1<- 1
11733    bcc     .LOP_CMPG_DOUBLE_finish
11734    mov     r1, #1                            @ r1<- 1 or -1 for NaN
11735    b       .LOP_CMPG_DOUBLE_finish
11736
11737/* continuation for OP_CMP_LONG */
11738
11739.LOP_CMP_LONG_less:
11740    mvn     r1, #0                      @ r1<- -1
11741    @ Want to cond code the next mov so we can avoid branch, but don't see it;
11742    @ instead, we just replicate the tail end.
11743    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11744    SET_VREG(r1, r9)                    @ vAA<- r1
11745    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11746    GOTO_OPCODE(ip)                     @ jump to next instruction
11747
11748.LOP_CMP_LONG_greater:
11749    mov     r1, #1                      @ r1<- 1
11750    @ fall through to _finish
11751
11752.LOP_CMP_LONG_finish:
11753    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11754    SET_VREG(r1, r9)                    @ vAA<- r1
11755    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11756    GOTO_OPCODE(ip)                     @ jump to next instruction
11757
11758/* continuation for OP_AGET_WIDE */
11759
11760.LOP_AGET_WIDE_finish:
11761    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11762    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11763    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
11764    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11765    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
11766    GOTO_OPCODE(ip)                     @ jump to next instruction
11767
11768/* continuation for OP_APUT_WIDE */
11769
11770.LOP_APUT_WIDE_finish:
11771    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11772    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
11773    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11774    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11775    GOTO_OPCODE(ip)                     @ jump to next instruction
11776
11777/* continuation for OP_APUT_OBJECT */
11778    /*
11779     * On entry:
11780     *  rINST = vBB (arrayObj)
11781     *  r9 = vAA (obj)
11782     *  r10 = offset into array (vBB + vCC * width)
11783     */
11784.LOP_APUT_OBJECT_finish:
11785    cmp     r9, #0                      @ storing null reference?
11786    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
11787    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
11788    ldr     r1, [rINST, #offObject_clazz]  @ r1<- arrayObj->clazz
11789    bl      dvmCanPutArrayElement       @ test object type vs. array type
11790    cmp     r0, #0                      @ okay?
11791    beq     .LOP_APUT_OBJECT_throw           @ no
11792    mov     r1, rINST                   @ r1<- arrayObj
11793    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11794    ldr     r2, [rSELF, #offThread_cardTable]     @ get biased CT base
11795    add     r10, #offArrayObject_contents   @ r0<- pointer to slot
11796    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11797    str     r9, [r10]                   @ vBB[vCC]<- vAA
11798    strb    r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
11799    GOTO_OPCODE(ip)                     @ jump to next instruction
11800.LOP_APUT_OBJECT_skip_check:
11801    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11802    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11803    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
11804    GOTO_OPCODE(ip)                     @ jump to next instruction
11805.LOP_APUT_OBJECT_throw:
11806    @ The types don't match.  We need to throw an ArrayStoreException.
11807    ldr     r0, [r9, #offObject_clazz]
11808    ldr     r1, [rINST, #offObject_clazz]
11809    EXPORT_PC()
11810    bl      dvmThrowArrayStoreExceptionIncompatibleElement
11811    b       common_exceptionThrown
11812
11813/* continuation for OP_IGET */
11814
11815    /*
11816     * Currently:
11817     *  r0 holds resolved field
11818     *  r9 holds object
11819     */
11820.LOP_IGET_finish:
11821    @bl      common_squeak0
11822    cmp     r9, #0                      @ check object for null
11823    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11824    beq     common_errNullObject        @ object was null
11825    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11826    @ no-op                             @ acquiring load
11827    mov     r2, rINST, lsr #8           @ r2<- A+
11828    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11829    and     r2, r2, #15                 @ r2<- A
11830    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11831    SET_VREG(r0, r2)                    @ fp[A]<- r0
11832    GOTO_OPCODE(ip)                     @ jump to next instruction
11833
11834/* continuation for OP_IGET_WIDE */
11835
11836    /*
11837     * Currently:
11838     *  r0 holds resolved field
11839     *  r9 holds object
11840     */
11841.LOP_IGET_WIDE_finish:
11842    cmp     r9, #0                      @ check object for null
11843    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11844    beq     common_errNullObject        @ object was null
11845    .if     0
11846    add     r0, r9, r3                  @ r0<- address of field
11847    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
11848    .else
11849    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
11850    .endif
11851    mov     r2, rINST, lsr #8           @ r2<- A+
11852    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11853    and     r2, r2, #15                 @ r2<- A
11854    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
11855    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11856    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
11857    GOTO_OPCODE(ip)                     @ jump to next instruction
11858
11859/* continuation for OP_IGET_OBJECT */
11860
11861    /*
11862     * Currently:
11863     *  r0 holds resolved field
11864     *  r9 holds object
11865     */
11866.LOP_IGET_OBJECT_finish:
11867    @bl      common_squeak0
11868    cmp     r9, #0                      @ check object for null
11869    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11870    beq     common_errNullObject        @ object was null
11871    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11872    @ no-op                             @ acquiring load
11873    mov     r2, rINST, lsr #8           @ r2<- A+
11874    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11875    and     r2, r2, #15                 @ r2<- A
11876    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11877    SET_VREG(r0, r2)                    @ fp[A]<- r0
11878    GOTO_OPCODE(ip)                     @ jump to next instruction
11879
11880/* continuation for OP_IGET_BOOLEAN */
11881
11882    /*
11883     * Currently:
11884     *  r0 holds resolved field
11885     *  r9 holds object
11886     */
11887.LOP_IGET_BOOLEAN_finish:
11888    @bl      common_squeak1
11889    cmp     r9, #0                      @ check object for null
11890    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11891    beq     common_errNullObject        @ object was null
11892    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11893    @ no-op                             @ acquiring load
11894    mov     r2, rINST, lsr #8           @ r2<- A+
11895    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11896    and     r2, r2, #15                 @ r2<- A
11897    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11898    SET_VREG(r0, r2)                    @ fp[A]<- r0
11899    GOTO_OPCODE(ip)                     @ jump to next instruction
11900
11901/* continuation for OP_IGET_BYTE */
11902
11903    /*
11904     * Currently:
11905     *  r0 holds resolved field
11906     *  r9 holds object
11907     */
11908.LOP_IGET_BYTE_finish:
11909    @bl      common_squeak2
11910    cmp     r9, #0                      @ check object for null
11911    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11912    beq     common_errNullObject        @ object was null
11913    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11914    @ no-op                             @ acquiring load
11915    mov     r2, rINST, lsr #8           @ r2<- A+
11916    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11917    and     r2, r2, #15                 @ r2<- A
11918    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11919    SET_VREG(r0, r2)                    @ fp[A]<- r0
11920    GOTO_OPCODE(ip)                     @ jump to next instruction
11921
11922/* continuation for OP_IGET_CHAR */
11923
11924    /*
11925     * Currently:
11926     *  r0 holds resolved field
11927     *  r9 holds object
11928     */
11929.LOP_IGET_CHAR_finish:
11930    @bl      common_squeak3
11931    cmp     r9, #0                      @ check object for null
11932    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11933    beq     common_errNullObject        @ object was null
11934    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11935    @ no-op                             @ acquiring load
11936    mov     r2, rINST, lsr #8           @ r2<- A+
11937    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11938    and     r2, r2, #15                 @ r2<- A
11939    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11940    SET_VREG(r0, r2)                    @ fp[A]<- r0
11941    GOTO_OPCODE(ip)                     @ jump to next instruction
11942
11943/* continuation for OP_IGET_SHORT */
11944
11945    /*
11946     * Currently:
11947     *  r0 holds resolved field
11948     *  r9 holds object
11949     */
11950.LOP_IGET_SHORT_finish:
11951    @bl      common_squeak4
11952    cmp     r9, #0                      @ check object for null
11953    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11954    beq     common_errNullObject        @ object was null
11955    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11956    @ no-op                             @ acquiring load
11957    mov     r2, rINST, lsr #8           @ r2<- A+
11958    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11959    and     r2, r2, #15                 @ r2<- A
11960    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11961    SET_VREG(r0, r2)                    @ fp[A]<- r0
11962    GOTO_OPCODE(ip)                     @ jump to next instruction
11963
11964/* continuation for OP_IPUT */
11965
11966    /*
11967     * Currently:
11968     *  r0 holds resolved field
11969     *  r9 holds object
11970     */
11971.LOP_IPUT_finish:
11972    @bl      common_squeak0
11973    mov     r1, rINST, lsr #8           @ r1<- A+
11974    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11975    and     r1, r1, #15                 @ r1<- A
11976    cmp     r9, #0                      @ check object for null
11977    GET_VREG(r0, r1)                    @ r0<- fp[A]
11978    beq     common_errNullObject        @ object was null
11979    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11980    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11981    @ no-op                             @ releasing store
11982    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11983    GOTO_OPCODE(ip)                     @ jump to next instruction
11984
11985/* continuation for OP_IPUT_WIDE */
11986
11987    /*
11988     * Currently:
11989     *  r0 holds resolved field
11990     *  r9 holds object
11991     */
11992.LOP_IPUT_WIDE_finish:
11993    mov     r2, rINST, lsr #8           @ r2<- A+
11994    cmp     r9, #0                      @ check object for null
11995    and     r2, r2, #15                 @ r2<- A
11996    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11997    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
11998    beq     common_errNullObject        @ object was null
11999    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12000    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
12001    GET_INST_OPCODE(r10)                @ extract opcode from rINST
12002    .if     0
12003    add     r2, r9, r3                  @ r2<- target address
12004    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
12005    .else
12006    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
12007    .endif
12008    GOTO_OPCODE(r10)                    @ jump to next instruction
12009
12010/* continuation for OP_IPUT_OBJECT */
12011
12012    /*
12013     * Currently:
12014     *  r0 holds resolved field
12015     *  r9 holds object
12016     */
12017.LOP_IPUT_OBJECT_finish:
12018    @bl      common_squeak0
12019    mov     r1, rINST, lsr #8           @ r1<- A+
12020    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12021    and     r1, r1, #15                 @ r1<- A
12022    cmp     r9, #0                      @ check object for null
12023    GET_VREG(r0, r1)                    @ r0<- fp[A]
12024    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
12025    beq     common_errNullObject        @ object was null
12026    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12027    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12028    @ no-op                             @ releasing store
12029    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
12030    cmp     r0, #0                      @ stored a null reference?
12031    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
12032    GOTO_OPCODE(ip)                     @ jump to next instruction
12033
12034/* continuation for OP_IPUT_BOOLEAN */
12035
12036    /*
12037     * Currently:
12038     *  r0 holds resolved field
12039     *  r9 holds object
12040     */
12041.LOP_IPUT_BOOLEAN_finish:
12042    @bl      common_squeak1
12043    mov     r1, rINST, lsr #8           @ r1<- A+
12044    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12045    and     r1, r1, #15                 @ r1<- A
12046    cmp     r9, #0                      @ check object for null
12047    GET_VREG(r0, r1)                    @ r0<- fp[A]
12048    beq     common_errNullObject        @ object was null
12049    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12050    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12051    @ no-op                             @ releasing store
12052    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12053    GOTO_OPCODE(ip)                     @ jump to next instruction
12054
12055/* continuation for OP_IPUT_BYTE */
12056
12057    /*
12058     * Currently:
12059     *  r0 holds resolved field
12060     *  r9 holds object
12061     */
12062.LOP_IPUT_BYTE_finish:
12063    @bl      common_squeak2
12064    mov     r1, rINST, lsr #8           @ r1<- A+
12065    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12066    and     r1, r1, #15                 @ r1<- A
12067    cmp     r9, #0                      @ check object for null
12068    GET_VREG(r0, r1)                    @ r0<- fp[A]
12069    beq     common_errNullObject        @ object was null
12070    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12071    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12072    @ no-op                             @ releasing store
12073    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12074    GOTO_OPCODE(ip)                     @ jump to next instruction
12075
12076/* continuation for OP_IPUT_CHAR */
12077
12078    /*
12079     * Currently:
12080     *  r0 holds resolved field
12081     *  r9 holds object
12082     */
12083.LOP_IPUT_CHAR_finish:
12084    @bl      common_squeak3
12085    mov     r1, rINST, lsr #8           @ r1<- A+
12086    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12087    and     r1, r1, #15                 @ r1<- A
12088    cmp     r9, #0                      @ check object for null
12089    GET_VREG(r0, r1)                    @ r0<- fp[A]
12090    beq     common_errNullObject        @ object was null
12091    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12092    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12093    @ no-op                             @ releasing store
12094    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12095    GOTO_OPCODE(ip)                     @ jump to next instruction
12096
12097/* continuation for OP_IPUT_SHORT */
12098
12099    /*
12100     * Currently:
12101     *  r0 holds resolved field
12102     *  r9 holds object
12103     */
12104.LOP_IPUT_SHORT_finish:
12105    @bl      common_squeak4
12106    mov     r1, rINST, lsr #8           @ r1<- A+
12107    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12108    and     r1, r1, #15                 @ r1<- A
12109    cmp     r9, #0                      @ check object for null
12110    GET_VREG(r0, r1)                    @ r0<- fp[A]
12111    beq     common_errNullObject        @ object was null
12112    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12113    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12114    @ no-op                             @ releasing store
12115    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12116    GOTO_OPCODE(ip)                     @ jump to next instruction
12117
12118/* continuation for OP_SGET */
12119
12120    /*
12121     * Continuation if the field has not yet been resolved.
12122     *  r1:  BBBB field ref
12123     *  r10: dvmDex->pResFields
12124     */
12125.LOP_SGET_resolve:
12126    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12127#if defined(WITH_JIT)
12128    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12129#endif
12130    EXPORT_PC()                         @ resolve() could throw, so export now
12131    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12132    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12133    cmp     r0, #0                      @ success?
12134    beq     common_exceptionThrown      @ no, handle exception
12135#if defined(WITH_JIT)
12136    /*
12137     * If the JIT is actively building a trace we need to make sure
12138     * that the field is fully resolved before including this instruction.
12139     */
12140    bl      common_verifyField
12141#endif
12142    b       .LOP_SGET_finish
12143
12144/* continuation for OP_SGET_WIDE */
12145
12146    /*
12147     * Continuation if the field has not yet been resolved.
12148     *  r1:  BBBB field ref
12149     *  r10: dvmDex->pResFields
12150     *
12151     * Returns StaticField pointer in r0.
12152     */
12153.LOP_SGET_WIDE_resolve:
12154    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12155#if defined(WITH_JIT)
12156    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
12157#endif
12158    EXPORT_PC()                         @ resolve() could throw, so export now
12159    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12160    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12161    cmp     r0, #0                      @ success?
12162    beq     common_exceptionThrown      @ no, handle exception
12163#if defined(WITH_JIT)
12164    /*
12165     * If the JIT is actively building a trace we need to make sure
12166     * that the field is fully resolved before including this instruction.
12167     */
12168    bl      common_verifyField
12169#endif
12170    b       .LOP_SGET_WIDE_finish          @ resume
12171
12172/* continuation for OP_SGET_OBJECT */
12173
12174    /*
12175     * Continuation if the field has not yet been resolved.
12176     *  r1:  BBBB field ref
12177     *  r10: dvmDex->pResFields
12178     */
12179.LOP_SGET_OBJECT_resolve:
12180    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12181#if defined(WITH_JIT)
12182    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12183#endif
12184    EXPORT_PC()                         @ resolve() could throw, so export now
12185    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12186    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12187    cmp     r0, #0                      @ success?
12188    beq     common_exceptionThrown      @ no, handle exception
12189#if defined(WITH_JIT)
12190    /*
12191     * If the JIT is actively building a trace we need to make sure
12192     * that the field is fully resolved before including this instruction.
12193     */
12194    bl      common_verifyField
12195#endif
12196    b       .LOP_SGET_OBJECT_finish
12197
12198/* continuation for OP_SGET_BOOLEAN */
12199
12200    /*
12201     * Continuation if the field has not yet been resolved.
12202     *  r1:  BBBB field ref
12203     *  r10: dvmDex->pResFields
12204     */
12205.LOP_SGET_BOOLEAN_resolve:
12206    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12207#if defined(WITH_JIT)
12208    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12209#endif
12210    EXPORT_PC()                         @ resolve() could throw, so export now
12211    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12212    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12213    cmp     r0, #0                      @ success?
12214    beq     common_exceptionThrown      @ no, handle exception
12215#if defined(WITH_JIT)
12216    /*
12217     * If the JIT is actively building a trace we need to make sure
12218     * that the field is fully resolved before including this instruction.
12219     */
12220    bl      common_verifyField
12221#endif
12222    b       .LOP_SGET_BOOLEAN_finish
12223
12224/* continuation for OP_SGET_BYTE */
12225
12226    /*
12227     * Continuation if the field has not yet been resolved.
12228     *  r1:  BBBB field ref
12229     *  r10: dvmDex->pResFields
12230     */
12231.LOP_SGET_BYTE_resolve:
12232    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12233#if defined(WITH_JIT)
12234    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12235#endif
12236    EXPORT_PC()                         @ resolve() could throw, so export now
12237    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12238    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12239    cmp     r0, #0                      @ success?
12240    beq     common_exceptionThrown      @ no, handle exception
12241#if defined(WITH_JIT)
12242    /*
12243     * If the JIT is actively building a trace we need to make sure
12244     * that the field is fully resolved before including this instruction.
12245     */
12246    bl      common_verifyField
12247#endif
12248    b       .LOP_SGET_BYTE_finish
12249
12250/* continuation for OP_SGET_CHAR */
12251
12252    /*
12253     * Continuation if the field has not yet been resolved.
12254     *  r1:  BBBB field ref
12255     *  r10: dvmDex->pResFields
12256     */
12257.LOP_SGET_CHAR_resolve:
12258    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12259#if defined(WITH_JIT)
12260    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12261#endif
12262    EXPORT_PC()                         @ resolve() could throw, so export now
12263    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12264    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12265    cmp     r0, #0                      @ success?
12266    beq     common_exceptionThrown      @ no, handle exception
12267#if defined(WITH_JIT)
12268    /*
12269     * If the JIT is actively building a trace we need to make sure
12270     * that the field is fully resolved before including this instruction.
12271     */
12272    bl      common_verifyField
12273#endif
12274    b       .LOP_SGET_CHAR_finish
12275
12276/* continuation for OP_SGET_SHORT */
12277
12278    /*
12279     * Continuation if the field has not yet been resolved.
12280     *  r1:  BBBB field ref
12281     *  r10: dvmDex->pResFields
12282     */
12283.LOP_SGET_SHORT_resolve:
12284    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12285#if defined(WITH_JIT)
12286    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12287#endif
12288    EXPORT_PC()                         @ resolve() could throw, so export now
12289    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12290    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12291    cmp     r0, #0                      @ success?
12292    beq     common_exceptionThrown      @ no, handle exception
12293#if defined(WITH_JIT)
12294    /*
12295     * If the JIT is actively building a trace we need to make sure
12296     * that the field is fully resolved before including this instruction.
12297     */
12298    bl      common_verifyField
12299#endif
12300    b       .LOP_SGET_SHORT_finish
12301
12302/* continuation for OP_SPUT */
12303
12304    /*
12305     * Continuation if the field has not yet been resolved.
12306     *  r1:  BBBB field ref
12307     *  r10: dvmDex->pResFields
12308     */
12309.LOP_SPUT_resolve:
12310    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12311#if defined(WITH_JIT)
12312    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12313#endif
12314    EXPORT_PC()                         @ resolve() could throw, so export now
12315    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12316    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12317    cmp     r0, #0                      @ success?
12318    beq     common_exceptionThrown      @ no, handle exception
12319#if defined(WITH_JIT)
12320    /*
12321     * If the JIT is actively building a trace we need to make sure
12322     * that the field is fully resolved before including this instruction.
12323     */
12324    bl      common_verifyField
12325#endif
12326    b       .LOP_SPUT_finish          @ resume
12327
12328/* continuation for OP_SPUT_WIDE */
12329
12330    /*
12331     * Continuation if the field has not yet been resolved.
12332     *  r1:  BBBB field ref
12333     *  r9:  &fp[AA]
12334     *  r10: dvmDex->pResFields
12335     *
12336     * Returns StaticField pointer in r2.
12337     */
12338.LOP_SPUT_WIDE_resolve:
12339    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12340#if defined(WITH_JIT)
12341    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12342#endif
12343    EXPORT_PC()                         @ resolve() could throw, so export now
12344    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12345    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12346    cmp     r0, #0                      @ success?
12347    mov     r2, r0                      @ copy to r2
12348    beq     common_exceptionThrown      @ no, handle exception
12349#if defined(WITH_JIT)
12350    /*
12351     * If the JIT is actively building a trace we need to make sure
12352     * that the field is fully resolved before including this instruction.
12353     */
12354    bl      common_verifyField
12355#endif
12356    b       .LOP_SPUT_WIDE_finish          @ resume
12357
12358/* continuation for OP_SPUT_OBJECT */
12359
12360
12361.LOP_SPUT_OBJECT_end:
12362    str     r1, [r0, #offStaticField_value]  @ field<- vAA
12363    cmp     r1, #0                      @ stored a null object?
12364    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
12365    GOTO_OPCODE(ip)                     @ jump to next instruction
12366
12367    /* Continuation if the field has not yet been resolved.
12368     * r1:  BBBB field ref
12369     * r10: dvmDex->pResFields
12370     */
12371.LOP_SPUT_OBJECT_resolve:
12372    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12373#if defined(WITH_JIT)
12374    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12375#endif
12376    EXPORT_PC()                         @ resolve() could throw, so export now
12377    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12378    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12379    cmp     r0, #0                      @ success?
12380    beq     common_exceptionThrown      @ no, handle exception
12381#if defined(WITH_JIT)
12382    /*
12383     * If the JIT is actively building a trace we need to make sure
12384     * that the field is fully resolved before including this instruction.
12385     */
12386    bl      common_verifyField
12387#endif
12388    b       .LOP_SPUT_OBJECT_finish          @ resume
12389
12390
12391/* continuation for OP_SPUT_BOOLEAN */
12392
12393    /*
12394     * Continuation if the field has not yet been resolved.
12395     *  r1:  BBBB field ref
12396     *  r10: dvmDex->pResFields
12397     */
12398.LOP_SPUT_BOOLEAN_resolve:
12399    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12400#if defined(WITH_JIT)
12401    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12402#endif
12403    EXPORT_PC()                         @ resolve() could throw, so export now
12404    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12405    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12406    cmp     r0, #0                      @ success?
12407    beq     common_exceptionThrown      @ no, handle exception
12408#if defined(WITH_JIT)
12409    /*
12410     * If the JIT is actively building a trace we need to make sure
12411     * that the field is fully resolved before including this instruction.
12412     */
12413    bl      common_verifyField
12414#endif
12415    b       .LOP_SPUT_BOOLEAN_finish          @ resume
12416
12417/* continuation for OP_SPUT_BYTE */
12418
12419    /*
12420     * Continuation if the field has not yet been resolved.
12421     *  r1:  BBBB field ref
12422     *  r10: dvmDex->pResFields
12423     */
12424.LOP_SPUT_BYTE_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_SPUT_BYTE_finish          @ resume
12442
12443/* continuation for OP_SPUT_CHAR */
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_CHAR_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_CHAR_finish          @ resume
12468
12469/* continuation for OP_SPUT_SHORT */
12470
12471    /*
12472     * Continuation if the field has not yet been resolved.
12473     *  r1:  BBBB field ref
12474     *  r10: dvmDex->pResFields
12475     */
12476.LOP_SPUT_SHORT_resolve:
12477    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12478#if defined(WITH_JIT)
12479    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12480#endif
12481    EXPORT_PC()                         @ resolve() could throw, so export now
12482    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12483    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12484    cmp     r0, #0                      @ success?
12485    beq     common_exceptionThrown      @ no, handle exception
12486#if defined(WITH_JIT)
12487    /*
12488     * If the JIT is actively building a trace we need to make sure
12489     * that the field is fully resolved before including this instruction.
12490     */
12491    bl      common_verifyField
12492#endif
12493    b       .LOP_SPUT_SHORT_finish          @ resume
12494
12495/* continuation for OP_INVOKE_VIRTUAL */
12496
12497    /*
12498     * At this point:
12499     *  r0 = resolved base method
12500     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
12501     */
12502.LOP_INVOKE_VIRTUAL_continue:
12503    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12504    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12505    cmp     r9, #0                      @ is "this" null?
12506    beq     common_errNullObject        @ null "this", throw exception
12507    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12508    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12509    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12510    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
12511
12512/* continuation for OP_INVOKE_SUPER */
12513
12514    /*
12515     * At this point:
12516     *  r0 = resolved base method
12517     *  r10 = method->clazz
12518     */
12519.LOP_INVOKE_SUPER_continue:
12520    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12521    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12522    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12523    EXPORT_PC()                         @ must export for invoke
12524    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12525    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
12526    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12527    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12528    bl      common_invokeMethodNoRange @ continue on
12529
12530.LOP_INVOKE_SUPER_resolve:
12531    mov     r0, r10                     @ r0<- method->clazz
12532    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12533    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12534    cmp     r0, #0                      @ got null?
12535    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
12536    b       common_exceptionThrown      @ yes, handle exception
12537
12538    /*
12539     * Throw a NoSuchMethodError with the method name as the message.
12540     *  r0 = resolved base method
12541     */
12542.LOP_INVOKE_SUPER_nsm:
12543    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12544    b       common_errNoSuchMethod
12545
12546/* continuation for OP_INVOKE_DIRECT */
12547
12548    /*
12549     * On entry:
12550     *  r1 = reference (BBBB or CCCC)
12551     *  r10 = "this" register
12552     */
12553.LOP_INVOKE_DIRECT_resolve:
12554    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12555    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12556    mov     r2, #METHOD_DIRECT          @ resolver method type
12557    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12558    cmp     r0, #0                      @ got null?
12559    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
12560    b       common_exceptionThrown      @ yes, handle exception
12561
12562/* continuation for OP_INVOKE_STATIC */
12563
12564
12565.LOP_INVOKE_STATIC_resolve:
12566    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12567    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12568    mov     r2, #METHOD_STATIC          @ resolver method type
12569    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12570    cmp     r0, #0                      @ got null?
12571#if defined(WITH_JIT)
12572    /*
12573     * Check to see if we're actively building a trace.  If so,
12574     * we need to keep this instruction out of it.
12575     * r10: &resolved_methodToCall
12576     */
12577    ldrh    r2, [rSELF, #offThread_subMode]
12578    beq     common_exceptionThrown            @ null, handle exception
12579    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12580    beq     common_invokeMethodNoRange     @ no (r0=method, r9="this")
12581    ldr     r1, [r10]                         @ reload resolved method
12582    cmp     r1, #0                            @ finished resolving?
12583    bne     common_invokeMethodNoRange     @ yes (r0=method, r9="this")
12584    mov     r10, r0                           @ preserve method
12585    mov     r0, rSELF
12586    mov     r1, rPC
12587    bl      dvmJitEndTraceSelect              @ (self, pc)
12588    mov     r0, r10
12589    b       common_invokeMethodNoRange     @ whew, finally!
12590#else
12591    bne     common_invokeMethodNoRange     @ (r0=method, r9="this")
12592    b       common_exceptionThrown            @ yes, handle exception
12593#endif
12594
12595/* continuation for OP_INVOKE_VIRTUAL_RANGE */
12596
12597    /*
12598     * At this point:
12599     *  r0 = resolved base method
12600     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
12601     */
12602.LOP_INVOKE_VIRTUAL_RANGE_continue:
12603    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12604    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12605    cmp     r9, #0                      @ is "this" null?
12606    beq     common_errNullObject        @ null "this", throw exception
12607    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12608    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12609    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12610    bl      common_invokeMethodRange @ (r0=method, r9="this")
12611
12612/* continuation for OP_INVOKE_SUPER_RANGE */
12613
12614    /*
12615     * At this point:
12616     *  r0 = resolved base method
12617     *  r10 = method->clazz
12618     */
12619.LOP_INVOKE_SUPER_RANGE_continue:
12620    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12621    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12622    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12623    EXPORT_PC()                         @ must export for invoke
12624    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12625    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
12626    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12627    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12628    bl      common_invokeMethodRange @ continue on
12629
12630.LOP_INVOKE_SUPER_RANGE_resolve:
12631    mov     r0, r10                     @ r0<- method->clazz
12632    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12633    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12634    cmp     r0, #0                      @ got null?
12635    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
12636    b       common_exceptionThrown      @ yes, handle exception
12637
12638    /*
12639     * Throw a NoSuchMethodError with the method name as the message.
12640     *  r0 = resolved base method
12641     */
12642.LOP_INVOKE_SUPER_RANGE_nsm:
12643    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12644    b       common_errNoSuchMethod
12645
12646/* continuation for OP_INVOKE_DIRECT_RANGE */
12647
12648    /*
12649     * On entry:
12650     *  r1 = reference (BBBB or CCCC)
12651     *  r10 = "this" register
12652     */
12653.LOP_INVOKE_DIRECT_RANGE_resolve:
12654    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12655    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12656    mov     r2, #METHOD_DIRECT          @ resolver method type
12657    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12658    cmp     r0, #0                      @ got null?
12659    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
12660    b       common_exceptionThrown      @ yes, handle exception
12661
12662/* continuation for OP_INVOKE_STATIC_RANGE */
12663
12664
12665.LOP_INVOKE_STATIC_RANGE_resolve:
12666    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12667    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12668    mov     r2, #METHOD_STATIC          @ resolver method type
12669    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12670    cmp     r0, #0                      @ got null?
12671#if defined(WITH_JIT)
12672    /*
12673     * Check to see if we're actively building a trace.  If so,
12674     * we need to keep this instruction out of it.
12675     * r10: &resolved_methodToCall
12676     */
12677    ldrh    r2, [rSELF, #offThread_subMode]
12678    beq     common_exceptionThrown            @ null, handle exception
12679    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12680    beq     common_invokeMethodRange     @ no (r0=method, r9="this")
12681    ldr     r1, [r10]                         @ reload resolved method
12682    cmp     r1, #0                            @ finished resolving?
12683    bne     common_invokeMethodRange     @ yes (r0=method, r9="this")
12684    mov     r10, r0                           @ preserve method
12685    mov     r0, rSELF
12686    mov     r1, rPC
12687    bl      dvmJitEndTraceSelect              @ (self, pc)
12688    mov     r0, r10
12689    b       common_invokeMethodRange     @ whew, finally!
12690#else
12691    bne     common_invokeMethodRange     @ (r0=method, r9="this")
12692    b       common_exceptionThrown            @ yes, handle exception
12693#endif
12694
12695/* continuation for OP_FLOAT_TO_LONG */
12696/*
12697 * Convert the float in r0 to a long in r0/r1.
12698 *
12699 * We have to clip values to long min/max per the specification.  The
12700 * expected common case is a "reasonable" value that converts directly
12701 * to modest integer.  The EABI convert function isn't doing this for us.
12702 */
12703f2l_doconv:
12704    stmfd   sp!, {r4, lr}
12705    mov     r1, #0x5f000000             @ (float)maxlong
12706    mov     r4, r0
12707    bl      __aeabi_fcmpge              @ is arg >= maxlong?
12708    cmp     r0, #0                      @ nonzero == yes
12709    mvnne   r0, #0                      @ return maxlong (7fffffff)
12710    mvnne   r1, #0x80000000
12711    ldmnefd sp!, {r4, pc}
12712
12713    mov     r0, r4                      @ recover arg
12714    mov     r1, #0xdf000000             @ (float)minlong
12715    bl      __aeabi_fcmple              @ is arg <= minlong?
12716    cmp     r0, #0                      @ nonzero == yes
12717    movne   r0, #0                      @ return minlong (80000000)
12718    movne   r1, #0x80000000
12719    ldmnefd sp!, {r4, pc}
12720
12721    mov     r0, r4                      @ recover arg
12722    mov     r1, r4
12723    bl      __aeabi_fcmpeq              @ is arg == self?
12724    cmp     r0, #0                      @ zero == no
12725    moveq   r1, #0                      @ return zero for NaN
12726    ldmeqfd sp!, {r4, pc}
12727
12728    mov     r0, r4                      @ recover arg
12729    bl      __aeabi_f2lz                @ convert float to long
12730    ldmfd   sp!, {r4, pc}
12731
12732/* continuation for OP_DOUBLE_TO_LONG */
12733/*
12734 * Convert the double in r0/r1 to a long in r0/r1.
12735 *
12736 * We have to clip values to long min/max per the specification.  The
12737 * expected common case is a "reasonable" value that converts directly
12738 * to modest integer.  The EABI convert function isn't doing this for us.
12739 */
12740d2l_doconv:
12741    stmfd   sp!, {r4, r5, lr}           @ save regs
12742    mov     r3, #0x43000000             @ maxlong, as a double (high word)
12743    add     r3, #0x00e00000             @  0x43e00000
12744    mov     r2, #0                      @ maxlong, as a double (low word)
12745    sub     sp, sp, #4                  @ align for EABI
12746    mov     r4, r0                      @ save a copy of r0
12747    mov     r5, r1                      @  and r1
12748    bl      __aeabi_dcmpge              @ is arg >= maxlong?
12749    cmp     r0, #0                      @ nonzero == yes
12750    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
12751    mvnne   r1, #0x80000000
12752    bne     1f
12753
12754    mov     r0, r4                      @ recover arg
12755    mov     r1, r5
12756    mov     r3, #0xc3000000             @ minlong, as a double (high word)
12757    add     r3, #0x00e00000             @  0xc3e00000
12758    mov     r2, #0                      @ minlong, as a double (low word)
12759    bl      __aeabi_dcmple              @ is arg <= minlong?
12760    cmp     r0, #0                      @ nonzero == yes
12761    movne   r0, #0                      @ return minlong (8000000000000000)
12762    movne   r1, #0x80000000
12763    bne     1f
12764
12765    mov     r0, r4                      @ recover arg
12766    mov     r1, r5
12767    mov     r2, r4                      @ compare against self
12768    mov     r3, r5
12769    bl      __aeabi_dcmpeq              @ is arg == self?
12770    cmp     r0, #0                      @ zero == no
12771    moveq   r1, #0                      @ return zero for NaN
12772    beq     1f
12773
12774    mov     r0, r4                      @ recover arg
12775    mov     r1, r5
12776    bl      __aeabi_d2lz                @ convert double to long
12777
127781:
12779    add     sp, sp, #4
12780    ldmfd   sp!, {r4, r5, pc}
12781
12782/* continuation for OP_MUL_LONG */
12783
12784.LOP_MUL_LONG_finish:
12785    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12786    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
12787    GOTO_OPCODE(ip)                     @ jump to next instruction
12788
12789/* continuation for OP_SHL_LONG */
12790
12791.LOP_SHL_LONG_finish:
12792    mov     r0, r0, asl r2              @  r0<- r0 << r2
12793    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12794    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12795    GOTO_OPCODE(ip)                     @ jump to next instruction
12796
12797/* continuation for OP_SHR_LONG */
12798
12799.LOP_SHR_LONG_finish:
12800    mov     r1, r1, asr r2              @  r1<- r1 >> r2
12801    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12802    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12803    GOTO_OPCODE(ip)                     @ jump to next instruction
12804
12805/* continuation for OP_USHR_LONG */
12806
12807.LOP_USHR_LONG_finish:
12808    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
12809    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12810    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12811    GOTO_OPCODE(ip)                     @ jump to next instruction
12812
12813/* continuation for OP_SHL_LONG_2ADDR */
12814
12815.LOP_SHL_LONG_2ADDR_finish:
12816    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12817    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12818    GOTO_OPCODE(ip)                     @ jump to next instruction
12819
12820/* continuation for OP_SHR_LONG_2ADDR */
12821
12822.LOP_SHR_LONG_2ADDR_finish:
12823    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12824    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12825    GOTO_OPCODE(ip)                     @ jump to next instruction
12826
12827/* continuation for OP_USHR_LONG_2ADDR */
12828
12829.LOP_USHR_LONG_2ADDR_finish:
12830    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12831    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12832    GOTO_OPCODE(ip)                     @ jump to next instruction
12833
12834/* continuation for OP_IGET_VOLATILE */
12835
12836    /*
12837     * Currently:
12838     *  r0 holds resolved field
12839     *  r9 holds object
12840     */
12841.LOP_IGET_VOLATILE_finish:
12842    @bl      common_squeak0
12843    cmp     r9, #0                      @ check object for null
12844    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12845    beq     common_errNullObject        @ object was null
12846    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12847    SMP_DMB                            @ acquiring load
12848    mov     r2, rINST, lsr #8           @ r2<- A+
12849    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12850    and     r2, r2, #15                 @ r2<- A
12851    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12852    SET_VREG(r0, r2)                    @ fp[A]<- r0
12853    GOTO_OPCODE(ip)                     @ jump to next instruction
12854
12855/* continuation for OP_IPUT_VOLATILE */
12856
12857    /*
12858     * Currently:
12859     *  r0 holds resolved field
12860     *  r9 holds object
12861     */
12862.LOP_IPUT_VOLATILE_finish:
12863    @bl      common_squeak0
12864    mov     r1, rINST, lsr #8           @ r1<- A+
12865    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12866    and     r1, r1, #15                 @ r1<- A
12867    cmp     r9, #0                      @ check object for null
12868    GET_VREG(r0, r1)                    @ r0<- fp[A]
12869    beq     common_errNullObject        @ object was null
12870    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12871    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12872    SMP_DMB                            @ releasing store
12873    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12874    GOTO_OPCODE(ip)                     @ jump to next instruction
12875
12876/* continuation for OP_SGET_VOLATILE */
12877
12878    /*
12879     * Continuation if the field has not yet been resolved.
12880     *  r1:  BBBB field ref
12881     *  r10: dvmDex->pResFields
12882     */
12883.LOP_SGET_VOLATILE_resolve:
12884    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12885#if defined(WITH_JIT)
12886    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12887#endif
12888    EXPORT_PC()                         @ resolve() could throw, so export now
12889    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12890    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12891    cmp     r0, #0                      @ success?
12892    beq     common_exceptionThrown      @ no, handle exception
12893#if defined(WITH_JIT)
12894    /*
12895     * If the JIT is actively building a trace we need to make sure
12896     * that the field is fully resolved before including this instruction.
12897     */
12898    bl      common_verifyField
12899#endif
12900    b       .LOP_SGET_VOLATILE_finish
12901
12902/* continuation for OP_SPUT_VOLATILE */
12903
12904    /*
12905     * Continuation if the field has not yet been resolved.
12906     *  r1:  BBBB field ref
12907     *  r10: dvmDex->pResFields
12908     */
12909.LOP_SPUT_VOLATILE_resolve:
12910    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12911#if defined(WITH_JIT)
12912    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12913#endif
12914    EXPORT_PC()                         @ resolve() could throw, so export now
12915    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12916    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12917    cmp     r0, #0                      @ success?
12918    beq     common_exceptionThrown      @ no, handle exception
12919#if defined(WITH_JIT)
12920    /*
12921     * If the JIT is actively building a trace we need to make sure
12922     * that the field is fully resolved before including this instruction.
12923     */
12924    bl      common_verifyField
12925#endif
12926    b       .LOP_SPUT_VOLATILE_finish          @ resume
12927
12928/* continuation for OP_IGET_OBJECT_VOLATILE */
12929
12930    /*
12931     * Currently:
12932     *  r0 holds resolved field
12933     *  r9 holds object
12934     */
12935.LOP_IGET_OBJECT_VOLATILE_finish:
12936    @bl      common_squeak0
12937    cmp     r9, #0                      @ check object for null
12938    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12939    beq     common_errNullObject        @ object was null
12940    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12941    SMP_DMB                            @ acquiring load
12942    mov     r2, rINST, lsr #8           @ r2<- A+
12943    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12944    and     r2, r2, #15                 @ r2<- A
12945    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12946    SET_VREG(r0, r2)                    @ fp[A]<- r0
12947    GOTO_OPCODE(ip)                     @ jump to next instruction
12948
12949/* continuation for OP_IGET_WIDE_VOLATILE */
12950
12951    /*
12952     * Currently:
12953     *  r0 holds resolved field
12954     *  r9 holds object
12955     */
12956.LOP_IGET_WIDE_VOLATILE_finish:
12957    cmp     r9, #0                      @ check object for null
12958    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12959    beq     common_errNullObject        @ object was null
12960    .if     1
12961    add     r0, r9, r3                  @ r0<- address of field
12962    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
12963    .else
12964    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
12965    .endif
12966    mov     r2, rINST, lsr #8           @ r2<- A+
12967    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12968    and     r2, r2, #15                 @ r2<- A
12969    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
12970    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12971    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
12972    GOTO_OPCODE(ip)                     @ jump to next instruction
12973
12974/* continuation for OP_IPUT_WIDE_VOLATILE */
12975
12976    /*
12977     * Currently:
12978     *  r0 holds resolved field
12979     *  r9 holds object
12980     */
12981.LOP_IPUT_WIDE_VOLATILE_finish:
12982    mov     r2, rINST, lsr #8           @ r2<- A+
12983    cmp     r9, #0                      @ check object for null
12984    and     r2, r2, #15                 @ r2<- A
12985    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12986    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
12987    beq     common_errNullObject        @ object was null
12988    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12989    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
12990    GET_INST_OPCODE(r10)                @ extract opcode from rINST
12991    .if     1
12992    add     r2, r9, r3                  @ r2<- target address
12993    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
12994    .else
12995    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
12996    .endif
12997    GOTO_OPCODE(r10)                    @ jump to next instruction
12998
12999/* continuation for OP_SGET_WIDE_VOLATILE */
13000
13001    /*
13002     * Continuation if the field has not yet been resolved.
13003     *  r1:  BBBB field ref
13004     *  r10: dvmDex->pResFields
13005     *
13006     * Returns StaticField pointer in r0.
13007     */
13008.LOP_SGET_WIDE_VOLATILE_resolve:
13009    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13010#if defined(WITH_JIT)
13011    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
13012#endif
13013    EXPORT_PC()                         @ resolve() could throw, so export now
13014    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13015    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13016    cmp     r0, #0                      @ success?
13017    beq     common_exceptionThrown      @ no, handle exception
13018#if defined(WITH_JIT)
13019    /*
13020     * If the JIT is actively building a trace we need to make sure
13021     * that the field is fully resolved before including this instruction.
13022     */
13023    bl      common_verifyField
13024#endif
13025    b       .LOP_SGET_WIDE_VOLATILE_finish          @ resume
13026
13027/* continuation for OP_SPUT_WIDE_VOLATILE */
13028
13029    /*
13030     * Continuation if the field has not yet been resolved.
13031     *  r1:  BBBB field ref
13032     *  r9:  &fp[AA]
13033     *  r10: dvmDex->pResFields
13034     *
13035     * Returns StaticField pointer in r2.
13036     */
13037.LOP_SPUT_WIDE_VOLATILE_resolve:
13038    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13039#if defined(WITH_JIT)
13040    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13041#endif
13042    EXPORT_PC()                         @ resolve() could throw, so export now
13043    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13044    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13045    cmp     r0, #0                      @ success?
13046    mov     r2, r0                      @ copy to r2
13047    beq     common_exceptionThrown      @ no, handle exception
13048#if defined(WITH_JIT)
13049    /*
13050     * If the JIT is actively building a trace we need to make sure
13051     * that the field is fully resolved before including this instruction.
13052     */
13053    bl      common_verifyField
13054#endif
13055    b       .LOP_SPUT_WIDE_VOLATILE_finish          @ resume
13056
13057/* continuation for OP_EXECUTE_INLINE */
13058
13059    /*
13060     * Extract args, call function.
13061     *  r0 = #of args (0-4)
13062     *  r10 = call index
13063     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
13064     *
13065     * Other ideas:
13066     * - Use a jump table from the main piece to jump directly into the
13067     *   AND/LDR pairs.  Costs a data load, saves a branch.
13068     * - Have five separate pieces that do the loading, so we can work the
13069     *   interleave a little better.  Increases code size.
13070     */
13071.LOP_EXECUTE_INLINE_continue:
13072    rsb     r0, r0, #4                  @ r0<- 4-r0
13073    FETCH(rINST, 2)                     @ rINST<- FEDC
13074    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
13075    bl      common_abort                @ (skipped due to ARM prefetch)
130764:  and     ip, rINST, #0xf000          @ isolate F
13077    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
130783:  and     ip, rINST, #0x0f00          @ isolate E
13079    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
130802:  and     ip, rINST, #0x00f0          @ isolate D
13081    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
130821:  and     ip, rINST, #0x000f          @ isolate C
13083    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
130840:
13085    ldr     rINST, .LOP_EXECUTE_INLINE_table    @ table of InlineOperation
13086    ldr     pc, [rINST, r10, lsl #4]    @ sizeof=16, "func" is first entry
13087    @ (not reached)
13088
13089    /*
13090     * We're debugging or profiling.
13091     * r10: opIndex
13092     */
13093.LOP_EXECUTE_INLINE_debugmode:
13094    mov     r0, r10
13095    bl      dvmResolveInlineNative
13096    cmp     r0, #0                      @ did it resolve?
13097    beq     .LOP_EXECUTE_INLINE_resume          @ no, just move on
13098    mov     r9, r0                      @ remember method
13099    mov     r1, rSELF
13100    bl      dvmFastMethodTraceEnter     @ (method, self)
13101    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
13102    sub     sp, sp, #8                  @ make room for arg, +64 bit align
13103    mov     r0, rINST, lsr #12          @ r0<- B
13104    str     r1, [sp]                    @ push &self->retval
13105    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
13106    mov     rINST, r0                   @ save result of inline
13107    add     sp, sp, #8                  @ pop stack
13108    mov     r0, r9                      @ r0<- method
13109    mov     r1, rSELF
13110    bl      dvmFastNativeMethodTraceExit @ (method, self)
13111    cmp     rINST, #0                   @ test boolean result of inline
13112    beq     common_exceptionThrown      @ returned false, handle exception
13113    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
13114    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13115    GOTO_OPCODE(ip)                     @ jump to next instruction
13116
13117
13118
13119
13120.LOP_EXECUTE_INLINE_table:
13121    .word   gDvmInlineOpsTable
13122
13123/* continuation for OP_EXECUTE_INLINE_RANGE */
13124
13125    /*
13126     * Extract args, call function.
13127     *  r0 = #of args (0-4)
13128     *  r10 = call index
13129     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
13130     */
13131.LOP_EXECUTE_INLINE_RANGE_continue:
13132    rsb     r0, r0, #4                  @ r0<- 4-r0
13133    FETCH(r9, 2)                        @ r9<- CCCC
13134    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
13135    bl      common_abort                @ (skipped due to ARM prefetch)
131364:  add     ip, r9, #3                  @ base+3
13137    GET_VREG(r3, ip)                    @ r3<- vBase[3]
131383:  add     ip, r9, #2                  @ base+2
13139    GET_VREG(r2, ip)                    @ r2<- vBase[2]
131402:  add     ip, r9, #1                  @ base+1
13141    GET_VREG(r1, ip)                    @ r1<- vBase[1]
131421:  add     ip, r9, #0                  @ (nop)
13143    GET_VREG(r0, ip)                    @ r0<- vBase[0]
131440:
13145    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
13146    ldr     pc, [r9, r10, lsl #4]       @ sizeof=16, "func" is first entry
13147    @ (not reached)
13148
13149
13150    /*
13151     * We're debugging or profiling.
13152     * r10: opIndex
13153     */
13154.LOP_EXECUTE_INLINE_RANGE_debugmode:
13155    mov     r0, r10
13156    bl      dvmResolveInlineNative
13157    cmp     r0, #0                      @ did it resolve?
13158    beq     .LOP_EXECUTE_INLINE_RANGE_resume          @ no, just move on
13159    mov     r9, r0                      @ remember method
13160    mov     r1, rSELF
13161    bl      dvmFastMethodTraceEnter     @ (method, self)
13162    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
13163    sub     sp, sp, #8                  @ make room for arg, +64 bit align
13164    mov     r0, rINST, lsr #8           @ r0<- B
13165    mov     rINST, r9                   @ rINST<- method
13166    str     r1, [sp]                    @ push &self->retval
13167    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
13168    mov     r9, r0                      @ save result of inline
13169    add     sp, sp, #8                  @ pop stack
13170    mov     r0, rINST                   @ r0<- method
13171    mov     r1, rSELF
13172    bl      dvmFastNativeMethodTraceExit  @ (method, self)
13173    cmp     r9, #0                      @ test boolean result of inline
13174    beq     common_exceptionThrown      @ returned false, handle exception
13175    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
13176    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13177    GOTO_OPCODE(ip)                     @ jump to next instruction
13178
13179
13180
13181
13182.LOP_EXECUTE_INLINE_RANGE_table:
13183    .word   gDvmInlineOpsTable
13184
13185
13186/* continuation for OP_INVOKE_OBJECT_INIT_RANGE */
13187
13188.LOP_INVOKE_OBJECT_INIT_RANGE_setFinal:
13189    EXPORT_PC()                         @ can throw
13190    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
13191    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
13192    cmp     r0, #0                      @ exception pending?
13193    bne     common_exceptionThrown      @ yes, handle it
13194    b       .LOP_INVOKE_OBJECT_INIT_RANGE_finish
13195
13196    /*
13197     * A debugger is attached, so we need to go ahead and do
13198     * this.  For simplicity, we'll just jump directly to the
13199     * corresponding handler.  Note that we can't use
13200     * rIBASE here because it may be in single-step mode.
13201     * Load the primary table base directly.
13202     */
13203.LOP_INVOKE_OBJECT_INIT_RANGE_debugger:
13204    ldr     r1, [rSELF, #offThread_mainHandlerTable]
13205    .if 0
13206    mov     ip, #OP_INVOKE_DIRECT_JUMBO
13207    .else
13208    mov     ip, #OP_INVOKE_DIRECT_RANGE
13209    .endif
13210    GOTO_OPCODE_BASE(r1,ip)             @ execute it
13211
13212/* continuation for OP_IPUT_OBJECT_VOLATILE */
13213
13214    /*
13215     * Currently:
13216     *  r0 holds resolved field
13217     *  r9 holds object
13218     */
13219.LOP_IPUT_OBJECT_VOLATILE_finish:
13220    @bl      common_squeak0
13221    mov     r1, rINST, lsr #8           @ r1<- A+
13222    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13223    and     r1, r1, #15                 @ r1<- A
13224    cmp     r9, #0                      @ check object for null
13225    GET_VREG(r0, r1)                    @ r0<- fp[A]
13226    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13227    beq     common_errNullObject        @ object was null
13228    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
13229    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13230    SMP_DMB                            @ releasing store
13231    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
13232    cmp     r0, #0                      @ stored a null reference?
13233    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
13234    GOTO_OPCODE(ip)                     @ jump to next instruction
13235
13236/* continuation for OP_SGET_OBJECT_VOLATILE */
13237
13238    /*
13239     * Continuation if the field has not yet been resolved.
13240     *  r1:  BBBB field ref
13241     *  r10: dvmDex->pResFields
13242     */
13243.LOP_SGET_OBJECT_VOLATILE_resolve:
13244    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13245#if defined(WITH_JIT)
13246    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13247#endif
13248    EXPORT_PC()                         @ resolve() could throw, so export now
13249    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13250    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13251    cmp     r0, #0                      @ success?
13252    beq     common_exceptionThrown      @ no, handle exception
13253#if defined(WITH_JIT)
13254    /*
13255     * If the JIT is actively building a trace we need to make sure
13256     * that the field is fully resolved before including this instruction.
13257     */
13258    bl      common_verifyField
13259#endif
13260    b       .LOP_SGET_OBJECT_VOLATILE_finish
13261
13262/* continuation for OP_SPUT_OBJECT_VOLATILE */
13263
13264
13265.LOP_SPUT_OBJECT_VOLATILE_end:
13266    str     r1, [r0, #offStaticField_value]  @ field<- vAA
13267    cmp     r1, #0                      @ stored a null object?
13268    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
13269    GOTO_OPCODE(ip)                     @ jump to next instruction
13270
13271    /* Continuation if the field has not yet been resolved.
13272     * r1:  BBBB field ref
13273     * r10: dvmDex->pResFields
13274     */
13275.LOP_SPUT_OBJECT_VOLATILE_resolve:
13276    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13277#if defined(WITH_JIT)
13278    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13279#endif
13280    EXPORT_PC()                         @ resolve() could throw, so export now
13281    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13282    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13283    cmp     r0, #0                      @ success?
13284    beq     common_exceptionThrown      @ no, handle exception
13285#if defined(WITH_JIT)
13286    /*
13287     * If the JIT is actively building a trace we need to make sure
13288     * that the field is fully resolved before including this instruction.
13289     */
13290    bl      common_verifyField
13291#endif
13292    b       .LOP_SPUT_OBJECT_VOLATILE_finish          @ resume
13293
13294
13295/* continuation for OP_CONST_CLASS_JUMBO */
13296
13297    /*
13298     * Continuation if the Class has not yet been resolved.
13299     *  r1: AAAAAAAA (Class ref)
13300     *  r9: target register
13301     */
13302.LOP_CONST_CLASS_JUMBO_resolve:
13303    EXPORT_PC()
13304    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
13305    mov     r2, #1                      @ r2<- true
13306    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
13307    bl      dvmResolveClass             @ r0<- Class reference
13308    cmp     r0, #0                      @ failed?
13309    beq     common_exceptionThrown      @ yup, handle the exception
13310    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
13311    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13312    SET_VREG(r0, r9)                    @ vBBBB<- r0
13313    GOTO_OPCODE(ip)                     @ jump to next instruction
13314
13315/* continuation for OP_CHECK_CAST_JUMBO */
13316
13317    /*
13318     * Trivial test failed, need to perform full check.  This is common.
13319     *  r0 holds obj->clazz
13320     *  r1 holds desired class resolved from AAAAAAAA
13321     *  r9 holds object
13322     */
13323.LOP_CHECK_CAST_JUMBO_fullcheck:
13324    mov     r10, r1                     @ avoid ClassObject getting clobbered
13325    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
13326    cmp     r0, #0                      @ failed?
13327    bne     .LOP_CHECK_CAST_JUMBO_okay            @ no, success
13328
13329    @ A cast has failed.  We need to throw a ClassCastException.
13330    EXPORT_PC()                         @ about to throw
13331    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
13332    mov     r1, r10                     @ r1<- desired class
13333    bl      dvmThrowClassCastException
13334    b       common_exceptionThrown
13335
13336    /*
13337     * Advance PC and get the next opcode.
13338     */
13339.LOP_CHECK_CAST_JUMBO_okay:
13340    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
13341    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13342    GOTO_OPCODE(ip)                     @ jump to next instruction
13343
13344    /*
13345     * Resolution required.  This is the least-likely path.
13346     *
13347     *  r2 holds AAAAAAAA
13348     *  r9 holds object
13349     */
13350.LOP_CHECK_CAST_JUMBO_resolve:
13351    EXPORT_PC()                         @ resolve() could throw
13352    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13353    mov     r1, r2                      @ r1<- AAAAAAAA
13354    mov     r2, #0                      @ r2<- false
13355    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13356    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
13357    cmp     r0, #0                      @ got null?
13358    beq     common_exceptionThrown      @ yes, handle exception
13359    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
13360    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
13361    b       .LOP_CHECK_CAST_JUMBO_resolved        @ pick up where we left off
13362
13363/* continuation for OP_INSTANCE_OF_JUMBO */
13364
13365    /*
13366     * Class resolved, determine type of check necessary.  This is common.
13367     *  r0 holds obj->clazz
13368     *  r1 holds class resolved from AAAAAAAA
13369     *  r9 holds BBBB
13370     */
13371.LOP_INSTANCE_OF_JUMBO_resolved:
13372    cmp     r0, r1                      @ same class (trivial success)?
13373    beq     .LOP_INSTANCE_OF_JUMBO_trivial         @ yes, trivial finish
13374    @ fall through to OP_INSTANCE_OF_JUMBO_fullcheck
13375
13376    /*
13377     * Trivial test failed, need to perform full check.  This is common.
13378     *  r0 holds obj->clazz
13379     *  r1 holds class resolved from AAAAAAAA
13380     *  r9 holds BBBB
13381     */
13382.LOP_INSTANCE_OF_JUMBO_fullcheck:
13383    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
13384    @ fall through to OP_INSTANCE_OF_JUMBO_store
13385
13386    /*
13387     * r0 holds boolean result
13388     * r9 holds BBBB
13389     */
13390.LOP_INSTANCE_OF_JUMBO_store:
13391    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13392    SET_VREG(r0, r9)                    @ vBBBB<- r0
13393    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13394    GOTO_OPCODE(ip)                     @ jump to next instruction
13395
13396    /*
13397     * Trivial test succeeded, save and bail.
13398     *  r9 holds BBBB
13399     */
13400.LOP_INSTANCE_OF_JUMBO_trivial:
13401    mov     r0, #1                      @ indicate success
13402    @ could b OP_INSTANCE_OF_JUMBO_store, but copying is faster and cheaper
13403    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13404    SET_VREG(r0, r9)                    @ vBBBB<- r0
13405    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13406    GOTO_OPCODE(ip)                     @ jump to next instruction
13407
13408    /*
13409     * Resolution required.  This is the least-likely path.
13410     *
13411     *  r3 holds AAAAAAAA
13412     *  r9 holds BBBB
13413     */
13414
13415.LOP_INSTANCE_OF_JUMBO_resolve:
13416    EXPORT_PC()                         @ resolve() could throw
13417    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
13418    mov     r1, r3                      @ r1<- AAAAAAAA
13419    mov     r2, #1                      @ r2<- true
13420    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
13421    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
13422    cmp     r0, #0                      @ got null?
13423    beq     common_exceptionThrown      @ yes, handle exception
13424    FETCH(r3, 4)                        @ r3<- vCCCC
13425    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
13426    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
13427    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
13428    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ pick up where we left off
13429
13430/* continuation for OP_NEW_INSTANCE_JUMBO */
13431
13432    .balign 32                          @ minimize cache lines
13433.LOP_NEW_INSTANCE_JUMBO_finish: @ r0=new object
13434    FETCH(r3, 3)                        @ r3<- BBBB
13435    cmp     r0, #0                      @ failed?
13436#if defined(WITH_JIT)
13437    /*
13438     * The JIT needs the class to be fully resolved before it can
13439     * include this instruction in a trace.
13440     */
13441    ldrh    r1, [rSELF, #offThread_subMode]
13442    beq     common_exceptionThrown      @ yes, handle the exception
13443    ands    r1, #kSubModeJitTraceBuild  @ under construction?
13444    bne     .LOP_NEW_INSTANCE_JUMBO_jitCheck
13445#else
13446    beq     common_exceptionThrown      @ yes, handle the exception
13447#endif
13448.LOP_NEW_INSTANCE_JUMBO_end:
13449    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
13450    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13451    SET_VREG(r0, r3)                    @ vBBBB<- r0
13452    GOTO_OPCODE(ip)                     @ jump to next instruction
13453
13454#if defined(WITH_JIT)
13455    /*
13456     * Check to see if we need to stop the trace building early.
13457     * r0: new object
13458     * r3: vAA
13459     */
13460.LOP_NEW_INSTANCE_JUMBO_jitCheck:
13461    ldr     r1, [r10]                   @ reload resolved class
13462    cmp     r1, #0                      @ okay?
13463    bne     .LOP_NEW_INSTANCE_JUMBO_end             @ yes, finish
13464    mov     r9, r0                      @ preserve new object
13465    mov     r10, r3                     @ preserve vAA
13466    mov     r0, rSELF
13467    mov     r1, rPC
13468    bl      dvmJitEndTraceSelect        @ (self, pc)
13469    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
13470    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13471    SET_VREG(r9, r10)                   @ vAA<- new object
13472    GOTO_OPCODE(ip)                     @ jump to next instruction
13473#endif
13474
13475    /*
13476     * Class initialization required.
13477     *
13478     *  r0 holds class object
13479     */
13480.LOP_NEW_INSTANCE_JUMBO_needinit:
13481    mov     r9, r0                      @ save r0
13482    bl      dvmInitClass                @ initialize class
13483    cmp     r0, #0                      @ check boolean result
13484    mov     r0, r9                      @ restore r0
13485    bne     .LOP_NEW_INSTANCE_JUMBO_initialized     @ success, continue
13486    b       common_exceptionThrown      @ failed, deal with init exception
13487
13488    /*
13489     * Resolution required.  This is the least-likely path.
13490     *
13491     *  r1 holds AAAAAAAA
13492     */
13493.LOP_NEW_INSTANCE_JUMBO_resolve:
13494    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13495    mov     r2, #0                      @ r2<- false
13496    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13497    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
13498    cmp     r0, #0                      @ got null?
13499    bne     .LOP_NEW_INSTANCE_JUMBO_resolved        @ no, continue
13500    b       common_exceptionThrown      @ yes, handle exception
13501
13502/* continuation for OP_NEW_ARRAY_JUMBO */
13503
13504
13505    /*
13506     * Resolve class.  (This is an uncommon case.)
13507     *
13508     *  r1 holds array length
13509     *  r2 holds class ref AAAAAAAA
13510     */
13511.LOP_NEW_ARRAY_JUMBO_resolve:
13512    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13513    mov     r9, r1                      @ r9<- length (save)
13514    mov     r1, r2                      @ r1<- AAAAAAAA
13515    mov     r2, #0                      @ r2<- false
13516    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13517    bl      dvmResolveClass             @ r0<- call(clazz, ref)
13518    cmp     r0, #0                      @ got null?
13519    mov     r1, r9                      @ r1<- length (restore)
13520    beq     common_exceptionThrown      @ yes, handle exception
13521    @ fall through to OP_NEW_ARRAY_JUMBO_finish
13522
13523    /*
13524     * Finish allocation.
13525     *
13526     *  r0 holds class
13527     *  r1 holds array length
13528     */
13529.LOP_NEW_ARRAY_JUMBO_finish:
13530    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
13531    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
13532    cmp     r0, #0                      @ failed?
13533    FETCH(r2, 3)                        @ r2<- vBBBB
13534    beq     common_exceptionThrown      @ yes, handle the exception
13535    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13536    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13537    SET_VREG(r0, r2)                    @ vBBBB<- r0
13538    GOTO_OPCODE(ip)                     @ jump to next instruction
13539
13540/* continuation for OP_FILLED_NEW_ARRAY_JUMBO */
13541
13542    /*
13543     * On entry:
13544     *  r0 holds array class
13545     */
13546.LOP_FILLED_NEW_ARRAY_JUMBO_continue:
13547    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
13548    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
13549    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
13550    FETCH(r1, 3)                        @ r1<- BBBB (length)
13551    cmp     rINST, #'I'                 @ array of ints?
13552    cmpne   rINST, #'L'                 @ array of objects?
13553    cmpne   rINST, #'['                 @ array of arrays?
13554    mov     r9, r1                      @ save length in r9
13555    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_notimpl         @ no, not handled yet
13556    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
13557    cmp     r0, #0                      @ null return?
13558    beq     common_exceptionThrown      @ alloc failed, handle exception
13559
13560    FETCH(r1, 4)                        @ r1<- CCCC
13561    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
13562    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
13563    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
13564    subs    r9, r9, #1                  @ length--, check for neg
13565    FETCH_ADVANCE_INST(5)               @ advance to next instr, load rINST
13566    bmi     2f                          @ was zero, bail
13567
13568    @ copy values from registers into the array
13569    @ r0=array, r1=CCCC, r9=BBBB (length)
13570    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
135711:  ldr     r3, [r2], #4                @ r3<- *r2++
13572    subs    r9, r9, #1                  @ count--
13573    str     r3, [r0], #4                @ *contents++ = vX
13574    bpl     1b
13575
135762:  ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
13577    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
13578    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13579    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
13580    cmp     r1, #'I'                         @ Is int array?
13581    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
13582    GOTO_OPCODE(ip)                          @ execute it
13583
13584    /*
13585     * Throw an exception indicating that we have not implemented this
13586     * mode of filled-new-array.
13587     */
13588.LOP_FILLED_NEW_ARRAY_JUMBO_notimpl:
13589    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO
13590    bl      dvmThrowInternalError
13591    b       common_exceptionThrown
13592
13593    /*
13594     * Ideally we'd only define this once, but depending on layout we can
13595     * exceed the range of the load above.
13596     */
13597
13598.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO:
13599    .word   .LstrFilledNewArrayNotImpl
13600
13601/* continuation for OP_IGET_JUMBO */
13602
13603    /*
13604     * Currently:
13605     *  r0 holds resolved field
13606     *  r9 holds object
13607     */
13608.LOP_IGET_JUMBO_resolved:
13609    cmp     r0, #0                      @ resolution unsuccessful?
13610    beq     common_exceptionThrown      @ yes, throw exception
13611    @ fall through to OP_IGET_JUMBO_finish
13612
13613    /*
13614     * Currently:
13615     *  r0 holds resolved field
13616     *  r9 holds object
13617     */
13618.LOP_IGET_JUMBO_finish:
13619    @bl      common_squeak0
13620    cmp     r9, #0                      @ check object for null
13621    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13622    beq     common_errNullObject        @ object was null
13623    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13624    @ no-op                             @ acquiring load
13625    FETCH(r2, 3)                        @ r2<- BBBB
13626    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13627    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13628    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13629    GOTO_OPCODE(ip)                     @ jump to next instruction
13630
13631/* continuation for OP_IGET_WIDE_JUMBO */
13632
13633    /*
13634     * Currently:
13635     *  r0 holds resolved field
13636     *  r9 holds object
13637     */
13638.LOP_IGET_WIDE_JUMBO_resolved:
13639    cmp     r0, #0                      @ resolution unsuccessful?
13640    beq     common_exceptionThrown      @ yes, throw exception
13641    @ fall through to OP_IGET_WIDE_JUMBO_finish
13642
13643    /*
13644     * Currently:
13645     *  r0 holds resolved field
13646     *  r9 holds object
13647     */
13648.LOP_IGET_WIDE_JUMBO_finish:
13649    cmp     r9, #0                      @ check object for null
13650    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13651    beq     common_errNullObject        @ object was null
13652    .if     0
13653    add     r0, r9, r3                  @ r0<- address of field
13654    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
13655    .else
13656    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
13657    .endif
13658    FETCH(r2, 3)                        @ r2<- BBBB
13659    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13660    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13661    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13662    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
13663    GOTO_OPCODE(ip)                     @ jump to next instruction
13664
13665/* continuation for OP_IGET_OBJECT_JUMBO */
13666
13667    /*
13668     * Currently:
13669     *  r0 holds resolved field
13670     *  r9 holds object
13671     */
13672.LOP_IGET_OBJECT_JUMBO_resolved:
13673    cmp     r0, #0                      @ resolution unsuccessful?
13674    beq     common_exceptionThrown      @ yes, throw exception
13675    @ fall through to OP_IGET_OBJECT_JUMBO_finish
13676
13677    /*
13678     * Currently:
13679     *  r0 holds resolved field
13680     *  r9 holds object
13681     */
13682.LOP_IGET_OBJECT_JUMBO_finish:
13683    @bl      common_squeak0
13684    cmp     r9, #0                      @ check object for null
13685    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13686    beq     common_errNullObject        @ object was null
13687    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13688    @ no-op                             @ acquiring load
13689    FETCH(r2, 3)                        @ r2<- BBBB
13690    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13691    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13692    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13693    GOTO_OPCODE(ip)                     @ jump to next instruction
13694
13695/* continuation for OP_IGET_BOOLEAN_JUMBO */
13696
13697    /*
13698     * Currently:
13699     *  r0 holds resolved field
13700     *  r9 holds object
13701     */
13702.LOP_IGET_BOOLEAN_JUMBO_resolved:
13703    cmp     r0, #0                      @ resolution unsuccessful?
13704    beq     common_exceptionThrown      @ yes, throw exception
13705    @ fall through to OP_IGET_BOOLEAN_JUMBO_finish
13706
13707    /*
13708     * Currently:
13709     *  r0 holds resolved field
13710     *  r9 holds object
13711     */
13712.LOP_IGET_BOOLEAN_JUMBO_finish:
13713    @bl      common_squeak1
13714    cmp     r9, #0                      @ check object for null
13715    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13716    beq     common_errNullObject        @ object was null
13717    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13718    @ no-op                             @ acquiring load
13719    FETCH(r2, 3)                        @ r2<- BBBB
13720    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13721    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13722    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13723    GOTO_OPCODE(ip)                     @ jump to next instruction
13724
13725/* continuation for OP_IGET_BYTE_JUMBO */
13726
13727    /*
13728     * Currently:
13729     *  r0 holds resolved field
13730     *  r9 holds object
13731     */
13732.LOP_IGET_BYTE_JUMBO_resolved:
13733    cmp     r0, #0                      @ resolution unsuccessful?
13734    beq     common_exceptionThrown      @ yes, throw exception
13735    @ fall through to OP_IGET_BYTE_JUMBO_finish
13736
13737    /*
13738     * Currently:
13739     *  r0 holds resolved field
13740     *  r9 holds object
13741     */
13742.LOP_IGET_BYTE_JUMBO_finish:
13743    @bl      common_squeak2
13744    cmp     r9, #0                      @ check object for null
13745    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13746    beq     common_errNullObject        @ object was null
13747    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13748    @ no-op                             @ acquiring load
13749    FETCH(r2, 3)                        @ r2<- BBBB
13750    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13751    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13752    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13753    GOTO_OPCODE(ip)                     @ jump to next instruction
13754
13755/* continuation for OP_IGET_CHAR_JUMBO */
13756
13757    /*
13758     * Currently:
13759     *  r0 holds resolved field
13760     *  r9 holds object
13761     */
13762.LOP_IGET_CHAR_JUMBO_resolved:
13763    cmp     r0, #0                      @ resolution unsuccessful?
13764    beq     common_exceptionThrown      @ yes, throw exception
13765    @ fall through to OP_IGET_CHAR_JUMBO_finish
13766
13767    /*
13768     * Currently:
13769     *  r0 holds resolved field
13770     *  r9 holds object
13771     */
13772.LOP_IGET_CHAR_JUMBO_finish:
13773    @bl      common_squeak3
13774    cmp     r9, #0                      @ check object for null
13775    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13776    beq     common_errNullObject        @ object was null
13777    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13778    @ no-op                             @ acquiring load
13779    FETCH(r2, 3)                        @ r2<- BBBB
13780    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13781    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13782    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13783    GOTO_OPCODE(ip)                     @ jump to next instruction
13784
13785/* continuation for OP_IGET_SHORT_JUMBO */
13786
13787    /*
13788     * Currently:
13789     *  r0 holds resolved field
13790     *  r9 holds object
13791     */
13792.LOP_IGET_SHORT_JUMBO_resolved:
13793    cmp     r0, #0                      @ resolution unsuccessful?
13794    beq     common_exceptionThrown      @ yes, throw exception
13795    @ fall through to OP_IGET_SHORT_JUMBO_finish
13796
13797    /*
13798     * Currently:
13799     *  r0 holds resolved field
13800     *  r9 holds object
13801     */
13802.LOP_IGET_SHORT_JUMBO_finish:
13803    @bl      common_squeak4
13804    cmp     r9, #0                      @ check object for null
13805    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13806    beq     common_errNullObject        @ object was null
13807    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13808    @ no-op                             @ acquiring load
13809    FETCH(r2, 3)                        @ r2<- BBBB
13810    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13811    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13812    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13813    GOTO_OPCODE(ip)                     @ jump to next instruction
13814
13815/* continuation for OP_IPUT_JUMBO */
13816
13817    /*
13818     * Currently:
13819     *  r0 holds resolved field
13820     *  r9 holds object
13821     */
13822.LOP_IPUT_JUMBO_resolved:
13823     cmp     r0, #0                     @ resolution unsuccessful?
13824     beq     common_exceptionThrown     @ yes, throw exception
13825     @ fall through to OP_IPUT_JUMBO_finish
13826
13827    /*
13828     * Currently:
13829     *  r0 holds resolved field
13830     *  r9 holds object
13831     */
13832.LOP_IPUT_JUMBO_finish:
13833    @bl      common_squeak0
13834    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13835    FETCH(r1, 3)                        @ r1<- BBBB
13836    cmp     r9, #0                      @ check object for null
13837    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13838    beq     common_errNullObject        @ object was null
13839    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13840    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13841    @ no-op                             @ releasing store
13842    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13843    GOTO_OPCODE(ip)                     @ jump to next instruction
13844
13845/* continuation for OP_IPUT_WIDE_JUMBO */
13846
13847    /*
13848     * Currently:
13849     *  r0 holds resolved field
13850     *  r9 holds object
13851     */
13852.LOP_IPUT_WIDE_JUMBO_resolved:
13853     cmp     r0, #0                     @ resolution unsuccessful?
13854     beq     common_exceptionThrown     @ yes, throw exception
13855     @ fall through to OP_IPUT_WIDE_JUMBO_finish
13856
13857    /*
13858     * Currently:
13859     *  r0 holds resolved field
13860     *  r9 holds object
13861     */
13862.LOP_IPUT_WIDE_JUMBO_finish:
13863    cmp     r9, #0                      @ check object for null
13864    FETCH(r2, 3)                        @ r1<- BBBB
13865    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13866    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13867    beq     common_errNullObject        @ object was null
13868    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13869    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
13870    GET_INST_OPCODE(r10)                @ extract opcode from rINST
13871    .if     0
13872    add     r2, r9, r3                  @ r2<- target address
13873    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
13874    .else
13875    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
13876    .endif
13877    GOTO_OPCODE(r10)                    @ jump to next instruction
13878
13879/* continuation for OP_IPUT_OBJECT_JUMBO */
13880
13881    /*
13882     * Currently:
13883     *  r0 holds resolved field
13884     *  r9 holds object
13885     */
13886.LOP_IPUT_OBJECT_JUMBO_resolved:
13887     cmp     r0, #0                     @ resolution unsuccessful?
13888     beq     common_exceptionThrown     @ yes, throw exception
13889     @ fall through to OP_IPUT_OBJECT_JUMBO_finish
13890
13891    /*
13892     * Currently:
13893     *  r0 holds resolved field
13894     *  r9 holds object
13895     */
13896.LOP_IPUT_OBJECT_JUMBO_finish:
13897    @bl      common_squeak0
13898    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13899    FETCH(r1, 3)                        @ r1<- BBBB
13900    cmp     r9, #0                      @ check object for null
13901    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13902    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13903    beq     common_errNullObject        @ object was null
13904    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13905    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13906    @ no-op                             @ releasing store
13907    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
13908    cmp     r0, #0                      @ stored a null reference?
13909    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
13910    GOTO_OPCODE(ip)                     @ jump to next instruction
13911
13912/* continuation for OP_IPUT_BOOLEAN_JUMBO */
13913
13914    /*
13915     * Currently:
13916     *  r0 holds resolved field
13917     *  r9 holds object
13918     */
13919.LOP_IPUT_BOOLEAN_JUMBO_resolved:
13920     cmp     r0, #0                     @ resolution unsuccessful?
13921     beq     common_exceptionThrown     @ yes, throw exception
13922     @ fall through to OP_IPUT_BOOLEAN_JUMBO_finish
13923
13924    /*
13925     * Currently:
13926     *  r0 holds resolved field
13927     *  r9 holds object
13928     */
13929.LOP_IPUT_BOOLEAN_JUMBO_finish:
13930    @bl      common_squeak1
13931    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13932    FETCH(r1, 3)                        @ r1<- BBBB
13933    cmp     r9, #0                      @ check object for null
13934    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13935    beq     common_errNullObject        @ object was null
13936    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13937    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13938    @ no-op                             @ releasing store
13939    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13940    GOTO_OPCODE(ip)                     @ jump to next instruction
13941
13942/* continuation for OP_IPUT_BYTE_JUMBO */
13943
13944    /*
13945     * Currently:
13946     *  r0 holds resolved field
13947     *  r9 holds object
13948     */
13949.LOP_IPUT_BYTE_JUMBO_resolved:
13950     cmp     r0, #0                     @ resolution unsuccessful?
13951     beq     common_exceptionThrown     @ yes, throw exception
13952     @ fall through to OP_IPUT_BYTE_JUMBO_finish
13953
13954    /*
13955     * Currently:
13956     *  r0 holds resolved field
13957     *  r9 holds object
13958     */
13959.LOP_IPUT_BYTE_JUMBO_finish:
13960    @bl      common_squeak2
13961    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13962    FETCH(r1, 3)                        @ r1<- BBBB
13963    cmp     r9, #0                      @ check object for null
13964    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13965    beq     common_errNullObject        @ object was null
13966    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13967    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13968    @ no-op                             @ releasing store
13969    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13970    GOTO_OPCODE(ip)                     @ jump to next instruction
13971
13972/* continuation for OP_IPUT_CHAR_JUMBO */
13973
13974    /*
13975     * Currently:
13976     *  r0 holds resolved field
13977     *  r9 holds object
13978     */
13979.LOP_IPUT_CHAR_JUMBO_resolved:
13980     cmp     r0, #0                     @ resolution unsuccessful?
13981     beq     common_exceptionThrown     @ yes, throw exception
13982     @ fall through to OP_IPUT_CHAR_JUMBO_finish
13983
13984    /*
13985     * Currently:
13986     *  r0 holds resolved field
13987     *  r9 holds object
13988     */
13989.LOP_IPUT_CHAR_JUMBO_finish:
13990    @bl      common_squeak3
13991    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13992    FETCH(r1, 3)                        @ r1<- BBBB
13993    cmp     r9, #0                      @ check object for null
13994    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13995    beq     common_errNullObject        @ object was null
13996    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13997    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13998    @ no-op                             @ releasing store
13999    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14000    GOTO_OPCODE(ip)                     @ jump to next instruction
14001
14002/* continuation for OP_IPUT_SHORT_JUMBO */
14003
14004    /*
14005     * Currently:
14006     *  r0 holds resolved field
14007     *  r9 holds object
14008     */
14009.LOP_IPUT_SHORT_JUMBO_resolved:
14010     cmp     r0, #0                     @ resolution unsuccessful?
14011     beq     common_exceptionThrown     @ yes, throw exception
14012     @ fall through to OP_IPUT_SHORT_JUMBO_finish
14013
14014    /*
14015     * Currently:
14016     *  r0 holds resolved field
14017     *  r9 holds object
14018     */
14019.LOP_IPUT_SHORT_JUMBO_finish:
14020    @bl      common_squeak4
14021    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14022    FETCH(r1, 3)                        @ r1<- BBBB
14023    cmp     r9, #0                      @ check object for null
14024    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14025    beq     common_errNullObject        @ object was null
14026    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14027    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14028    @ no-op                             @ releasing store
14029    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14030    GOTO_OPCODE(ip)                     @ jump to next instruction
14031
14032/* continuation for OP_SGET_JUMBO */
14033
14034    /*
14035     * Continuation if the field has not yet been resolved.
14036     *  r1:  AAAAAAAA field ref
14037     *  r10: dvmDex->pResFields
14038     */
14039.LOP_SGET_JUMBO_resolve:
14040    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14041#if defined(WITH_JIT)
14042    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14043#endif
14044    EXPORT_PC()                         @ resolve() could throw, so export now
14045    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14046    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14047    cmp     r0, #0                      @ success?
14048    beq     common_exceptionThrown      @ no, handle exception
14049#if defined(WITH_JIT)
14050    /*
14051     * If the JIT is actively building a trace we need to make sure
14052     * that the field is fully resolved before including this instruction.
14053     */
14054    bl      common_verifyField
14055#endif
14056    b       .LOP_SGET_JUMBO_finish          @ resume
14057
14058/* continuation for OP_SGET_WIDE_JUMBO */
14059
14060    /*
14061     * Continuation if the field has not yet been resolved.
14062     *  r1: AAAAAAAA field ref
14063     *
14064     * Returns StaticField pointer in r0.
14065     */
14066.LOP_SGET_WIDE_JUMBO_resolve:
14067    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14068    EXPORT_PC()                         @ resolve() could throw, so export now
14069    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14070    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14071    cmp     r0, #0                      @ success?
14072    bne     .LOP_SGET_WIDE_JUMBO_finish          @ yes, finish
14073    b       common_exceptionThrown      @ no, handle exception
14074
14075/* continuation for OP_SGET_OBJECT_JUMBO */
14076
14077    /*
14078     * Continuation if the field has not yet been resolved.
14079     *  r1:  AAAAAAAA field ref
14080     *  r10: dvmDex->pResFields
14081     */
14082.LOP_SGET_OBJECT_JUMBO_resolve:
14083    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14084#if defined(WITH_JIT)
14085    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14086#endif
14087    EXPORT_PC()                         @ resolve() could throw, so export now
14088    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14089    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14090    cmp     r0, #0                      @ success?
14091    beq     common_exceptionThrown      @ no, handle exception
14092#if defined(WITH_JIT)
14093    /*
14094     * If the JIT is actively building a trace we need to make sure
14095     * that the field is fully resolved before including this instruction.
14096     */
14097    bl      common_verifyField
14098#endif
14099    b       .LOP_SGET_OBJECT_JUMBO_finish          @ resume
14100
14101/* continuation for OP_SGET_BOOLEAN_JUMBO */
14102
14103    /*
14104     * Continuation if the field has not yet been resolved.
14105     *  r1:  AAAAAAAA field ref
14106     *  r10: dvmDex->pResFields
14107     */
14108.LOP_SGET_BOOLEAN_JUMBO_resolve:
14109    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14110#if defined(WITH_JIT)
14111    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14112#endif
14113    EXPORT_PC()                         @ resolve() could throw, so export now
14114    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14115    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14116    cmp     r0, #0                      @ success?
14117    beq     common_exceptionThrown      @ no, handle exception
14118#if defined(WITH_JIT)
14119    /*
14120     * If the JIT is actively building a trace we need to make sure
14121     * that the field is fully resolved before including this instruction.
14122     */
14123    bl      common_verifyField
14124#endif
14125    b       .LOP_SGET_BOOLEAN_JUMBO_finish          @ resume
14126
14127/* continuation for OP_SGET_BYTE_JUMBO */
14128
14129    /*
14130     * Continuation if the field has not yet been resolved.
14131     *  r1:  AAAAAAAA field ref
14132     *  r10: dvmDex->pResFields
14133     */
14134.LOP_SGET_BYTE_JUMBO_resolve:
14135    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14136#if defined(WITH_JIT)
14137    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14138#endif
14139    EXPORT_PC()                         @ resolve() could throw, so export now
14140    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14141    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14142    cmp     r0, #0                      @ success?
14143    beq     common_exceptionThrown      @ no, handle exception
14144#if defined(WITH_JIT)
14145    /*
14146     * If the JIT is actively building a trace we need to make sure
14147     * that the field is fully resolved before including this instruction.
14148     */
14149    bl      common_verifyField
14150#endif
14151    b       .LOP_SGET_BYTE_JUMBO_finish          @ resume
14152
14153/* continuation for OP_SGET_CHAR_JUMBO */
14154
14155    /*
14156     * Continuation if the field has not yet been resolved.
14157     *  r1:  AAAAAAAA field ref
14158     *  r10: dvmDex->pResFields
14159     */
14160.LOP_SGET_CHAR_JUMBO_resolve:
14161    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14162#if defined(WITH_JIT)
14163    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14164#endif
14165    EXPORT_PC()                         @ resolve() could throw, so export now
14166    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14167    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14168    cmp     r0, #0                      @ success?
14169    beq     common_exceptionThrown      @ no, handle exception
14170#if defined(WITH_JIT)
14171    /*
14172     * If the JIT is actively building a trace we need to make sure
14173     * that the field is fully resolved before including this instruction.
14174     */
14175    bl      common_verifyField
14176#endif
14177    b       .LOP_SGET_CHAR_JUMBO_finish          @ resume
14178
14179/* continuation for OP_SGET_SHORT_JUMBO */
14180
14181    /*
14182     * Continuation if the field has not yet been resolved.
14183     *  r1:  AAAAAAAA field ref
14184     *  r10: dvmDex->pResFields
14185     */
14186.LOP_SGET_SHORT_JUMBO_resolve:
14187    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14188#if defined(WITH_JIT)
14189    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14190#endif
14191    EXPORT_PC()                         @ resolve() could throw, so export now
14192    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14193    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14194    cmp     r0, #0                      @ success?
14195    beq     common_exceptionThrown      @ no, handle exception
14196#if defined(WITH_JIT)
14197    /*
14198     * If the JIT is actively building a trace we need to make sure
14199     * that the field is fully resolved before including this instruction.
14200     */
14201    bl      common_verifyField
14202#endif
14203    b       .LOP_SGET_SHORT_JUMBO_finish          @ resume
14204
14205/* continuation for OP_SPUT_JUMBO */
14206
14207    /*
14208     * Continuation if the field has not yet been resolved.
14209     *  r1:  AAAAAAAA field ref
14210     *  r10: dvmDex->pResFields
14211     */
14212.LOP_SPUT_JUMBO_resolve:
14213    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14214#if defined(WITH_JIT)
14215    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14216#endif
14217    EXPORT_PC()                         @ resolve() could throw, so export now
14218    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14219    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14220    cmp     r0, #0                      @ success?
14221    beq     common_exceptionThrown      @ no, handle exception
14222#if defined(WITH_JIT)
14223    /*
14224     * If the JIT is actively building a trace we need to make sure
14225     * that the field is fully resolved before including this instruction.
14226     */
14227    bl      common_verifyField
14228#endif
14229    b       .LOP_SPUT_JUMBO_finish          @ resume
14230
14231/* continuation for OP_SPUT_WIDE_JUMBO */
14232
14233    /*
14234     * Continuation if the field has not yet been resolved.
14235     *  r1:  AAAAAAAA field ref
14236     *  r9:  &fp[BBBB]
14237     *  r10: dvmDex->pResFields
14238     *
14239     * Returns StaticField pointer in r2.
14240     */
14241.LOP_SPUT_WIDE_JUMBO_resolve:
14242    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14243#if defined(WITH_JIT)
14244    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14245#endif
14246    EXPORT_PC()                         @ resolve() could throw, so export now
14247    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14248    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14249    cmp     r0, #0                      @ success?
14250    mov     r2, r0                      @ copy to r2
14251    beq     common_exceptionThrown      @ no, handle exception
14252#if defined(WITH_JIT)
14253    /*
14254     * If the JIT is actively building a trace we need to make sure
14255     * that the field is fully resolved before including this instruction.
14256     */
14257    bl      common_verifyField
14258#endif
14259    b       .LOP_SPUT_WIDE_JUMBO_finish          @ resume
14260
14261/* continuation for OP_SPUT_OBJECT_JUMBO */
14262
14263
14264.LOP_SPUT_OBJECT_JUMBO_end:
14265    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
14266    cmp     r1, #0                      @ stored a null object?
14267    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
14268    GOTO_OPCODE(ip)                     @ jump to next instruction
14269
14270    /* Continuation if the field has not yet been resolved.
14271     * r1:  AAAAaaaa field ref
14272     * r10: dvmDex->pResFields
14273     */
14274.LOP_SPUT_OBJECT_JUMBO_resolve:
14275    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
14276#if defined(WITH_JIT)
14277    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14278#endif
14279    EXPORT_PC()                         @ resolve() could throw, so export now
14280    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14281    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14282    cmp     r0, #0                      @ success?
14283    beq     common_exceptionThrown      @ no, handle exception
14284#if defined(WITH_JIT)
14285    /*
14286     * If the JIT is actively building a trace we need to make sure
14287     * that the field is fully resolved before including this instruction.
14288     */
14289    bl      common_verifyField
14290#endif
14291    b       .LOP_SPUT_OBJECT_JUMBO_finish          @ resume
14292
14293
14294/* continuation for OP_SPUT_BOOLEAN_JUMBO */
14295
14296    /*
14297     * Continuation if the field has not yet been resolved.
14298     *  r1:  AAAAAAAA field ref
14299     *  r10: dvmDex->pResFields
14300     */
14301.LOP_SPUT_BOOLEAN_JUMBO_resolve:
14302    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14303#if defined(WITH_JIT)
14304    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14305#endif
14306    EXPORT_PC()                         @ resolve() could throw, so export now
14307    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14308    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14309    cmp     r0, #0                      @ success?
14310    beq     common_exceptionThrown      @ no, handle exception
14311#if defined(WITH_JIT)
14312    /*
14313     * If the JIT is actively building a trace we need to make sure
14314     * that the field is fully resolved before including this instruction.
14315     */
14316    bl      common_verifyField
14317#endif
14318    b       .LOP_SPUT_BOOLEAN_JUMBO_finish          @ resume
14319
14320/* continuation for OP_SPUT_BYTE_JUMBO */
14321
14322    /*
14323     * Continuation if the field has not yet been resolved.
14324     *  r1:  AAAAAAAA field ref
14325     *  r10: dvmDex->pResFields
14326     */
14327.LOP_SPUT_BYTE_JUMBO_resolve:
14328    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14329#if defined(WITH_JIT)
14330    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14331#endif
14332    EXPORT_PC()                         @ resolve() could throw, so export now
14333    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14334    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14335    cmp     r0, #0                      @ success?
14336    beq     common_exceptionThrown      @ no, handle exception
14337#if defined(WITH_JIT)
14338    /*
14339     * If the JIT is actively building a trace we need to make sure
14340     * that the field is fully resolved before including this instruction.
14341     */
14342    bl      common_verifyField
14343#endif
14344    b       .LOP_SPUT_BYTE_JUMBO_finish          @ resume
14345
14346/* continuation for OP_SPUT_CHAR_JUMBO */
14347
14348    /*
14349     * Continuation if the field has not yet been resolved.
14350     *  r1:  AAAAAAAA field ref
14351     *  r10: dvmDex->pResFields
14352     */
14353.LOP_SPUT_CHAR_JUMBO_resolve:
14354    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14355#if defined(WITH_JIT)
14356    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14357#endif
14358    EXPORT_PC()                         @ resolve() could throw, so export now
14359    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14360    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14361    cmp     r0, #0                      @ success?
14362    beq     common_exceptionThrown      @ no, handle exception
14363#if defined(WITH_JIT)
14364    /*
14365     * If the JIT is actively building a trace we need to make sure
14366     * that the field is fully resolved before including this instruction.
14367     */
14368    bl      common_verifyField
14369#endif
14370    b       .LOP_SPUT_CHAR_JUMBO_finish          @ resume
14371
14372/* continuation for OP_SPUT_SHORT_JUMBO */
14373
14374    /*
14375     * Continuation if the field has not yet been resolved.
14376     *  r1:  AAAAAAAA field ref
14377     *  r10: dvmDex->pResFields
14378     */
14379.LOP_SPUT_SHORT_JUMBO_resolve:
14380    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14381#if defined(WITH_JIT)
14382    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14383#endif
14384    EXPORT_PC()                         @ resolve() could throw, so export now
14385    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14386    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14387    cmp     r0, #0                      @ success?
14388    beq     common_exceptionThrown      @ no, handle exception
14389#if defined(WITH_JIT)
14390    /*
14391     * If the JIT is actively building a trace we need to make sure
14392     * that the field is fully resolved before including this instruction.
14393     */
14394    bl      common_verifyField
14395#endif
14396    b       .LOP_SPUT_SHORT_JUMBO_finish          @ resume
14397
14398/* continuation for OP_INVOKE_VIRTUAL_JUMBO */
14399
14400    /*
14401     * At this point:
14402     *  r0 = resolved base method
14403     */
14404.LOP_INVOKE_VIRTUAL_JUMBO_continue:
14405    FETCH(r10, 4)                       @ r10<- CCCC
14406    GET_VREG(r9, r10)                   @ r9<- "this" ptr
14407    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
14408    cmp     r9, #0                      @ is "this" null?
14409    beq     common_errNullObject        @ null "this", throw exception
14410    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
14411    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
14412    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
14413    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
14414
14415/* continuation for OP_INVOKE_SUPER_JUMBO */
14416
14417    /*
14418     * At this point:
14419     *  r0 = resolved base method
14420     *  r10 = method->clazz
14421     */
14422.LOP_INVOKE_SUPER_JUMBO_continue:
14423    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
14424    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
14425    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
14426    EXPORT_PC()                         @ must export for invoke
14427    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
14428    bcs     .LOP_INVOKE_SUPER_JUMBO_nsm             @ method not present in superclass
14429    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
14430    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
14431    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
14432
14433.LOP_INVOKE_SUPER_JUMBO_resolve:
14434    mov     r0, r10                     @ r0<- method->clazz
14435    mov     r2, #METHOD_VIRTUAL         @ resolver method type
14436    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14437    cmp     r0, #0                      @ got null?
14438    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ no, continue
14439    b       common_exceptionThrown      @ yes, handle exception
14440
14441    /*
14442     * Throw a NoSuchMethodError with the method name as the message.
14443     *  r0 = resolved base method
14444     */
14445.LOP_INVOKE_SUPER_JUMBO_nsm:
14446    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
14447    b       common_errNoSuchMethod
14448
14449/* continuation for OP_INVOKE_DIRECT_JUMBO */
14450
14451    /*
14452     * On entry:
14453     *  r1 = reference (CCCC)
14454     *  r10 = "this" register
14455     */
14456.LOP_INVOKE_DIRECT_JUMBO_resolve:
14457    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
14458    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
14459    mov     r2, #METHOD_DIRECT          @ resolver method type
14460    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14461    cmp     r0, #0                      @ got null?
14462    bne     .LOP_INVOKE_DIRECT_JUMBO_finish          @ no, continue
14463    b       common_exceptionThrown      @ yes, handle exception
14464
14465/* continuation for OP_INVOKE_STATIC_JUMBO */
14466
14467
14468.LOP_INVOKE_STATIC_JUMBO_resolve:
14469    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
14470    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
14471    mov     r2, #METHOD_STATIC          @ resolver method type
14472    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14473    cmp     r0, #0                      @ got null?
14474#if defined(WITH_JIT)
14475    /*
14476     * Check to see if we're actively building a trace.  If so,
14477     * we need to keep this instruction out of it.
14478     * r10: &resolved_methodToCall
14479     */
14480    ldrh    r2, [rSELF, #offThread_subMode]
14481    beq     common_exceptionThrown            @ null, handle exception
14482    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
14483    beq     common_invokeMethodJumboNoThis    @ no (r0=method, r9="this")
14484    ldr     r1, [r10]                         @ reload resolved method
14485    cmp     r1, #0                            @ finished resolving?
14486    bne     common_invokeMethodJumboNoThis    @ yes (r0=method, r9="this")
14487    mov     r10, r0                           @ preserve method
14488    mov     r0, rSELF
14489    mov     r1, rPC
14490    bl      dvmJitEndTraceSelect              @ (self, pc)
14491    mov     r0, r10
14492    b       common_invokeMethodJumboNoThis    @ whew, finally!
14493#else
14494    bne     common_invokeMethodJumboNoThis    @ (r0=method, r9="this")
14495    b       common_exceptionThrown            @ yes, handle exception
14496#endif
14497
14498/* continuation for OP_INVOKE_OBJECT_INIT_JUMBO */
14499
14500.LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal:
14501    EXPORT_PC()                         @ can throw
14502    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
14503    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
14504    cmp     r0, #0                      @ exception pending?
14505    bne     common_exceptionThrown      @ yes, handle it
14506    b       .LOP_INVOKE_OBJECT_INIT_JUMBO_finish
14507
14508    /*
14509     * A debugger is attached, so we need to go ahead and do
14510     * this.  For simplicity, we'll just jump directly to the
14511     * corresponding handler.  Note that we can't use
14512     * rIBASE here because it may be in single-step mode.
14513     * Load the primary table base directly.
14514     */
14515.LOP_INVOKE_OBJECT_INIT_JUMBO_debugger:
14516    ldr     r1, [rSELF, #offThread_mainHandlerTable]
14517    .if 1
14518    mov     ip, #OP_INVOKE_DIRECT_JUMBO
14519    .else
14520    mov     ip, #OP_INVOKE_DIRECT_RANGE
14521    .endif
14522    GOTO_OPCODE_BASE(r1,ip)             @ execute it
14523
14524/* continuation for OP_IGET_VOLATILE_JUMBO */
14525
14526    /*
14527     * Currently:
14528     *  r0 holds resolved field
14529     *  r9 holds object
14530     */
14531.LOP_IGET_VOLATILE_JUMBO_resolved:
14532    cmp     r0, #0                      @ resolution unsuccessful?
14533    beq     common_exceptionThrown      @ yes, throw exception
14534    @ fall through to OP_IGET_VOLATILE_JUMBO_finish
14535
14536    /*
14537     * Currently:
14538     *  r0 holds resolved field
14539     *  r9 holds object
14540     */
14541.LOP_IGET_VOLATILE_JUMBO_finish:
14542    @bl      common_squeak0
14543    cmp     r9, #0                      @ check object for null
14544    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14545    beq     common_errNullObject        @ object was null
14546    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14547    SMP_DMB                            @ acquiring load
14548    FETCH(r2, 3)                        @ r2<- BBBB
14549    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14550    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14551    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14552    GOTO_OPCODE(ip)                     @ jump to next instruction
14553
14554/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
14555
14556    /*
14557     * Currently:
14558     *  r0 holds resolved field
14559     *  r9 holds object
14560     */
14561.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
14562    cmp     r0, #0                      @ resolution unsuccessful?
14563    beq     common_exceptionThrown      @ yes, throw exception
14564    @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
14565
14566    /*
14567     * Currently:
14568     *  r0 holds resolved field
14569     *  r9 holds object
14570     */
14571.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
14572    cmp     r9, #0                      @ check object for null
14573    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14574    beq     common_errNullObject        @ object was null
14575    .if     1
14576    add     r0, r9, r3                  @ r0<- address of field
14577    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
14578    .else
14579    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
14580    .endif
14581    FETCH(r2, 3)                        @ r2<- BBBB
14582    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14583    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14584    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14585    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
14586    GOTO_OPCODE(ip)                     @ jump to next instruction
14587
14588/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
14589
14590    /*
14591     * Currently:
14592     *  r0 holds resolved field
14593     *  r9 holds object
14594     */
14595.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
14596    cmp     r0, #0                      @ resolution unsuccessful?
14597    beq     common_exceptionThrown      @ yes, throw exception
14598    @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
14599
14600    /*
14601     * Currently:
14602     *  r0 holds resolved field
14603     *  r9 holds object
14604     */
14605.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
14606    @bl      common_squeak0
14607    cmp     r9, #0                      @ check object for null
14608    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14609    beq     common_errNullObject        @ object was null
14610    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14611    SMP_DMB                            @ acquiring load
14612    FETCH(r2, 3)                        @ r2<- BBBB
14613    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14614    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14615    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14616    GOTO_OPCODE(ip)                     @ jump to next instruction
14617
14618/* continuation for OP_IPUT_VOLATILE_JUMBO */
14619
14620    /*
14621     * Currently:
14622     *  r0 holds resolved field
14623     *  r9 holds object
14624     */
14625.LOP_IPUT_VOLATILE_JUMBO_resolved:
14626     cmp     r0, #0                     @ resolution unsuccessful?
14627     beq     common_exceptionThrown     @ yes, throw exception
14628     @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
14629
14630    /*
14631     * Currently:
14632     *  r0 holds resolved field
14633     *  r9 holds object
14634     */
14635.LOP_IPUT_VOLATILE_JUMBO_finish:
14636    @bl      common_squeak0
14637    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14638    FETCH(r1, 3)                        @ r1<- BBBB
14639    cmp     r9, #0                      @ check object for null
14640    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14641    beq     common_errNullObject        @ object was null
14642    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14643    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14644    SMP_DMB                            @ releasing store
14645    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14646    GOTO_OPCODE(ip)                     @ jump to next instruction
14647
14648/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
14649
14650    /*
14651     * Currently:
14652     *  r0 holds resolved field
14653     *  r9 holds object
14654     */
14655.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
14656     cmp     r0, #0                     @ resolution unsuccessful?
14657     beq     common_exceptionThrown     @ yes, throw exception
14658     @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
14659
14660    /*
14661     * Currently:
14662     *  r0 holds resolved field
14663     *  r9 holds object
14664     */
14665.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
14666    cmp     r9, #0                      @ check object for null
14667    FETCH(r2, 3)                        @ r1<- BBBB
14668    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14669    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14670    beq     common_errNullObject        @ object was null
14671    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14672    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
14673    GET_INST_OPCODE(r10)                @ extract opcode from rINST
14674    .if     1
14675    add     r2, r9, r3                  @ r2<- target address
14676    bl      dvmQuasiAtomicSwap64        @ stores r0/r1 into addr r2
14677    .else
14678    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
14679    .endif
14680    GOTO_OPCODE(r10)                    @ jump to next instruction
14681
14682/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
14683
14684    /*
14685     * Currently:
14686     *  r0 holds resolved field
14687     *  r9 holds object
14688     */
14689.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
14690     cmp     r0, #0                     @ resolution unsuccessful?
14691     beq     common_exceptionThrown     @ yes, throw exception
14692     @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
14693
14694    /*
14695     * Currently:
14696     *  r0 holds resolved field
14697     *  r9 holds object
14698     */
14699.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
14700    @bl      common_squeak0
14701    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14702    FETCH(r1, 3)                        @ r1<- BBBB
14703    cmp     r9, #0                      @ check object for null
14704    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14705    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
14706    beq     common_errNullObject        @ object was null
14707    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14708    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14709    SMP_DMB                            @ releasing store
14710    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
14711    cmp     r0, #0                      @ stored a null reference?
14712    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
14713    GOTO_OPCODE(ip)                     @ jump to next instruction
14714
14715/* continuation for OP_SGET_VOLATILE_JUMBO */
14716
14717    /*
14718     * Continuation if the field has not yet been resolved.
14719     *  r1:  AAAAAAAA field ref
14720     *  r10: dvmDex->pResFields
14721     */
14722.LOP_SGET_VOLATILE_JUMBO_resolve:
14723    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14724#if defined(WITH_JIT)
14725    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14726#endif
14727    EXPORT_PC()                         @ resolve() could throw, so export now
14728    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14729    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14730    cmp     r0, #0                      @ success?
14731    beq     common_exceptionThrown      @ no, handle exception
14732#if defined(WITH_JIT)
14733    /*
14734     * If the JIT is actively building a trace we need to make sure
14735     * that the field is fully resolved before including this instruction.
14736     */
14737    bl      common_verifyField
14738#endif
14739    b       .LOP_SGET_VOLATILE_JUMBO_finish          @ resume
14740
14741/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
14742
14743    /*
14744     * Continuation if the field has not yet been resolved.
14745     *  r1: AAAAAAAA field ref
14746     *
14747     * Returns StaticField pointer in r0.
14748     */
14749.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
14750    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14751    EXPORT_PC()                         @ resolve() could throw, so export now
14752    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14753    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14754    cmp     r0, #0                      @ success?
14755    bne     .LOP_SGET_WIDE_VOLATILE_JUMBO_finish          @ yes, finish
14756    b       common_exceptionThrown      @ no, handle exception
14757
14758/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
14759
14760    /*
14761     * Continuation if the field has not yet been resolved.
14762     *  r1:  AAAAAAAA field ref
14763     *  r10: dvmDex->pResFields
14764     */
14765.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
14766    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14767#if defined(WITH_JIT)
14768    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14769#endif
14770    EXPORT_PC()                         @ resolve() could throw, so export now
14771    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14772    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14773    cmp     r0, #0                      @ success?
14774    beq     common_exceptionThrown      @ no, handle exception
14775#if defined(WITH_JIT)
14776    /*
14777     * If the JIT is actively building a trace we need to make sure
14778     * that the field is fully resolved before including this instruction.
14779     */
14780    bl      common_verifyField
14781#endif
14782    b       .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish          @ resume
14783
14784/* continuation for OP_SPUT_VOLATILE_JUMBO */
14785
14786    /*
14787     * Continuation if the field has not yet been resolved.
14788     *  r1:  AAAAAAAA field ref
14789     *  r10: dvmDex->pResFields
14790     */
14791.LOP_SPUT_VOLATILE_JUMBO_resolve:
14792    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14793#if defined(WITH_JIT)
14794    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14795#endif
14796    EXPORT_PC()                         @ resolve() could throw, so export now
14797    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14798    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14799    cmp     r0, #0                      @ success?
14800    beq     common_exceptionThrown      @ no, handle exception
14801#if defined(WITH_JIT)
14802    /*
14803     * If the JIT is actively building a trace we need to make sure
14804     * that the field is fully resolved before including this instruction.
14805     */
14806    bl      common_verifyField
14807#endif
14808    b       .LOP_SPUT_VOLATILE_JUMBO_finish          @ resume
14809
14810/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
14811
14812    /*
14813     * Continuation if the field has not yet been resolved.
14814     *  r1:  AAAAAAAA field ref
14815     *  r9:  &fp[BBBB]
14816     *  r10: dvmDex->pResFields
14817     *
14818     * Returns StaticField pointer in r2.
14819     */
14820.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
14821    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14822#if defined(WITH_JIT)
14823    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14824#endif
14825    EXPORT_PC()                         @ resolve() could throw, so export now
14826    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14827    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14828    cmp     r0, #0                      @ success?
14829    mov     r2, r0                      @ copy to r2
14830    beq     common_exceptionThrown      @ no, handle exception
14831#if defined(WITH_JIT)
14832    /*
14833     * If the JIT is actively building a trace we need to make sure
14834     * that the field is fully resolved before including this instruction.
14835     */
14836    bl      common_verifyField
14837#endif
14838    b       .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish          @ resume
14839
14840/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
14841
14842
14843.LOP_SPUT_OBJECT_VOLATILE_JUMBO_end:
14844    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
14845    cmp     r1, #0                      @ stored a null object?
14846    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
14847    GOTO_OPCODE(ip)                     @ jump to next instruction
14848
14849    /* Continuation if the field has not yet been resolved.
14850     * r1:  AAAAaaaa field ref
14851     * r10: dvmDex->pResFields
14852     */
14853.LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve:
14854    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
14855#if defined(WITH_JIT)
14856    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14857#endif
14858    EXPORT_PC()                         @ resolve() could throw, so export now
14859    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14860    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14861    cmp     r0, #0                      @ success?
14862    beq     common_exceptionThrown      @ no, handle exception
14863#if defined(WITH_JIT)
14864    /*
14865     * If the JIT is actively building a trace we need to make sure
14866     * that the field is fully resolved before including this instruction.
14867     */
14868    bl      common_verifyField
14869#endif
14870    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish          @ resume
14871
14872
14873    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
14874    .global dvmAsmSisterEnd
14875dvmAsmSisterEnd:
14876
14877
14878    .global dvmAsmAltInstructionStart
14879    .type   dvmAsmAltInstructionStart, %function
14880    .text
14881
14882dvmAsmAltInstructionStart = .L_ALT_OP_NOP
14883/* ------------------------------ */
14884    .balign 64
14885.L_ALT_OP_NOP: /* 0x00 */
14886/* File: armv5te/alt_stub.S */
14887/*
14888 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14889 * any interesting requests and then jump to the real instruction
14890 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14891 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14892 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14893 * bail to the real handler if breakFlags==0.
14894 */
14895    ldrb   r3, [rSELF, #offThread_breakFlags]
14896    adrl   lr, dvmAsmInstructionStart + (0 * 64)
14897    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14898    cmp    r3, #0
14899    bxeq   lr                   @ nothing to do - jump to real handler
14900    EXPORT_PC()
14901    mov    r0, rPC              @ arg0
14902    mov    r1, rFP              @ arg1
14903    mov    r2, rSELF            @ arg2
14904    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14905
14906/* ------------------------------ */
14907    .balign 64
14908.L_ALT_OP_MOVE: /* 0x01 */
14909/* File: armv5te/alt_stub.S */
14910/*
14911 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14912 * any interesting requests and then jump to the real instruction
14913 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14914 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14915 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14916 * bail to the real handler if breakFlags==0.
14917 */
14918    ldrb   r3, [rSELF, #offThread_breakFlags]
14919    adrl   lr, dvmAsmInstructionStart + (1 * 64)
14920    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14921    cmp    r3, #0
14922    bxeq   lr                   @ nothing to do - jump to real handler
14923    EXPORT_PC()
14924    mov    r0, rPC              @ arg0
14925    mov    r1, rFP              @ arg1
14926    mov    r2, rSELF            @ arg2
14927    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14928
14929/* ------------------------------ */
14930    .balign 64
14931.L_ALT_OP_MOVE_FROM16: /* 0x02 */
14932/* File: armv5te/alt_stub.S */
14933/*
14934 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14935 * any interesting requests and then jump to the real instruction
14936 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14937 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14938 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14939 * bail to the real handler if breakFlags==0.
14940 */
14941    ldrb   r3, [rSELF, #offThread_breakFlags]
14942    adrl   lr, dvmAsmInstructionStart + (2 * 64)
14943    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14944    cmp    r3, #0
14945    bxeq   lr                   @ nothing to do - jump to real handler
14946    EXPORT_PC()
14947    mov    r0, rPC              @ arg0
14948    mov    r1, rFP              @ arg1
14949    mov    r2, rSELF            @ arg2
14950    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14951
14952/* ------------------------------ */
14953    .balign 64
14954.L_ALT_OP_MOVE_16: /* 0x03 */
14955/* File: armv5te/alt_stub.S */
14956/*
14957 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14958 * any interesting requests and then jump to the real instruction
14959 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14960 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14961 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14962 * bail to the real handler if breakFlags==0.
14963 */
14964    ldrb   r3, [rSELF, #offThread_breakFlags]
14965    adrl   lr, dvmAsmInstructionStart + (3 * 64)
14966    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14967    cmp    r3, #0
14968    bxeq   lr                   @ nothing to do - jump to real handler
14969    EXPORT_PC()
14970    mov    r0, rPC              @ arg0
14971    mov    r1, rFP              @ arg1
14972    mov    r2, rSELF            @ arg2
14973    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14974
14975/* ------------------------------ */
14976    .balign 64
14977.L_ALT_OP_MOVE_WIDE: /* 0x04 */
14978/* File: armv5te/alt_stub.S */
14979/*
14980 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14981 * any interesting requests and then jump to the real instruction
14982 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14983 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14984 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14985 * bail to the real handler if breakFlags==0.
14986 */
14987    ldrb   r3, [rSELF, #offThread_breakFlags]
14988    adrl   lr, dvmAsmInstructionStart + (4 * 64)
14989    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14990    cmp    r3, #0
14991    bxeq   lr                   @ nothing to do - jump to real handler
14992    EXPORT_PC()
14993    mov    r0, rPC              @ arg0
14994    mov    r1, rFP              @ arg1
14995    mov    r2, rSELF            @ arg2
14996    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14997
14998/* ------------------------------ */
14999    .balign 64
15000.L_ALT_OP_MOVE_WIDE_FROM16: /* 0x05 */
15001/* File: armv5te/alt_stub.S */
15002/*
15003 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15004 * any interesting requests and then jump to the real instruction
15005 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15006 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15007 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15008 * bail to the real handler if breakFlags==0.
15009 */
15010    ldrb   r3, [rSELF, #offThread_breakFlags]
15011    adrl   lr, dvmAsmInstructionStart + (5 * 64)
15012    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15013    cmp    r3, #0
15014    bxeq   lr                   @ nothing to do - jump to real handler
15015    EXPORT_PC()
15016    mov    r0, rPC              @ arg0
15017    mov    r1, rFP              @ arg1
15018    mov    r2, rSELF            @ arg2
15019    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15020
15021/* ------------------------------ */
15022    .balign 64
15023.L_ALT_OP_MOVE_WIDE_16: /* 0x06 */
15024/* File: armv5te/alt_stub.S */
15025/*
15026 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15027 * any interesting requests and then jump to the real instruction
15028 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15029 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15030 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15031 * bail to the real handler if breakFlags==0.
15032 */
15033    ldrb   r3, [rSELF, #offThread_breakFlags]
15034    adrl   lr, dvmAsmInstructionStart + (6 * 64)
15035    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15036    cmp    r3, #0
15037    bxeq   lr                   @ nothing to do - jump to real handler
15038    EXPORT_PC()
15039    mov    r0, rPC              @ arg0
15040    mov    r1, rFP              @ arg1
15041    mov    r2, rSELF            @ arg2
15042    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15043
15044/* ------------------------------ */
15045    .balign 64
15046.L_ALT_OP_MOVE_OBJECT: /* 0x07 */
15047/* File: armv5te/alt_stub.S */
15048/*
15049 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15050 * any interesting requests and then jump to the real instruction
15051 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15052 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15053 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15054 * bail to the real handler if breakFlags==0.
15055 */
15056    ldrb   r3, [rSELF, #offThread_breakFlags]
15057    adrl   lr, dvmAsmInstructionStart + (7 * 64)
15058    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15059    cmp    r3, #0
15060    bxeq   lr                   @ nothing to do - jump to real handler
15061    EXPORT_PC()
15062    mov    r0, rPC              @ arg0
15063    mov    r1, rFP              @ arg1
15064    mov    r2, rSELF            @ arg2
15065    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15066
15067/* ------------------------------ */
15068    .balign 64
15069.L_ALT_OP_MOVE_OBJECT_FROM16: /* 0x08 */
15070/* File: armv5te/alt_stub.S */
15071/*
15072 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15073 * any interesting requests and then jump to the real instruction
15074 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15075 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15076 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15077 * bail to the real handler if breakFlags==0.
15078 */
15079    ldrb   r3, [rSELF, #offThread_breakFlags]
15080    adrl   lr, dvmAsmInstructionStart + (8 * 64)
15081    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15082    cmp    r3, #0
15083    bxeq   lr                   @ nothing to do - jump to real handler
15084    EXPORT_PC()
15085    mov    r0, rPC              @ arg0
15086    mov    r1, rFP              @ arg1
15087    mov    r2, rSELF            @ arg2
15088    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15089
15090/* ------------------------------ */
15091    .balign 64
15092.L_ALT_OP_MOVE_OBJECT_16: /* 0x09 */
15093/* File: armv5te/alt_stub.S */
15094/*
15095 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15096 * any interesting requests and then jump to the real instruction
15097 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15098 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15099 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15100 * bail to the real handler if breakFlags==0.
15101 */
15102    ldrb   r3, [rSELF, #offThread_breakFlags]
15103    adrl   lr, dvmAsmInstructionStart + (9 * 64)
15104    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15105    cmp    r3, #0
15106    bxeq   lr                   @ nothing to do - jump to real handler
15107    EXPORT_PC()
15108    mov    r0, rPC              @ arg0
15109    mov    r1, rFP              @ arg1
15110    mov    r2, rSELF            @ arg2
15111    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15112
15113/* ------------------------------ */
15114    .balign 64
15115.L_ALT_OP_MOVE_RESULT: /* 0x0a */
15116/* File: armv5te/alt_stub.S */
15117/*
15118 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15119 * any interesting requests and then jump to the real instruction
15120 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15121 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15122 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15123 * bail to the real handler if breakFlags==0.
15124 */
15125    ldrb   r3, [rSELF, #offThread_breakFlags]
15126    adrl   lr, dvmAsmInstructionStart + (10 * 64)
15127    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15128    cmp    r3, #0
15129    bxeq   lr                   @ nothing to do - jump to real handler
15130    EXPORT_PC()
15131    mov    r0, rPC              @ arg0
15132    mov    r1, rFP              @ arg1
15133    mov    r2, rSELF            @ arg2
15134    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15135
15136/* ------------------------------ */
15137    .balign 64
15138.L_ALT_OP_MOVE_RESULT_WIDE: /* 0x0b */
15139/* File: armv5te/alt_stub.S */
15140/*
15141 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15142 * any interesting requests and then jump to the real instruction
15143 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15144 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15145 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15146 * bail to the real handler if breakFlags==0.
15147 */
15148    ldrb   r3, [rSELF, #offThread_breakFlags]
15149    adrl   lr, dvmAsmInstructionStart + (11 * 64)
15150    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15151    cmp    r3, #0
15152    bxeq   lr                   @ nothing to do - jump to real handler
15153    EXPORT_PC()
15154    mov    r0, rPC              @ arg0
15155    mov    r1, rFP              @ arg1
15156    mov    r2, rSELF            @ arg2
15157    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15158
15159/* ------------------------------ */
15160    .balign 64
15161.L_ALT_OP_MOVE_RESULT_OBJECT: /* 0x0c */
15162/* File: armv5te/alt_stub.S */
15163/*
15164 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15165 * any interesting requests and then jump to the real instruction
15166 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15167 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15168 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15169 * bail to the real handler if breakFlags==0.
15170 */
15171    ldrb   r3, [rSELF, #offThread_breakFlags]
15172    adrl   lr, dvmAsmInstructionStart + (12 * 64)
15173    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15174    cmp    r3, #0
15175    bxeq   lr                   @ nothing to do - jump to real handler
15176    EXPORT_PC()
15177    mov    r0, rPC              @ arg0
15178    mov    r1, rFP              @ arg1
15179    mov    r2, rSELF            @ arg2
15180    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15181
15182/* ------------------------------ */
15183    .balign 64
15184.L_ALT_OP_MOVE_EXCEPTION: /* 0x0d */
15185/* File: armv5te/alt_stub.S */
15186/*
15187 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15188 * any interesting requests and then jump to the real instruction
15189 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15190 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15191 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15192 * bail to the real handler if breakFlags==0.
15193 */
15194    ldrb   r3, [rSELF, #offThread_breakFlags]
15195    adrl   lr, dvmAsmInstructionStart + (13 * 64)
15196    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15197    cmp    r3, #0
15198    bxeq   lr                   @ nothing to do - jump to real handler
15199    EXPORT_PC()
15200    mov    r0, rPC              @ arg0
15201    mov    r1, rFP              @ arg1
15202    mov    r2, rSELF            @ arg2
15203    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15204
15205/* ------------------------------ */
15206    .balign 64
15207.L_ALT_OP_RETURN_VOID: /* 0x0e */
15208/* File: armv5te/alt_stub.S */
15209/*
15210 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15211 * any interesting requests and then jump to the real instruction
15212 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15213 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15214 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15215 * bail to the real handler if breakFlags==0.
15216 */
15217    ldrb   r3, [rSELF, #offThread_breakFlags]
15218    adrl   lr, dvmAsmInstructionStart + (14 * 64)
15219    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15220    cmp    r3, #0
15221    bxeq   lr                   @ nothing to do - jump to real handler
15222    EXPORT_PC()
15223    mov    r0, rPC              @ arg0
15224    mov    r1, rFP              @ arg1
15225    mov    r2, rSELF            @ arg2
15226    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15227
15228/* ------------------------------ */
15229    .balign 64
15230.L_ALT_OP_RETURN: /* 0x0f */
15231/* File: armv5te/alt_stub.S */
15232/*
15233 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15234 * any interesting requests and then jump to the real instruction
15235 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15236 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15237 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15238 * bail to the real handler if breakFlags==0.
15239 */
15240    ldrb   r3, [rSELF, #offThread_breakFlags]
15241    adrl   lr, dvmAsmInstructionStart + (15 * 64)
15242    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15243    cmp    r3, #0
15244    bxeq   lr                   @ nothing to do - jump to real handler
15245    EXPORT_PC()
15246    mov    r0, rPC              @ arg0
15247    mov    r1, rFP              @ arg1
15248    mov    r2, rSELF            @ arg2
15249    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15250
15251/* ------------------------------ */
15252    .balign 64
15253.L_ALT_OP_RETURN_WIDE: /* 0x10 */
15254/* File: armv5te/alt_stub.S */
15255/*
15256 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15257 * any interesting requests and then jump to the real instruction
15258 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15259 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15260 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15261 * bail to the real handler if breakFlags==0.
15262 */
15263    ldrb   r3, [rSELF, #offThread_breakFlags]
15264    adrl   lr, dvmAsmInstructionStart + (16 * 64)
15265    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15266    cmp    r3, #0
15267    bxeq   lr                   @ nothing to do - jump to real handler
15268    EXPORT_PC()
15269    mov    r0, rPC              @ arg0
15270    mov    r1, rFP              @ arg1
15271    mov    r2, rSELF            @ arg2
15272    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15273
15274/* ------------------------------ */
15275    .balign 64
15276.L_ALT_OP_RETURN_OBJECT: /* 0x11 */
15277/* File: armv5te/alt_stub.S */
15278/*
15279 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15280 * any interesting requests and then jump to the real instruction
15281 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15282 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15283 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15284 * bail to the real handler if breakFlags==0.
15285 */
15286    ldrb   r3, [rSELF, #offThread_breakFlags]
15287    adrl   lr, dvmAsmInstructionStart + (17 * 64)
15288    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15289    cmp    r3, #0
15290    bxeq   lr                   @ nothing to do - jump to real handler
15291    EXPORT_PC()
15292    mov    r0, rPC              @ arg0
15293    mov    r1, rFP              @ arg1
15294    mov    r2, rSELF            @ arg2
15295    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15296
15297/* ------------------------------ */
15298    .balign 64
15299.L_ALT_OP_CONST_4: /* 0x12 */
15300/* File: armv5te/alt_stub.S */
15301/*
15302 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15303 * any interesting requests and then jump to the real instruction
15304 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15305 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15306 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15307 * bail to the real handler if breakFlags==0.
15308 */
15309    ldrb   r3, [rSELF, #offThread_breakFlags]
15310    adrl   lr, dvmAsmInstructionStart + (18 * 64)
15311    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15312    cmp    r3, #0
15313    bxeq   lr                   @ nothing to do - jump to real handler
15314    EXPORT_PC()
15315    mov    r0, rPC              @ arg0
15316    mov    r1, rFP              @ arg1
15317    mov    r2, rSELF            @ arg2
15318    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15319
15320/* ------------------------------ */
15321    .balign 64
15322.L_ALT_OP_CONST_16: /* 0x13 */
15323/* File: armv5te/alt_stub.S */
15324/*
15325 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15326 * any interesting requests and then jump to the real instruction
15327 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15328 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15329 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15330 * bail to the real handler if breakFlags==0.
15331 */
15332    ldrb   r3, [rSELF, #offThread_breakFlags]
15333    adrl   lr, dvmAsmInstructionStart + (19 * 64)
15334    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15335    cmp    r3, #0
15336    bxeq   lr                   @ nothing to do - jump to real handler
15337    EXPORT_PC()
15338    mov    r0, rPC              @ arg0
15339    mov    r1, rFP              @ arg1
15340    mov    r2, rSELF            @ arg2
15341    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15342
15343/* ------------------------------ */
15344    .balign 64
15345.L_ALT_OP_CONST: /* 0x14 */
15346/* File: armv5te/alt_stub.S */
15347/*
15348 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15349 * any interesting requests and then jump to the real instruction
15350 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15351 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15352 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15353 * bail to the real handler if breakFlags==0.
15354 */
15355    ldrb   r3, [rSELF, #offThread_breakFlags]
15356    adrl   lr, dvmAsmInstructionStart + (20 * 64)
15357    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15358    cmp    r3, #0
15359    bxeq   lr                   @ nothing to do - jump to real handler
15360    EXPORT_PC()
15361    mov    r0, rPC              @ arg0
15362    mov    r1, rFP              @ arg1
15363    mov    r2, rSELF            @ arg2
15364    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15365
15366/* ------------------------------ */
15367    .balign 64
15368.L_ALT_OP_CONST_HIGH16: /* 0x15 */
15369/* File: armv5te/alt_stub.S */
15370/*
15371 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15372 * any interesting requests and then jump to the real instruction
15373 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15374 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15375 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15376 * bail to the real handler if breakFlags==0.
15377 */
15378    ldrb   r3, [rSELF, #offThread_breakFlags]
15379    adrl   lr, dvmAsmInstructionStart + (21 * 64)
15380    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15381    cmp    r3, #0
15382    bxeq   lr                   @ nothing to do - jump to real handler
15383    EXPORT_PC()
15384    mov    r0, rPC              @ arg0
15385    mov    r1, rFP              @ arg1
15386    mov    r2, rSELF            @ arg2
15387    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15388
15389/* ------------------------------ */
15390    .balign 64
15391.L_ALT_OP_CONST_WIDE_16: /* 0x16 */
15392/* File: armv5te/alt_stub.S */
15393/*
15394 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15395 * any interesting requests and then jump to the real instruction
15396 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15397 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15398 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15399 * bail to the real handler if breakFlags==0.
15400 */
15401    ldrb   r3, [rSELF, #offThread_breakFlags]
15402    adrl   lr, dvmAsmInstructionStart + (22 * 64)
15403    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15404    cmp    r3, #0
15405    bxeq   lr                   @ nothing to do - jump to real handler
15406    EXPORT_PC()
15407    mov    r0, rPC              @ arg0
15408    mov    r1, rFP              @ arg1
15409    mov    r2, rSELF            @ arg2
15410    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15411
15412/* ------------------------------ */
15413    .balign 64
15414.L_ALT_OP_CONST_WIDE_32: /* 0x17 */
15415/* File: armv5te/alt_stub.S */
15416/*
15417 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15418 * any interesting requests and then jump to the real instruction
15419 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15420 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15421 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15422 * bail to the real handler if breakFlags==0.
15423 */
15424    ldrb   r3, [rSELF, #offThread_breakFlags]
15425    adrl   lr, dvmAsmInstructionStart + (23 * 64)
15426    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15427    cmp    r3, #0
15428    bxeq   lr                   @ nothing to do - jump to real handler
15429    EXPORT_PC()
15430    mov    r0, rPC              @ arg0
15431    mov    r1, rFP              @ arg1
15432    mov    r2, rSELF            @ arg2
15433    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15434
15435/* ------------------------------ */
15436    .balign 64
15437.L_ALT_OP_CONST_WIDE: /* 0x18 */
15438/* File: armv5te/alt_stub.S */
15439/*
15440 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15441 * any interesting requests and then jump to the real instruction
15442 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15443 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15444 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15445 * bail to the real handler if breakFlags==0.
15446 */
15447    ldrb   r3, [rSELF, #offThread_breakFlags]
15448    adrl   lr, dvmAsmInstructionStart + (24 * 64)
15449    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15450    cmp    r3, #0
15451    bxeq   lr                   @ nothing to do - jump to real handler
15452    EXPORT_PC()
15453    mov    r0, rPC              @ arg0
15454    mov    r1, rFP              @ arg1
15455    mov    r2, rSELF            @ arg2
15456    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15457
15458/* ------------------------------ */
15459    .balign 64
15460.L_ALT_OP_CONST_WIDE_HIGH16: /* 0x19 */
15461/* File: armv5te/alt_stub.S */
15462/*
15463 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15464 * any interesting requests and then jump to the real instruction
15465 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15466 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15467 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15468 * bail to the real handler if breakFlags==0.
15469 */
15470    ldrb   r3, [rSELF, #offThread_breakFlags]
15471    adrl   lr, dvmAsmInstructionStart + (25 * 64)
15472    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15473    cmp    r3, #0
15474    bxeq   lr                   @ nothing to do - jump to real handler
15475    EXPORT_PC()
15476    mov    r0, rPC              @ arg0
15477    mov    r1, rFP              @ arg1
15478    mov    r2, rSELF            @ arg2
15479    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15480
15481/* ------------------------------ */
15482    .balign 64
15483.L_ALT_OP_CONST_STRING: /* 0x1a */
15484/* File: armv5te/alt_stub.S */
15485/*
15486 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15487 * any interesting requests and then jump to the real instruction
15488 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15489 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15490 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15491 * bail to the real handler if breakFlags==0.
15492 */
15493    ldrb   r3, [rSELF, #offThread_breakFlags]
15494    adrl   lr, dvmAsmInstructionStart + (26 * 64)
15495    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15496    cmp    r3, #0
15497    bxeq   lr                   @ nothing to do - jump to real handler
15498    EXPORT_PC()
15499    mov    r0, rPC              @ arg0
15500    mov    r1, rFP              @ arg1
15501    mov    r2, rSELF            @ arg2
15502    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15503
15504/* ------------------------------ */
15505    .balign 64
15506.L_ALT_OP_CONST_STRING_JUMBO: /* 0x1b */
15507/* File: armv5te/alt_stub.S */
15508/*
15509 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15510 * any interesting requests and then jump to the real instruction
15511 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15512 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15513 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15514 * bail to the real handler if breakFlags==0.
15515 */
15516    ldrb   r3, [rSELF, #offThread_breakFlags]
15517    adrl   lr, dvmAsmInstructionStart + (27 * 64)
15518    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15519    cmp    r3, #0
15520    bxeq   lr                   @ nothing to do - jump to real handler
15521    EXPORT_PC()
15522    mov    r0, rPC              @ arg0
15523    mov    r1, rFP              @ arg1
15524    mov    r2, rSELF            @ arg2
15525    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15526
15527/* ------------------------------ */
15528    .balign 64
15529.L_ALT_OP_CONST_CLASS: /* 0x1c */
15530/* File: armv5te/alt_stub.S */
15531/*
15532 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15533 * any interesting requests and then jump to the real instruction
15534 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15535 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15536 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15537 * bail to the real handler if breakFlags==0.
15538 */
15539    ldrb   r3, [rSELF, #offThread_breakFlags]
15540    adrl   lr, dvmAsmInstructionStart + (28 * 64)
15541    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15542    cmp    r3, #0
15543    bxeq   lr                   @ nothing to do - jump to real handler
15544    EXPORT_PC()
15545    mov    r0, rPC              @ arg0
15546    mov    r1, rFP              @ arg1
15547    mov    r2, rSELF            @ arg2
15548    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15549
15550/* ------------------------------ */
15551    .balign 64
15552.L_ALT_OP_MONITOR_ENTER: /* 0x1d */
15553/* File: armv5te/alt_stub.S */
15554/*
15555 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15556 * any interesting requests and then jump to the real instruction
15557 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15558 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15559 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15560 * bail to the real handler if breakFlags==0.
15561 */
15562    ldrb   r3, [rSELF, #offThread_breakFlags]
15563    adrl   lr, dvmAsmInstructionStart + (29 * 64)
15564    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15565    cmp    r3, #0
15566    bxeq   lr                   @ nothing to do - jump to real handler
15567    EXPORT_PC()
15568    mov    r0, rPC              @ arg0
15569    mov    r1, rFP              @ arg1
15570    mov    r2, rSELF            @ arg2
15571    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15572
15573/* ------------------------------ */
15574    .balign 64
15575.L_ALT_OP_MONITOR_EXIT: /* 0x1e */
15576/* File: armv5te/alt_stub.S */
15577/*
15578 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15579 * any interesting requests and then jump to the real instruction
15580 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15581 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15582 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15583 * bail to the real handler if breakFlags==0.
15584 */
15585    ldrb   r3, [rSELF, #offThread_breakFlags]
15586    adrl   lr, dvmAsmInstructionStart + (30 * 64)
15587    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15588    cmp    r3, #0
15589    bxeq   lr                   @ nothing to do - jump to real handler
15590    EXPORT_PC()
15591    mov    r0, rPC              @ arg0
15592    mov    r1, rFP              @ arg1
15593    mov    r2, rSELF            @ arg2
15594    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15595
15596/* ------------------------------ */
15597    .balign 64
15598.L_ALT_OP_CHECK_CAST: /* 0x1f */
15599/* File: armv5te/alt_stub.S */
15600/*
15601 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15602 * any interesting requests and then jump to the real instruction
15603 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15604 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15605 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15606 * bail to the real handler if breakFlags==0.
15607 */
15608    ldrb   r3, [rSELF, #offThread_breakFlags]
15609    adrl   lr, dvmAsmInstructionStart + (31 * 64)
15610    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15611    cmp    r3, #0
15612    bxeq   lr                   @ nothing to do - jump to real handler
15613    EXPORT_PC()
15614    mov    r0, rPC              @ arg0
15615    mov    r1, rFP              @ arg1
15616    mov    r2, rSELF            @ arg2
15617    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15618
15619/* ------------------------------ */
15620    .balign 64
15621.L_ALT_OP_INSTANCE_OF: /* 0x20 */
15622/* File: armv5te/alt_stub.S */
15623/*
15624 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15625 * any interesting requests and then jump to the real instruction
15626 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15627 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15628 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15629 * bail to the real handler if breakFlags==0.
15630 */
15631    ldrb   r3, [rSELF, #offThread_breakFlags]
15632    adrl   lr, dvmAsmInstructionStart + (32 * 64)
15633    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15634    cmp    r3, #0
15635    bxeq   lr                   @ nothing to do - jump to real handler
15636    EXPORT_PC()
15637    mov    r0, rPC              @ arg0
15638    mov    r1, rFP              @ arg1
15639    mov    r2, rSELF            @ arg2
15640    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15641
15642/* ------------------------------ */
15643    .balign 64
15644.L_ALT_OP_ARRAY_LENGTH: /* 0x21 */
15645/* File: armv5te/alt_stub.S */
15646/*
15647 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15648 * any interesting requests and then jump to the real instruction
15649 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15650 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15651 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15652 * bail to the real handler if breakFlags==0.
15653 */
15654    ldrb   r3, [rSELF, #offThread_breakFlags]
15655    adrl   lr, dvmAsmInstructionStart + (33 * 64)
15656    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15657    cmp    r3, #0
15658    bxeq   lr                   @ nothing to do - jump to real handler
15659    EXPORT_PC()
15660    mov    r0, rPC              @ arg0
15661    mov    r1, rFP              @ arg1
15662    mov    r2, rSELF            @ arg2
15663    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15664
15665/* ------------------------------ */
15666    .balign 64
15667.L_ALT_OP_NEW_INSTANCE: /* 0x22 */
15668/* File: armv5te/alt_stub.S */
15669/*
15670 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15671 * any interesting requests and then jump to the real instruction
15672 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15673 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15674 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15675 * bail to the real handler if breakFlags==0.
15676 */
15677    ldrb   r3, [rSELF, #offThread_breakFlags]
15678    adrl   lr, dvmAsmInstructionStart + (34 * 64)
15679    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15680    cmp    r3, #0
15681    bxeq   lr                   @ nothing to do - jump to real handler
15682    EXPORT_PC()
15683    mov    r0, rPC              @ arg0
15684    mov    r1, rFP              @ arg1
15685    mov    r2, rSELF            @ arg2
15686    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15687
15688/* ------------------------------ */
15689    .balign 64
15690.L_ALT_OP_NEW_ARRAY: /* 0x23 */
15691/* File: armv5te/alt_stub.S */
15692/*
15693 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15694 * any interesting requests and then jump to the real instruction
15695 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15696 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15697 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15698 * bail to the real handler if breakFlags==0.
15699 */
15700    ldrb   r3, [rSELF, #offThread_breakFlags]
15701    adrl   lr, dvmAsmInstructionStart + (35 * 64)
15702    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15703    cmp    r3, #0
15704    bxeq   lr                   @ nothing to do - jump to real handler
15705    EXPORT_PC()
15706    mov    r0, rPC              @ arg0
15707    mov    r1, rFP              @ arg1
15708    mov    r2, rSELF            @ arg2
15709    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15710
15711/* ------------------------------ */
15712    .balign 64
15713.L_ALT_OP_FILLED_NEW_ARRAY: /* 0x24 */
15714/* File: armv5te/alt_stub.S */
15715/*
15716 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15717 * any interesting requests and then jump to the real instruction
15718 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15719 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15720 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15721 * bail to the real handler if breakFlags==0.
15722 */
15723    ldrb   r3, [rSELF, #offThread_breakFlags]
15724    adrl   lr, dvmAsmInstructionStart + (36 * 64)
15725    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15726    cmp    r3, #0
15727    bxeq   lr                   @ nothing to do - jump to real handler
15728    EXPORT_PC()
15729    mov    r0, rPC              @ arg0
15730    mov    r1, rFP              @ arg1
15731    mov    r2, rSELF            @ arg2
15732    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15733
15734/* ------------------------------ */
15735    .balign 64
15736.L_ALT_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
15737/* File: armv5te/alt_stub.S */
15738/*
15739 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15740 * any interesting requests and then jump to the real instruction
15741 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15742 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15743 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15744 * bail to the real handler if breakFlags==0.
15745 */
15746    ldrb   r3, [rSELF, #offThread_breakFlags]
15747    adrl   lr, dvmAsmInstructionStart + (37 * 64)
15748    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15749    cmp    r3, #0
15750    bxeq   lr                   @ nothing to do - jump to real handler
15751    EXPORT_PC()
15752    mov    r0, rPC              @ arg0
15753    mov    r1, rFP              @ arg1
15754    mov    r2, rSELF            @ arg2
15755    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15756
15757/* ------------------------------ */
15758    .balign 64
15759.L_ALT_OP_FILL_ARRAY_DATA: /* 0x26 */
15760/* File: armv5te/alt_stub.S */
15761/*
15762 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15763 * any interesting requests and then jump to the real instruction
15764 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15765 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15766 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15767 * bail to the real handler if breakFlags==0.
15768 */
15769    ldrb   r3, [rSELF, #offThread_breakFlags]
15770    adrl   lr, dvmAsmInstructionStart + (38 * 64)
15771    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15772    cmp    r3, #0
15773    bxeq   lr                   @ nothing to do - jump to real handler
15774    EXPORT_PC()
15775    mov    r0, rPC              @ arg0
15776    mov    r1, rFP              @ arg1
15777    mov    r2, rSELF            @ arg2
15778    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15779
15780/* ------------------------------ */
15781    .balign 64
15782.L_ALT_OP_THROW: /* 0x27 */
15783/* File: armv5te/alt_stub.S */
15784/*
15785 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15786 * any interesting requests and then jump to the real instruction
15787 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15788 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15789 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15790 * bail to the real handler if breakFlags==0.
15791 */
15792    ldrb   r3, [rSELF, #offThread_breakFlags]
15793    adrl   lr, dvmAsmInstructionStart + (39 * 64)
15794    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15795    cmp    r3, #0
15796    bxeq   lr                   @ nothing to do - jump to real handler
15797    EXPORT_PC()
15798    mov    r0, rPC              @ arg0
15799    mov    r1, rFP              @ arg1
15800    mov    r2, rSELF            @ arg2
15801    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15802
15803/* ------------------------------ */
15804    .balign 64
15805.L_ALT_OP_GOTO: /* 0x28 */
15806/* File: armv5te/alt_stub.S */
15807/*
15808 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15809 * any interesting requests and then jump to the real instruction
15810 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15811 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15812 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15813 * bail to the real handler if breakFlags==0.
15814 */
15815    ldrb   r3, [rSELF, #offThread_breakFlags]
15816    adrl   lr, dvmAsmInstructionStart + (40 * 64)
15817    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15818    cmp    r3, #0
15819    bxeq   lr                   @ nothing to do - jump to real handler
15820    EXPORT_PC()
15821    mov    r0, rPC              @ arg0
15822    mov    r1, rFP              @ arg1
15823    mov    r2, rSELF            @ arg2
15824    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15825
15826/* ------------------------------ */
15827    .balign 64
15828.L_ALT_OP_GOTO_16: /* 0x29 */
15829/* File: armv5te/alt_stub.S */
15830/*
15831 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15832 * any interesting requests and then jump to the real instruction
15833 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15834 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15835 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15836 * bail to the real handler if breakFlags==0.
15837 */
15838    ldrb   r3, [rSELF, #offThread_breakFlags]
15839    adrl   lr, dvmAsmInstructionStart + (41 * 64)
15840    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15841    cmp    r3, #0
15842    bxeq   lr                   @ nothing to do - jump to real handler
15843    EXPORT_PC()
15844    mov    r0, rPC              @ arg0
15845    mov    r1, rFP              @ arg1
15846    mov    r2, rSELF            @ arg2
15847    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15848
15849/* ------------------------------ */
15850    .balign 64
15851.L_ALT_OP_GOTO_32: /* 0x2a */
15852/* File: armv5te/alt_stub.S */
15853/*
15854 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15855 * any interesting requests and then jump to the real instruction
15856 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15857 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15858 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15859 * bail to the real handler if breakFlags==0.
15860 */
15861    ldrb   r3, [rSELF, #offThread_breakFlags]
15862    adrl   lr, dvmAsmInstructionStart + (42 * 64)
15863    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15864    cmp    r3, #0
15865    bxeq   lr                   @ nothing to do - jump to real handler
15866    EXPORT_PC()
15867    mov    r0, rPC              @ arg0
15868    mov    r1, rFP              @ arg1
15869    mov    r2, rSELF            @ arg2
15870    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15871
15872/* ------------------------------ */
15873    .balign 64
15874.L_ALT_OP_PACKED_SWITCH: /* 0x2b */
15875/* File: armv5te/alt_stub.S */
15876/*
15877 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15878 * any interesting requests and then jump to the real instruction
15879 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15880 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15881 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15882 * bail to the real handler if breakFlags==0.
15883 */
15884    ldrb   r3, [rSELF, #offThread_breakFlags]
15885    adrl   lr, dvmAsmInstructionStart + (43 * 64)
15886    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15887    cmp    r3, #0
15888    bxeq   lr                   @ nothing to do - jump to real handler
15889    EXPORT_PC()
15890    mov    r0, rPC              @ arg0
15891    mov    r1, rFP              @ arg1
15892    mov    r2, rSELF            @ arg2
15893    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15894
15895/* ------------------------------ */
15896    .balign 64
15897.L_ALT_OP_SPARSE_SWITCH: /* 0x2c */
15898/* File: armv5te/alt_stub.S */
15899/*
15900 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15901 * any interesting requests and then jump to the real instruction
15902 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15903 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15904 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15905 * bail to the real handler if breakFlags==0.
15906 */
15907    ldrb   r3, [rSELF, #offThread_breakFlags]
15908    adrl   lr, dvmAsmInstructionStart + (44 * 64)
15909    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15910    cmp    r3, #0
15911    bxeq   lr                   @ nothing to do - jump to real handler
15912    EXPORT_PC()
15913    mov    r0, rPC              @ arg0
15914    mov    r1, rFP              @ arg1
15915    mov    r2, rSELF            @ arg2
15916    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15917
15918/* ------------------------------ */
15919    .balign 64
15920.L_ALT_OP_CMPL_FLOAT: /* 0x2d */
15921/* File: armv5te/alt_stub.S */
15922/*
15923 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15924 * any interesting requests and then jump to the real instruction
15925 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15926 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15927 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15928 * bail to the real handler if breakFlags==0.
15929 */
15930    ldrb   r3, [rSELF, #offThread_breakFlags]
15931    adrl   lr, dvmAsmInstructionStart + (45 * 64)
15932    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15933    cmp    r3, #0
15934    bxeq   lr                   @ nothing to do - jump to real handler
15935    EXPORT_PC()
15936    mov    r0, rPC              @ arg0
15937    mov    r1, rFP              @ arg1
15938    mov    r2, rSELF            @ arg2
15939    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15940
15941/* ------------------------------ */
15942    .balign 64
15943.L_ALT_OP_CMPG_FLOAT: /* 0x2e */
15944/* File: armv5te/alt_stub.S */
15945/*
15946 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15947 * any interesting requests and then jump to the real instruction
15948 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15949 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15950 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15951 * bail to the real handler if breakFlags==0.
15952 */
15953    ldrb   r3, [rSELF, #offThread_breakFlags]
15954    adrl   lr, dvmAsmInstructionStart + (46 * 64)
15955    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15956    cmp    r3, #0
15957    bxeq   lr                   @ nothing to do - jump to real handler
15958    EXPORT_PC()
15959    mov    r0, rPC              @ arg0
15960    mov    r1, rFP              @ arg1
15961    mov    r2, rSELF            @ arg2
15962    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15963
15964/* ------------------------------ */
15965    .balign 64
15966.L_ALT_OP_CMPL_DOUBLE: /* 0x2f */
15967/* File: armv5te/alt_stub.S */
15968/*
15969 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15970 * any interesting requests and then jump to the real instruction
15971 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15972 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15973 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15974 * bail to the real handler if breakFlags==0.
15975 */
15976    ldrb   r3, [rSELF, #offThread_breakFlags]
15977    adrl   lr, dvmAsmInstructionStart + (47 * 64)
15978    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15979    cmp    r3, #0
15980    bxeq   lr                   @ nothing to do - jump to real handler
15981    EXPORT_PC()
15982    mov    r0, rPC              @ arg0
15983    mov    r1, rFP              @ arg1
15984    mov    r2, rSELF            @ arg2
15985    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15986
15987/* ------------------------------ */
15988    .balign 64
15989.L_ALT_OP_CMPG_DOUBLE: /* 0x30 */
15990/* File: armv5te/alt_stub.S */
15991/*
15992 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15993 * any interesting requests and then jump to the real instruction
15994 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15995 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15996 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15997 * bail to the real handler if breakFlags==0.
15998 */
15999    ldrb   r3, [rSELF, #offThread_breakFlags]
16000    adrl   lr, dvmAsmInstructionStart + (48 * 64)
16001    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16002    cmp    r3, #0
16003    bxeq   lr                   @ nothing to do - jump to real handler
16004    EXPORT_PC()
16005    mov    r0, rPC              @ arg0
16006    mov    r1, rFP              @ arg1
16007    mov    r2, rSELF            @ arg2
16008    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16009
16010/* ------------------------------ */
16011    .balign 64
16012.L_ALT_OP_CMP_LONG: /* 0x31 */
16013/* File: armv5te/alt_stub.S */
16014/*
16015 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16016 * any interesting requests and then jump to the real instruction
16017 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16018 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16019 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16020 * bail to the real handler if breakFlags==0.
16021 */
16022    ldrb   r3, [rSELF, #offThread_breakFlags]
16023    adrl   lr, dvmAsmInstructionStart + (49 * 64)
16024    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16025    cmp    r3, #0
16026    bxeq   lr                   @ nothing to do - jump to real handler
16027    EXPORT_PC()
16028    mov    r0, rPC              @ arg0
16029    mov    r1, rFP              @ arg1
16030    mov    r2, rSELF            @ arg2
16031    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16032
16033/* ------------------------------ */
16034    .balign 64
16035.L_ALT_OP_IF_EQ: /* 0x32 */
16036/* File: armv5te/alt_stub.S */
16037/*
16038 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16039 * any interesting requests and then jump to the real instruction
16040 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16041 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16042 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16043 * bail to the real handler if breakFlags==0.
16044 */
16045    ldrb   r3, [rSELF, #offThread_breakFlags]
16046    adrl   lr, dvmAsmInstructionStart + (50 * 64)
16047    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16048    cmp    r3, #0
16049    bxeq   lr                   @ nothing to do - jump to real handler
16050    EXPORT_PC()
16051    mov    r0, rPC              @ arg0
16052    mov    r1, rFP              @ arg1
16053    mov    r2, rSELF            @ arg2
16054    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16055
16056/* ------------------------------ */
16057    .balign 64
16058.L_ALT_OP_IF_NE: /* 0x33 */
16059/* File: armv5te/alt_stub.S */
16060/*
16061 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16062 * any interesting requests and then jump to the real instruction
16063 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16064 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16065 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16066 * bail to the real handler if breakFlags==0.
16067 */
16068    ldrb   r3, [rSELF, #offThread_breakFlags]
16069    adrl   lr, dvmAsmInstructionStart + (51 * 64)
16070    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16071    cmp    r3, #0
16072    bxeq   lr                   @ nothing to do - jump to real handler
16073    EXPORT_PC()
16074    mov    r0, rPC              @ arg0
16075    mov    r1, rFP              @ arg1
16076    mov    r2, rSELF            @ arg2
16077    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16078
16079/* ------------------------------ */
16080    .balign 64
16081.L_ALT_OP_IF_LT: /* 0x34 */
16082/* File: armv5te/alt_stub.S */
16083/*
16084 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16085 * any interesting requests and then jump to the real instruction
16086 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16087 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16088 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16089 * bail to the real handler if breakFlags==0.
16090 */
16091    ldrb   r3, [rSELF, #offThread_breakFlags]
16092    adrl   lr, dvmAsmInstructionStart + (52 * 64)
16093    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16094    cmp    r3, #0
16095    bxeq   lr                   @ nothing to do - jump to real handler
16096    EXPORT_PC()
16097    mov    r0, rPC              @ arg0
16098    mov    r1, rFP              @ arg1
16099    mov    r2, rSELF            @ arg2
16100    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16101
16102/* ------------------------------ */
16103    .balign 64
16104.L_ALT_OP_IF_GE: /* 0x35 */
16105/* File: armv5te/alt_stub.S */
16106/*
16107 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16108 * any interesting requests and then jump to the real instruction
16109 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16110 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16111 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16112 * bail to the real handler if breakFlags==0.
16113 */
16114    ldrb   r3, [rSELF, #offThread_breakFlags]
16115    adrl   lr, dvmAsmInstructionStart + (53 * 64)
16116    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16117    cmp    r3, #0
16118    bxeq   lr                   @ nothing to do - jump to real handler
16119    EXPORT_PC()
16120    mov    r0, rPC              @ arg0
16121    mov    r1, rFP              @ arg1
16122    mov    r2, rSELF            @ arg2
16123    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16124
16125/* ------------------------------ */
16126    .balign 64
16127.L_ALT_OP_IF_GT: /* 0x36 */
16128/* File: armv5te/alt_stub.S */
16129/*
16130 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16131 * any interesting requests and then jump to the real instruction
16132 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16133 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16134 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16135 * bail to the real handler if breakFlags==0.
16136 */
16137    ldrb   r3, [rSELF, #offThread_breakFlags]
16138    adrl   lr, dvmAsmInstructionStart + (54 * 64)
16139    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16140    cmp    r3, #0
16141    bxeq   lr                   @ nothing to do - jump to real handler
16142    EXPORT_PC()
16143    mov    r0, rPC              @ arg0
16144    mov    r1, rFP              @ arg1
16145    mov    r2, rSELF            @ arg2
16146    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16147
16148/* ------------------------------ */
16149    .balign 64
16150.L_ALT_OP_IF_LE: /* 0x37 */
16151/* File: armv5te/alt_stub.S */
16152/*
16153 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16154 * any interesting requests and then jump to the real instruction
16155 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16156 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16157 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16158 * bail to the real handler if breakFlags==0.
16159 */
16160    ldrb   r3, [rSELF, #offThread_breakFlags]
16161    adrl   lr, dvmAsmInstructionStart + (55 * 64)
16162    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16163    cmp    r3, #0
16164    bxeq   lr                   @ nothing to do - jump to real handler
16165    EXPORT_PC()
16166    mov    r0, rPC              @ arg0
16167    mov    r1, rFP              @ arg1
16168    mov    r2, rSELF            @ arg2
16169    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16170
16171/* ------------------------------ */
16172    .balign 64
16173.L_ALT_OP_IF_EQZ: /* 0x38 */
16174/* File: armv5te/alt_stub.S */
16175/*
16176 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16177 * any interesting requests and then jump to the real instruction
16178 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16179 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16180 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16181 * bail to the real handler if breakFlags==0.
16182 */
16183    ldrb   r3, [rSELF, #offThread_breakFlags]
16184    adrl   lr, dvmAsmInstructionStart + (56 * 64)
16185    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16186    cmp    r3, #0
16187    bxeq   lr                   @ nothing to do - jump to real handler
16188    EXPORT_PC()
16189    mov    r0, rPC              @ arg0
16190    mov    r1, rFP              @ arg1
16191    mov    r2, rSELF            @ arg2
16192    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16193
16194/* ------------------------------ */
16195    .balign 64
16196.L_ALT_OP_IF_NEZ: /* 0x39 */
16197/* File: armv5te/alt_stub.S */
16198/*
16199 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16200 * any interesting requests and then jump to the real instruction
16201 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16202 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16203 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16204 * bail to the real handler if breakFlags==0.
16205 */
16206    ldrb   r3, [rSELF, #offThread_breakFlags]
16207    adrl   lr, dvmAsmInstructionStart + (57 * 64)
16208    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16209    cmp    r3, #0
16210    bxeq   lr                   @ nothing to do - jump to real handler
16211    EXPORT_PC()
16212    mov    r0, rPC              @ arg0
16213    mov    r1, rFP              @ arg1
16214    mov    r2, rSELF            @ arg2
16215    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16216
16217/* ------------------------------ */
16218    .balign 64
16219.L_ALT_OP_IF_LTZ: /* 0x3a */
16220/* File: armv5te/alt_stub.S */
16221/*
16222 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16223 * any interesting requests and then jump to the real instruction
16224 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16225 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16226 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16227 * bail to the real handler if breakFlags==0.
16228 */
16229    ldrb   r3, [rSELF, #offThread_breakFlags]
16230    adrl   lr, dvmAsmInstructionStart + (58 * 64)
16231    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16232    cmp    r3, #0
16233    bxeq   lr                   @ nothing to do - jump to real handler
16234    EXPORT_PC()
16235    mov    r0, rPC              @ arg0
16236    mov    r1, rFP              @ arg1
16237    mov    r2, rSELF            @ arg2
16238    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16239
16240/* ------------------------------ */
16241    .balign 64
16242.L_ALT_OP_IF_GEZ: /* 0x3b */
16243/* File: armv5te/alt_stub.S */
16244/*
16245 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16246 * any interesting requests and then jump to the real instruction
16247 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16248 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16249 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16250 * bail to the real handler if breakFlags==0.
16251 */
16252    ldrb   r3, [rSELF, #offThread_breakFlags]
16253    adrl   lr, dvmAsmInstructionStart + (59 * 64)
16254    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16255    cmp    r3, #0
16256    bxeq   lr                   @ nothing to do - jump to real handler
16257    EXPORT_PC()
16258    mov    r0, rPC              @ arg0
16259    mov    r1, rFP              @ arg1
16260    mov    r2, rSELF            @ arg2
16261    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16262
16263/* ------------------------------ */
16264    .balign 64
16265.L_ALT_OP_IF_GTZ: /* 0x3c */
16266/* File: armv5te/alt_stub.S */
16267/*
16268 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16269 * any interesting requests and then jump to the real instruction
16270 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16271 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16272 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16273 * bail to the real handler if breakFlags==0.
16274 */
16275    ldrb   r3, [rSELF, #offThread_breakFlags]
16276    adrl   lr, dvmAsmInstructionStart + (60 * 64)
16277    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16278    cmp    r3, #0
16279    bxeq   lr                   @ nothing to do - jump to real handler
16280    EXPORT_PC()
16281    mov    r0, rPC              @ arg0
16282    mov    r1, rFP              @ arg1
16283    mov    r2, rSELF            @ arg2
16284    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16285
16286/* ------------------------------ */
16287    .balign 64
16288.L_ALT_OP_IF_LEZ: /* 0x3d */
16289/* File: armv5te/alt_stub.S */
16290/*
16291 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16292 * any interesting requests and then jump to the real instruction
16293 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16294 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16295 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16296 * bail to the real handler if breakFlags==0.
16297 */
16298    ldrb   r3, [rSELF, #offThread_breakFlags]
16299    adrl   lr, dvmAsmInstructionStart + (61 * 64)
16300    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16301    cmp    r3, #0
16302    bxeq   lr                   @ nothing to do - jump to real handler
16303    EXPORT_PC()
16304    mov    r0, rPC              @ arg0
16305    mov    r1, rFP              @ arg1
16306    mov    r2, rSELF            @ arg2
16307    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16308
16309/* ------------------------------ */
16310    .balign 64
16311.L_ALT_OP_UNUSED_3E: /* 0x3e */
16312/* File: armv5te/alt_stub.S */
16313/*
16314 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16315 * any interesting requests and then jump to the real instruction
16316 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16317 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16318 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16319 * bail to the real handler if breakFlags==0.
16320 */
16321    ldrb   r3, [rSELF, #offThread_breakFlags]
16322    adrl   lr, dvmAsmInstructionStart + (62 * 64)
16323    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16324    cmp    r3, #0
16325    bxeq   lr                   @ nothing to do - jump to real handler
16326    EXPORT_PC()
16327    mov    r0, rPC              @ arg0
16328    mov    r1, rFP              @ arg1
16329    mov    r2, rSELF            @ arg2
16330    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16331
16332/* ------------------------------ */
16333    .balign 64
16334.L_ALT_OP_UNUSED_3F: /* 0x3f */
16335/* File: armv5te/alt_stub.S */
16336/*
16337 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16338 * any interesting requests and then jump to the real instruction
16339 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16340 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16341 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16342 * bail to the real handler if breakFlags==0.
16343 */
16344    ldrb   r3, [rSELF, #offThread_breakFlags]
16345    adrl   lr, dvmAsmInstructionStart + (63 * 64)
16346    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16347    cmp    r3, #0
16348    bxeq   lr                   @ nothing to do - jump to real handler
16349    EXPORT_PC()
16350    mov    r0, rPC              @ arg0
16351    mov    r1, rFP              @ arg1
16352    mov    r2, rSELF            @ arg2
16353    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16354
16355/* ------------------------------ */
16356    .balign 64
16357.L_ALT_OP_UNUSED_40: /* 0x40 */
16358/* File: armv5te/alt_stub.S */
16359/*
16360 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16361 * any interesting requests and then jump to the real instruction
16362 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16363 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16364 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16365 * bail to the real handler if breakFlags==0.
16366 */
16367    ldrb   r3, [rSELF, #offThread_breakFlags]
16368    adrl   lr, dvmAsmInstructionStart + (64 * 64)
16369    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16370    cmp    r3, #0
16371    bxeq   lr                   @ nothing to do - jump to real handler
16372    EXPORT_PC()
16373    mov    r0, rPC              @ arg0
16374    mov    r1, rFP              @ arg1
16375    mov    r2, rSELF            @ arg2
16376    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16377
16378/* ------------------------------ */
16379    .balign 64
16380.L_ALT_OP_UNUSED_41: /* 0x41 */
16381/* File: armv5te/alt_stub.S */
16382/*
16383 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16384 * any interesting requests and then jump to the real instruction
16385 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16386 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16387 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16388 * bail to the real handler if breakFlags==0.
16389 */
16390    ldrb   r3, [rSELF, #offThread_breakFlags]
16391    adrl   lr, dvmAsmInstructionStart + (65 * 64)
16392    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16393    cmp    r3, #0
16394    bxeq   lr                   @ nothing to do - jump to real handler
16395    EXPORT_PC()
16396    mov    r0, rPC              @ arg0
16397    mov    r1, rFP              @ arg1
16398    mov    r2, rSELF            @ arg2
16399    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16400
16401/* ------------------------------ */
16402    .balign 64
16403.L_ALT_OP_UNUSED_42: /* 0x42 */
16404/* File: armv5te/alt_stub.S */
16405/*
16406 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16407 * any interesting requests and then jump to the real instruction
16408 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16409 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16410 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16411 * bail to the real handler if breakFlags==0.
16412 */
16413    ldrb   r3, [rSELF, #offThread_breakFlags]
16414    adrl   lr, dvmAsmInstructionStart + (66 * 64)
16415    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16416    cmp    r3, #0
16417    bxeq   lr                   @ nothing to do - jump to real handler
16418    EXPORT_PC()
16419    mov    r0, rPC              @ arg0
16420    mov    r1, rFP              @ arg1
16421    mov    r2, rSELF            @ arg2
16422    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16423
16424/* ------------------------------ */
16425    .balign 64
16426.L_ALT_OP_UNUSED_43: /* 0x43 */
16427/* File: armv5te/alt_stub.S */
16428/*
16429 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16430 * any interesting requests and then jump to the real instruction
16431 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16432 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16433 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16434 * bail to the real handler if breakFlags==0.
16435 */
16436    ldrb   r3, [rSELF, #offThread_breakFlags]
16437    adrl   lr, dvmAsmInstructionStart + (67 * 64)
16438    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16439    cmp    r3, #0
16440    bxeq   lr                   @ nothing to do - jump to real handler
16441    EXPORT_PC()
16442    mov    r0, rPC              @ arg0
16443    mov    r1, rFP              @ arg1
16444    mov    r2, rSELF            @ arg2
16445    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16446
16447/* ------------------------------ */
16448    .balign 64
16449.L_ALT_OP_AGET: /* 0x44 */
16450/* File: armv5te/alt_stub.S */
16451/*
16452 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16453 * any interesting requests and then jump to the real instruction
16454 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16455 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16456 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16457 * bail to the real handler if breakFlags==0.
16458 */
16459    ldrb   r3, [rSELF, #offThread_breakFlags]
16460    adrl   lr, dvmAsmInstructionStart + (68 * 64)
16461    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16462    cmp    r3, #0
16463    bxeq   lr                   @ nothing to do - jump to real handler
16464    EXPORT_PC()
16465    mov    r0, rPC              @ arg0
16466    mov    r1, rFP              @ arg1
16467    mov    r2, rSELF            @ arg2
16468    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16469
16470/* ------------------------------ */
16471    .balign 64
16472.L_ALT_OP_AGET_WIDE: /* 0x45 */
16473/* File: armv5te/alt_stub.S */
16474/*
16475 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16476 * any interesting requests and then jump to the real instruction
16477 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16478 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16479 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16480 * bail to the real handler if breakFlags==0.
16481 */
16482    ldrb   r3, [rSELF, #offThread_breakFlags]
16483    adrl   lr, dvmAsmInstructionStart + (69 * 64)
16484    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16485    cmp    r3, #0
16486    bxeq   lr                   @ nothing to do - jump to real handler
16487    EXPORT_PC()
16488    mov    r0, rPC              @ arg0
16489    mov    r1, rFP              @ arg1
16490    mov    r2, rSELF            @ arg2
16491    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16492
16493/* ------------------------------ */
16494    .balign 64
16495.L_ALT_OP_AGET_OBJECT: /* 0x46 */
16496/* File: armv5te/alt_stub.S */
16497/*
16498 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16499 * any interesting requests and then jump to the real instruction
16500 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16501 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16502 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16503 * bail to the real handler if breakFlags==0.
16504 */
16505    ldrb   r3, [rSELF, #offThread_breakFlags]
16506    adrl   lr, dvmAsmInstructionStart + (70 * 64)
16507    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16508    cmp    r3, #0
16509    bxeq   lr                   @ nothing to do - jump to real handler
16510    EXPORT_PC()
16511    mov    r0, rPC              @ arg0
16512    mov    r1, rFP              @ arg1
16513    mov    r2, rSELF            @ arg2
16514    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16515
16516/* ------------------------------ */
16517    .balign 64
16518.L_ALT_OP_AGET_BOOLEAN: /* 0x47 */
16519/* File: armv5te/alt_stub.S */
16520/*
16521 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16522 * any interesting requests and then jump to the real instruction
16523 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16524 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16525 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16526 * bail to the real handler if breakFlags==0.
16527 */
16528    ldrb   r3, [rSELF, #offThread_breakFlags]
16529    adrl   lr, dvmAsmInstructionStart + (71 * 64)
16530    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16531    cmp    r3, #0
16532    bxeq   lr                   @ nothing to do - jump to real handler
16533    EXPORT_PC()
16534    mov    r0, rPC              @ arg0
16535    mov    r1, rFP              @ arg1
16536    mov    r2, rSELF            @ arg2
16537    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16538
16539/* ------------------------------ */
16540    .balign 64
16541.L_ALT_OP_AGET_BYTE: /* 0x48 */
16542/* File: armv5te/alt_stub.S */
16543/*
16544 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16545 * any interesting requests and then jump to the real instruction
16546 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16547 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16548 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16549 * bail to the real handler if breakFlags==0.
16550 */
16551    ldrb   r3, [rSELF, #offThread_breakFlags]
16552    adrl   lr, dvmAsmInstructionStart + (72 * 64)
16553    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16554    cmp    r3, #0
16555    bxeq   lr                   @ nothing to do - jump to real handler
16556    EXPORT_PC()
16557    mov    r0, rPC              @ arg0
16558    mov    r1, rFP              @ arg1
16559    mov    r2, rSELF            @ arg2
16560    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16561
16562/* ------------------------------ */
16563    .balign 64
16564.L_ALT_OP_AGET_CHAR: /* 0x49 */
16565/* File: armv5te/alt_stub.S */
16566/*
16567 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16568 * any interesting requests and then jump to the real instruction
16569 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16570 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16571 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16572 * bail to the real handler if breakFlags==0.
16573 */
16574    ldrb   r3, [rSELF, #offThread_breakFlags]
16575    adrl   lr, dvmAsmInstructionStart + (73 * 64)
16576    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16577    cmp    r3, #0
16578    bxeq   lr                   @ nothing to do - jump to real handler
16579    EXPORT_PC()
16580    mov    r0, rPC              @ arg0
16581    mov    r1, rFP              @ arg1
16582    mov    r2, rSELF            @ arg2
16583    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16584
16585/* ------------------------------ */
16586    .balign 64
16587.L_ALT_OP_AGET_SHORT: /* 0x4a */
16588/* File: armv5te/alt_stub.S */
16589/*
16590 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16591 * any interesting requests and then jump to the real instruction
16592 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16593 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16594 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16595 * bail to the real handler if breakFlags==0.
16596 */
16597    ldrb   r3, [rSELF, #offThread_breakFlags]
16598    adrl   lr, dvmAsmInstructionStart + (74 * 64)
16599    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16600    cmp    r3, #0
16601    bxeq   lr                   @ nothing to do - jump to real handler
16602    EXPORT_PC()
16603    mov    r0, rPC              @ arg0
16604    mov    r1, rFP              @ arg1
16605    mov    r2, rSELF            @ arg2
16606    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16607
16608/* ------------------------------ */
16609    .balign 64
16610.L_ALT_OP_APUT: /* 0x4b */
16611/* File: armv5te/alt_stub.S */
16612/*
16613 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16614 * any interesting requests and then jump to the real instruction
16615 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16616 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16617 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16618 * bail to the real handler if breakFlags==0.
16619 */
16620    ldrb   r3, [rSELF, #offThread_breakFlags]
16621    adrl   lr, dvmAsmInstructionStart + (75 * 64)
16622    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16623    cmp    r3, #0
16624    bxeq   lr                   @ nothing to do - jump to real handler
16625    EXPORT_PC()
16626    mov    r0, rPC              @ arg0
16627    mov    r1, rFP              @ arg1
16628    mov    r2, rSELF            @ arg2
16629    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16630
16631/* ------------------------------ */
16632    .balign 64
16633.L_ALT_OP_APUT_WIDE: /* 0x4c */
16634/* File: armv5te/alt_stub.S */
16635/*
16636 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16637 * any interesting requests and then jump to the real instruction
16638 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16639 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16640 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16641 * bail to the real handler if breakFlags==0.
16642 */
16643    ldrb   r3, [rSELF, #offThread_breakFlags]
16644    adrl   lr, dvmAsmInstructionStart + (76 * 64)
16645    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16646    cmp    r3, #0
16647    bxeq   lr                   @ nothing to do - jump to real handler
16648    EXPORT_PC()
16649    mov    r0, rPC              @ arg0
16650    mov    r1, rFP              @ arg1
16651    mov    r2, rSELF            @ arg2
16652    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16653
16654/* ------------------------------ */
16655    .balign 64
16656.L_ALT_OP_APUT_OBJECT: /* 0x4d */
16657/* File: armv5te/alt_stub.S */
16658/*
16659 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16660 * any interesting requests and then jump to the real instruction
16661 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16662 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16663 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16664 * bail to the real handler if breakFlags==0.
16665 */
16666    ldrb   r3, [rSELF, #offThread_breakFlags]
16667    adrl   lr, dvmAsmInstructionStart + (77 * 64)
16668    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16669    cmp    r3, #0
16670    bxeq   lr                   @ nothing to do - jump to real handler
16671    EXPORT_PC()
16672    mov    r0, rPC              @ arg0
16673    mov    r1, rFP              @ arg1
16674    mov    r2, rSELF            @ arg2
16675    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16676
16677/* ------------------------------ */
16678    .balign 64
16679.L_ALT_OP_APUT_BOOLEAN: /* 0x4e */
16680/* File: armv5te/alt_stub.S */
16681/*
16682 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16683 * any interesting requests and then jump to the real instruction
16684 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16685 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16686 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16687 * bail to the real handler if breakFlags==0.
16688 */
16689    ldrb   r3, [rSELF, #offThread_breakFlags]
16690    adrl   lr, dvmAsmInstructionStart + (78 * 64)
16691    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16692    cmp    r3, #0
16693    bxeq   lr                   @ nothing to do - jump to real handler
16694    EXPORT_PC()
16695    mov    r0, rPC              @ arg0
16696    mov    r1, rFP              @ arg1
16697    mov    r2, rSELF            @ arg2
16698    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16699
16700/* ------------------------------ */
16701    .balign 64
16702.L_ALT_OP_APUT_BYTE: /* 0x4f */
16703/* File: armv5te/alt_stub.S */
16704/*
16705 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16706 * any interesting requests and then jump to the real instruction
16707 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16708 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16709 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16710 * bail to the real handler if breakFlags==0.
16711 */
16712    ldrb   r3, [rSELF, #offThread_breakFlags]
16713    adrl   lr, dvmAsmInstructionStart + (79 * 64)
16714    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16715    cmp    r3, #0
16716    bxeq   lr                   @ nothing to do - jump to real handler
16717    EXPORT_PC()
16718    mov    r0, rPC              @ arg0
16719    mov    r1, rFP              @ arg1
16720    mov    r2, rSELF            @ arg2
16721    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16722
16723/* ------------------------------ */
16724    .balign 64
16725.L_ALT_OP_APUT_CHAR: /* 0x50 */
16726/* File: armv5te/alt_stub.S */
16727/*
16728 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16729 * any interesting requests and then jump to the real instruction
16730 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16731 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16732 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16733 * bail to the real handler if breakFlags==0.
16734 */
16735    ldrb   r3, [rSELF, #offThread_breakFlags]
16736    adrl   lr, dvmAsmInstructionStart + (80 * 64)
16737    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16738    cmp    r3, #0
16739    bxeq   lr                   @ nothing to do - jump to real handler
16740    EXPORT_PC()
16741    mov    r0, rPC              @ arg0
16742    mov    r1, rFP              @ arg1
16743    mov    r2, rSELF            @ arg2
16744    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16745
16746/* ------------------------------ */
16747    .balign 64
16748.L_ALT_OP_APUT_SHORT: /* 0x51 */
16749/* File: armv5te/alt_stub.S */
16750/*
16751 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16752 * any interesting requests and then jump to the real instruction
16753 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16754 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16755 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16756 * bail to the real handler if breakFlags==0.
16757 */
16758    ldrb   r3, [rSELF, #offThread_breakFlags]
16759    adrl   lr, dvmAsmInstructionStart + (81 * 64)
16760    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16761    cmp    r3, #0
16762    bxeq   lr                   @ nothing to do - jump to real handler
16763    EXPORT_PC()
16764    mov    r0, rPC              @ arg0
16765    mov    r1, rFP              @ arg1
16766    mov    r2, rSELF            @ arg2
16767    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16768
16769/* ------------------------------ */
16770    .balign 64
16771.L_ALT_OP_IGET: /* 0x52 */
16772/* File: armv5te/alt_stub.S */
16773/*
16774 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16775 * any interesting requests and then jump to the real instruction
16776 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16777 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16778 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16779 * bail to the real handler if breakFlags==0.
16780 */
16781    ldrb   r3, [rSELF, #offThread_breakFlags]
16782    adrl   lr, dvmAsmInstructionStart + (82 * 64)
16783    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16784    cmp    r3, #0
16785    bxeq   lr                   @ nothing to do - jump to real handler
16786    EXPORT_PC()
16787    mov    r0, rPC              @ arg0
16788    mov    r1, rFP              @ arg1
16789    mov    r2, rSELF            @ arg2
16790    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16791
16792/* ------------------------------ */
16793    .balign 64
16794.L_ALT_OP_IGET_WIDE: /* 0x53 */
16795/* File: armv5te/alt_stub.S */
16796/*
16797 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16798 * any interesting requests and then jump to the real instruction
16799 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16800 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16801 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16802 * bail to the real handler if breakFlags==0.
16803 */
16804    ldrb   r3, [rSELF, #offThread_breakFlags]
16805    adrl   lr, dvmAsmInstructionStart + (83 * 64)
16806    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16807    cmp    r3, #0
16808    bxeq   lr                   @ nothing to do - jump to real handler
16809    EXPORT_PC()
16810    mov    r0, rPC              @ arg0
16811    mov    r1, rFP              @ arg1
16812    mov    r2, rSELF            @ arg2
16813    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16814
16815/* ------------------------------ */
16816    .balign 64
16817.L_ALT_OP_IGET_OBJECT: /* 0x54 */
16818/* File: armv5te/alt_stub.S */
16819/*
16820 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16821 * any interesting requests and then jump to the real instruction
16822 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16823 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16824 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16825 * bail to the real handler if breakFlags==0.
16826 */
16827    ldrb   r3, [rSELF, #offThread_breakFlags]
16828    adrl   lr, dvmAsmInstructionStart + (84 * 64)
16829    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16830    cmp    r3, #0
16831    bxeq   lr                   @ nothing to do - jump to real handler
16832    EXPORT_PC()
16833    mov    r0, rPC              @ arg0
16834    mov    r1, rFP              @ arg1
16835    mov    r2, rSELF            @ arg2
16836    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16837
16838/* ------------------------------ */
16839    .balign 64
16840.L_ALT_OP_IGET_BOOLEAN: /* 0x55 */
16841/* File: armv5te/alt_stub.S */
16842/*
16843 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16844 * any interesting requests and then jump to the real instruction
16845 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16846 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16847 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16848 * bail to the real handler if breakFlags==0.
16849 */
16850    ldrb   r3, [rSELF, #offThread_breakFlags]
16851    adrl   lr, dvmAsmInstructionStart + (85 * 64)
16852    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16853    cmp    r3, #0
16854    bxeq   lr                   @ nothing to do - jump to real handler
16855    EXPORT_PC()
16856    mov    r0, rPC              @ arg0
16857    mov    r1, rFP              @ arg1
16858    mov    r2, rSELF            @ arg2
16859    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16860
16861/* ------------------------------ */
16862    .balign 64
16863.L_ALT_OP_IGET_BYTE: /* 0x56 */
16864/* File: armv5te/alt_stub.S */
16865/*
16866 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16867 * any interesting requests and then jump to the real instruction
16868 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16869 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16870 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16871 * bail to the real handler if breakFlags==0.
16872 */
16873    ldrb   r3, [rSELF, #offThread_breakFlags]
16874    adrl   lr, dvmAsmInstructionStart + (86 * 64)
16875    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16876    cmp    r3, #0
16877    bxeq   lr                   @ nothing to do - jump to real handler
16878    EXPORT_PC()
16879    mov    r0, rPC              @ arg0
16880    mov    r1, rFP              @ arg1
16881    mov    r2, rSELF            @ arg2
16882    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16883
16884/* ------------------------------ */
16885    .balign 64
16886.L_ALT_OP_IGET_CHAR: /* 0x57 */
16887/* File: armv5te/alt_stub.S */
16888/*
16889 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16890 * any interesting requests and then jump to the real instruction
16891 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16892 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16893 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16894 * bail to the real handler if breakFlags==0.
16895 */
16896    ldrb   r3, [rSELF, #offThread_breakFlags]
16897    adrl   lr, dvmAsmInstructionStart + (87 * 64)
16898    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16899    cmp    r3, #0
16900    bxeq   lr                   @ nothing to do - jump to real handler
16901    EXPORT_PC()
16902    mov    r0, rPC              @ arg0
16903    mov    r1, rFP              @ arg1
16904    mov    r2, rSELF            @ arg2
16905    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16906
16907/* ------------------------------ */
16908    .balign 64
16909.L_ALT_OP_IGET_SHORT: /* 0x58 */
16910/* File: armv5te/alt_stub.S */
16911/*
16912 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16913 * any interesting requests and then jump to the real instruction
16914 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16915 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16916 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16917 * bail to the real handler if breakFlags==0.
16918 */
16919    ldrb   r3, [rSELF, #offThread_breakFlags]
16920    adrl   lr, dvmAsmInstructionStart + (88 * 64)
16921    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16922    cmp    r3, #0
16923    bxeq   lr                   @ nothing to do - jump to real handler
16924    EXPORT_PC()
16925    mov    r0, rPC              @ arg0
16926    mov    r1, rFP              @ arg1
16927    mov    r2, rSELF            @ arg2
16928    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16929
16930/* ------------------------------ */
16931    .balign 64
16932.L_ALT_OP_IPUT: /* 0x59 */
16933/* File: armv5te/alt_stub.S */
16934/*
16935 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16936 * any interesting requests and then jump to the real instruction
16937 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16938 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16939 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16940 * bail to the real handler if breakFlags==0.
16941 */
16942    ldrb   r3, [rSELF, #offThread_breakFlags]
16943    adrl   lr, dvmAsmInstructionStart + (89 * 64)
16944    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16945    cmp    r3, #0
16946    bxeq   lr                   @ nothing to do - jump to real handler
16947    EXPORT_PC()
16948    mov    r0, rPC              @ arg0
16949    mov    r1, rFP              @ arg1
16950    mov    r2, rSELF            @ arg2
16951    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16952
16953/* ------------------------------ */
16954    .balign 64
16955.L_ALT_OP_IPUT_WIDE: /* 0x5a */
16956/* File: armv5te/alt_stub.S */
16957/*
16958 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16959 * any interesting requests and then jump to the real instruction
16960 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16961 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16962 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16963 * bail to the real handler if breakFlags==0.
16964 */
16965    ldrb   r3, [rSELF, #offThread_breakFlags]
16966    adrl   lr, dvmAsmInstructionStart + (90 * 64)
16967    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16968    cmp    r3, #0
16969    bxeq   lr                   @ nothing to do - jump to real handler
16970    EXPORT_PC()
16971    mov    r0, rPC              @ arg0
16972    mov    r1, rFP              @ arg1
16973    mov    r2, rSELF            @ arg2
16974    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16975
16976/* ------------------------------ */
16977    .balign 64
16978.L_ALT_OP_IPUT_OBJECT: /* 0x5b */
16979/* File: armv5te/alt_stub.S */
16980/*
16981 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16982 * any interesting requests and then jump to the real instruction
16983 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16984 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16985 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16986 * bail to the real handler if breakFlags==0.
16987 */
16988    ldrb   r3, [rSELF, #offThread_breakFlags]
16989    adrl   lr, dvmAsmInstructionStart + (91 * 64)
16990    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16991    cmp    r3, #0
16992    bxeq   lr                   @ nothing to do - jump to real handler
16993    EXPORT_PC()
16994    mov    r0, rPC              @ arg0
16995    mov    r1, rFP              @ arg1
16996    mov    r2, rSELF            @ arg2
16997    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16998
16999/* ------------------------------ */
17000    .balign 64
17001.L_ALT_OP_IPUT_BOOLEAN: /* 0x5c */
17002/* File: armv5te/alt_stub.S */
17003/*
17004 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17005 * any interesting requests and then jump to the real instruction
17006 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17007 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17008 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17009 * bail to the real handler if breakFlags==0.
17010 */
17011    ldrb   r3, [rSELF, #offThread_breakFlags]
17012    adrl   lr, dvmAsmInstructionStart + (92 * 64)
17013    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17014    cmp    r3, #0
17015    bxeq   lr                   @ nothing to do - jump to real handler
17016    EXPORT_PC()
17017    mov    r0, rPC              @ arg0
17018    mov    r1, rFP              @ arg1
17019    mov    r2, rSELF            @ arg2
17020    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17021
17022/* ------------------------------ */
17023    .balign 64
17024.L_ALT_OP_IPUT_BYTE: /* 0x5d */
17025/* File: armv5te/alt_stub.S */
17026/*
17027 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17028 * any interesting requests and then jump to the real instruction
17029 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17030 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17031 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17032 * bail to the real handler if breakFlags==0.
17033 */
17034    ldrb   r3, [rSELF, #offThread_breakFlags]
17035    adrl   lr, dvmAsmInstructionStart + (93 * 64)
17036    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17037    cmp    r3, #0
17038    bxeq   lr                   @ nothing to do - jump to real handler
17039    EXPORT_PC()
17040    mov    r0, rPC              @ arg0
17041    mov    r1, rFP              @ arg1
17042    mov    r2, rSELF            @ arg2
17043    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17044
17045/* ------------------------------ */
17046    .balign 64
17047.L_ALT_OP_IPUT_CHAR: /* 0x5e */
17048/* File: armv5te/alt_stub.S */
17049/*
17050 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17051 * any interesting requests and then jump to the real instruction
17052 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17053 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17054 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17055 * bail to the real handler if breakFlags==0.
17056 */
17057    ldrb   r3, [rSELF, #offThread_breakFlags]
17058    adrl   lr, dvmAsmInstructionStart + (94 * 64)
17059    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17060    cmp    r3, #0
17061    bxeq   lr                   @ nothing to do - jump to real handler
17062    EXPORT_PC()
17063    mov    r0, rPC              @ arg0
17064    mov    r1, rFP              @ arg1
17065    mov    r2, rSELF            @ arg2
17066    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17067
17068/* ------------------------------ */
17069    .balign 64
17070.L_ALT_OP_IPUT_SHORT: /* 0x5f */
17071/* File: armv5te/alt_stub.S */
17072/*
17073 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17074 * any interesting requests and then jump to the real instruction
17075 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17076 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17077 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17078 * bail to the real handler if breakFlags==0.
17079 */
17080    ldrb   r3, [rSELF, #offThread_breakFlags]
17081    adrl   lr, dvmAsmInstructionStart + (95 * 64)
17082    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17083    cmp    r3, #0
17084    bxeq   lr                   @ nothing to do - jump to real handler
17085    EXPORT_PC()
17086    mov    r0, rPC              @ arg0
17087    mov    r1, rFP              @ arg1
17088    mov    r2, rSELF            @ arg2
17089    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17090
17091/* ------------------------------ */
17092    .balign 64
17093.L_ALT_OP_SGET: /* 0x60 */
17094/* File: armv5te/alt_stub.S */
17095/*
17096 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17097 * any interesting requests and then jump to the real instruction
17098 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17099 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17100 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17101 * bail to the real handler if breakFlags==0.
17102 */
17103    ldrb   r3, [rSELF, #offThread_breakFlags]
17104    adrl   lr, dvmAsmInstructionStart + (96 * 64)
17105    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17106    cmp    r3, #0
17107    bxeq   lr                   @ nothing to do - jump to real handler
17108    EXPORT_PC()
17109    mov    r0, rPC              @ arg0
17110    mov    r1, rFP              @ arg1
17111    mov    r2, rSELF            @ arg2
17112    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17113
17114/* ------------------------------ */
17115    .balign 64
17116.L_ALT_OP_SGET_WIDE: /* 0x61 */
17117/* File: armv5te/alt_stub.S */
17118/*
17119 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17120 * any interesting requests and then jump to the real instruction
17121 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17122 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17123 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17124 * bail to the real handler if breakFlags==0.
17125 */
17126    ldrb   r3, [rSELF, #offThread_breakFlags]
17127    adrl   lr, dvmAsmInstructionStart + (97 * 64)
17128    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17129    cmp    r3, #0
17130    bxeq   lr                   @ nothing to do - jump to real handler
17131    EXPORT_PC()
17132    mov    r0, rPC              @ arg0
17133    mov    r1, rFP              @ arg1
17134    mov    r2, rSELF            @ arg2
17135    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17136
17137/* ------------------------------ */
17138    .balign 64
17139.L_ALT_OP_SGET_OBJECT: /* 0x62 */
17140/* File: armv5te/alt_stub.S */
17141/*
17142 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17143 * any interesting requests and then jump to the real instruction
17144 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17145 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17146 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17147 * bail to the real handler if breakFlags==0.
17148 */
17149    ldrb   r3, [rSELF, #offThread_breakFlags]
17150    adrl   lr, dvmAsmInstructionStart + (98 * 64)
17151    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17152    cmp    r3, #0
17153    bxeq   lr                   @ nothing to do - jump to real handler
17154    EXPORT_PC()
17155    mov    r0, rPC              @ arg0
17156    mov    r1, rFP              @ arg1
17157    mov    r2, rSELF            @ arg2
17158    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17159
17160/* ------------------------------ */
17161    .balign 64
17162.L_ALT_OP_SGET_BOOLEAN: /* 0x63 */
17163/* File: armv5te/alt_stub.S */
17164/*
17165 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17166 * any interesting requests and then jump to the real instruction
17167 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17168 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17169 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17170 * bail to the real handler if breakFlags==0.
17171 */
17172    ldrb   r3, [rSELF, #offThread_breakFlags]
17173    adrl   lr, dvmAsmInstructionStart + (99 * 64)
17174    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17175    cmp    r3, #0
17176    bxeq   lr                   @ nothing to do - jump to real handler
17177    EXPORT_PC()
17178    mov    r0, rPC              @ arg0
17179    mov    r1, rFP              @ arg1
17180    mov    r2, rSELF            @ arg2
17181    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17182
17183/* ------------------------------ */
17184    .balign 64
17185.L_ALT_OP_SGET_BYTE: /* 0x64 */
17186/* File: armv5te/alt_stub.S */
17187/*
17188 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17189 * any interesting requests and then jump to the real instruction
17190 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17191 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17192 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17193 * bail to the real handler if breakFlags==0.
17194 */
17195    ldrb   r3, [rSELF, #offThread_breakFlags]
17196    adrl   lr, dvmAsmInstructionStart + (100 * 64)
17197    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17198    cmp    r3, #0
17199    bxeq   lr                   @ nothing to do - jump to real handler
17200    EXPORT_PC()
17201    mov    r0, rPC              @ arg0
17202    mov    r1, rFP              @ arg1
17203    mov    r2, rSELF            @ arg2
17204    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17205
17206/* ------------------------------ */
17207    .balign 64
17208.L_ALT_OP_SGET_CHAR: /* 0x65 */
17209/* File: armv5te/alt_stub.S */
17210/*
17211 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17212 * any interesting requests and then jump to the real instruction
17213 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17214 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17215 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17216 * bail to the real handler if breakFlags==0.
17217 */
17218    ldrb   r3, [rSELF, #offThread_breakFlags]
17219    adrl   lr, dvmAsmInstructionStart + (101 * 64)
17220    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17221    cmp    r3, #0
17222    bxeq   lr                   @ nothing to do - jump to real handler
17223    EXPORT_PC()
17224    mov    r0, rPC              @ arg0
17225    mov    r1, rFP              @ arg1
17226    mov    r2, rSELF            @ arg2
17227    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17228
17229/* ------------------------------ */
17230    .balign 64
17231.L_ALT_OP_SGET_SHORT: /* 0x66 */
17232/* File: armv5te/alt_stub.S */
17233/*
17234 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17235 * any interesting requests and then jump to the real instruction
17236 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17237 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17238 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17239 * bail to the real handler if breakFlags==0.
17240 */
17241    ldrb   r3, [rSELF, #offThread_breakFlags]
17242    adrl   lr, dvmAsmInstructionStart + (102 * 64)
17243    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17244    cmp    r3, #0
17245    bxeq   lr                   @ nothing to do - jump to real handler
17246    EXPORT_PC()
17247    mov    r0, rPC              @ arg0
17248    mov    r1, rFP              @ arg1
17249    mov    r2, rSELF            @ arg2
17250    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17251
17252/* ------------------------------ */
17253    .balign 64
17254.L_ALT_OP_SPUT: /* 0x67 */
17255/* File: armv5te/alt_stub.S */
17256/*
17257 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17258 * any interesting requests and then jump to the real instruction
17259 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17260 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17261 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17262 * bail to the real handler if breakFlags==0.
17263 */
17264    ldrb   r3, [rSELF, #offThread_breakFlags]
17265    adrl   lr, dvmAsmInstructionStart + (103 * 64)
17266    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17267    cmp    r3, #0
17268    bxeq   lr                   @ nothing to do - jump to real handler
17269    EXPORT_PC()
17270    mov    r0, rPC              @ arg0
17271    mov    r1, rFP              @ arg1
17272    mov    r2, rSELF            @ arg2
17273    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17274
17275/* ------------------------------ */
17276    .balign 64
17277.L_ALT_OP_SPUT_WIDE: /* 0x68 */
17278/* File: armv5te/alt_stub.S */
17279/*
17280 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17281 * any interesting requests and then jump to the real instruction
17282 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17283 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17284 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17285 * bail to the real handler if breakFlags==0.
17286 */
17287    ldrb   r3, [rSELF, #offThread_breakFlags]
17288    adrl   lr, dvmAsmInstructionStart + (104 * 64)
17289    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17290    cmp    r3, #0
17291    bxeq   lr                   @ nothing to do - jump to real handler
17292    EXPORT_PC()
17293    mov    r0, rPC              @ arg0
17294    mov    r1, rFP              @ arg1
17295    mov    r2, rSELF            @ arg2
17296    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17297
17298/* ------------------------------ */
17299    .balign 64
17300.L_ALT_OP_SPUT_OBJECT: /* 0x69 */
17301/* File: armv5te/alt_stub.S */
17302/*
17303 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17304 * any interesting requests and then jump to the real instruction
17305 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17306 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17307 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17308 * bail to the real handler if breakFlags==0.
17309 */
17310    ldrb   r3, [rSELF, #offThread_breakFlags]
17311    adrl   lr, dvmAsmInstructionStart + (105 * 64)
17312    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17313    cmp    r3, #0
17314    bxeq   lr                   @ nothing to do - jump to real handler
17315    EXPORT_PC()
17316    mov    r0, rPC              @ arg0
17317    mov    r1, rFP              @ arg1
17318    mov    r2, rSELF            @ arg2
17319    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17320
17321/* ------------------------------ */
17322    .balign 64
17323.L_ALT_OP_SPUT_BOOLEAN: /* 0x6a */
17324/* File: armv5te/alt_stub.S */
17325/*
17326 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17327 * any interesting requests and then jump to the real instruction
17328 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17329 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17330 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17331 * bail to the real handler if breakFlags==0.
17332 */
17333    ldrb   r3, [rSELF, #offThread_breakFlags]
17334    adrl   lr, dvmAsmInstructionStart + (106 * 64)
17335    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17336    cmp    r3, #0
17337    bxeq   lr                   @ nothing to do - jump to real handler
17338    EXPORT_PC()
17339    mov    r0, rPC              @ arg0
17340    mov    r1, rFP              @ arg1
17341    mov    r2, rSELF            @ arg2
17342    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17343
17344/* ------------------------------ */
17345    .balign 64
17346.L_ALT_OP_SPUT_BYTE: /* 0x6b */
17347/* File: armv5te/alt_stub.S */
17348/*
17349 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17350 * any interesting requests and then jump to the real instruction
17351 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17352 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17353 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17354 * bail to the real handler if breakFlags==0.
17355 */
17356    ldrb   r3, [rSELF, #offThread_breakFlags]
17357    adrl   lr, dvmAsmInstructionStart + (107 * 64)
17358    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17359    cmp    r3, #0
17360    bxeq   lr                   @ nothing to do - jump to real handler
17361    EXPORT_PC()
17362    mov    r0, rPC              @ arg0
17363    mov    r1, rFP              @ arg1
17364    mov    r2, rSELF            @ arg2
17365    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17366
17367/* ------------------------------ */
17368    .balign 64
17369.L_ALT_OP_SPUT_CHAR: /* 0x6c */
17370/* File: armv5te/alt_stub.S */
17371/*
17372 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17373 * any interesting requests and then jump to the real instruction
17374 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17375 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17376 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17377 * bail to the real handler if breakFlags==0.
17378 */
17379    ldrb   r3, [rSELF, #offThread_breakFlags]
17380    adrl   lr, dvmAsmInstructionStart + (108 * 64)
17381    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17382    cmp    r3, #0
17383    bxeq   lr                   @ nothing to do - jump to real handler
17384    EXPORT_PC()
17385    mov    r0, rPC              @ arg0
17386    mov    r1, rFP              @ arg1
17387    mov    r2, rSELF            @ arg2
17388    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17389
17390/* ------------------------------ */
17391    .balign 64
17392.L_ALT_OP_SPUT_SHORT: /* 0x6d */
17393/* File: armv5te/alt_stub.S */
17394/*
17395 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17396 * any interesting requests and then jump to the real instruction
17397 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17398 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17399 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17400 * bail to the real handler if breakFlags==0.
17401 */
17402    ldrb   r3, [rSELF, #offThread_breakFlags]
17403    adrl   lr, dvmAsmInstructionStart + (109 * 64)
17404    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17405    cmp    r3, #0
17406    bxeq   lr                   @ nothing to do - jump to real handler
17407    EXPORT_PC()
17408    mov    r0, rPC              @ arg0
17409    mov    r1, rFP              @ arg1
17410    mov    r2, rSELF            @ arg2
17411    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17412
17413/* ------------------------------ */
17414    .balign 64
17415.L_ALT_OP_INVOKE_VIRTUAL: /* 0x6e */
17416/* File: armv5te/alt_stub.S */
17417/*
17418 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17419 * any interesting requests and then jump to the real instruction
17420 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17421 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17422 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17423 * bail to the real handler if breakFlags==0.
17424 */
17425    ldrb   r3, [rSELF, #offThread_breakFlags]
17426    adrl   lr, dvmAsmInstructionStart + (110 * 64)
17427    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17428    cmp    r3, #0
17429    bxeq   lr                   @ nothing to do - jump to real handler
17430    EXPORT_PC()
17431    mov    r0, rPC              @ arg0
17432    mov    r1, rFP              @ arg1
17433    mov    r2, rSELF            @ arg2
17434    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17435
17436/* ------------------------------ */
17437    .balign 64
17438.L_ALT_OP_INVOKE_SUPER: /* 0x6f */
17439/* File: armv5te/alt_stub.S */
17440/*
17441 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17442 * any interesting requests and then jump to the real instruction
17443 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17444 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17445 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17446 * bail to the real handler if breakFlags==0.
17447 */
17448    ldrb   r3, [rSELF, #offThread_breakFlags]
17449    adrl   lr, dvmAsmInstructionStart + (111 * 64)
17450    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17451    cmp    r3, #0
17452    bxeq   lr                   @ nothing to do - jump to real handler
17453    EXPORT_PC()
17454    mov    r0, rPC              @ arg0
17455    mov    r1, rFP              @ arg1
17456    mov    r2, rSELF            @ arg2
17457    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17458
17459/* ------------------------------ */
17460    .balign 64
17461.L_ALT_OP_INVOKE_DIRECT: /* 0x70 */
17462/* File: armv5te/alt_stub.S */
17463/*
17464 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17465 * any interesting requests and then jump to the real instruction
17466 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17467 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17468 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17469 * bail to the real handler if breakFlags==0.
17470 */
17471    ldrb   r3, [rSELF, #offThread_breakFlags]
17472    adrl   lr, dvmAsmInstructionStart + (112 * 64)
17473    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17474    cmp    r3, #0
17475    bxeq   lr                   @ nothing to do - jump to real handler
17476    EXPORT_PC()
17477    mov    r0, rPC              @ arg0
17478    mov    r1, rFP              @ arg1
17479    mov    r2, rSELF            @ arg2
17480    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17481
17482/* ------------------------------ */
17483    .balign 64
17484.L_ALT_OP_INVOKE_STATIC: /* 0x71 */
17485/* File: armv5te/alt_stub.S */
17486/*
17487 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17488 * any interesting requests and then jump to the real instruction
17489 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17490 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17491 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17492 * bail to the real handler if breakFlags==0.
17493 */
17494    ldrb   r3, [rSELF, #offThread_breakFlags]
17495    adrl   lr, dvmAsmInstructionStart + (113 * 64)
17496    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17497    cmp    r3, #0
17498    bxeq   lr                   @ nothing to do - jump to real handler
17499    EXPORT_PC()
17500    mov    r0, rPC              @ arg0
17501    mov    r1, rFP              @ arg1
17502    mov    r2, rSELF            @ arg2
17503    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17504
17505/* ------------------------------ */
17506    .balign 64
17507.L_ALT_OP_INVOKE_INTERFACE: /* 0x72 */
17508/* File: armv5te/alt_stub.S */
17509/*
17510 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17511 * any interesting requests and then jump to the real instruction
17512 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17513 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17514 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17515 * bail to the real handler if breakFlags==0.
17516 */
17517    ldrb   r3, [rSELF, #offThread_breakFlags]
17518    adrl   lr, dvmAsmInstructionStart + (114 * 64)
17519    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17520    cmp    r3, #0
17521    bxeq   lr                   @ nothing to do - jump to real handler
17522    EXPORT_PC()
17523    mov    r0, rPC              @ arg0
17524    mov    r1, rFP              @ arg1
17525    mov    r2, rSELF            @ arg2
17526    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17527
17528/* ------------------------------ */
17529    .balign 64
17530.L_ALT_OP_UNUSED_73: /* 0x73 */
17531/* File: armv5te/alt_stub.S */
17532/*
17533 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17534 * any interesting requests and then jump to the real instruction
17535 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17536 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17537 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17538 * bail to the real handler if breakFlags==0.
17539 */
17540    ldrb   r3, [rSELF, #offThread_breakFlags]
17541    adrl   lr, dvmAsmInstructionStart + (115 * 64)
17542    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17543    cmp    r3, #0
17544    bxeq   lr                   @ nothing to do - jump to real handler
17545    EXPORT_PC()
17546    mov    r0, rPC              @ arg0
17547    mov    r1, rFP              @ arg1
17548    mov    r2, rSELF            @ arg2
17549    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17550
17551/* ------------------------------ */
17552    .balign 64
17553.L_ALT_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
17554/* File: armv5te/alt_stub.S */
17555/*
17556 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17557 * any interesting requests and then jump to the real instruction
17558 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17559 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17560 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17561 * bail to the real handler if breakFlags==0.
17562 */
17563    ldrb   r3, [rSELF, #offThread_breakFlags]
17564    adrl   lr, dvmAsmInstructionStart + (116 * 64)
17565    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17566    cmp    r3, #0
17567    bxeq   lr                   @ nothing to do - jump to real handler
17568    EXPORT_PC()
17569    mov    r0, rPC              @ arg0
17570    mov    r1, rFP              @ arg1
17571    mov    r2, rSELF            @ arg2
17572    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17573
17574/* ------------------------------ */
17575    .balign 64
17576.L_ALT_OP_INVOKE_SUPER_RANGE: /* 0x75 */
17577/* File: armv5te/alt_stub.S */
17578/*
17579 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17580 * any interesting requests and then jump to the real instruction
17581 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17582 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17583 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17584 * bail to the real handler if breakFlags==0.
17585 */
17586    ldrb   r3, [rSELF, #offThread_breakFlags]
17587    adrl   lr, dvmAsmInstructionStart + (117 * 64)
17588    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17589    cmp    r3, #0
17590    bxeq   lr                   @ nothing to do - jump to real handler
17591    EXPORT_PC()
17592    mov    r0, rPC              @ arg0
17593    mov    r1, rFP              @ arg1
17594    mov    r2, rSELF            @ arg2
17595    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17596
17597/* ------------------------------ */
17598    .balign 64
17599.L_ALT_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
17600/* File: armv5te/alt_stub.S */
17601/*
17602 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17603 * any interesting requests and then jump to the real instruction
17604 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17605 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17606 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17607 * bail to the real handler if breakFlags==0.
17608 */
17609    ldrb   r3, [rSELF, #offThread_breakFlags]
17610    adrl   lr, dvmAsmInstructionStart + (118 * 64)
17611    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17612    cmp    r3, #0
17613    bxeq   lr                   @ nothing to do - jump to real handler
17614    EXPORT_PC()
17615    mov    r0, rPC              @ arg0
17616    mov    r1, rFP              @ arg1
17617    mov    r2, rSELF            @ arg2
17618    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17619
17620/* ------------------------------ */
17621    .balign 64
17622.L_ALT_OP_INVOKE_STATIC_RANGE: /* 0x77 */
17623/* File: armv5te/alt_stub.S */
17624/*
17625 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17626 * any interesting requests and then jump to the real instruction
17627 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17628 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17629 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17630 * bail to the real handler if breakFlags==0.
17631 */
17632    ldrb   r3, [rSELF, #offThread_breakFlags]
17633    adrl   lr, dvmAsmInstructionStart + (119 * 64)
17634    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17635    cmp    r3, #0
17636    bxeq   lr                   @ nothing to do - jump to real handler
17637    EXPORT_PC()
17638    mov    r0, rPC              @ arg0
17639    mov    r1, rFP              @ arg1
17640    mov    r2, rSELF            @ arg2
17641    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17642
17643/* ------------------------------ */
17644    .balign 64
17645.L_ALT_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
17646/* File: armv5te/alt_stub.S */
17647/*
17648 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17649 * any interesting requests and then jump to the real instruction
17650 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17651 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17652 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17653 * bail to the real handler if breakFlags==0.
17654 */
17655    ldrb   r3, [rSELF, #offThread_breakFlags]
17656    adrl   lr, dvmAsmInstructionStart + (120 * 64)
17657    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17658    cmp    r3, #0
17659    bxeq   lr                   @ nothing to do - jump to real handler
17660    EXPORT_PC()
17661    mov    r0, rPC              @ arg0
17662    mov    r1, rFP              @ arg1
17663    mov    r2, rSELF            @ arg2
17664    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17665
17666/* ------------------------------ */
17667    .balign 64
17668.L_ALT_OP_UNUSED_79: /* 0x79 */
17669/* File: armv5te/alt_stub.S */
17670/*
17671 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17672 * any interesting requests and then jump to the real instruction
17673 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17674 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17675 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17676 * bail to the real handler if breakFlags==0.
17677 */
17678    ldrb   r3, [rSELF, #offThread_breakFlags]
17679    adrl   lr, dvmAsmInstructionStart + (121 * 64)
17680    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17681    cmp    r3, #0
17682    bxeq   lr                   @ nothing to do - jump to real handler
17683    EXPORT_PC()
17684    mov    r0, rPC              @ arg0
17685    mov    r1, rFP              @ arg1
17686    mov    r2, rSELF            @ arg2
17687    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17688
17689/* ------------------------------ */
17690    .balign 64
17691.L_ALT_OP_UNUSED_7A: /* 0x7a */
17692/* File: armv5te/alt_stub.S */
17693/*
17694 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17695 * any interesting requests and then jump to the real instruction
17696 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17697 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17698 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17699 * bail to the real handler if breakFlags==0.
17700 */
17701    ldrb   r3, [rSELF, #offThread_breakFlags]
17702    adrl   lr, dvmAsmInstructionStart + (122 * 64)
17703    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17704    cmp    r3, #0
17705    bxeq   lr                   @ nothing to do - jump to real handler
17706    EXPORT_PC()
17707    mov    r0, rPC              @ arg0
17708    mov    r1, rFP              @ arg1
17709    mov    r2, rSELF            @ arg2
17710    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17711
17712/* ------------------------------ */
17713    .balign 64
17714.L_ALT_OP_NEG_INT: /* 0x7b */
17715/* File: armv5te/alt_stub.S */
17716/*
17717 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17718 * any interesting requests and then jump to the real instruction
17719 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17720 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17721 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17722 * bail to the real handler if breakFlags==0.
17723 */
17724    ldrb   r3, [rSELF, #offThread_breakFlags]
17725    adrl   lr, dvmAsmInstructionStart + (123 * 64)
17726    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17727    cmp    r3, #0
17728    bxeq   lr                   @ nothing to do - jump to real handler
17729    EXPORT_PC()
17730    mov    r0, rPC              @ arg0
17731    mov    r1, rFP              @ arg1
17732    mov    r2, rSELF            @ arg2
17733    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17734
17735/* ------------------------------ */
17736    .balign 64
17737.L_ALT_OP_NOT_INT: /* 0x7c */
17738/* File: armv5te/alt_stub.S */
17739/*
17740 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17741 * any interesting requests and then jump to the real instruction
17742 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17743 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17744 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17745 * bail to the real handler if breakFlags==0.
17746 */
17747    ldrb   r3, [rSELF, #offThread_breakFlags]
17748    adrl   lr, dvmAsmInstructionStart + (124 * 64)
17749    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17750    cmp    r3, #0
17751    bxeq   lr                   @ nothing to do - jump to real handler
17752    EXPORT_PC()
17753    mov    r0, rPC              @ arg0
17754    mov    r1, rFP              @ arg1
17755    mov    r2, rSELF            @ arg2
17756    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17757
17758/* ------------------------------ */
17759    .balign 64
17760.L_ALT_OP_NEG_LONG: /* 0x7d */
17761/* File: armv5te/alt_stub.S */
17762/*
17763 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17764 * any interesting requests and then jump to the real instruction
17765 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17766 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17767 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17768 * bail to the real handler if breakFlags==0.
17769 */
17770    ldrb   r3, [rSELF, #offThread_breakFlags]
17771    adrl   lr, dvmAsmInstructionStart + (125 * 64)
17772    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17773    cmp    r3, #0
17774    bxeq   lr                   @ nothing to do - jump to real handler
17775    EXPORT_PC()
17776    mov    r0, rPC              @ arg0
17777    mov    r1, rFP              @ arg1
17778    mov    r2, rSELF            @ arg2
17779    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17780
17781/* ------------------------------ */
17782    .balign 64
17783.L_ALT_OP_NOT_LONG: /* 0x7e */
17784/* File: armv5te/alt_stub.S */
17785/*
17786 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17787 * any interesting requests and then jump to the real instruction
17788 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17789 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17790 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17791 * bail to the real handler if breakFlags==0.
17792 */
17793    ldrb   r3, [rSELF, #offThread_breakFlags]
17794    adrl   lr, dvmAsmInstructionStart + (126 * 64)
17795    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17796    cmp    r3, #0
17797    bxeq   lr                   @ nothing to do - jump to real handler
17798    EXPORT_PC()
17799    mov    r0, rPC              @ arg0
17800    mov    r1, rFP              @ arg1
17801    mov    r2, rSELF            @ arg2
17802    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17803
17804/* ------------------------------ */
17805    .balign 64
17806.L_ALT_OP_NEG_FLOAT: /* 0x7f */
17807/* File: armv5te/alt_stub.S */
17808/*
17809 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17810 * any interesting requests and then jump to the real instruction
17811 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17812 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17813 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17814 * bail to the real handler if breakFlags==0.
17815 */
17816    ldrb   r3, [rSELF, #offThread_breakFlags]
17817    adrl   lr, dvmAsmInstructionStart + (127 * 64)
17818    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17819    cmp    r3, #0
17820    bxeq   lr                   @ nothing to do - jump to real handler
17821    EXPORT_PC()
17822    mov    r0, rPC              @ arg0
17823    mov    r1, rFP              @ arg1
17824    mov    r2, rSELF            @ arg2
17825    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17826
17827/* ------------------------------ */
17828    .balign 64
17829.L_ALT_OP_NEG_DOUBLE: /* 0x80 */
17830/* File: armv5te/alt_stub.S */
17831/*
17832 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17833 * any interesting requests and then jump to the real instruction
17834 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17835 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17836 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17837 * bail to the real handler if breakFlags==0.
17838 */
17839    ldrb   r3, [rSELF, #offThread_breakFlags]
17840    adrl   lr, dvmAsmInstructionStart + (128 * 64)
17841    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17842    cmp    r3, #0
17843    bxeq   lr                   @ nothing to do - jump to real handler
17844    EXPORT_PC()
17845    mov    r0, rPC              @ arg0
17846    mov    r1, rFP              @ arg1
17847    mov    r2, rSELF            @ arg2
17848    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17849
17850/* ------------------------------ */
17851    .balign 64
17852.L_ALT_OP_INT_TO_LONG: /* 0x81 */
17853/* File: armv5te/alt_stub.S */
17854/*
17855 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17856 * any interesting requests and then jump to the real instruction
17857 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17858 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17859 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17860 * bail to the real handler if breakFlags==0.
17861 */
17862    ldrb   r3, [rSELF, #offThread_breakFlags]
17863    adrl   lr, dvmAsmInstructionStart + (129 * 64)
17864    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17865    cmp    r3, #0
17866    bxeq   lr                   @ nothing to do - jump to real handler
17867    EXPORT_PC()
17868    mov    r0, rPC              @ arg0
17869    mov    r1, rFP              @ arg1
17870    mov    r2, rSELF            @ arg2
17871    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17872
17873/* ------------------------------ */
17874    .balign 64
17875.L_ALT_OP_INT_TO_FLOAT: /* 0x82 */
17876/* File: armv5te/alt_stub.S */
17877/*
17878 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17879 * any interesting requests and then jump to the real instruction
17880 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17881 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17882 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17883 * bail to the real handler if breakFlags==0.
17884 */
17885    ldrb   r3, [rSELF, #offThread_breakFlags]
17886    adrl   lr, dvmAsmInstructionStart + (130 * 64)
17887    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17888    cmp    r3, #0
17889    bxeq   lr                   @ nothing to do - jump to real handler
17890    EXPORT_PC()
17891    mov    r0, rPC              @ arg0
17892    mov    r1, rFP              @ arg1
17893    mov    r2, rSELF            @ arg2
17894    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17895
17896/* ------------------------------ */
17897    .balign 64
17898.L_ALT_OP_INT_TO_DOUBLE: /* 0x83 */
17899/* File: armv5te/alt_stub.S */
17900/*
17901 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17902 * any interesting requests and then jump to the real instruction
17903 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17904 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17905 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17906 * bail to the real handler if breakFlags==0.
17907 */
17908    ldrb   r3, [rSELF, #offThread_breakFlags]
17909    adrl   lr, dvmAsmInstructionStart + (131 * 64)
17910    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17911    cmp    r3, #0
17912    bxeq   lr                   @ nothing to do - jump to real handler
17913    EXPORT_PC()
17914    mov    r0, rPC              @ arg0
17915    mov    r1, rFP              @ arg1
17916    mov    r2, rSELF            @ arg2
17917    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17918
17919/* ------------------------------ */
17920    .balign 64
17921.L_ALT_OP_LONG_TO_INT: /* 0x84 */
17922/* File: armv5te/alt_stub.S */
17923/*
17924 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17925 * any interesting requests and then jump to the real instruction
17926 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17927 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17928 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17929 * bail to the real handler if breakFlags==0.
17930 */
17931    ldrb   r3, [rSELF, #offThread_breakFlags]
17932    adrl   lr, dvmAsmInstructionStart + (132 * 64)
17933    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17934    cmp    r3, #0
17935    bxeq   lr                   @ nothing to do - jump to real handler
17936    EXPORT_PC()
17937    mov    r0, rPC              @ arg0
17938    mov    r1, rFP              @ arg1
17939    mov    r2, rSELF            @ arg2
17940    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17941
17942/* ------------------------------ */
17943    .balign 64
17944.L_ALT_OP_LONG_TO_FLOAT: /* 0x85 */
17945/* File: armv5te/alt_stub.S */
17946/*
17947 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17948 * any interesting requests and then jump to the real instruction
17949 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17950 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17951 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17952 * bail to the real handler if breakFlags==0.
17953 */
17954    ldrb   r3, [rSELF, #offThread_breakFlags]
17955    adrl   lr, dvmAsmInstructionStart + (133 * 64)
17956    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17957    cmp    r3, #0
17958    bxeq   lr                   @ nothing to do - jump to real handler
17959    EXPORT_PC()
17960    mov    r0, rPC              @ arg0
17961    mov    r1, rFP              @ arg1
17962    mov    r2, rSELF            @ arg2
17963    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17964
17965/* ------------------------------ */
17966    .balign 64
17967.L_ALT_OP_LONG_TO_DOUBLE: /* 0x86 */
17968/* File: armv5te/alt_stub.S */
17969/*
17970 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17971 * any interesting requests and then jump to the real instruction
17972 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17973 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17974 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17975 * bail to the real handler if breakFlags==0.
17976 */
17977    ldrb   r3, [rSELF, #offThread_breakFlags]
17978    adrl   lr, dvmAsmInstructionStart + (134 * 64)
17979    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17980    cmp    r3, #0
17981    bxeq   lr                   @ nothing to do - jump to real handler
17982    EXPORT_PC()
17983    mov    r0, rPC              @ arg0
17984    mov    r1, rFP              @ arg1
17985    mov    r2, rSELF            @ arg2
17986    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17987
17988/* ------------------------------ */
17989    .balign 64
17990.L_ALT_OP_FLOAT_TO_INT: /* 0x87 */
17991/* File: armv5te/alt_stub.S */
17992/*
17993 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17994 * any interesting requests and then jump to the real instruction
17995 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17996 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17997 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17998 * bail to the real handler if breakFlags==0.
17999 */
18000    ldrb   r3, [rSELF, #offThread_breakFlags]
18001    adrl   lr, dvmAsmInstructionStart + (135 * 64)
18002    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18003    cmp    r3, #0
18004    bxeq   lr                   @ nothing to do - jump to real handler
18005    EXPORT_PC()
18006    mov    r0, rPC              @ arg0
18007    mov    r1, rFP              @ arg1
18008    mov    r2, rSELF            @ arg2
18009    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18010
18011/* ------------------------------ */
18012    .balign 64
18013.L_ALT_OP_FLOAT_TO_LONG: /* 0x88 */
18014/* File: armv5te/alt_stub.S */
18015/*
18016 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18017 * any interesting requests and then jump to the real instruction
18018 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18019 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18020 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18021 * bail to the real handler if breakFlags==0.
18022 */
18023    ldrb   r3, [rSELF, #offThread_breakFlags]
18024    adrl   lr, dvmAsmInstructionStart + (136 * 64)
18025    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18026    cmp    r3, #0
18027    bxeq   lr                   @ nothing to do - jump to real handler
18028    EXPORT_PC()
18029    mov    r0, rPC              @ arg0
18030    mov    r1, rFP              @ arg1
18031    mov    r2, rSELF            @ arg2
18032    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18033
18034/* ------------------------------ */
18035    .balign 64
18036.L_ALT_OP_FLOAT_TO_DOUBLE: /* 0x89 */
18037/* File: armv5te/alt_stub.S */
18038/*
18039 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18040 * any interesting requests and then jump to the real instruction
18041 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18042 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18043 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18044 * bail to the real handler if breakFlags==0.
18045 */
18046    ldrb   r3, [rSELF, #offThread_breakFlags]
18047    adrl   lr, dvmAsmInstructionStart + (137 * 64)
18048    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18049    cmp    r3, #0
18050    bxeq   lr                   @ nothing to do - jump to real handler
18051    EXPORT_PC()
18052    mov    r0, rPC              @ arg0
18053    mov    r1, rFP              @ arg1
18054    mov    r2, rSELF            @ arg2
18055    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18056
18057/* ------------------------------ */
18058    .balign 64
18059.L_ALT_OP_DOUBLE_TO_INT: /* 0x8a */
18060/* File: armv5te/alt_stub.S */
18061/*
18062 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18063 * any interesting requests and then jump to the real instruction
18064 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18065 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18066 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18067 * bail to the real handler if breakFlags==0.
18068 */
18069    ldrb   r3, [rSELF, #offThread_breakFlags]
18070    adrl   lr, dvmAsmInstructionStart + (138 * 64)
18071    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18072    cmp    r3, #0
18073    bxeq   lr                   @ nothing to do - jump to real handler
18074    EXPORT_PC()
18075    mov    r0, rPC              @ arg0
18076    mov    r1, rFP              @ arg1
18077    mov    r2, rSELF            @ arg2
18078    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18079
18080/* ------------------------------ */
18081    .balign 64
18082.L_ALT_OP_DOUBLE_TO_LONG: /* 0x8b */
18083/* File: armv5te/alt_stub.S */
18084/*
18085 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18086 * any interesting requests and then jump to the real instruction
18087 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18088 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18089 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18090 * bail to the real handler if breakFlags==0.
18091 */
18092    ldrb   r3, [rSELF, #offThread_breakFlags]
18093    adrl   lr, dvmAsmInstructionStart + (139 * 64)
18094    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18095    cmp    r3, #0
18096    bxeq   lr                   @ nothing to do - jump to real handler
18097    EXPORT_PC()
18098    mov    r0, rPC              @ arg0
18099    mov    r1, rFP              @ arg1
18100    mov    r2, rSELF            @ arg2
18101    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18102
18103/* ------------------------------ */
18104    .balign 64
18105.L_ALT_OP_DOUBLE_TO_FLOAT: /* 0x8c */
18106/* File: armv5te/alt_stub.S */
18107/*
18108 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18109 * any interesting requests and then jump to the real instruction
18110 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18111 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18112 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18113 * bail to the real handler if breakFlags==0.
18114 */
18115    ldrb   r3, [rSELF, #offThread_breakFlags]
18116    adrl   lr, dvmAsmInstructionStart + (140 * 64)
18117    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18118    cmp    r3, #0
18119    bxeq   lr                   @ nothing to do - jump to real handler
18120    EXPORT_PC()
18121    mov    r0, rPC              @ arg0
18122    mov    r1, rFP              @ arg1
18123    mov    r2, rSELF            @ arg2
18124    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18125
18126/* ------------------------------ */
18127    .balign 64
18128.L_ALT_OP_INT_TO_BYTE: /* 0x8d */
18129/* File: armv5te/alt_stub.S */
18130/*
18131 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18132 * any interesting requests and then jump to the real instruction
18133 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18134 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18135 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18136 * bail to the real handler if breakFlags==0.
18137 */
18138    ldrb   r3, [rSELF, #offThread_breakFlags]
18139    adrl   lr, dvmAsmInstructionStart + (141 * 64)
18140    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18141    cmp    r3, #0
18142    bxeq   lr                   @ nothing to do - jump to real handler
18143    EXPORT_PC()
18144    mov    r0, rPC              @ arg0
18145    mov    r1, rFP              @ arg1
18146    mov    r2, rSELF            @ arg2
18147    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18148
18149/* ------------------------------ */
18150    .balign 64
18151.L_ALT_OP_INT_TO_CHAR: /* 0x8e */
18152/* File: armv5te/alt_stub.S */
18153/*
18154 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18155 * any interesting requests and then jump to the real instruction
18156 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18157 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18158 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18159 * bail to the real handler if breakFlags==0.
18160 */
18161    ldrb   r3, [rSELF, #offThread_breakFlags]
18162    adrl   lr, dvmAsmInstructionStart + (142 * 64)
18163    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18164    cmp    r3, #0
18165    bxeq   lr                   @ nothing to do - jump to real handler
18166    EXPORT_PC()
18167    mov    r0, rPC              @ arg0
18168    mov    r1, rFP              @ arg1
18169    mov    r2, rSELF            @ arg2
18170    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18171
18172/* ------------------------------ */
18173    .balign 64
18174.L_ALT_OP_INT_TO_SHORT: /* 0x8f */
18175/* File: armv5te/alt_stub.S */
18176/*
18177 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18178 * any interesting requests and then jump to the real instruction
18179 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18180 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18181 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18182 * bail to the real handler if breakFlags==0.
18183 */
18184    ldrb   r3, [rSELF, #offThread_breakFlags]
18185    adrl   lr, dvmAsmInstructionStart + (143 * 64)
18186    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18187    cmp    r3, #0
18188    bxeq   lr                   @ nothing to do - jump to real handler
18189    EXPORT_PC()
18190    mov    r0, rPC              @ arg0
18191    mov    r1, rFP              @ arg1
18192    mov    r2, rSELF            @ arg2
18193    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18194
18195/* ------------------------------ */
18196    .balign 64
18197.L_ALT_OP_ADD_INT: /* 0x90 */
18198/* File: armv5te/alt_stub.S */
18199/*
18200 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18201 * any interesting requests and then jump to the real instruction
18202 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18203 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18204 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18205 * bail to the real handler if breakFlags==0.
18206 */
18207    ldrb   r3, [rSELF, #offThread_breakFlags]
18208    adrl   lr, dvmAsmInstructionStart + (144 * 64)
18209    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18210    cmp    r3, #0
18211    bxeq   lr                   @ nothing to do - jump to real handler
18212    EXPORT_PC()
18213    mov    r0, rPC              @ arg0
18214    mov    r1, rFP              @ arg1
18215    mov    r2, rSELF            @ arg2
18216    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18217
18218/* ------------------------------ */
18219    .balign 64
18220.L_ALT_OP_SUB_INT: /* 0x91 */
18221/* File: armv5te/alt_stub.S */
18222/*
18223 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18224 * any interesting requests and then jump to the real instruction
18225 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18226 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18227 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18228 * bail to the real handler if breakFlags==0.
18229 */
18230    ldrb   r3, [rSELF, #offThread_breakFlags]
18231    adrl   lr, dvmAsmInstructionStart + (145 * 64)
18232    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18233    cmp    r3, #0
18234    bxeq   lr                   @ nothing to do - jump to real handler
18235    EXPORT_PC()
18236    mov    r0, rPC              @ arg0
18237    mov    r1, rFP              @ arg1
18238    mov    r2, rSELF            @ arg2
18239    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18240
18241/* ------------------------------ */
18242    .balign 64
18243.L_ALT_OP_MUL_INT: /* 0x92 */
18244/* File: armv5te/alt_stub.S */
18245/*
18246 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18247 * any interesting requests and then jump to the real instruction
18248 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18249 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18250 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18251 * bail to the real handler if breakFlags==0.
18252 */
18253    ldrb   r3, [rSELF, #offThread_breakFlags]
18254    adrl   lr, dvmAsmInstructionStart + (146 * 64)
18255    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18256    cmp    r3, #0
18257    bxeq   lr                   @ nothing to do - jump to real handler
18258    EXPORT_PC()
18259    mov    r0, rPC              @ arg0
18260    mov    r1, rFP              @ arg1
18261    mov    r2, rSELF            @ arg2
18262    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18263
18264/* ------------------------------ */
18265    .balign 64
18266.L_ALT_OP_DIV_INT: /* 0x93 */
18267/* File: armv5te/alt_stub.S */
18268/*
18269 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18270 * any interesting requests and then jump to the real instruction
18271 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18272 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18273 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18274 * bail to the real handler if breakFlags==0.
18275 */
18276    ldrb   r3, [rSELF, #offThread_breakFlags]
18277    adrl   lr, dvmAsmInstructionStart + (147 * 64)
18278    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18279    cmp    r3, #0
18280    bxeq   lr                   @ nothing to do - jump to real handler
18281    EXPORT_PC()
18282    mov    r0, rPC              @ arg0
18283    mov    r1, rFP              @ arg1
18284    mov    r2, rSELF            @ arg2
18285    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18286
18287/* ------------------------------ */
18288    .balign 64
18289.L_ALT_OP_REM_INT: /* 0x94 */
18290/* File: armv5te/alt_stub.S */
18291/*
18292 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18293 * any interesting requests and then jump to the real instruction
18294 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18295 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18296 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18297 * bail to the real handler if breakFlags==0.
18298 */
18299    ldrb   r3, [rSELF, #offThread_breakFlags]
18300    adrl   lr, dvmAsmInstructionStart + (148 * 64)
18301    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18302    cmp    r3, #0
18303    bxeq   lr                   @ nothing to do - jump to real handler
18304    EXPORT_PC()
18305    mov    r0, rPC              @ arg0
18306    mov    r1, rFP              @ arg1
18307    mov    r2, rSELF            @ arg2
18308    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18309
18310/* ------------------------------ */
18311    .balign 64
18312.L_ALT_OP_AND_INT: /* 0x95 */
18313/* File: armv5te/alt_stub.S */
18314/*
18315 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18316 * any interesting requests and then jump to the real instruction
18317 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18318 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18319 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18320 * bail to the real handler if breakFlags==0.
18321 */
18322    ldrb   r3, [rSELF, #offThread_breakFlags]
18323    adrl   lr, dvmAsmInstructionStart + (149 * 64)
18324    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18325    cmp    r3, #0
18326    bxeq   lr                   @ nothing to do - jump to real handler
18327    EXPORT_PC()
18328    mov    r0, rPC              @ arg0
18329    mov    r1, rFP              @ arg1
18330    mov    r2, rSELF            @ arg2
18331    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18332
18333/* ------------------------------ */
18334    .balign 64
18335.L_ALT_OP_OR_INT: /* 0x96 */
18336/* File: armv5te/alt_stub.S */
18337/*
18338 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18339 * any interesting requests and then jump to the real instruction
18340 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18341 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18342 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18343 * bail to the real handler if breakFlags==0.
18344 */
18345    ldrb   r3, [rSELF, #offThread_breakFlags]
18346    adrl   lr, dvmAsmInstructionStart + (150 * 64)
18347    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18348    cmp    r3, #0
18349    bxeq   lr                   @ nothing to do - jump to real handler
18350    EXPORT_PC()
18351    mov    r0, rPC              @ arg0
18352    mov    r1, rFP              @ arg1
18353    mov    r2, rSELF            @ arg2
18354    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18355
18356/* ------------------------------ */
18357    .balign 64
18358.L_ALT_OP_XOR_INT: /* 0x97 */
18359/* File: armv5te/alt_stub.S */
18360/*
18361 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18362 * any interesting requests and then jump to the real instruction
18363 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18364 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18365 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18366 * bail to the real handler if breakFlags==0.
18367 */
18368    ldrb   r3, [rSELF, #offThread_breakFlags]
18369    adrl   lr, dvmAsmInstructionStart + (151 * 64)
18370    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18371    cmp    r3, #0
18372    bxeq   lr                   @ nothing to do - jump to real handler
18373    EXPORT_PC()
18374    mov    r0, rPC              @ arg0
18375    mov    r1, rFP              @ arg1
18376    mov    r2, rSELF            @ arg2
18377    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18378
18379/* ------------------------------ */
18380    .balign 64
18381.L_ALT_OP_SHL_INT: /* 0x98 */
18382/* File: armv5te/alt_stub.S */
18383/*
18384 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18385 * any interesting requests and then jump to the real instruction
18386 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18387 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18388 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18389 * bail to the real handler if breakFlags==0.
18390 */
18391    ldrb   r3, [rSELF, #offThread_breakFlags]
18392    adrl   lr, dvmAsmInstructionStart + (152 * 64)
18393    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18394    cmp    r3, #0
18395    bxeq   lr                   @ nothing to do - jump to real handler
18396    EXPORT_PC()
18397    mov    r0, rPC              @ arg0
18398    mov    r1, rFP              @ arg1
18399    mov    r2, rSELF            @ arg2
18400    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18401
18402/* ------------------------------ */
18403    .balign 64
18404.L_ALT_OP_SHR_INT: /* 0x99 */
18405/* File: armv5te/alt_stub.S */
18406/*
18407 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18408 * any interesting requests and then jump to the real instruction
18409 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18410 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18411 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18412 * bail to the real handler if breakFlags==0.
18413 */
18414    ldrb   r3, [rSELF, #offThread_breakFlags]
18415    adrl   lr, dvmAsmInstructionStart + (153 * 64)
18416    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18417    cmp    r3, #0
18418    bxeq   lr                   @ nothing to do - jump to real handler
18419    EXPORT_PC()
18420    mov    r0, rPC              @ arg0
18421    mov    r1, rFP              @ arg1
18422    mov    r2, rSELF            @ arg2
18423    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18424
18425/* ------------------------------ */
18426    .balign 64
18427.L_ALT_OP_USHR_INT: /* 0x9a */
18428/* File: armv5te/alt_stub.S */
18429/*
18430 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18431 * any interesting requests and then jump to the real instruction
18432 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18433 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18434 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18435 * bail to the real handler if breakFlags==0.
18436 */
18437    ldrb   r3, [rSELF, #offThread_breakFlags]
18438    adrl   lr, dvmAsmInstructionStart + (154 * 64)
18439    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18440    cmp    r3, #0
18441    bxeq   lr                   @ nothing to do - jump to real handler
18442    EXPORT_PC()
18443    mov    r0, rPC              @ arg0
18444    mov    r1, rFP              @ arg1
18445    mov    r2, rSELF            @ arg2
18446    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18447
18448/* ------------------------------ */
18449    .balign 64
18450.L_ALT_OP_ADD_LONG: /* 0x9b */
18451/* File: armv5te/alt_stub.S */
18452/*
18453 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18454 * any interesting requests and then jump to the real instruction
18455 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18456 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18457 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18458 * bail to the real handler if breakFlags==0.
18459 */
18460    ldrb   r3, [rSELF, #offThread_breakFlags]
18461    adrl   lr, dvmAsmInstructionStart + (155 * 64)
18462    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18463    cmp    r3, #0
18464    bxeq   lr                   @ nothing to do - jump to real handler
18465    EXPORT_PC()
18466    mov    r0, rPC              @ arg0
18467    mov    r1, rFP              @ arg1
18468    mov    r2, rSELF            @ arg2
18469    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18470
18471/* ------------------------------ */
18472    .balign 64
18473.L_ALT_OP_SUB_LONG: /* 0x9c */
18474/* File: armv5te/alt_stub.S */
18475/*
18476 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18477 * any interesting requests and then jump to the real instruction
18478 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18479 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18480 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18481 * bail to the real handler if breakFlags==0.
18482 */
18483    ldrb   r3, [rSELF, #offThread_breakFlags]
18484    adrl   lr, dvmAsmInstructionStart + (156 * 64)
18485    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18486    cmp    r3, #0
18487    bxeq   lr                   @ nothing to do - jump to real handler
18488    EXPORT_PC()
18489    mov    r0, rPC              @ arg0
18490    mov    r1, rFP              @ arg1
18491    mov    r2, rSELF            @ arg2
18492    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18493
18494/* ------------------------------ */
18495    .balign 64
18496.L_ALT_OP_MUL_LONG: /* 0x9d */
18497/* File: armv5te/alt_stub.S */
18498/*
18499 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18500 * any interesting requests and then jump to the real instruction
18501 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18502 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18503 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18504 * bail to the real handler if breakFlags==0.
18505 */
18506    ldrb   r3, [rSELF, #offThread_breakFlags]
18507    adrl   lr, dvmAsmInstructionStart + (157 * 64)
18508    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18509    cmp    r3, #0
18510    bxeq   lr                   @ nothing to do - jump to real handler
18511    EXPORT_PC()
18512    mov    r0, rPC              @ arg0
18513    mov    r1, rFP              @ arg1
18514    mov    r2, rSELF            @ arg2
18515    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18516
18517/* ------------------------------ */
18518    .balign 64
18519.L_ALT_OP_DIV_LONG: /* 0x9e */
18520/* File: armv5te/alt_stub.S */
18521/*
18522 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18523 * any interesting requests and then jump to the real instruction
18524 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18525 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18526 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18527 * bail to the real handler if breakFlags==0.
18528 */
18529    ldrb   r3, [rSELF, #offThread_breakFlags]
18530    adrl   lr, dvmAsmInstructionStart + (158 * 64)
18531    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18532    cmp    r3, #0
18533    bxeq   lr                   @ nothing to do - jump to real handler
18534    EXPORT_PC()
18535    mov    r0, rPC              @ arg0
18536    mov    r1, rFP              @ arg1
18537    mov    r2, rSELF            @ arg2
18538    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18539
18540/* ------------------------------ */
18541    .balign 64
18542.L_ALT_OP_REM_LONG: /* 0x9f */
18543/* File: armv5te/alt_stub.S */
18544/*
18545 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18546 * any interesting requests and then jump to the real instruction
18547 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18548 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18549 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18550 * bail to the real handler if breakFlags==0.
18551 */
18552    ldrb   r3, [rSELF, #offThread_breakFlags]
18553    adrl   lr, dvmAsmInstructionStart + (159 * 64)
18554    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18555    cmp    r3, #0
18556    bxeq   lr                   @ nothing to do - jump to real handler
18557    EXPORT_PC()
18558    mov    r0, rPC              @ arg0
18559    mov    r1, rFP              @ arg1
18560    mov    r2, rSELF            @ arg2
18561    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18562
18563/* ------------------------------ */
18564    .balign 64
18565.L_ALT_OP_AND_LONG: /* 0xa0 */
18566/* File: armv5te/alt_stub.S */
18567/*
18568 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18569 * any interesting requests and then jump to the real instruction
18570 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18571 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18572 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18573 * bail to the real handler if breakFlags==0.
18574 */
18575    ldrb   r3, [rSELF, #offThread_breakFlags]
18576    adrl   lr, dvmAsmInstructionStart + (160 * 64)
18577    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18578    cmp    r3, #0
18579    bxeq   lr                   @ nothing to do - jump to real handler
18580    EXPORT_PC()
18581    mov    r0, rPC              @ arg0
18582    mov    r1, rFP              @ arg1
18583    mov    r2, rSELF            @ arg2
18584    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18585
18586/* ------------------------------ */
18587    .balign 64
18588.L_ALT_OP_OR_LONG: /* 0xa1 */
18589/* File: armv5te/alt_stub.S */
18590/*
18591 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18592 * any interesting requests and then jump to the real instruction
18593 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18594 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18595 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18596 * bail to the real handler if breakFlags==0.
18597 */
18598    ldrb   r3, [rSELF, #offThread_breakFlags]
18599    adrl   lr, dvmAsmInstructionStart + (161 * 64)
18600    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18601    cmp    r3, #0
18602    bxeq   lr                   @ nothing to do - jump to real handler
18603    EXPORT_PC()
18604    mov    r0, rPC              @ arg0
18605    mov    r1, rFP              @ arg1
18606    mov    r2, rSELF            @ arg2
18607    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18608
18609/* ------------------------------ */
18610    .balign 64
18611.L_ALT_OP_XOR_LONG: /* 0xa2 */
18612/* File: armv5te/alt_stub.S */
18613/*
18614 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18615 * any interesting requests and then jump to the real instruction
18616 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18617 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18618 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18619 * bail to the real handler if breakFlags==0.
18620 */
18621    ldrb   r3, [rSELF, #offThread_breakFlags]
18622    adrl   lr, dvmAsmInstructionStart + (162 * 64)
18623    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18624    cmp    r3, #0
18625    bxeq   lr                   @ nothing to do - jump to real handler
18626    EXPORT_PC()
18627    mov    r0, rPC              @ arg0
18628    mov    r1, rFP              @ arg1
18629    mov    r2, rSELF            @ arg2
18630    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18631
18632/* ------------------------------ */
18633    .balign 64
18634.L_ALT_OP_SHL_LONG: /* 0xa3 */
18635/* File: armv5te/alt_stub.S */
18636/*
18637 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18638 * any interesting requests and then jump to the real instruction
18639 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18640 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18641 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18642 * bail to the real handler if breakFlags==0.
18643 */
18644    ldrb   r3, [rSELF, #offThread_breakFlags]
18645    adrl   lr, dvmAsmInstructionStart + (163 * 64)
18646    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18647    cmp    r3, #0
18648    bxeq   lr                   @ nothing to do - jump to real handler
18649    EXPORT_PC()
18650    mov    r0, rPC              @ arg0
18651    mov    r1, rFP              @ arg1
18652    mov    r2, rSELF            @ arg2
18653    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18654
18655/* ------------------------------ */
18656    .balign 64
18657.L_ALT_OP_SHR_LONG: /* 0xa4 */
18658/* File: armv5te/alt_stub.S */
18659/*
18660 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18661 * any interesting requests and then jump to the real instruction
18662 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18663 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18664 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18665 * bail to the real handler if breakFlags==0.
18666 */
18667    ldrb   r3, [rSELF, #offThread_breakFlags]
18668    adrl   lr, dvmAsmInstructionStart + (164 * 64)
18669    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18670    cmp    r3, #0
18671    bxeq   lr                   @ nothing to do - jump to real handler
18672    EXPORT_PC()
18673    mov    r0, rPC              @ arg0
18674    mov    r1, rFP              @ arg1
18675    mov    r2, rSELF            @ arg2
18676    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18677
18678/* ------------------------------ */
18679    .balign 64
18680.L_ALT_OP_USHR_LONG: /* 0xa5 */
18681/* File: armv5te/alt_stub.S */
18682/*
18683 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18684 * any interesting requests and then jump to the real instruction
18685 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18686 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18687 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18688 * bail to the real handler if breakFlags==0.
18689 */
18690    ldrb   r3, [rSELF, #offThread_breakFlags]
18691    adrl   lr, dvmAsmInstructionStart + (165 * 64)
18692    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18693    cmp    r3, #0
18694    bxeq   lr                   @ nothing to do - jump to real handler
18695    EXPORT_PC()
18696    mov    r0, rPC              @ arg0
18697    mov    r1, rFP              @ arg1
18698    mov    r2, rSELF            @ arg2
18699    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18700
18701/* ------------------------------ */
18702    .balign 64
18703.L_ALT_OP_ADD_FLOAT: /* 0xa6 */
18704/* File: armv5te/alt_stub.S */
18705/*
18706 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18707 * any interesting requests and then jump to the real instruction
18708 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18709 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18710 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18711 * bail to the real handler if breakFlags==0.
18712 */
18713    ldrb   r3, [rSELF, #offThread_breakFlags]
18714    adrl   lr, dvmAsmInstructionStart + (166 * 64)
18715    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18716    cmp    r3, #0
18717    bxeq   lr                   @ nothing to do - jump to real handler
18718    EXPORT_PC()
18719    mov    r0, rPC              @ arg0
18720    mov    r1, rFP              @ arg1
18721    mov    r2, rSELF            @ arg2
18722    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18723
18724/* ------------------------------ */
18725    .balign 64
18726.L_ALT_OP_SUB_FLOAT: /* 0xa7 */
18727/* File: armv5te/alt_stub.S */
18728/*
18729 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18730 * any interesting requests and then jump to the real instruction
18731 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18732 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18733 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18734 * bail to the real handler if breakFlags==0.
18735 */
18736    ldrb   r3, [rSELF, #offThread_breakFlags]
18737    adrl   lr, dvmAsmInstructionStart + (167 * 64)
18738    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18739    cmp    r3, #0
18740    bxeq   lr                   @ nothing to do - jump to real handler
18741    EXPORT_PC()
18742    mov    r0, rPC              @ arg0
18743    mov    r1, rFP              @ arg1
18744    mov    r2, rSELF            @ arg2
18745    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18746
18747/* ------------------------------ */
18748    .balign 64
18749.L_ALT_OP_MUL_FLOAT: /* 0xa8 */
18750/* File: armv5te/alt_stub.S */
18751/*
18752 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18753 * any interesting requests and then jump to the real instruction
18754 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18755 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18756 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18757 * bail to the real handler if breakFlags==0.
18758 */
18759    ldrb   r3, [rSELF, #offThread_breakFlags]
18760    adrl   lr, dvmAsmInstructionStart + (168 * 64)
18761    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18762    cmp    r3, #0
18763    bxeq   lr                   @ nothing to do - jump to real handler
18764    EXPORT_PC()
18765    mov    r0, rPC              @ arg0
18766    mov    r1, rFP              @ arg1
18767    mov    r2, rSELF            @ arg2
18768    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18769
18770/* ------------------------------ */
18771    .balign 64
18772.L_ALT_OP_DIV_FLOAT: /* 0xa9 */
18773/* File: armv5te/alt_stub.S */
18774/*
18775 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18776 * any interesting requests and then jump to the real instruction
18777 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18778 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18779 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18780 * bail to the real handler if breakFlags==0.
18781 */
18782    ldrb   r3, [rSELF, #offThread_breakFlags]
18783    adrl   lr, dvmAsmInstructionStart + (169 * 64)
18784    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18785    cmp    r3, #0
18786    bxeq   lr                   @ nothing to do - jump to real handler
18787    EXPORT_PC()
18788    mov    r0, rPC              @ arg0
18789    mov    r1, rFP              @ arg1
18790    mov    r2, rSELF            @ arg2
18791    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18792
18793/* ------------------------------ */
18794    .balign 64
18795.L_ALT_OP_REM_FLOAT: /* 0xaa */
18796/* File: armv5te/alt_stub.S */
18797/*
18798 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18799 * any interesting requests and then jump to the real instruction
18800 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18801 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18802 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18803 * bail to the real handler if breakFlags==0.
18804 */
18805    ldrb   r3, [rSELF, #offThread_breakFlags]
18806    adrl   lr, dvmAsmInstructionStart + (170 * 64)
18807    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18808    cmp    r3, #0
18809    bxeq   lr                   @ nothing to do - jump to real handler
18810    EXPORT_PC()
18811    mov    r0, rPC              @ arg0
18812    mov    r1, rFP              @ arg1
18813    mov    r2, rSELF            @ arg2
18814    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18815
18816/* ------------------------------ */
18817    .balign 64
18818.L_ALT_OP_ADD_DOUBLE: /* 0xab */
18819/* File: armv5te/alt_stub.S */
18820/*
18821 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18822 * any interesting requests and then jump to the real instruction
18823 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18824 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18825 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18826 * bail to the real handler if breakFlags==0.
18827 */
18828    ldrb   r3, [rSELF, #offThread_breakFlags]
18829    adrl   lr, dvmAsmInstructionStart + (171 * 64)
18830    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18831    cmp    r3, #0
18832    bxeq   lr                   @ nothing to do - jump to real handler
18833    EXPORT_PC()
18834    mov    r0, rPC              @ arg0
18835    mov    r1, rFP              @ arg1
18836    mov    r2, rSELF            @ arg2
18837    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18838
18839/* ------------------------------ */
18840    .balign 64
18841.L_ALT_OP_SUB_DOUBLE: /* 0xac */
18842/* File: armv5te/alt_stub.S */
18843/*
18844 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18845 * any interesting requests and then jump to the real instruction
18846 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18847 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18848 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18849 * bail to the real handler if breakFlags==0.
18850 */
18851    ldrb   r3, [rSELF, #offThread_breakFlags]
18852    adrl   lr, dvmAsmInstructionStart + (172 * 64)
18853    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18854    cmp    r3, #0
18855    bxeq   lr                   @ nothing to do - jump to real handler
18856    EXPORT_PC()
18857    mov    r0, rPC              @ arg0
18858    mov    r1, rFP              @ arg1
18859    mov    r2, rSELF            @ arg2
18860    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18861
18862/* ------------------------------ */
18863    .balign 64
18864.L_ALT_OP_MUL_DOUBLE: /* 0xad */
18865/* File: armv5te/alt_stub.S */
18866/*
18867 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18868 * any interesting requests and then jump to the real instruction
18869 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18870 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18871 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18872 * bail to the real handler if breakFlags==0.
18873 */
18874    ldrb   r3, [rSELF, #offThread_breakFlags]
18875    adrl   lr, dvmAsmInstructionStart + (173 * 64)
18876    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18877    cmp    r3, #0
18878    bxeq   lr                   @ nothing to do - jump to real handler
18879    EXPORT_PC()
18880    mov    r0, rPC              @ arg0
18881    mov    r1, rFP              @ arg1
18882    mov    r2, rSELF            @ arg2
18883    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18884
18885/* ------------------------------ */
18886    .balign 64
18887.L_ALT_OP_DIV_DOUBLE: /* 0xae */
18888/* File: armv5te/alt_stub.S */
18889/*
18890 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18891 * any interesting requests and then jump to the real instruction
18892 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18893 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18894 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18895 * bail to the real handler if breakFlags==0.
18896 */
18897    ldrb   r3, [rSELF, #offThread_breakFlags]
18898    adrl   lr, dvmAsmInstructionStart + (174 * 64)
18899    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18900    cmp    r3, #0
18901    bxeq   lr                   @ nothing to do - jump to real handler
18902    EXPORT_PC()
18903    mov    r0, rPC              @ arg0
18904    mov    r1, rFP              @ arg1
18905    mov    r2, rSELF            @ arg2
18906    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18907
18908/* ------------------------------ */
18909    .balign 64
18910.L_ALT_OP_REM_DOUBLE: /* 0xaf */
18911/* File: armv5te/alt_stub.S */
18912/*
18913 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18914 * any interesting requests and then jump to the real instruction
18915 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18916 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18917 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18918 * bail to the real handler if breakFlags==0.
18919 */
18920    ldrb   r3, [rSELF, #offThread_breakFlags]
18921    adrl   lr, dvmAsmInstructionStart + (175 * 64)
18922    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18923    cmp    r3, #0
18924    bxeq   lr                   @ nothing to do - jump to real handler
18925    EXPORT_PC()
18926    mov    r0, rPC              @ arg0
18927    mov    r1, rFP              @ arg1
18928    mov    r2, rSELF            @ arg2
18929    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18930
18931/* ------------------------------ */
18932    .balign 64
18933.L_ALT_OP_ADD_INT_2ADDR: /* 0xb0 */
18934/* File: armv5te/alt_stub.S */
18935/*
18936 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18937 * any interesting requests and then jump to the real instruction
18938 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18939 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18940 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18941 * bail to the real handler if breakFlags==0.
18942 */
18943    ldrb   r3, [rSELF, #offThread_breakFlags]
18944    adrl   lr, dvmAsmInstructionStart + (176 * 64)
18945    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18946    cmp    r3, #0
18947    bxeq   lr                   @ nothing to do - jump to real handler
18948    EXPORT_PC()
18949    mov    r0, rPC              @ arg0
18950    mov    r1, rFP              @ arg1
18951    mov    r2, rSELF            @ arg2
18952    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18953
18954/* ------------------------------ */
18955    .balign 64
18956.L_ALT_OP_SUB_INT_2ADDR: /* 0xb1 */
18957/* File: armv5te/alt_stub.S */
18958/*
18959 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18960 * any interesting requests and then jump to the real instruction
18961 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18962 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18963 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18964 * bail to the real handler if breakFlags==0.
18965 */
18966    ldrb   r3, [rSELF, #offThread_breakFlags]
18967    adrl   lr, dvmAsmInstructionStart + (177 * 64)
18968    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18969    cmp    r3, #0
18970    bxeq   lr                   @ nothing to do - jump to real handler
18971    EXPORT_PC()
18972    mov    r0, rPC              @ arg0
18973    mov    r1, rFP              @ arg1
18974    mov    r2, rSELF            @ arg2
18975    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18976
18977/* ------------------------------ */
18978    .balign 64
18979.L_ALT_OP_MUL_INT_2ADDR: /* 0xb2 */
18980/* File: armv5te/alt_stub.S */
18981/*
18982 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18983 * any interesting requests and then jump to the real instruction
18984 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18985 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18986 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18987 * bail to the real handler if breakFlags==0.
18988 */
18989    ldrb   r3, [rSELF, #offThread_breakFlags]
18990    adrl   lr, dvmAsmInstructionStart + (178 * 64)
18991    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18992    cmp    r3, #0
18993    bxeq   lr                   @ nothing to do - jump to real handler
18994    EXPORT_PC()
18995    mov    r0, rPC              @ arg0
18996    mov    r1, rFP              @ arg1
18997    mov    r2, rSELF            @ arg2
18998    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18999
19000/* ------------------------------ */
19001    .balign 64
19002.L_ALT_OP_DIV_INT_2ADDR: /* 0xb3 */
19003/* File: armv5te/alt_stub.S */
19004/*
19005 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19006 * any interesting requests and then jump to the real instruction
19007 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19008 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19009 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19010 * bail to the real handler if breakFlags==0.
19011 */
19012    ldrb   r3, [rSELF, #offThread_breakFlags]
19013    adrl   lr, dvmAsmInstructionStart + (179 * 64)
19014    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19015    cmp    r3, #0
19016    bxeq   lr                   @ nothing to do - jump to real handler
19017    EXPORT_PC()
19018    mov    r0, rPC              @ arg0
19019    mov    r1, rFP              @ arg1
19020    mov    r2, rSELF            @ arg2
19021    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19022
19023/* ------------------------------ */
19024    .balign 64
19025.L_ALT_OP_REM_INT_2ADDR: /* 0xb4 */
19026/* File: armv5te/alt_stub.S */
19027/*
19028 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19029 * any interesting requests and then jump to the real instruction
19030 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19031 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19032 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19033 * bail to the real handler if breakFlags==0.
19034 */
19035    ldrb   r3, [rSELF, #offThread_breakFlags]
19036    adrl   lr, dvmAsmInstructionStart + (180 * 64)
19037    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19038    cmp    r3, #0
19039    bxeq   lr                   @ nothing to do - jump to real handler
19040    EXPORT_PC()
19041    mov    r0, rPC              @ arg0
19042    mov    r1, rFP              @ arg1
19043    mov    r2, rSELF            @ arg2
19044    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19045
19046/* ------------------------------ */
19047    .balign 64
19048.L_ALT_OP_AND_INT_2ADDR: /* 0xb5 */
19049/* File: armv5te/alt_stub.S */
19050/*
19051 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19052 * any interesting requests and then jump to the real instruction
19053 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19054 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19055 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19056 * bail to the real handler if breakFlags==0.
19057 */
19058    ldrb   r3, [rSELF, #offThread_breakFlags]
19059    adrl   lr, dvmAsmInstructionStart + (181 * 64)
19060    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19061    cmp    r3, #0
19062    bxeq   lr                   @ nothing to do - jump to real handler
19063    EXPORT_PC()
19064    mov    r0, rPC              @ arg0
19065    mov    r1, rFP              @ arg1
19066    mov    r2, rSELF            @ arg2
19067    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19068
19069/* ------------------------------ */
19070    .balign 64
19071.L_ALT_OP_OR_INT_2ADDR: /* 0xb6 */
19072/* File: armv5te/alt_stub.S */
19073/*
19074 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19075 * any interesting requests and then jump to the real instruction
19076 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19077 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19078 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19079 * bail to the real handler if breakFlags==0.
19080 */
19081    ldrb   r3, [rSELF, #offThread_breakFlags]
19082    adrl   lr, dvmAsmInstructionStart + (182 * 64)
19083    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19084    cmp    r3, #0
19085    bxeq   lr                   @ nothing to do - jump to real handler
19086    EXPORT_PC()
19087    mov    r0, rPC              @ arg0
19088    mov    r1, rFP              @ arg1
19089    mov    r2, rSELF            @ arg2
19090    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19091
19092/* ------------------------------ */
19093    .balign 64
19094.L_ALT_OP_XOR_INT_2ADDR: /* 0xb7 */
19095/* File: armv5te/alt_stub.S */
19096/*
19097 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19098 * any interesting requests and then jump to the real instruction
19099 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19100 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19101 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19102 * bail to the real handler if breakFlags==0.
19103 */
19104    ldrb   r3, [rSELF, #offThread_breakFlags]
19105    adrl   lr, dvmAsmInstructionStart + (183 * 64)
19106    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19107    cmp    r3, #0
19108    bxeq   lr                   @ nothing to do - jump to real handler
19109    EXPORT_PC()
19110    mov    r0, rPC              @ arg0
19111    mov    r1, rFP              @ arg1
19112    mov    r2, rSELF            @ arg2
19113    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19114
19115/* ------------------------------ */
19116    .balign 64
19117.L_ALT_OP_SHL_INT_2ADDR: /* 0xb8 */
19118/* File: armv5te/alt_stub.S */
19119/*
19120 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19121 * any interesting requests and then jump to the real instruction
19122 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19123 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19124 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19125 * bail to the real handler if breakFlags==0.
19126 */
19127    ldrb   r3, [rSELF, #offThread_breakFlags]
19128    adrl   lr, dvmAsmInstructionStart + (184 * 64)
19129    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19130    cmp    r3, #0
19131    bxeq   lr                   @ nothing to do - jump to real handler
19132    EXPORT_PC()
19133    mov    r0, rPC              @ arg0
19134    mov    r1, rFP              @ arg1
19135    mov    r2, rSELF            @ arg2
19136    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19137
19138/* ------------------------------ */
19139    .balign 64
19140.L_ALT_OP_SHR_INT_2ADDR: /* 0xb9 */
19141/* File: armv5te/alt_stub.S */
19142/*
19143 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19144 * any interesting requests and then jump to the real instruction
19145 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19146 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19147 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19148 * bail to the real handler if breakFlags==0.
19149 */
19150    ldrb   r3, [rSELF, #offThread_breakFlags]
19151    adrl   lr, dvmAsmInstructionStart + (185 * 64)
19152    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19153    cmp    r3, #0
19154    bxeq   lr                   @ nothing to do - jump to real handler
19155    EXPORT_PC()
19156    mov    r0, rPC              @ arg0
19157    mov    r1, rFP              @ arg1
19158    mov    r2, rSELF            @ arg2
19159    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19160
19161/* ------------------------------ */
19162    .balign 64
19163.L_ALT_OP_USHR_INT_2ADDR: /* 0xba */
19164/* File: armv5te/alt_stub.S */
19165/*
19166 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19167 * any interesting requests and then jump to the real instruction
19168 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19169 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19170 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19171 * bail to the real handler if breakFlags==0.
19172 */
19173    ldrb   r3, [rSELF, #offThread_breakFlags]
19174    adrl   lr, dvmAsmInstructionStart + (186 * 64)
19175    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19176    cmp    r3, #0
19177    bxeq   lr                   @ nothing to do - jump to real handler
19178    EXPORT_PC()
19179    mov    r0, rPC              @ arg0
19180    mov    r1, rFP              @ arg1
19181    mov    r2, rSELF            @ arg2
19182    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19183
19184/* ------------------------------ */
19185    .balign 64
19186.L_ALT_OP_ADD_LONG_2ADDR: /* 0xbb */
19187/* File: armv5te/alt_stub.S */
19188/*
19189 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19190 * any interesting requests and then jump to the real instruction
19191 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19192 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19193 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19194 * bail to the real handler if breakFlags==0.
19195 */
19196    ldrb   r3, [rSELF, #offThread_breakFlags]
19197    adrl   lr, dvmAsmInstructionStart + (187 * 64)
19198    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19199    cmp    r3, #0
19200    bxeq   lr                   @ nothing to do - jump to real handler
19201    EXPORT_PC()
19202    mov    r0, rPC              @ arg0
19203    mov    r1, rFP              @ arg1
19204    mov    r2, rSELF            @ arg2
19205    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19206
19207/* ------------------------------ */
19208    .balign 64
19209.L_ALT_OP_SUB_LONG_2ADDR: /* 0xbc */
19210/* File: armv5te/alt_stub.S */
19211/*
19212 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19213 * any interesting requests and then jump to the real instruction
19214 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19215 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19216 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19217 * bail to the real handler if breakFlags==0.
19218 */
19219    ldrb   r3, [rSELF, #offThread_breakFlags]
19220    adrl   lr, dvmAsmInstructionStart + (188 * 64)
19221    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19222    cmp    r3, #0
19223    bxeq   lr                   @ nothing to do - jump to real handler
19224    EXPORT_PC()
19225    mov    r0, rPC              @ arg0
19226    mov    r1, rFP              @ arg1
19227    mov    r2, rSELF            @ arg2
19228    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19229
19230/* ------------------------------ */
19231    .balign 64
19232.L_ALT_OP_MUL_LONG_2ADDR: /* 0xbd */
19233/* File: armv5te/alt_stub.S */
19234/*
19235 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19236 * any interesting requests and then jump to the real instruction
19237 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19238 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19239 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19240 * bail to the real handler if breakFlags==0.
19241 */
19242    ldrb   r3, [rSELF, #offThread_breakFlags]
19243    adrl   lr, dvmAsmInstructionStart + (189 * 64)
19244    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19245    cmp    r3, #0
19246    bxeq   lr                   @ nothing to do - jump to real handler
19247    EXPORT_PC()
19248    mov    r0, rPC              @ arg0
19249    mov    r1, rFP              @ arg1
19250    mov    r2, rSELF            @ arg2
19251    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19252
19253/* ------------------------------ */
19254    .balign 64
19255.L_ALT_OP_DIV_LONG_2ADDR: /* 0xbe */
19256/* File: armv5te/alt_stub.S */
19257/*
19258 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19259 * any interesting requests and then jump to the real instruction
19260 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19261 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19262 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19263 * bail to the real handler if breakFlags==0.
19264 */
19265    ldrb   r3, [rSELF, #offThread_breakFlags]
19266    adrl   lr, dvmAsmInstructionStart + (190 * 64)
19267    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19268    cmp    r3, #0
19269    bxeq   lr                   @ nothing to do - jump to real handler
19270    EXPORT_PC()
19271    mov    r0, rPC              @ arg0
19272    mov    r1, rFP              @ arg1
19273    mov    r2, rSELF            @ arg2
19274    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19275
19276/* ------------------------------ */
19277    .balign 64
19278.L_ALT_OP_REM_LONG_2ADDR: /* 0xbf */
19279/* File: armv5te/alt_stub.S */
19280/*
19281 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19282 * any interesting requests and then jump to the real instruction
19283 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19284 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19285 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19286 * bail to the real handler if breakFlags==0.
19287 */
19288    ldrb   r3, [rSELF, #offThread_breakFlags]
19289    adrl   lr, dvmAsmInstructionStart + (191 * 64)
19290    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19291    cmp    r3, #0
19292    bxeq   lr                   @ nothing to do - jump to real handler
19293    EXPORT_PC()
19294    mov    r0, rPC              @ arg0
19295    mov    r1, rFP              @ arg1
19296    mov    r2, rSELF            @ arg2
19297    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19298
19299/* ------------------------------ */
19300    .balign 64
19301.L_ALT_OP_AND_LONG_2ADDR: /* 0xc0 */
19302/* File: armv5te/alt_stub.S */
19303/*
19304 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19305 * any interesting requests and then jump to the real instruction
19306 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19307 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19308 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19309 * bail to the real handler if breakFlags==0.
19310 */
19311    ldrb   r3, [rSELF, #offThread_breakFlags]
19312    adrl   lr, dvmAsmInstructionStart + (192 * 64)
19313    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19314    cmp    r3, #0
19315    bxeq   lr                   @ nothing to do - jump to real handler
19316    EXPORT_PC()
19317    mov    r0, rPC              @ arg0
19318    mov    r1, rFP              @ arg1
19319    mov    r2, rSELF            @ arg2
19320    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19321
19322/* ------------------------------ */
19323    .balign 64
19324.L_ALT_OP_OR_LONG_2ADDR: /* 0xc1 */
19325/* File: armv5te/alt_stub.S */
19326/*
19327 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19328 * any interesting requests and then jump to the real instruction
19329 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19330 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19331 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19332 * bail to the real handler if breakFlags==0.
19333 */
19334    ldrb   r3, [rSELF, #offThread_breakFlags]
19335    adrl   lr, dvmAsmInstructionStart + (193 * 64)
19336    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19337    cmp    r3, #0
19338    bxeq   lr                   @ nothing to do - jump to real handler
19339    EXPORT_PC()
19340    mov    r0, rPC              @ arg0
19341    mov    r1, rFP              @ arg1
19342    mov    r2, rSELF            @ arg2
19343    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19344
19345/* ------------------------------ */
19346    .balign 64
19347.L_ALT_OP_XOR_LONG_2ADDR: /* 0xc2 */
19348/* File: armv5te/alt_stub.S */
19349/*
19350 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19351 * any interesting requests and then jump to the real instruction
19352 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19353 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19354 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19355 * bail to the real handler if breakFlags==0.
19356 */
19357    ldrb   r3, [rSELF, #offThread_breakFlags]
19358    adrl   lr, dvmAsmInstructionStart + (194 * 64)
19359    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19360    cmp    r3, #0
19361    bxeq   lr                   @ nothing to do - jump to real handler
19362    EXPORT_PC()
19363    mov    r0, rPC              @ arg0
19364    mov    r1, rFP              @ arg1
19365    mov    r2, rSELF            @ arg2
19366    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19367
19368/* ------------------------------ */
19369    .balign 64
19370.L_ALT_OP_SHL_LONG_2ADDR: /* 0xc3 */
19371/* File: armv5te/alt_stub.S */
19372/*
19373 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19374 * any interesting requests and then jump to the real instruction
19375 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19376 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19377 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19378 * bail to the real handler if breakFlags==0.
19379 */
19380    ldrb   r3, [rSELF, #offThread_breakFlags]
19381    adrl   lr, dvmAsmInstructionStart + (195 * 64)
19382    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19383    cmp    r3, #0
19384    bxeq   lr                   @ nothing to do - jump to real handler
19385    EXPORT_PC()
19386    mov    r0, rPC              @ arg0
19387    mov    r1, rFP              @ arg1
19388    mov    r2, rSELF            @ arg2
19389    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19390
19391/* ------------------------------ */
19392    .balign 64
19393.L_ALT_OP_SHR_LONG_2ADDR: /* 0xc4 */
19394/* File: armv5te/alt_stub.S */
19395/*
19396 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19397 * any interesting requests and then jump to the real instruction
19398 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19399 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19400 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19401 * bail to the real handler if breakFlags==0.
19402 */
19403    ldrb   r3, [rSELF, #offThread_breakFlags]
19404    adrl   lr, dvmAsmInstructionStart + (196 * 64)
19405    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19406    cmp    r3, #0
19407    bxeq   lr                   @ nothing to do - jump to real handler
19408    EXPORT_PC()
19409    mov    r0, rPC              @ arg0
19410    mov    r1, rFP              @ arg1
19411    mov    r2, rSELF            @ arg2
19412    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19413
19414/* ------------------------------ */
19415    .balign 64
19416.L_ALT_OP_USHR_LONG_2ADDR: /* 0xc5 */
19417/* File: armv5te/alt_stub.S */
19418/*
19419 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19420 * any interesting requests and then jump to the real instruction
19421 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19422 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19423 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19424 * bail to the real handler if breakFlags==0.
19425 */
19426    ldrb   r3, [rSELF, #offThread_breakFlags]
19427    adrl   lr, dvmAsmInstructionStart + (197 * 64)
19428    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19429    cmp    r3, #0
19430    bxeq   lr                   @ nothing to do - jump to real handler
19431    EXPORT_PC()
19432    mov    r0, rPC              @ arg0
19433    mov    r1, rFP              @ arg1
19434    mov    r2, rSELF            @ arg2
19435    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19436
19437/* ------------------------------ */
19438    .balign 64
19439.L_ALT_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
19440/* File: armv5te/alt_stub.S */
19441/*
19442 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19443 * any interesting requests and then jump to the real instruction
19444 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19445 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19446 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19447 * bail to the real handler if breakFlags==0.
19448 */
19449    ldrb   r3, [rSELF, #offThread_breakFlags]
19450    adrl   lr, dvmAsmInstructionStart + (198 * 64)
19451    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19452    cmp    r3, #0
19453    bxeq   lr                   @ nothing to do - jump to real handler
19454    EXPORT_PC()
19455    mov    r0, rPC              @ arg0
19456    mov    r1, rFP              @ arg1
19457    mov    r2, rSELF            @ arg2
19458    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19459
19460/* ------------------------------ */
19461    .balign 64
19462.L_ALT_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
19463/* File: armv5te/alt_stub.S */
19464/*
19465 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19466 * any interesting requests and then jump to the real instruction
19467 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19468 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19469 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19470 * bail to the real handler if breakFlags==0.
19471 */
19472    ldrb   r3, [rSELF, #offThread_breakFlags]
19473    adrl   lr, dvmAsmInstructionStart + (199 * 64)
19474    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19475    cmp    r3, #0
19476    bxeq   lr                   @ nothing to do - jump to real handler
19477    EXPORT_PC()
19478    mov    r0, rPC              @ arg0
19479    mov    r1, rFP              @ arg1
19480    mov    r2, rSELF            @ arg2
19481    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19482
19483/* ------------------------------ */
19484    .balign 64
19485.L_ALT_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
19486/* File: armv5te/alt_stub.S */
19487/*
19488 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19489 * any interesting requests and then jump to the real instruction
19490 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19491 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19492 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19493 * bail to the real handler if breakFlags==0.
19494 */
19495    ldrb   r3, [rSELF, #offThread_breakFlags]
19496    adrl   lr, dvmAsmInstructionStart + (200 * 64)
19497    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19498    cmp    r3, #0
19499    bxeq   lr                   @ nothing to do - jump to real handler
19500    EXPORT_PC()
19501    mov    r0, rPC              @ arg0
19502    mov    r1, rFP              @ arg1
19503    mov    r2, rSELF            @ arg2
19504    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19505
19506/* ------------------------------ */
19507    .balign 64
19508.L_ALT_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
19509/* File: armv5te/alt_stub.S */
19510/*
19511 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19512 * any interesting requests and then jump to the real instruction
19513 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19514 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19515 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19516 * bail to the real handler if breakFlags==0.
19517 */
19518    ldrb   r3, [rSELF, #offThread_breakFlags]
19519    adrl   lr, dvmAsmInstructionStart + (201 * 64)
19520    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19521    cmp    r3, #0
19522    bxeq   lr                   @ nothing to do - jump to real handler
19523    EXPORT_PC()
19524    mov    r0, rPC              @ arg0
19525    mov    r1, rFP              @ arg1
19526    mov    r2, rSELF            @ arg2
19527    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19528
19529/* ------------------------------ */
19530    .balign 64
19531.L_ALT_OP_REM_FLOAT_2ADDR: /* 0xca */
19532/* File: armv5te/alt_stub.S */
19533/*
19534 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19535 * any interesting requests and then jump to the real instruction
19536 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19537 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19538 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19539 * bail to the real handler if breakFlags==0.
19540 */
19541    ldrb   r3, [rSELF, #offThread_breakFlags]
19542    adrl   lr, dvmAsmInstructionStart + (202 * 64)
19543    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19544    cmp    r3, #0
19545    bxeq   lr                   @ nothing to do - jump to real handler
19546    EXPORT_PC()
19547    mov    r0, rPC              @ arg0
19548    mov    r1, rFP              @ arg1
19549    mov    r2, rSELF            @ arg2
19550    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19551
19552/* ------------------------------ */
19553    .balign 64
19554.L_ALT_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
19555/* File: armv5te/alt_stub.S */
19556/*
19557 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19558 * any interesting requests and then jump to the real instruction
19559 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19560 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19561 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19562 * bail to the real handler if breakFlags==0.
19563 */
19564    ldrb   r3, [rSELF, #offThread_breakFlags]
19565    adrl   lr, dvmAsmInstructionStart + (203 * 64)
19566    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19567    cmp    r3, #0
19568    bxeq   lr                   @ nothing to do - jump to real handler
19569    EXPORT_PC()
19570    mov    r0, rPC              @ arg0
19571    mov    r1, rFP              @ arg1
19572    mov    r2, rSELF            @ arg2
19573    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19574
19575/* ------------------------------ */
19576    .balign 64
19577.L_ALT_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
19578/* File: armv5te/alt_stub.S */
19579/*
19580 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19581 * any interesting requests and then jump to the real instruction
19582 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19583 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19584 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19585 * bail to the real handler if breakFlags==0.
19586 */
19587    ldrb   r3, [rSELF, #offThread_breakFlags]
19588    adrl   lr, dvmAsmInstructionStart + (204 * 64)
19589    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19590    cmp    r3, #0
19591    bxeq   lr                   @ nothing to do - jump to real handler
19592    EXPORT_PC()
19593    mov    r0, rPC              @ arg0
19594    mov    r1, rFP              @ arg1
19595    mov    r2, rSELF            @ arg2
19596    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19597
19598/* ------------------------------ */
19599    .balign 64
19600.L_ALT_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
19601/* File: armv5te/alt_stub.S */
19602/*
19603 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19604 * any interesting requests and then jump to the real instruction
19605 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19606 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19607 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19608 * bail to the real handler if breakFlags==0.
19609 */
19610    ldrb   r3, [rSELF, #offThread_breakFlags]
19611    adrl   lr, dvmAsmInstructionStart + (205 * 64)
19612    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19613    cmp    r3, #0
19614    bxeq   lr                   @ nothing to do - jump to real handler
19615    EXPORT_PC()
19616    mov    r0, rPC              @ arg0
19617    mov    r1, rFP              @ arg1
19618    mov    r2, rSELF            @ arg2
19619    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19620
19621/* ------------------------------ */
19622    .balign 64
19623.L_ALT_OP_DIV_DOUBLE_2ADDR: /* 0xce */
19624/* File: armv5te/alt_stub.S */
19625/*
19626 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19627 * any interesting requests and then jump to the real instruction
19628 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19629 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19630 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19631 * bail to the real handler if breakFlags==0.
19632 */
19633    ldrb   r3, [rSELF, #offThread_breakFlags]
19634    adrl   lr, dvmAsmInstructionStart + (206 * 64)
19635    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19636    cmp    r3, #0
19637    bxeq   lr                   @ nothing to do - jump to real handler
19638    EXPORT_PC()
19639    mov    r0, rPC              @ arg0
19640    mov    r1, rFP              @ arg1
19641    mov    r2, rSELF            @ arg2
19642    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19643
19644/* ------------------------------ */
19645    .balign 64
19646.L_ALT_OP_REM_DOUBLE_2ADDR: /* 0xcf */
19647/* File: armv5te/alt_stub.S */
19648/*
19649 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19650 * any interesting requests and then jump to the real instruction
19651 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19652 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19653 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19654 * bail to the real handler if breakFlags==0.
19655 */
19656    ldrb   r3, [rSELF, #offThread_breakFlags]
19657    adrl   lr, dvmAsmInstructionStart + (207 * 64)
19658    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19659    cmp    r3, #0
19660    bxeq   lr                   @ nothing to do - jump to real handler
19661    EXPORT_PC()
19662    mov    r0, rPC              @ arg0
19663    mov    r1, rFP              @ arg1
19664    mov    r2, rSELF            @ arg2
19665    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19666
19667/* ------------------------------ */
19668    .balign 64
19669.L_ALT_OP_ADD_INT_LIT16: /* 0xd0 */
19670/* File: armv5te/alt_stub.S */
19671/*
19672 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19673 * any interesting requests and then jump to the real instruction
19674 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19675 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19676 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19677 * bail to the real handler if breakFlags==0.
19678 */
19679    ldrb   r3, [rSELF, #offThread_breakFlags]
19680    adrl   lr, dvmAsmInstructionStart + (208 * 64)
19681    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19682    cmp    r3, #0
19683    bxeq   lr                   @ nothing to do - jump to real handler
19684    EXPORT_PC()
19685    mov    r0, rPC              @ arg0
19686    mov    r1, rFP              @ arg1
19687    mov    r2, rSELF            @ arg2
19688    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19689
19690/* ------------------------------ */
19691    .balign 64
19692.L_ALT_OP_RSUB_INT: /* 0xd1 */
19693/* File: armv5te/alt_stub.S */
19694/*
19695 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19696 * any interesting requests and then jump to the real instruction
19697 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19698 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19699 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19700 * bail to the real handler if breakFlags==0.
19701 */
19702    ldrb   r3, [rSELF, #offThread_breakFlags]
19703    adrl   lr, dvmAsmInstructionStart + (209 * 64)
19704    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19705    cmp    r3, #0
19706    bxeq   lr                   @ nothing to do - jump to real handler
19707    EXPORT_PC()
19708    mov    r0, rPC              @ arg0
19709    mov    r1, rFP              @ arg1
19710    mov    r2, rSELF            @ arg2
19711    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19712
19713/* ------------------------------ */
19714    .balign 64
19715.L_ALT_OP_MUL_INT_LIT16: /* 0xd2 */
19716/* File: armv5te/alt_stub.S */
19717/*
19718 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19719 * any interesting requests and then jump to the real instruction
19720 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19721 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19722 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19723 * bail to the real handler if breakFlags==0.
19724 */
19725    ldrb   r3, [rSELF, #offThread_breakFlags]
19726    adrl   lr, dvmAsmInstructionStart + (210 * 64)
19727    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19728    cmp    r3, #0
19729    bxeq   lr                   @ nothing to do - jump to real handler
19730    EXPORT_PC()
19731    mov    r0, rPC              @ arg0
19732    mov    r1, rFP              @ arg1
19733    mov    r2, rSELF            @ arg2
19734    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19735
19736/* ------------------------------ */
19737    .balign 64
19738.L_ALT_OP_DIV_INT_LIT16: /* 0xd3 */
19739/* File: armv5te/alt_stub.S */
19740/*
19741 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19742 * any interesting requests and then jump to the real instruction
19743 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19744 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19745 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19746 * bail to the real handler if breakFlags==0.
19747 */
19748    ldrb   r3, [rSELF, #offThread_breakFlags]
19749    adrl   lr, dvmAsmInstructionStart + (211 * 64)
19750    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19751    cmp    r3, #0
19752    bxeq   lr                   @ nothing to do - jump to real handler
19753    EXPORT_PC()
19754    mov    r0, rPC              @ arg0
19755    mov    r1, rFP              @ arg1
19756    mov    r2, rSELF            @ arg2
19757    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19758
19759/* ------------------------------ */
19760    .balign 64
19761.L_ALT_OP_REM_INT_LIT16: /* 0xd4 */
19762/* File: armv5te/alt_stub.S */
19763/*
19764 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19765 * any interesting requests and then jump to the real instruction
19766 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19767 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19768 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19769 * bail to the real handler if breakFlags==0.
19770 */
19771    ldrb   r3, [rSELF, #offThread_breakFlags]
19772    adrl   lr, dvmAsmInstructionStart + (212 * 64)
19773    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19774    cmp    r3, #0
19775    bxeq   lr                   @ nothing to do - jump to real handler
19776    EXPORT_PC()
19777    mov    r0, rPC              @ arg0
19778    mov    r1, rFP              @ arg1
19779    mov    r2, rSELF            @ arg2
19780    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19781
19782/* ------------------------------ */
19783    .balign 64
19784.L_ALT_OP_AND_INT_LIT16: /* 0xd5 */
19785/* File: armv5te/alt_stub.S */
19786/*
19787 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19788 * any interesting requests and then jump to the real instruction
19789 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19790 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19791 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19792 * bail to the real handler if breakFlags==0.
19793 */
19794    ldrb   r3, [rSELF, #offThread_breakFlags]
19795    adrl   lr, dvmAsmInstructionStart + (213 * 64)
19796    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19797    cmp    r3, #0
19798    bxeq   lr                   @ nothing to do - jump to real handler
19799    EXPORT_PC()
19800    mov    r0, rPC              @ arg0
19801    mov    r1, rFP              @ arg1
19802    mov    r2, rSELF            @ arg2
19803    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19804
19805/* ------------------------------ */
19806    .balign 64
19807.L_ALT_OP_OR_INT_LIT16: /* 0xd6 */
19808/* File: armv5te/alt_stub.S */
19809/*
19810 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19811 * any interesting requests and then jump to the real instruction
19812 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19813 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19814 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19815 * bail to the real handler if breakFlags==0.
19816 */
19817    ldrb   r3, [rSELF, #offThread_breakFlags]
19818    adrl   lr, dvmAsmInstructionStart + (214 * 64)
19819    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19820    cmp    r3, #0
19821    bxeq   lr                   @ nothing to do - jump to real handler
19822    EXPORT_PC()
19823    mov    r0, rPC              @ arg0
19824    mov    r1, rFP              @ arg1
19825    mov    r2, rSELF            @ arg2
19826    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19827
19828/* ------------------------------ */
19829    .balign 64
19830.L_ALT_OP_XOR_INT_LIT16: /* 0xd7 */
19831/* File: armv5te/alt_stub.S */
19832/*
19833 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19834 * any interesting requests and then jump to the real instruction
19835 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19836 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19837 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19838 * bail to the real handler if breakFlags==0.
19839 */
19840    ldrb   r3, [rSELF, #offThread_breakFlags]
19841    adrl   lr, dvmAsmInstructionStart + (215 * 64)
19842    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19843    cmp    r3, #0
19844    bxeq   lr                   @ nothing to do - jump to real handler
19845    EXPORT_PC()
19846    mov    r0, rPC              @ arg0
19847    mov    r1, rFP              @ arg1
19848    mov    r2, rSELF            @ arg2
19849    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19850
19851/* ------------------------------ */
19852    .balign 64
19853.L_ALT_OP_ADD_INT_LIT8: /* 0xd8 */
19854/* File: armv5te/alt_stub.S */
19855/*
19856 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19857 * any interesting requests and then jump to the real instruction
19858 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19859 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19860 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19861 * bail to the real handler if breakFlags==0.
19862 */
19863    ldrb   r3, [rSELF, #offThread_breakFlags]
19864    adrl   lr, dvmAsmInstructionStart + (216 * 64)
19865    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19866    cmp    r3, #0
19867    bxeq   lr                   @ nothing to do - jump to real handler
19868    EXPORT_PC()
19869    mov    r0, rPC              @ arg0
19870    mov    r1, rFP              @ arg1
19871    mov    r2, rSELF            @ arg2
19872    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19873
19874/* ------------------------------ */
19875    .balign 64
19876.L_ALT_OP_RSUB_INT_LIT8: /* 0xd9 */
19877/* File: armv5te/alt_stub.S */
19878/*
19879 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19880 * any interesting requests and then jump to the real instruction
19881 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19882 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19883 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19884 * bail to the real handler if breakFlags==0.
19885 */
19886    ldrb   r3, [rSELF, #offThread_breakFlags]
19887    adrl   lr, dvmAsmInstructionStart + (217 * 64)
19888    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19889    cmp    r3, #0
19890    bxeq   lr                   @ nothing to do - jump to real handler
19891    EXPORT_PC()
19892    mov    r0, rPC              @ arg0
19893    mov    r1, rFP              @ arg1
19894    mov    r2, rSELF            @ arg2
19895    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19896
19897/* ------------------------------ */
19898    .balign 64
19899.L_ALT_OP_MUL_INT_LIT8: /* 0xda */
19900/* File: armv5te/alt_stub.S */
19901/*
19902 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19903 * any interesting requests and then jump to the real instruction
19904 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19905 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19906 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19907 * bail to the real handler if breakFlags==0.
19908 */
19909    ldrb   r3, [rSELF, #offThread_breakFlags]
19910    adrl   lr, dvmAsmInstructionStart + (218 * 64)
19911    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19912    cmp    r3, #0
19913    bxeq   lr                   @ nothing to do - jump to real handler
19914    EXPORT_PC()
19915    mov    r0, rPC              @ arg0
19916    mov    r1, rFP              @ arg1
19917    mov    r2, rSELF            @ arg2
19918    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19919
19920/* ------------------------------ */
19921    .balign 64
19922.L_ALT_OP_DIV_INT_LIT8: /* 0xdb */
19923/* File: armv5te/alt_stub.S */
19924/*
19925 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19926 * any interesting requests and then jump to the real instruction
19927 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19928 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19929 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19930 * bail to the real handler if breakFlags==0.
19931 */
19932    ldrb   r3, [rSELF, #offThread_breakFlags]
19933    adrl   lr, dvmAsmInstructionStart + (219 * 64)
19934    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19935    cmp    r3, #0
19936    bxeq   lr                   @ nothing to do - jump to real handler
19937    EXPORT_PC()
19938    mov    r0, rPC              @ arg0
19939    mov    r1, rFP              @ arg1
19940    mov    r2, rSELF            @ arg2
19941    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19942
19943/* ------------------------------ */
19944    .balign 64
19945.L_ALT_OP_REM_INT_LIT8: /* 0xdc */
19946/* File: armv5te/alt_stub.S */
19947/*
19948 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19949 * any interesting requests and then jump to the real instruction
19950 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19951 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19952 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19953 * bail to the real handler if breakFlags==0.
19954 */
19955    ldrb   r3, [rSELF, #offThread_breakFlags]
19956    adrl   lr, dvmAsmInstructionStart + (220 * 64)
19957    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19958    cmp    r3, #0
19959    bxeq   lr                   @ nothing to do - jump to real handler
19960    EXPORT_PC()
19961    mov    r0, rPC              @ arg0
19962    mov    r1, rFP              @ arg1
19963    mov    r2, rSELF            @ arg2
19964    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19965
19966/* ------------------------------ */
19967    .balign 64
19968.L_ALT_OP_AND_INT_LIT8: /* 0xdd */
19969/* File: armv5te/alt_stub.S */
19970/*
19971 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19972 * any interesting requests and then jump to the real instruction
19973 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19974 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19975 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19976 * bail to the real handler if breakFlags==0.
19977 */
19978    ldrb   r3, [rSELF, #offThread_breakFlags]
19979    adrl   lr, dvmAsmInstructionStart + (221 * 64)
19980    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19981    cmp    r3, #0
19982    bxeq   lr                   @ nothing to do - jump to real handler
19983    EXPORT_PC()
19984    mov    r0, rPC              @ arg0
19985    mov    r1, rFP              @ arg1
19986    mov    r2, rSELF            @ arg2
19987    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19988
19989/* ------------------------------ */
19990    .balign 64
19991.L_ALT_OP_OR_INT_LIT8: /* 0xde */
19992/* File: armv5te/alt_stub.S */
19993/*
19994 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19995 * any interesting requests and then jump to the real instruction
19996 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19997 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19998 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19999 * bail to the real handler if breakFlags==0.
20000 */
20001    ldrb   r3, [rSELF, #offThread_breakFlags]
20002    adrl   lr, dvmAsmInstructionStart + (222 * 64)
20003    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20004    cmp    r3, #0
20005    bxeq   lr                   @ nothing to do - jump to real handler
20006    EXPORT_PC()
20007    mov    r0, rPC              @ arg0
20008    mov    r1, rFP              @ arg1
20009    mov    r2, rSELF            @ arg2
20010    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20011
20012/* ------------------------------ */
20013    .balign 64
20014.L_ALT_OP_XOR_INT_LIT8: /* 0xdf */
20015/* File: armv5te/alt_stub.S */
20016/*
20017 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20018 * any interesting requests and then jump to the real instruction
20019 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20020 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20021 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20022 * bail to the real handler if breakFlags==0.
20023 */
20024    ldrb   r3, [rSELF, #offThread_breakFlags]
20025    adrl   lr, dvmAsmInstructionStart + (223 * 64)
20026    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20027    cmp    r3, #0
20028    bxeq   lr                   @ nothing to do - jump to real handler
20029    EXPORT_PC()
20030    mov    r0, rPC              @ arg0
20031    mov    r1, rFP              @ arg1
20032    mov    r2, rSELF            @ arg2
20033    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20034
20035/* ------------------------------ */
20036    .balign 64
20037.L_ALT_OP_SHL_INT_LIT8: /* 0xe0 */
20038/* File: armv5te/alt_stub.S */
20039/*
20040 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20041 * any interesting requests and then jump to the real instruction
20042 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20043 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20044 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20045 * bail to the real handler if breakFlags==0.
20046 */
20047    ldrb   r3, [rSELF, #offThread_breakFlags]
20048    adrl   lr, dvmAsmInstructionStart + (224 * 64)
20049    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20050    cmp    r3, #0
20051    bxeq   lr                   @ nothing to do - jump to real handler
20052    EXPORT_PC()
20053    mov    r0, rPC              @ arg0
20054    mov    r1, rFP              @ arg1
20055    mov    r2, rSELF            @ arg2
20056    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20057
20058/* ------------------------------ */
20059    .balign 64
20060.L_ALT_OP_SHR_INT_LIT8: /* 0xe1 */
20061/* File: armv5te/alt_stub.S */
20062/*
20063 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20064 * any interesting requests and then jump to the real instruction
20065 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20066 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20067 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20068 * bail to the real handler if breakFlags==0.
20069 */
20070    ldrb   r3, [rSELF, #offThread_breakFlags]
20071    adrl   lr, dvmAsmInstructionStart + (225 * 64)
20072    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20073    cmp    r3, #0
20074    bxeq   lr                   @ nothing to do - jump to real handler
20075    EXPORT_PC()
20076    mov    r0, rPC              @ arg0
20077    mov    r1, rFP              @ arg1
20078    mov    r2, rSELF            @ arg2
20079    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20080
20081/* ------------------------------ */
20082    .balign 64
20083.L_ALT_OP_USHR_INT_LIT8: /* 0xe2 */
20084/* File: armv5te/alt_stub.S */
20085/*
20086 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20087 * any interesting requests and then jump to the real instruction
20088 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20089 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20090 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20091 * bail to the real handler if breakFlags==0.
20092 */
20093    ldrb   r3, [rSELF, #offThread_breakFlags]
20094    adrl   lr, dvmAsmInstructionStart + (226 * 64)
20095    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20096    cmp    r3, #0
20097    bxeq   lr                   @ nothing to do - jump to real handler
20098    EXPORT_PC()
20099    mov    r0, rPC              @ arg0
20100    mov    r1, rFP              @ arg1
20101    mov    r2, rSELF            @ arg2
20102    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20103
20104/* ------------------------------ */
20105    .balign 64
20106.L_ALT_OP_IGET_VOLATILE: /* 0xe3 */
20107/* File: armv5te/alt_stub.S */
20108/*
20109 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20110 * any interesting requests and then jump to the real instruction
20111 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20112 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20113 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20114 * bail to the real handler if breakFlags==0.
20115 */
20116    ldrb   r3, [rSELF, #offThread_breakFlags]
20117    adrl   lr, dvmAsmInstructionStart + (227 * 64)
20118    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20119    cmp    r3, #0
20120    bxeq   lr                   @ nothing to do - jump to real handler
20121    EXPORT_PC()
20122    mov    r0, rPC              @ arg0
20123    mov    r1, rFP              @ arg1
20124    mov    r2, rSELF            @ arg2
20125    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20126
20127/* ------------------------------ */
20128    .balign 64
20129.L_ALT_OP_IPUT_VOLATILE: /* 0xe4 */
20130/* File: armv5te/alt_stub.S */
20131/*
20132 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20133 * any interesting requests and then jump to the real instruction
20134 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20135 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20136 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20137 * bail to the real handler if breakFlags==0.
20138 */
20139    ldrb   r3, [rSELF, #offThread_breakFlags]
20140    adrl   lr, dvmAsmInstructionStart + (228 * 64)
20141    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20142    cmp    r3, #0
20143    bxeq   lr                   @ nothing to do - jump to real handler
20144    EXPORT_PC()
20145    mov    r0, rPC              @ arg0
20146    mov    r1, rFP              @ arg1
20147    mov    r2, rSELF            @ arg2
20148    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20149
20150/* ------------------------------ */
20151    .balign 64
20152.L_ALT_OP_SGET_VOLATILE: /* 0xe5 */
20153/* File: armv5te/alt_stub.S */
20154/*
20155 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20156 * any interesting requests and then jump to the real instruction
20157 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20158 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20159 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20160 * bail to the real handler if breakFlags==0.
20161 */
20162    ldrb   r3, [rSELF, #offThread_breakFlags]
20163    adrl   lr, dvmAsmInstructionStart + (229 * 64)
20164    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20165    cmp    r3, #0
20166    bxeq   lr                   @ nothing to do - jump to real handler
20167    EXPORT_PC()
20168    mov    r0, rPC              @ arg0
20169    mov    r1, rFP              @ arg1
20170    mov    r2, rSELF            @ arg2
20171    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20172
20173/* ------------------------------ */
20174    .balign 64
20175.L_ALT_OP_SPUT_VOLATILE: /* 0xe6 */
20176/* File: armv5te/alt_stub.S */
20177/*
20178 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20179 * any interesting requests and then jump to the real instruction
20180 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20181 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20182 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20183 * bail to the real handler if breakFlags==0.
20184 */
20185    ldrb   r3, [rSELF, #offThread_breakFlags]
20186    adrl   lr, dvmAsmInstructionStart + (230 * 64)
20187    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20188    cmp    r3, #0
20189    bxeq   lr                   @ nothing to do - jump to real handler
20190    EXPORT_PC()
20191    mov    r0, rPC              @ arg0
20192    mov    r1, rFP              @ arg1
20193    mov    r2, rSELF            @ arg2
20194    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20195
20196/* ------------------------------ */
20197    .balign 64
20198.L_ALT_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
20199/* File: armv5te/alt_stub.S */
20200/*
20201 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20202 * any interesting requests and then jump to the real instruction
20203 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20204 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20205 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20206 * bail to the real handler if breakFlags==0.
20207 */
20208    ldrb   r3, [rSELF, #offThread_breakFlags]
20209    adrl   lr, dvmAsmInstructionStart + (231 * 64)
20210    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20211    cmp    r3, #0
20212    bxeq   lr                   @ nothing to do - jump to real handler
20213    EXPORT_PC()
20214    mov    r0, rPC              @ arg0
20215    mov    r1, rFP              @ arg1
20216    mov    r2, rSELF            @ arg2
20217    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20218
20219/* ------------------------------ */
20220    .balign 64
20221.L_ALT_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
20222/* File: armv5te/alt_stub.S */
20223/*
20224 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20225 * any interesting requests and then jump to the real instruction
20226 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20227 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20228 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20229 * bail to the real handler if breakFlags==0.
20230 */
20231    ldrb   r3, [rSELF, #offThread_breakFlags]
20232    adrl   lr, dvmAsmInstructionStart + (232 * 64)
20233    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20234    cmp    r3, #0
20235    bxeq   lr                   @ nothing to do - jump to real handler
20236    EXPORT_PC()
20237    mov    r0, rPC              @ arg0
20238    mov    r1, rFP              @ arg1
20239    mov    r2, rSELF            @ arg2
20240    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20241
20242/* ------------------------------ */
20243    .balign 64
20244.L_ALT_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
20245/* File: armv5te/alt_stub.S */
20246/*
20247 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20248 * any interesting requests and then jump to the real instruction
20249 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20250 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20251 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20252 * bail to the real handler if breakFlags==0.
20253 */
20254    ldrb   r3, [rSELF, #offThread_breakFlags]
20255    adrl   lr, dvmAsmInstructionStart + (233 * 64)
20256    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20257    cmp    r3, #0
20258    bxeq   lr                   @ nothing to do - jump to real handler
20259    EXPORT_PC()
20260    mov    r0, rPC              @ arg0
20261    mov    r1, rFP              @ arg1
20262    mov    r2, rSELF            @ arg2
20263    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20264
20265/* ------------------------------ */
20266    .balign 64
20267.L_ALT_OP_SGET_WIDE_VOLATILE: /* 0xea */
20268/* File: armv5te/alt_stub.S */
20269/*
20270 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20271 * any interesting requests and then jump to the real instruction
20272 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20273 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20274 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20275 * bail to the real handler if breakFlags==0.
20276 */
20277    ldrb   r3, [rSELF, #offThread_breakFlags]
20278    adrl   lr, dvmAsmInstructionStart + (234 * 64)
20279    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20280    cmp    r3, #0
20281    bxeq   lr                   @ nothing to do - jump to real handler
20282    EXPORT_PC()
20283    mov    r0, rPC              @ arg0
20284    mov    r1, rFP              @ arg1
20285    mov    r2, rSELF            @ arg2
20286    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20287
20288/* ------------------------------ */
20289    .balign 64
20290.L_ALT_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
20291/* File: armv5te/alt_stub.S */
20292/*
20293 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20294 * any interesting requests and then jump to the real instruction
20295 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20296 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20297 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20298 * bail to the real handler if breakFlags==0.
20299 */
20300    ldrb   r3, [rSELF, #offThread_breakFlags]
20301    adrl   lr, dvmAsmInstructionStart + (235 * 64)
20302    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20303    cmp    r3, #0
20304    bxeq   lr                   @ nothing to do - jump to real handler
20305    EXPORT_PC()
20306    mov    r0, rPC              @ arg0
20307    mov    r1, rFP              @ arg1
20308    mov    r2, rSELF            @ arg2
20309    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20310
20311/* ------------------------------ */
20312    .balign 64
20313.L_ALT_OP_BREAKPOINT: /* 0xec */
20314/* File: armv5te/alt_stub.S */
20315/*
20316 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20317 * any interesting requests and then jump to the real instruction
20318 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20319 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20320 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20321 * bail to the real handler if breakFlags==0.
20322 */
20323    ldrb   r3, [rSELF, #offThread_breakFlags]
20324    adrl   lr, dvmAsmInstructionStart + (236 * 64)
20325    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20326    cmp    r3, #0
20327    bxeq   lr                   @ nothing to do - jump to real handler
20328    EXPORT_PC()
20329    mov    r0, rPC              @ arg0
20330    mov    r1, rFP              @ arg1
20331    mov    r2, rSELF            @ arg2
20332    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20333
20334/* ------------------------------ */
20335    .balign 64
20336.L_ALT_OP_THROW_VERIFICATION_ERROR: /* 0xed */
20337/* File: armv5te/alt_stub.S */
20338/*
20339 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20340 * any interesting requests and then jump to the real instruction
20341 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20342 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20343 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20344 * bail to the real handler if breakFlags==0.
20345 */
20346    ldrb   r3, [rSELF, #offThread_breakFlags]
20347    adrl   lr, dvmAsmInstructionStart + (237 * 64)
20348    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20349    cmp    r3, #0
20350    bxeq   lr                   @ nothing to do - jump to real handler
20351    EXPORT_PC()
20352    mov    r0, rPC              @ arg0
20353    mov    r1, rFP              @ arg1
20354    mov    r2, rSELF            @ arg2
20355    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20356
20357/* ------------------------------ */
20358    .balign 64
20359.L_ALT_OP_EXECUTE_INLINE: /* 0xee */
20360/* File: armv5te/alt_stub.S */
20361/*
20362 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20363 * any interesting requests and then jump to the real instruction
20364 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20365 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20366 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20367 * bail to the real handler if breakFlags==0.
20368 */
20369    ldrb   r3, [rSELF, #offThread_breakFlags]
20370    adrl   lr, dvmAsmInstructionStart + (238 * 64)
20371    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20372    cmp    r3, #0
20373    bxeq   lr                   @ nothing to do - jump to real handler
20374    EXPORT_PC()
20375    mov    r0, rPC              @ arg0
20376    mov    r1, rFP              @ arg1
20377    mov    r2, rSELF            @ arg2
20378    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20379
20380/* ------------------------------ */
20381    .balign 64
20382.L_ALT_OP_EXECUTE_INLINE_RANGE: /* 0xef */
20383/* File: armv5te/alt_stub.S */
20384/*
20385 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20386 * any interesting requests and then jump to the real instruction
20387 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20388 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20389 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20390 * bail to the real handler if breakFlags==0.
20391 */
20392    ldrb   r3, [rSELF, #offThread_breakFlags]
20393    adrl   lr, dvmAsmInstructionStart + (239 * 64)
20394    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20395    cmp    r3, #0
20396    bxeq   lr                   @ nothing to do - jump to real handler
20397    EXPORT_PC()
20398    mov    r0, rPC              @ arg0
20399    mov    r1, rFP              @ arg1
20400    mov    r2, rSELF            @ arg2
20401    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20402
20403/* ------------------------------ */
20404    .balign 64
20405.L_ALT_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
20406/* File: armv5te/alt_stub.S */
20407/*
20408 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20409 * any interesting requests and then jump to the real instruction
20410 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20411 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20412 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20413 * bail to the real handler if breakFlags==0.
20414 */
20415    ldrb   r3, [rSELF, #offThread_breakFlags]
20416    adrl   lr, dvmAsmInstructionStart + (240 * 64)
20417    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20418    cmp    r3, #0
20419    bxeq   lr                   @ nothing to do - jump to real handler
20420    EXPORT_PC()
20421    mov    r0, rPC              @ arg0
20422    mov    r1, rFP              @ arg1
20423    mov    r2, rSELF            @ arg2
20424    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20425
20426/* ------------------------------ */
20427    .balign 64
20428.L_ALT_OP_RETURN_VOID_BARRIER: /* 0xf1 */
20429/* File: armv5te/alt_stub.S */
20430/*
20431 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20432 * any interesting requests and then jump to the real instruction
20433 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20434 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20435 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20436 * bail to the real handler if breakFlags==0.
20437 */
20438    ldrb   r3, [rSELF, #offThread_breakFlags]
20439    adrl   lr, dvmAsmInstructionStart + (241 * 64)
20440    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20441    cmp    r3, #0
20442    bxeq   lr                   @ nothing to do - jump to real handler
20443    EXPORT_PC()
20444    mov    r0, rPC              @ arg0
20445    mov    r1, rFP              @ arg1
20446    mov    r2, rSELF            @ arg2
20447    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20448
20449/* ------------------------------ */
20450    .balign 64
20451.L_ALT_OP_IGET_QUICK: /* 0xf2 */
20452/* File: armv5te/alt_stub.S */
20453/*
20454 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20455 * any interesting requests and then jump to the real instruction
20456 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20457 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20458 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20459 * bail to the real handler if breakFlags==0.
20460 */
20461    ldrb   r3, [rSELF, #offThread_breakFlags]
20462    adrl   lr, dvmAsmInstructionStart + (242 * 64)
20463    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20464    cmp    r3, #0
20465    bxeq   lr                   @ nothing to do - jump to real handler
20466    EXPORT_PC()
20467    mov    r0, rPC              @ arg0
20468    mov    r1, rFP              @ arg1
20469    mov    r2, rSELF            @ arg2
20470    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20471
20472/* ------------------------------ */
20473    .balign 64
20474.L_ALT_OP_IGET_WIDE_QUICK: /* 0xf3 */
20475/* File: armv5te/alt_stub.S */
20476/*
20477 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20478 * any interesting requests and then jump to the real instruction
20479 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20480 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20481 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20482 * bail to the real handler if breakFlags==0.
20483 */
20484    ldrb   r3, [rSELF, #offThread_breakFlags]
20485    adrl   lr, dvmAsmInstructionStart + (243 * 64)
20486    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20487    cmp    r3, #0
20488    bxeq   lr                   @ nothing to do - jump to real handler
20489    EXPORT_PC()
20490    mov    r0, rPC              @ arg0
20491    mov    r1, rFP              @ arg1
20492    mov    r2, rSELF            @ arg2
20493    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20494
20495/* ------------------------------ */
20496    .balign 64
20497.L_ALT_OP_IGET_OBJECT_QUICK: /* 0xf4 */
20498/* File: armv5te/alt_stub.S */
20499/*
20500 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20501 * any interesting requests and then jump to the real instruction
20502 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20503 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20504 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20505 * bail to the real handler if breakFlags==0.
20506 */
20507    ldrb   r3, [rSELF, #offThread_breakFlags]
20508    adrl   lr, dvmAsmInstructionStart + (244 * 64)
20509    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20510    cmp    r3, #0
20511    bxeq   lr                   @ nothing to do - jump to real handler
20512    EXPORT_PC()
20513    mov    r0, rPC              @ arg0
20514    mov    r1, rFP              @ arg1
20515    mov    r2, rSELF            @ arg2
20516    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20517
20518/* ------------------------------ */
20519    .balign 64
20520.L_ALT_OP_IPUT_QUICK: /* 0xf5 */
20521/* File: armv5te/alt_stub.S */
20522/*
20523 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20524 * any interesting requests and then jump to the real instruction
20525 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20526 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20527 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20528 * bail to the real handler if breakFlags==0.
20529 */
20530    ldrb   r3, [rSELF, #offThread_breakFlags]
20531    adrl   lr, dvmAsmInstructionStart + (245 * 64)
20532    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20533    cmp    r3, #0
20534    bxeq   lr                   @ nothing to do - jump to real handler
20535    EXPORT_PC()
20536    mov    r0, rPC              @ arg0
20537    mov    r1, rFP              @ arg1
20538    mov    r2, rSELF            @ arg2
20539    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20540
20541/* ------------------------------ */
20542    .balign 64
20543.L_ALT_OP_IPUT_WIDE_QUICK: /* 0xf6 */
20544/* File: armv5te/alt_stub.S */
20545/*
20546 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20547 * any interesting requests and then jump to the real instruction
20548 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20549 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20550 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20551 * bail to the real handler if breakFlags==0.
20552 */
20553    ldrb   r3, [rSELF, #offThread_breakFlags]
20554    adrl   lr, dvmAsmInstructionStart + (246 * 64)
20555    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20556    cmp    r3, #0
20557    bxeq   lr                   @ nothing to do - jump to real handler
20558    EXPORT_PC()
20559    mov    r0, rPC              @ arg0
20560    mov    r1, rFP              @ arg1
20561    mov    r2, rSELF            @ arg2
20562    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20563
20564/* ------------------------------ */
20565    .balign 64
20566.L_ALT_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
20567/* File: armv5te/alt_stub.S */
20568/*
20569 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20570 * any interesting requests and then jump to the real instruction
20571 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20572 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20573 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20574 * bail to the real handler if breakFlags==0.
20575 */
20576    ldrb   r3, [rSELF, #offThread_breakFlags]
20577    adrl   lr, dvmAsmInstructionStart + (247 * 64)
20578    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20579    cmp    r3, #0
20580    bxeq   lr                   @ nothing to do - jump to real handler
20581    EXPORT_PC()
20582    mov    r0, rPC              @ arg0
20583    mov    r1, rFP              @ arg1
20584    mov    r2, rSELF            @ arg2
20585    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20586
20587/* ------------------------------ */
20588    .balign 64
20589.L_ALT_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
20590/* File: armv5te/alt_stub.S */
20591/*
20592 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20593 * any interesting requests and then jump to the real instruction
20594 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20595 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20596 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20597 * bail to the real handler if breakFlags==0.
20598 */
20599    ldrb   r3, [rSELF, #offThread_breakFlags]
20600    adrl   lr, dvmAsmInstructionStart + (248 * 64)
20601    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20602    cmp    r3, #0
20603    bxeq   lr                   @ nothing to do - jump to real handler
20604    EXPORT_PC()
20605    mov    r0, rPC              @ arg0
20606    mov    r1, rFP              @ arg1
20607    mov    r2, rSELF            @ arg2
20608    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20609
20610/* ------------------------------ */
20611    .balign 64
20612.L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
20613/* File: armv5te/alt_stub.S */
20614/*
20615 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20616 * any interesting requests and then jump to the real instruction
20617 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20618 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20619 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20620 * bail to the real handler if breakFlags==0.
20621 */
20622    ldrb   r3, [rSELF, #offThread_breakFlags]
20623    adrl   lr, dvmAsmInstructionStart + (249 * 64)
20624    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20625    cmp    r3, #0
20626    bxeq   lr                   @ nothing to do - jump to real handler
20627    EXPORT_PC()
20628    mov    r0, rPC              @ arg0
20629    mov    r1, rFP              @ arg1
20630    mov    r2, rSELF            @ arg2
20631    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20632
20633/* ------------------------------ */
20634    .balign 64
20635.L_ALT_OP_INVOKE_SUPER_QUICK: /* 0xfa */
20636/* File: armv5te/alt_stub.S */
20637/*
20638 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20639 * any interesting requests and then jump to the real instruction
20640 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20641 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20642 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20643 * bail to the real handler if breakFlags==0.
20644 */
20645    ldrb   r3, [rSELF, #offThread_breakFlags]
20646    adrl   lr, dvmAsmInstructionStart + (250 * 64)
20647    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20648    cmp    r3, #0
20649    bxeq   lr                   @ nothing to do - jump to real handler
20650    EXPORT_PC()
20651    mov    r0, rPC              @ arg0
20652    mov    r1, rFP              @ arg1
20653    mov    r2, rSELF            @ arg2
20654    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20655
20656/* ------------------------------ */
20657    .balign 64
20658.L_ALT_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
20659/* File: armv5te/alt_stub.S */
20660/*
20661 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20662 * any interesting requests and then jump to the real instruction
20663 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20664 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20665 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20666 * bail to the real handler if breakFlags==0.
20667 */
20668    ldrb   r3, [rSELF, #offThread_breakFlags]
20669    adrl   lr, dvmAsmInstructionStart + (251 * 64)
20670    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20671    cmp    r3, #0
20672    bxeq   lr                   @ nothing to do - jump to real handler
20673    EXPORT_PC()
20674    mov    r0, rPC              @ arg0
20675    mov    r1, rFP              @ arg1
20676    mov    r2, rSELF            @ arg2
20677    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20678
20679/* ------------------------------ */
20680    .balign 64
20681.L_ALT_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
20682/* File: armv5te/alt_stub.S */
20683/*
20684 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20685 * any interesting requests and then jump to the real instruction
20686 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20687 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20688 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20689 * bail to the real handler if breakFlags==0.
20690 */
20691    ldrb   r3, [rSELF, #offThread_breakFlags]
20692    adrl   lr, dvmAsmInstructionStart + (252 * 64)
20693    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20694    cmp    r3, #0
20695    bxeq   lr                   @ nothing to do - jump to real handler
20696    EXPORT_PC()
20697    mov    r0, rPC              @ arg0
20698    mov    r1, rFP              @ arg1
20699    mov    r2, rSELF            @ arg2
20700    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20701
20702/* ------------------------------ */
20703    .balign 64
20704.L_ALT_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
20705/* File: armv5te/alt_stub.S */
20706/*
20707 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20708 * any interesting requests and then jump to the real instruction
20709 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20710 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20711 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20712 * bail to the real handler if breakFlags==0.
20713 */
20714    ldrb   r3, [rSELF, #offThread_breakFlags]
20715    adrl   lr, dvmAsmInstructionStart + (253 * 64)
20716    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20717    cmp    r3, #0
20718    bxeq   lr                   @ nothing to do - jump to real handler
20719    EXPORT_PC()
20720    mov    r0, rPC              @ arg0
20721    mov    r1, rFP              @ arg1
20722    mov    r2, rSELF            @ arg2
20723    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20724
20725/* ------------------------------ */
20726    .balign 64
20727.L_ALT_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
20728/* File: armv5te/alt_stub.S */
20729/*
20730 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20731 * any interesting requests and then jump to the real instruction
20732 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20733 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20734 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20735 * bail to the real handler if breakFlags==0.
20736 */
20737    ldrb   r3, [rSELF, #offThread_breakFlags]
20738    adrl   lr, dvmAsmInstructionStart + (254 * 64)
20739    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20740    cmp    r3, #0
20741    bxeq   lr                   @ nothing to do - jump to real handler
20742    EXPORT_PC()
20743    mov    r0, rPC              @ arg0
20744    mov    r1, rFP              @ arg1
20745    mov    r2, rSELF            @ arg2
20746    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20747
20748/* ------------------------------ */
20749    .balign 64
20750.L_ALT_OP_DISPATCH_FF: /* 0xff */
20751/* File: armv5te/ALT_OP_DISPATCH_FF.S */
20752/*
20753 * Unlike other alt stubs, we don't want to call dvmCheckBefore() here.
20754 * Instead, just treat this as a trampoline to reach the real alt
20755 * handler (which will do the dvmCheckBefore() call.
20756 */
20757    mov     ip, rINST, lsr #8           @ ip<- extended opcode
20758    add     ip, ip, #256                @ add offset for extended opcodes
20759    GOTO_OPCODE(ip)                     @ go to proper extended handler
20760
20761
20762/* ------------------------------ */
20763    .balign 64
20764.L_ALT_OP_CONST_CLASS_JUMBO: /* 0x100 */
20765/* File: armv5te/alt_stub.S */
20766/*
20767 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20768 * any interesting requests and then jump to the real instruction
20769 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20770 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20771 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20772 * bail to the real handler if breakFlags==0.
20773 */
20774    ldrb   r3, [rSELF, #offThread_breakFlags]
20775    adrl   lr, dvmAsmInstructionStart + (256 * 64)
20776    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20777    cmp    r3, #0
20778    bxeq   lr                   @ nothing to do - jump to real handler
20779    EXPORT_PC()
20780    mov    r0, rPC              @ arg0
20781    mov    r1, rFP              @ arg1
20782    mov    r2, rSELF            @ arg2
20783    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20784
20785/* ------------------------------ */
20786    .balign 64
20787.L_ALT_OP_CHECK_CAST_JUMBO: /* 0x101 */
20788/* File: armv5te/alt_stub.S */
20789/*
20790 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20791 * any interesting requests and then jump to the real instruction
20792 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20793 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20794 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20795 * bail to the real handler if breakFlags==0.
20796 */
20797    ldrb   r3, [rSELF, #offThread_breakFlags]
20798    adrl   lr, dvmAsmInstructionStart + (257 * 64)
20799    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20800    cmp    r3, #0
20801    bxeq   lr                   @ nothing to do - jump to real handler
20802    EXPORT_PC()
20803    mov    r0, rPC              @ arg0
20804    mov    r1, rFP              @ arg1
20805    mov    r2, rSELF            @ arg2
20806    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20807
20808/* ------------------------------ */
20809    .balign 64
20810.L_ALT_OP_INSTANCE_OF_JUMBO: /* 0x102 */
20811/* File: armv5te/alt_stub.S */
20812/*
20813 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20814 * any interesting requests and then jump to the real instruction
20815 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20816 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20817 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20818 * bail to the real handler if breakFlags==0.
20819 */
20820    ldrb   r3, [rSELF, #offThread_breakFlags]
20821    adrl   lr, dvmAsmInstructionStart + (258 * 64)
20822    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20823    cmp    r3, #0
20824    bxeq   lr                   @ nothing to do - jump to real handler
20825    EXPORT_PC()
20826    mov    r0, rPC              @ arg0
20827    mov    r1, rFP              @ arg1
20828    mov    r2, rSELF            @ arg2
20829    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20830
20831/* ------------------------------ */
20832    .balign 64
20833.L_ALT_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
20834/* File: armv5te/alt_stub.S */
20835/*
20836 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20837 * any interesting requests and then jump to the real instruction
20838 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20839 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20840 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20841 * bail to the real handler if breakFlags==0.
20842 */
20843    ldrb   r3, [rSELF, #offThread_breakFlags]
20844    adrl   lr, dvmAsmInstructionStart + (259 * 64)
20845    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20846    cmp    r3, #0
20847    bxeq   lr                   @ nothing to do - jump to real handler
20848    EXPORT_PC()
20849    mov    r0, rPC              @ arg0
20850    mov    r1, rFP              @ arg1
20851    mov    r2, rSELF            @ arg2
20852    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20853
20854/* ------------------------------ */
20855    .balign 64
20856.L_ALT_OP_NEW_ARRAY_JUMBO: /* 0x104 */
20857/* File: armv5te/alt_stub.S */
20858/*
20859 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20860 * any interesting requests and then jump to the real instruction
20861 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20862 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20863 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20864 * bail to the real handler if breakFlags==0.
20865 */
20866    ldrb   r3, [rSELF, #offThread_breakFlags]
20867    adrl   lr, dvmAsmInstructionStart + (260 * 64)
20868    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20869    cmp    r3, #0
20870    bxeq   lr                   @ nothing to do - jump to real handler
20871    EXPORT_PC()
20872    mov    r0, rPC              @ arg0
20873    mov    r1, rFP              @ arg1
20874    mov    r2, rSELF            @ arg2
20875    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20876
20877/* ------------------------------ */
20878    .balign 64
20879.L_ALT_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
20880/* File: armv5te/alt_stub.S */
20881/*
20882 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20883 * any interesting requests and then jump to the real instruction
20884 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20885 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20886 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20887 * bail to the real handler if breakFlags==0.
20888 */
20889    ldrb   r3, [rSELF, #offThread_breakFlags]
20890    adrl   lr, dvmAsmInstructionStart + (261 * 64)
20891    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20892    cmp    r3, #0
20893    bxeq   lr                   @ nothing to do - jump to real handler
20894    EXPORT_PC()
20895    mov    r0, rPC              @ arg0
20896    mov    r1, rFP              @ arg1
20897    mov    r2, rSELF            @ arg2
20898    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20899
20900/* ------------------------------ */
20901    .balign 64
20902.L_ALT_OP_IGET_JUMBO: /* 0x106 */
20903/* File: armv5te/alt_stub.S */
20904/*
20905 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20906 * any interesting requests and then jump to the real instruction
20907 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20908 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20909 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20910 * bail to the real handler if breakFlags==0.
20911 */
20912    ldrb   r3, [rSELF, #offThread_breakFlags]
20913    adrl   lr, dvmAsmInstructionStart + (262 * 64)
20914    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20915    cmp    r3, #0
20916    bxeq   lr                   @ nothing to do - jump to real handler
20917    EXPORT_PC()
20918    mov    r0, rPC              @ arg0
20919    mov    r1, rFP              @ arg1
20920    mov    r2, rSELF            @ arg2
20921    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20922
20923/* ------------------------------ */
20924    .balign 64
20925.L_ALT_OP_IGET_WIDE_JUMBO: /* 0x107 */
20926/* File: armv5te/alt_stub.S */
20927/*
20928 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20929 * any interesting requests and then jump to the real instruction
20930 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20931 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20932 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20933 * bail to the real handler if breakFlags==0.
20934 */
20935    ldrb   r3, [rSELF, #offThread_breakFlags]
20936    adrl   lr, dvmAsmInstructionStart + (263 * 64)
20937    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20938    cmp    r3, #0
20939    bxeq   lr                   @ nothing to do - jump to real handler
20940    EXPORT_PC()
20941    mov    r0, rPC              @ arg0
20942    mov    r1, rFP              @ arg1
20943    mov    r2, rSELF            @ arg2
20944    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20945
20946/* ------------------------------ */
20947    .balign 64
20948.L_ALT_OP_IGET_OBJECT_JUMBO: /* 0x108 */
20949/* File: armv5te/alt_stub.S */
20950/*
20951 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20952 * any interesting requests and then jump to the real instruction
20953 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20954 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20955 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20956 * bail to the real handler if breakFlags==0.
20957 */
20958    ldrb   r3, [rSELF, #offThread_breakFlags]
20959    adrl   lr, dvmAsmInstructionStart + (264 * 64)
20960    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20961    cmp    r3, #0
20962    bxeq   lr                   @ nothing to do - jump to real handler
20963    EXPORT_PC()
20964    mov    r0, rPC              @ arg0
20965    mov    r1, rFP              @ arg1
20966    mov    r2, rSELF            @ arg2
20967    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20968
20969/* ------------------------------ */
20970    .balign 64
20971.L_ALT_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
20972/* File: armv5te/alt_stub.S */
20973/*
20974 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20975 * any interesting requests and then jump to the real instruction
20976 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20977 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20978 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20979 * bail to the real handler if breakFlags==0.
20980 */
20981    ldrb   r3, [rSELF, #offThread_breakFlags]
20982    adrl   lr, dvmAsmInstructionStart + (265 * 64)
20983    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20984    cmp    r3, #0
20985    bxeq   lr                   @ nothing to do - jump to real handler
20986    EXPORT_PC()
20987    mov    r0, rPC              @ arg0
20988    mov    r1, rFP              @ arg1
20989    mov    r2, rSELF            @ arg2
20990    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20991
20992/* ------------------------------ */
20993    .balign 64
20994.L_ALT_OP_IGET_BYTE_JUMBO: /* 0x10a */
20995/* File: armv5te/alt_stub.S */
20996/*
20997 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20998 * any interesting requests and then jump to the real instruction
20999 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21000 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21001 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21002 * bail to the real handler if breakFlags==0.
21003 */
21004    ldrb   r3, [rSELF, #offThread_breakFlags]
21005    adrl   lr, dvmAsmInstructionStart + (266 * 64)
21006    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21007    cmp    r3, #0
21008    bxeq   lr                   @ nothing to do - jump to real handler
21009    EXPORT_PC()
21010    mov    r0, rPC              @ arg0
21011    mov    r1, rFP              @ arg1
21012    mov    r2, rSELF            @ arg2
21013    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21014
21015/* ------------------------------ */
21016    .balign 64
21017.L_ALT_OP_IGET_CHAR_JUMBO: /* 0x10b */
21018/* File: armv5te/alt_stub.S */
21019/*
21020 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21021 * any interesting requests and then jump to the real instruction
21022 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21023 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21024 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21025 * bail to the real handler if breakFlags==0.
21026 */
21027    ldrb   r3, [rSELF, #offThread_breakFlags]
21028    adrl   lr, dvmAsmInstructionStart + (267 * 64)
21029    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21030    cmp    r3, #0
21031    bxeq   lr                   @ nothing to do - jump to real handler
21032    EXPORT_PC()
21033    mov    r0, rPC              @ arg0
21034    mov    r1, rFP              @ arg1
21035    mov    r2, rSELF            @ arg2
21036    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21037
21038/* ------------------------------ */
21039    .balign 64
21040.L_ALT_OP_IGET_SHORT_JUMBO: /* 0x10c */
21041/* File: armv5te/alt_stub.S */
21042/*
21043 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21044 * any interesting requests and then jump to the real instruction
21045 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21046 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21047 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21048 * bail to the real handler if breakFlags==0.
21049 */
21050    ldrb   r3, [rSELF, #offThread_breakFlags]
21051    adrl   lr, dvmAsmInstructionStart + (268 * 64)
21052    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21053    cmp    r3, #0
21054    bxeq   lr                   @ nothing to do - jump to real handler
21055    EXPORT_PC()
21056    mov    r0, rPC              @ arg0
21057    mov    r1, rFP              @ arg1
21058    mov    r2, rSELF            @ arg2
21059    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21060
21061/* ------------------------------ */
21062    .balign 64
21063.L_ALT_OP_IPUT_JUMBO: /* 0x10d */
21064/* File: armv5te/alt_stub.S */
21065/*
21066 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21067 * any interesting requests and then jump to the real instruction
21068 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21069 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21070 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21071 * bail to the real handler if breakFlags==0.
21072 */
21073    ldrb   r3, [rSELF, #offThread_breakFlags]
21074    adrl   lr, dvmAsmInstructionStart + (269 * 64)
21075    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21076    cmp    r3, #0
21077    bxeq   lr                   @ nothing to do - jump to real handler
21078    EXPORT_PC()
21079    mov    r0, rPC              @ arg0
21080    mov    r1, rFP              @ arg1
21081    mov    r2, rSELF            @ arg2
21082    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21083
21084/* ------------------------------ */
21085    .balign 64
21086.L_ALT_OP_IPUT_WIDE_JUMBO: /* 0x10e */
21087/* File: armv5te/alt_stub.S */
21088/*
21089 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21090 * any interesting requests and then jump to the real instruction
21091 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21092 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21093 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21094 * bail to the real handler if breakFlags==0.
21095 */
21096    ldrb   r3, [rSELF, #offThread_breakFlags]
21097    adrl   lr, dvmAsmInstructionStart + (270 * 64)
21098    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21099    cmp    r3, #0
21100    bxeq   lr                   @ nothing to do - jump to real handler
21101    EXPORT_PC()
21102    mov    r0, rPC              @ arg0
21103    mov    r1, rFP              @ arg1
21104    mov    r2, rSELF            @ arg2
21105    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21106
21107/* ------------------------------ */
21108    .balign 64
21109.L_ALT_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
21110/* File: armv5te/alt_stub.S */
21111/*
21112 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21113 * any interesting requests and then jump to the real instruction
21114 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21115 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21116 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21117 * bail to the real handler if breakFlags==0.
21118 */
21119    ldrb   r3, [rSELF, #offThread_breakFlags]
21120    adrl   lr, dvmAsmInstructionStart + (271 * 64)
21121    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21122    cmp    r3, #0
21123    bxeq   lr                   @ nothing to do - jump to real handler
21124    EXPORT_PC()
21125    mov    r0, rPC              @ arg0
21126    mov    r1, rFP              @ arg1
21127    mov    r2, rSELF            @ arg2
21128    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21129
21130/* ------------------------------ */
21131    .balign 64
21132.L_ALT_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
21133/* File: armv5te/alt_stub.S */
21134/*
21135 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21136 * any interesting requests and then jump to the real instruction
21137 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21138 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21139 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21140 * bail to the real handler if breakFlags==0.
21141 */
21142    ldrb   r3, [rSELF, #offThread_breakFlags]
21143    adrl   lr, dvmAsmInstructionStart + (272 * 64)
21144    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21145    cmp    r3, #0
21146    bxeq   lr                   @ nothing to do - jump to real handler
21147    EXPORT_PC()
21148    mov    r0, rPC              @ arg0
21149    mov    r1, rFP              @ arg1
21150    mov    r2, rSELF            @ arg2
21151    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21152
21153/* ------------------------------ */
21154    .balign 64
21155.L_ALT_OP_IPUT_BYTE_JUMBO: /* 0x111 */
21156/* File: armv5te/alt_stub.S */
21157/*
21158 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21159 * any interesting requests and then jump to the real instruction
21160 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21161 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21162 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21163 * bail to the real handler if breakFlags==0.
21164 */
21165    ldrb   r3, [rSELF, #offThread_breakFlags]
21166    adrl   lr, dvmAsmInstructionStart + (273 * 64)
21167    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21168    cmp    r3, #0
21169    bxeq   lr                   @ nothing to do - jump to real handler
21170    EXPORT_PC()
21171    mov    r0, rPC              @ arg0
21172    mov    r1, rFP              @ arg1
21173    mov    r2, rSELF            @ arg2
21174    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21175
21176/* ------------------------------ */
21177    .balign 64
21178.L_ALT_OP_IPUT_CHAR_JUMBO: /* 0x112 */
21179/* File: armv5te/alt_stub.S */
21180/*
21181 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21182 * any interesting requests and then jump to the real instruction
21183 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21184 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21185 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21186 * bail to the real handler if breakFlags==0.
21187 */
21188    ldrb   r3, [rSELF, #offThread_breakFlags]
21189    adrl   lr, dvmAsmInstructionStart + (274 * 64)
21190    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21191    cmp    r3, #0
21192    bxeq   lr                   @ nothing to do - jump to real handler
21193    EXPORT_PC()
21194    mov    r0, rPC              @ arg0
21195    mov    r1, rFP              @ arg1
21196    mov    r2, rSELF            @ arg2
21197    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21198
21199/* ------------------------------ */
21200    .balign 64
21201.L_ALT_OP_IPUT_SHORT_JUMBO: /* 0x113 */
21202/* File: armv5te/alt_stub.S */
21203/*
21204 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21205 * any interesting requests and then jump to the real instruction
21206 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21207 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21208 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21209 * bail to the real handler if breakFlags==0.
21210 */
21211    ldrb   r3, [rSELF, #offThread_breakFlags]
21212    adrl   lr, dvmAsmInstructionStart + (275 * 64)
21213    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21214    cmp    r3, #0
21215    bxeq   lr                   @ nothing to do - jump to real handler
21216    EXPORT_PC()
21217    mov    r0, rPC              @ arg0
21218    mov    r1, rFP              @ arg1
21219    mov    r2, rSELF            @ arg2
21220    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21221
21222/* ------------------------------ */
21223    .balign 64
21224.L_ALT_OP_SGET_JUMBO: /* 0x114 */
21225/* File: armv5te/alt_stub.S */
21226/*
21227 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21228 * any interesting requests and then jump to the real instruction
21229 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21230 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21231 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21232 * bail to the real handler if breakFlags==0.
21233 */
21234    ldrb   r3, [rSELF, #offThread_breakFlags]
21235    adrl   lr, dvmAsmInstructionStart + (276 * 64)
21236    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21237    cmp    r3, #0
21238    bxeq   lr                   @ nothing to do - jump to real handler
21239    EXPORT_PC()
21240    mov    r0, rPC              @ arg0
21241    mov    r1, rFP              @ arg1
21242    mov    r2, rSELF            @ arg2
21243    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21244
21245/* ------------------------------ */
21246    .balign 64
21247.L_ALT_OP_SGET_WIDE_JUMBO: /* 0x115 */
21248/* File: armv5te/alt_stub.S */
21249/*
21250 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21251 * any interesting requests and then jump to the real instruction
21252 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21253 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21254 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21255 * bail to the real handler if breakFlags==0.
21256 */
21257    ldrb   r3, [rSELF, #offThread_breakFlags]
21258    adrl   lr, dvmAsmInstructionStart + (277 * 64)
21259    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21260    cmp    r3, #0
21261    bxeq   lr                   @ nothing to do - jump to real handler
21262    EXPORT_PC()
21263    mov    r0, rPC              @ arg0
21264    mov    r1, rFP              @ arg1
21265    mov    r2, rSELF            @ arg2
21266    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21267
21268/* ------------------------------ */
21269    .balign 64
21270.L_ALT_OP_SGET_OBJECT_JUMBO: /* 0x116 */
21271/* File: armv5te/alt_stub.S */
21272/*
21273 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21274 * any interesting requests and then jump to the real instruction
21275 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21276 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21277 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21278 * bail to the real handler if breakFlags==0.
21279 */
21280    ldrb   r3, [rSELF, #offThread_breakFlags]
21281    adrl   lr, dvmAsmInstructionStart + (278 * 64)
21282    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21283    cmp    r3, #0
21284    bxeq   lr                   @ nothing to do - jump to real handler
21285    EXPORT_PC()
21286    mov    r0, rPC              @ arg0
21287    mov    r1, rFP              @ arg1
21288    mov    r2, rSELF            @ arg2
21289    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21290
21291/* ------------------------------ */
21292    .balign 64
21293.L_ALT_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
21294/* File: armv5te/alt_stub.S */
21295/*
21296 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21297 * any interesting requests and then jump to the real instruction
21298 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21299 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21300 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21301 * bail to the real handler if breakFlags==0.
21302 */
21303    ldrb   r3, [rSELF, #offThread_breakFlags]
21304    adrl   lr, dvmAsmInstructionStart + (279 * 64)
21305    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21306    cmp    r3, #0
21307    bxeq   lr                   @ nothing to do - jump to real handler
21308    EXPORT_PC()
21309    mov    r0, rPC              @ arg0
21310    mov    r1, rFP              @ arg1
21311    mov    r2, rSELF            @ arg2
21312    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21313
21314/* ------------------------------ */
21315    .balign 64
21316.L_ALT_OP_SGET_BYTE_JUMBO: /* 0x118 */
21317/* File: armv5te/alt_stub.S */
21318/*
21319 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21320 * any interesting requests and then jump to the real instruction
21321 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21322 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21323 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21324 * bail to the real handler if breakFlags==0.
21325 */
21326    ldrb   r3, [rSELF, #offThread_breakFlags]
21327    adrl   lr, dvmAsmInstructionStart + (280 * 64)
21328    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21329    cmp    r3, #0
21330    bxeq   lr                   @ nothing to do - jump to real handler
21331    EXPORT_PC()
21332    mov    r0, rPC              @ arg0
21333    mov    r1, rFP              @ arg1
21334    mov    r2, rSELF            @ arg2
21335    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21336
21337/* ------------------------------ */
21338    .balign 64
21339.L_ALT_OP_SGET_CHAR_JUMBO: /* 0x119 */
21340/* File: armv5te/alt_stub.S */
21341/*
21342 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21343 * any interesting requests and then jump to the real instruction
21344 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21345 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21346 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21347 * bail to the real handler if breakFlags==0.
21348 */
21349    ldrb   r3, [rSELF, #offThread_breakFlags]
21350    adrl   lr, dvmAsmInstructionStart + (281 * 64)
21351    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21352    cmp    r3, #0
21353    bxeq   lr                   @ nothing to do - jump to real handler
21354    EXPORT_PC()
21355    mov    r0, rPC              @ arg0
21356    mov    r1, rFP              @ arg1
21357    mov    r2, rSELF            @ arg2
21358    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21359
21360/* ------------------------------ */
21361    .balign 64
21362.L_ALT_OP_SGET_SHORT_JUMBO: /* 0x11a */
21363/* File: armv5te/alt_stub.S */
21364/*
21365 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21366 * any interesting requests and then jump to the real instruction
21367 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21368 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21369 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21370 * bail to the real handler if breakFlags==0.
21371 */
21372    ldrb   r3, [rSELF, #offThread_breakFlags]
21373    adrl   lr, dvmAsmInstructionStart + (282 * 64)
21374    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21375    cmp    r3, #0
21376    bxeq   lr                   @ nothing to do - jump to real handler
21377    EXPORT_PC()
21378    mov    r0, rPC              @ arg0
21379    mov    r1, rFP              @ arg1
21380    mov    r2, rSELF            @ arg2
21381    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21382
21383/* ------------------------------ */
21384    .balign 64
21385.L_ALT_OP_SPUT_JUMBO: /* 0x11b */
21386/* File: armv5te/alt_stub.S */
21387/*
21388 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21389 * any interesting requests and then jump to the real instruction
21390 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21391 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21392 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21393 * bail to the real handler if breakFlags==0.
21394 */
21395    ldrb   r3, [rSELF, #offThread_breakFlags]
21396    adrl   lr, dvmAsmInstructionStart + (283 * 64)
21397    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21398    cmp    r3, #0
21399    bxeq   lr                   @ nothing to do - jump to real handler
21400    EXPORT_PC()
21401    mov    r0, rPC              @ arg0
21402    mov    r1, rFP              @ arg1
21403    mov    r2, rSELF            @ arg2
21404    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21405
21406/* ------------------------------ */
21407    .balign 64
21408.L_ALT_OP_SPUT_WIDE_JUMBO: /* 0x11c */
21409/* File: armv5te/alt_stub.S */
21410/*
21411 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21412 * any interesting requests and then jump to the real instruction
21413 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21414 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21415 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21416 * bail to the real handler if breakFlags==0.
21417 */
21418    ldrb   r3, [rSELF, #offThread_breakFlags]
21419    adrl   lr, dvmAsmInstructionStart + (284 * 64)
21420    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21421    cmp    r3, #0
21422    bxeq   lr                   @ nothing to do - jump to real handler
21423    EXPORT_PC()
21424    mov    r0, rPC              @ arg0
21425    mov    r1, rFP              @ arg1
21426    mov    r2, rSELF            @ arg2
21427    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21428
21429/* ------------------------------ */
21430    .balign 64
21431.L_ALT_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
21432/* File: armv5te/alt_stub.S */
21433/*
21434 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21435 * any interesting requests and then jump to the real instruction
21436 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21437 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21438 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21439 * bail to the real handler if breakFlags==0.
21440 */
21441    ldrb   r3, [rSELF, #offThread_breakFlags]
21442    adrl   lr, dvmAsmInstructionStart + (285 * 64)
21443    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21444    cmp    r3, #0
21445    bxeq   lr                   @ nothing to do - jump to real handler
21446    EXPORT_PC()
21447    mov    r0, rPC              @ arg0
21448    mov    r1, rFP              @ arg1
21449    mov    r2, rSELF            @ arg2
21450    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21451
21452/* ------------------------------ */
21453    .balign 64
21454.L_ALT_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
21455/* File: armv5te/alt_stub.S */
21456/*
21457 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21458 * any interesting requests and then jump to the real instruction
21459 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21460 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21461 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21462 * bail to the real handler if breakFlags==0.
21463 */
21464    ldrb   r3, [rSELF, #offThread_breakFlags]
21465    adrl   lr, dvmAsmInstructionStart + (286 * 64)
21466    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21467    cmp    r3, #0
21468    bxeq   lr                   @ nothing to do - jump to real handler
21469    EXPORT_PC()
21470    mov    r0, rPC              @ arg0
21471    mov    r1, rFP              @ arg1
21472    mov    r2, rSELF            @ arg2
21473    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21474
21475/* ------------------------------ */
21476    .balign 64
21477.L_ALT_OP_SPUT_BYTE_JUMBO: /* 0x11f */
21478/* File: armv5te/alt_stub.S */
21479/*
21480 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21481 * any interesting requests and then jump to the real instruction
21482 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21483 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21484 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21485 * bail to the real handler if breakFlags==0.
21486 */
21487    ldrb   r3, [rSELF, #offThread_breakFlags]
21488    adrl   lr, dvmAsmInstructionStart + (287 * 64)
21489    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21490    cmp    r3, #0
21491    bxeq   lr                   @ nothing to do - jump to real handler
21492    EXPORT_PC()
21493    mov    r0, rPC              @ arg0
21494    mov    r1, rFP              @ arg1
21495    mov    r2, rSELF            @ arg2
21496    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21497
21498/* ------------------------------ */
21499    .balign 64
21500.L_ALT_OP_SPUT_CHAR_JUMBO: /* 0x120 */
21501/* File: armv5te/alt_stub.S */
21502/*
21503 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21504 * any interesting requests and then jump to the real instruction
21505 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21506 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21507 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21508 * bail to the real handler if breakFlags==0.
21509 */
21510    ldrb   r3, [rSELF, #offThread_breakFlags]
21511    adrl   lr, dvmAsmInstructionStart + (288 * 64)
21512    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21513    cmp    r3, #0
21514    bxeq   lr                   @ nothing to do - jump to real handler
21515    EXPORT_PC()
21516    mov    r0, rPC              @ arg0
21517    mov    r1, rFP              @ arg1
21518    mov    r2, rSELF            @ arg2
21519    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21520
21521/* ------------------------------ */
21522    .balign 64
21523.L_ALT_OP_SPUT_SHORT_JUMBO: /* 0x121 */
21524/* File: armv5te/alt_stub.S */
21525/*
21526 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21527 * any interesting requests and then jump to the real instruction
21528 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21529 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21530 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21531 * bail to the real handler if breakFlags==0.
21532 */
21533    ldrb   r3, [rSELF, #offThread_breakFlags]
21534    adrl   lr, dvmAsmInstructionStart + (289 * 64)
21535    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21536    cmp    r3, #0
21537    bxeq   lr                   @ nothing to do - jump to real handler
21538    EXPORT_PC()
21539    mov    r0, rPC              @ arg0
21540    mov    r1, rFP              @ arg1
21541    mov    r2, rSELF            @ arg2
21542    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21543
21544/* ------------------------------ */
21545    .balign 64
21546.L_ALT_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
21547/* File: armv5te/alt_stub.S */
21548/*
21549 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21550 * any interesting requests and then jump to the real instruction
21551 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21552 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21553 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21554 * bail to the real handler if breakFlags==0.
21555 */
21556    ldrb   r3, [rSELF, #offThread_breakFlags]
21557    adrl   lr, dvmAsmInstructionStart + (290 * 64)
21558    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21559    cmp    r3, #0
21560    bxeq   lr                   @ nothing to do - jump to real handler
21561    EXPORT_PC()
21562    mov    r0, rPC              @ arg0
21563    mov    r1, rFP              @ arg1
21564    mov    r2, rSELF            @ arg2
21565    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21566
21567/* ------------------------------ */
21568    .balign 64
21569.L_ALT_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
21570/* File: armv5te/alt_stub.S */
21571/*
21572 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21573 * any interesting requests and then jump to the real instruction
21574 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21575 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21576 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21577 * bail to the real handler if breakFlags==0.
21578 */
21579    ldrb   r3, [rSELF, #offThread_breakFlags]
21580    adrl   lr, dvmAsmInstructionStart + (291 * 64)
21581    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21582    cmp    r3, #0
21583    bxeq   lr                   @ nothing to do - jump to real handler
21584    EXPORT_PC()
21585    mov    r0, rPC              @ arg0
21586    mov    r1, rFP              @ arg1
21587    mov    r2, rSELF            @ arg2
21588    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21589
21590/* ------------------------------ */
21591    .balign 64
21592.L_ALT_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
21593/* File: armv5te/alt_stub.S */
21594/*
21595 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21596 * any interesting requests and then jump to the real instruction
21597 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21598 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21599 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21600 * bail to the real handler if breakFlags==0.
21601 */
21602    ldrb   r3, [rSELF, #offThread_breakFlags]
21603    adrl   lr, dvmAsmInstructionStart + (292 * 64)
21604    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21605    cmp    r3, #0
21606    bxeq   lr                   @ nothing to do - jump to real handler
21607    EXPORT_PC()
21608    mov    r0, rPC              @ arg0
21609    mov    r1, rFP              @ arg1
21610    mov    r2, rSELF            @ arg2
21611    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21612
21613/* ------------------------------ */
21614    .balign 64
21615.L_ALT_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
21616/* File: armv5te/alt_stub.S */
21617/*
21618 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21619 * any interesting requests and then jump to the real instruction
21620 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21621 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21622 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21623 * bail to the real handler if breakFlags==0.
21624 */
21625    ldrb   r3, [rSELF, #offThread_breakFlags]
21626    adrl   lr, dvmAsmInstructionStart + (293 * 64)
21627    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21628    cmp    r3, #0
21629    bxeq   lr                   @ nothing to do - jump to real handler
21630    EXPORT_PC()
21631    mov    r0, rPC              @ arg0
21632    mov    r1, rFP              @ arg1
21633    mov    r2, rSELF            @ arg2
21634    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21635
21636/* ------------------------------ */
21637    .balign 64
21638.L_ALT_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
21639/* File: armv5te/alt_stub.S */
21640/*
21641 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21642 * any interesting requests and then jump to the real instruction
21643 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21644 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21645 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21646 * bail to the real handler if breakFlags==0.
21647 */
21648    ldrb   r3, [rSELF, #offThread_breakFlags]
21649    adrl   lr, dvmAsmInstructionStart + (294 * 64)
21650    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21651    cmp    r3, #0
21652    bxeq   lr                   @ nothing to do - jump to real handler
21653    EXPORT_PC()
21654    mov    r0, rPC              @ arg0
21655    mov    r1, rFP              @ arg1
21656    mov    r2, rSELF            @ arg2
21657    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21658
21659/* ------------------------------ */
21660    .balign 64
21661.L_ALT_OP_UNUSED_27FF: /* 0x127 */
21662/* File: armv5te/alt_stub.S */
21663/*
21664 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21665 * any interesting requests and then jump to the real instruction
21666 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21667 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21668 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21669 * bail to the real handler if breakFlags==0.
21670 */
21671    ldrb   r3, [rSELF, #offThread_breakFlags]
21672    adrl   lr, dvmAsmInstructionStart + (295 * 64)
21673    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21674    cmp    r3, #0
21675    bxeq   lr                   @ nothing to do - jump to real handler
21676    EXPORT_PC()
21677    mov    r0, rPC              @ arg0
21678    mov    r1, rFP              @ arg1
21679    mov    r2, rSELF            @ arg2
21680    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21681
21682/* ------------------------------ */
21683    .balign 64
21684.L_ALT_OP_UNUSED_28FF: /* 0x128 */
21685/* File: armv5te/alt_stub.S */
21686/*
21687 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21688 * any interesting requests and then jump to the real instruction
21689 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21690 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21691 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21692 * bail to the real handler if breakFlags==0.
21693 */
21694    ldrb   r3, [rSELF, #offThread_breakFlags]
21695    adrl   lr, dvmAsmInstructionStart + (296 * 64)
21696    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21697    cmp    r3, #0
21698    bxeq   lr                   @ nothing to do - jump to real handler
21699    EXPORT_PC()
21700    mov    r0, rPC              @ arg0
21701    mov    r1, rFP              @ arg1
21702    mov    r2, rSELF            @ arg2
21703    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21704
21705/* ------------------------------ */
21706    .balign 64
21707.L_ALT_OP_UNUSED_29FF: /* 0x129 */
21708/* File: armv5te/alt_stub.S */
21709/*
21710 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21711 * any interesting requests and then jump to the real instruction
21712 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21713 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21714 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21715 * bail to the real handler if breakFlags==0.
21716 */
21717    ldrb   r3, [rSELF, #offThread_breakFlags]
21718    adrl   lr, dvmAsmInstructionStart + (297 * 64)
21719    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21720    cmp    r3, #0
21721    bxeq   lr                   @ nothing to do - jump to real handler
21722    EXPORT_PC()
21723    mov    r0, rPC              @ arg0
21724    mov    r1, rFP              @ arg1
21725    mov    r2, rSELF            @ arg2
21726    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21727
21728/* ------------------------------ */
21729    .balign 64
21730.L_ALT_OP_UNUSED_2AFF: /* 0x12a */
21731/* File: armv5te/alt_stub.S */
21732/*
21733 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21734 * any interesting requests and then jump to the real instruction
21735 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21736 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21737 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21738 * bail to the real handler if breakFlags==0.
21739 */
21740    ldrb   r3, [rSELF, #offThread_breakFlags]
21741    adrl   lr, dvmAsmInstructionStart + (298 * 64)
21742    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21743    cmp    r3, #0
21744    bxeq   lr                   @ nothing to do - jump to real handler
21745    EXPORT_PC()
21746    mov    r0, rPC              @ arg0
21747    mov    r1, rFP              @ arg1
21748    mov    r2, rSELF            @ arg2
21749    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21750
21751/* ------------------------------ */
21752    .balign 64
21753.L_ALT_OP_UNUSED_2BFF: /* 0x12b */
21754/* File: armv5te/alt_stub.S */
21755/*
21756 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21757 * any interesting requests and then jump to the real instruction
21758 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21759 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21760 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21761 * bail to the real handler if breakFlags==0.
21762 */
21763    ldrb   r3, [rSELF, #offThread_breakFlags]
21764    adrl   lr, dvmAsmInstructionStart + (299 * 64)
21765    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21766    cmp    r3, #0
21767    bxeq   lr                   @ nothing to do - jump to real handler
21768    EXPORT_PC()
21769    mov    r0, rPC              @ arg0
21770    mov    r1, rFP              @ arg1
21771    mov    r2, rSELF            @ arg2
21772    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21773
21774/* ------------------------------ */
21775    .balign 64
21776.L_ALT_OP_UNUSED_2CFF: /* 0x12c */
21777/* File: armv5te/alt_stub.S */
21778/*
21779 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21780 * any interesting requests and then jump to the real instruction
21781 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21782 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21783 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21784 * bail to the real handler if breakFlags==0.
21785 */
21786    ldrb   r3, [rSELF, #offThread_breakFlags]
21787    adrl   lr, dvmAsmInstructionStart + (300 * 64)
21788    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21789    cmp    r3, #0
21790    bxeq   lr                   @ nothing to do - jump to real handler
21791    EXPORT_PC()
21792    mov    r0, rPC              @ arg0
21793    mov    r1, rFP              @ arg1
21794    mov    r2, rSELF            @ arg2
21795    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21796
21797/* ------------------------------ */
21798    .balign 64
21799.L_ALT_OP_UNUSED_2DFF: /* 0x12d */
21800/* File: armv5te/alt_stub.S */
21801/*
21802 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21803 * any interesting requests and then jump to the real instruction
21804 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21805 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21806 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21807 * bail to the real handler if breakFlags==0.
21808 */
21809    ldrb   r3, [rSELF, #offThread_breakFlags]
21810    adrl   lr, dvmAsmInstructionStart + (301 * 64)
21811    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21812    cmp    r3, #0
21813    bxeq   lr                   @ nothing to do - jump to real handler
21814    EXPORT_PC()
21815    mov    r0, rPC              @ arg0
21816    mov    r1, rFP              @ arg1
21817    mov    r2, rSELF            @ arg2
21818    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21819
21820/* ------------------------------ */
21821    .balign 64
21822.L_ALT_OP_UNUSED_2EFF: /* 0x12e */
21823/* File: armv5te/alt_stub.S */
21824/*
21825 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21826 * any interesting requests and then jump to the real instruction
21827 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21828 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21829 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21830 * bail to the real handler if breakFlags==0.
21831 */
21832    ldrb   r3, [rSELF, #offThread_breakFlags]
21833    adrl   lr, dvmAsmInstructionStart + (302 * 64)
21834    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21835    cmp    r3, #0
21836    bxeq   lr                   @ nothing to do - jump to real handler
21837    EXPORT_PC()
21838    mov    r0, rPC              @ arg0
21839    mov    r1, rFP              @ arg1
21840    mov    r2, rSELF            @ arg2
21841    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21842
21843/* ------------------------------ */
21844    .balign 64
21845.L_ALT_OP_UNUSED_2FFF: /* 0x12f */
21846/* File: armv5te/alt_stub.S */
21847/*
21848 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21849 * any interesting requests and then jump to the real instruction
21850 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21851 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21852 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21853 * bail to the real handler if breakFlags==0.
21854 */
21855    ldrb   r3, [rSELF, #offThread_breakFlags]
21856    adrl   lr, dvmAsmInstructionStart + (303 * 64)
21857    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21858    cmp    r3, #0
21859    bxeq   lr                   @ nothing to do - jump to real handler
21860    EXPORT_PC()
21861    mov    r0, rPC              @ arg0
21862    mov    r1, rFP              @ arg1
21863    mov    r2, rSELF            @ arg2
21864    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21865
21866/* ------------------------------ */
21867    .balign 64
21868.L_ALT_OP_UNUSED_30FF: /* 0x130 */
21869/* File: armv5te/alt_stub.S */
21870/*
21871 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21872 * any interesting requests and then jump to the real instruction
21873 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21874 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21875 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21876 * bail to the real handler if breakFlags==0.
21877 */
21878    ldrb   r3, [rSELF, #offThread_breakFlags]
21879    adrl   lr, dvmAsmInstructionStart + (304 * 64)
21880    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21881    cmp    r3, #0
21882    bxeq   lr                   @ nothing to do - jump to real handler
21883    EXPORT_PC()
21884    mov    r0, rPC              @ arg0
21885    mov    r1, rFP              @ arg1
21886    mov    r2, rSELF            @ arg2
21887    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21888
21889/* ------------------------------ */
21890    .balign 64
21891.L_ALT_OP_UNUSED_31FF: /* 0x131 */
21892/* File: armv5te/alt_stub.S */
21893/*
21894 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21895 * any interesting requests and then jump to the real instruction
21896 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21897 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21898 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21899 * bail to the real handler if breakFlags==0.
21900 */
21901    ldrb   r3, [rSELF, #offThread_breakFlags]
21902    adrl   lr, dvmAsmInstructionStart + (305 * 64)
21903    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21904    cmp    r3, #0
21905    bxeq   lr                   @ nothing to do - jump to real handler
21906    EXPORT_PC()
21907    mov    r0, rPC              @ arg0
21908    mov    r1, rFP              @ arg1
21909    mov    r2, rSELF            @ arg2
21910    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21911
21912/* ------------------------------ */
21913    .balign 64
21914.L_ALT_OP_UNUSED_32FF: /* 0x132 */
21915/* File: armv5te/alt_stub.S */
21916/*
21917 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21918 * any interesting requests and then jump to the real instruction
21919 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21920 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21921 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21922 * bail to the real handler if breakFlags==0.
21923 */
21924    ldrb   r3, [rSELF, #offThread_breakFlags]
21925    adrl   lr, dvmAsmInstructionStart + (306 * 64)
21926    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21927    cmp    r3, #0
21928    bxeq   lr                   @ nothing to do - jump to real handler
21929    EXPORT_PC()
21930    mov    r0, rPC              @ arg0
21931    mov    r1, rFP              @ arg1
21932    mov    r2, rSELF            @ arg2
21933    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21934
21935/* ------------------------------ */
21936    .balign 64
21937.L_ALT_OP_UNUSED_33FF: /* 0x133 */
21938/* File: armv5te/alt_stub.S */
21939/*
21940 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21941 * any interesting requests and then jump to the real instruction
21942 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21943 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21944 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21945 * bail to the real handler if breakFlags==0.
21946 */
21947    ldrb   r3, [rSELF, #offThread_breakFlags]
21948    adrl   lr, dvmAsmInstructionStart + (307 * 64)
21949    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21950    cmp    r3, #0
21951    bxeq   lr                   @ nothing to do - jump to real handler
21952    EXPORT_PC()
21953    mov    r0, rPC              @ arg0
21954    mov    r1, rFP              @ arg1
21955    mov    r2, rSELF            @ arg2
21956    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21957
21958/* ------------------------------ */
21959    .balign 64
21960.L_ALT_OP_UNUSED_34FF: /* 0x134 */
21961/* File: armv5te/alt_stub.S */
21962/*
21963 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21964 * any interesting requests and then jump to the real instruction
21965 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21966 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21967 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21968 * bail to the real handler if breakFlags==0.
21969 */
21970    ldrb   r3, [rSELF, #offThread_breakFlags]
21971    adrl   lr, dvmAsmInstructionStart + (308 * 64)
21972    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21973    cmp    r3, #0
21974    bxeq   lr                   @ nothing to do - jump to real handler
21975    EXPORT_PC()
21976    mov    r0, rPC              @ arg0
21977    mov    r1, rFP              @ arg1
21978    mov    r2, rSELF            @ arg2
21979    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21980
21981/* ------------------------------ */
21982    .balign 64
21983.L_ALT_OP_UNUSED_35FF: /* 0x135 */
21984/* File: armv5te/alt_stub.S */
21985/*
21986 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21987 * any interesting requests and then jump to the real instruction
21988 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21989 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21990 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21991 * bail to the real handler if breakFlags==0.
21992 */
21993    ldrb   r3, [rSELF, #offThread_breakFlags]
21994    adrl   lr, dvmAsmInstructionStart + (309 * 64)
21995    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21996    cmp    r3, #0
21997    bxeq   lr                   @ nothing to do - jump to real handler
21998    EXPORT_PC()
21999    mov    r0, rPC              @ arg0
22000    mov    r1, rFP              @ arg1
22001    mov    r2, rSELF            @ arg2
22002    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22003
22004/* ------------------------------ */
22005    .balign 64
22006.L_ALT_OP_UNUSED_36FF: /* 0x136 */
22007/* File: armv5te/alt_stub.S */
22008/*
22009 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22010 * any interesting requests and then jump to the real instruction
22011 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22012 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22013 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22014 * bail to the real handler if breakFlags==0.
22015 */
22016    ldrb   r3, [rSELF, #offThread_breakFlags]
22017    adrl   lr, dvmAsmInstructionStart + (310 * 64)
22018    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22019    cmp    r3, #0
22020    bxeq   lr                   @ nothing to do - jump to real handler
22021    EXPORT_PC()
22022    mov    r0, rPC              @ arg0
22023    mov    r1, rFP              @ arg1
22024    mov    r2, rSELF            @ arg2
22025    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22026
22027/* ------------------------------ */
22028    .balign 64
22029.L_ALT_OP_UNUSED_37FF: /* 0x137 */
22030/* File: armv5te/alt_stub.S */
22031/*
22032 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22033 * any interesting requests and then jump to the real instruction
22034 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22035 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22036 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22037 * bail to the real handler if breakFlags==0.
22038 */
22039    ldrb   r3, [rSELF, #offThread_breakFlags]
22040    adrl   lr, dvmAsmInstructionStart + (311 * 64)
22041    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22042    cmp    r3, #0
22043    bxeq   lr                   @ nothing to do - jump to real handler
22044    EXPORT_PC()
22045    mov    r0, rPC              @ arg0
22046    mov    r1, rFP              @ arg1
22047    mov    r2, rSELF            @ arg2
22048    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22049
22050/* ------------------------------ */
22051    .balign 64
22052.L_ALT_OP_UNUSED_38FF: /* 0x138 */
22053/* File: armv5te/alt_stub.S */
22054/*
22055 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22056 * any interesting requests and then jump to the real instruction
22057 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22058 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22059 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22060 * bail to the real handler if breakFlags==0.
22061 */
22062    ldrb   r3, [rSELF, #offThread_breakFlags]
22063    adrl   lr, dvmAsmInstructionStart + (312 * 64)
22064    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22065    cmp    r3, #0
22066    bxeq   lr                   @ nothing to do - jump to real handler
22067    EXPORT_PC()
22068    mov    r0, rPC              @ arg0
22069    mov    r1, rFP              @ arg1
22070    mov    r2, rSELF            @ arg2
22071    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22072
22073/* ------------------------------ */
22074    .balign 64
22075.L_ALT_OP_UNUSED_39FF: /* 0x139 */
22076/* File: armv5te/alt_stub.S */
22077/*
22078 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22079 * any interesting requests and then jump to the real instruction
22080 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22081 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22082 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22083 * bail to the real handler if breakFlags==0.
22084 */
22085    ldrb   r3, [rSELF, #offThread_breakFlags]
22086    adrl   lr, dvmAsmInstructionStart + (313 * 64)
22087    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22088    cmp    r3, #0
22089    bxeq   lr                   @ nothing to do - jump to real handler
22090    EXPORT_PC()
22091    mov    r0, rPC              @ arg0
22092    mov    r1, rFP              @ arg1
22093    mov    r2, rSELF            @ arg2
22094    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22095
22096/* ------------------------------ */
22097    .balign 64
22098.L_ALT_OP_UNUSED_3AFF: /* 0x13a */
22099/* File: armv5te/alt_stub.S */
22100/*
22101 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22102 * any interesting requests and then jump to the real instruction
22103 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22104 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22105 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22106 * bail to the real handler if breakFlags==0.
22107 */
22108    ldrb   r3, [rSELF, #offThread_breakFlags]
22109    adrl   lr, dvmAsmInstructionStart + (314 * 64)
22110    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22111    cmp    r3, #0
22112    bxeq   lr                   @ nothing to do - jump to real handler
22113    EXPORT_PC()
22114    mov    r0, rPC              @ arg0
22115    mov    r1, rFP              @ arg1
22116    mov    r2, rSELF            @ arg2
22117    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22118
22119/* ------------------------------ */
22120    .balign 64
22121.L_ALT_OP_UNUSED_3BFF: /* 0x13b */
22122/* File: armv5te/alt_stub.S */
22123/*
22124 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22125 * any interesting requests and then jump to the real instruction
22126 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22127 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22128 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22129 * bail to the real handler if breakFlags==0.
22130 */
22131    ldrb   r3, [rSELF, #offThread_breakFlags]
22132    adrl   lr, dvmAsmInstructionStart + (315 * 64)
22133    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22134    cmp    r3, #0
22135    bxeq   lr                   @ nothing to do - jump to real handler
22136    EXPORT_PC()
22137    mov    r0, rPC              @ arg0
22138    mov    r1, rFP              @ arg1
22139    mov    r2, rSELF            @ arg2
22140    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22141
22142/* ------------------------------ */
22143    .balign 64
22144.L_ALT_OP_UNUSED_3CFF: /* 0x13c */
22145/* File: armv5te/alt_stub.S */
22146/*
22147 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22148 * any interesting requests and then jump to the real instruction
22149 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22150 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22151 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22152 * bail to the real handler if breakFlags==0.
22153 */
22154    ldrb   r3, [rSELF, #offThread_breakFlags]
22155    adrl   lr, dvmAsmInstructionStart + (316 * 64)
22156    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22157    cmp    r3, #0
22158    bxeq   lr                   @ nothing to do - jump to real handler
22159    EXPORT_PC()
22160    mov    r0, rPC              @ arg0
22161    mov    r1, rFP              @ arg1
22162    mov    r2, rSELF            @ arg2
22163    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22164
22165/* ------------------------------ */
22166    .balign 64
22167.L_ALT_OP_UNUSED_3DFF: /* 0x13d */
22168/* File: armv5te/alt_stub.S */
22169/*
22170 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22171 * any interesting requests and then jump to the real instruction
22172 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22173 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22174 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22175 * bail to the real handler if breakFlags==0.
22176 */
22177    ldrb   r3, [rSELF, #offThread_breakFlags]
22178    adrl   lr, dvmAsmInstructionStart + (317 * 64)
22179    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22180    cmp    r3, #0
22181    bxeq   lr                   @ nothing to do - jump to real handler
22182    EXPORT_PC()
22183    mov    r0, rPC              @ arg0
22184    mov    r1, rFP              @ arg1
22185    mov    r2, rSELF            @ arg2
22186    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22187
22188/* ------------------------------ */
22189    .balign 64
22190.L_ALT_OP_UNUSED_3EFF: /* 0x13e */
22191/* File: armv5te/alt_stub.S */
22192/*
22193 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22194 * any interesting requests and then jump to the real instruction
22195 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22196 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22197 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22198 * bail to the real handler if breakFlags==0.
22199 */
22200    ldrb   r3, [rSELF, #offThread_breakFlags]
22201    adrl   lr, dvmAsmInstructionStart + (318 * 64)
22202    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22203    cmp    r3, #0
22204    bxeq   lr                   @ nothing to do - jump to real handler
22205    EXPORT_PC()
22206    mov    r0, rPC              @ arg0
22207    mov    r1, rFP              @ arg1
22208    mov    r2, rSELF            @ arg2
22209    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22210
22211/* ------------------------------ */
22212    .balign 64
22213.L_ALT_OP_UNUSED_3FFF: /* 0x13f */
22214/* File: armv5te/alt_stub.S */
22215/*
22216 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22217 * any interesting requests and then jump to the real instruction
22218 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22219 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22220 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22221 * bail to the real handler if breakFlags==0.
22222 */
22223    ldrb   r3, [rSELF, #offThread_breakFlags]
22224    adrl   lr, dvmAsmInstructionStart + (319 * 64)
22225    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22226    cmp    r3, #0
22227    bxeq   lr                   @ nothing to do - jump to real handler
22228    EXPORT_PC()
22229    mov    r0, rPC              @ arg0
22230    mov    r1, rFP              @ arg1
22231    mov    r2, rSELF            @ arg2
22232    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22233
22234/* ------------------------------ */
22235    .balign 64
22236.L_ALT_OP_UNUSED_40FF: /* 0x140 */
22237/* File: armv5te/alt_stub.S */
22238/*
22239 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22240 * any interesting requests and then jump to the real instruction
22241 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22242 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22243 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22244 * bail to the real handler if breakFlags==0.
22245 */
22246    ldrb   r3, [rSELF, #offThread_breakFlags]
22247    adrl   lr, dvmAsmInstructionStart + (320 * 64)
22248    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22249    cmp    r3, #0
22250    bxeq   lr                   @ nothing to do - jump to real handler
22251    EXPORT_PC()
22252    mov    r0, rPC              @ arg0
22253    mov    r1, rFP              @ arg1
22254    mov    r2, rSELF            @ arg2
22255    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22256
22257/* ------------------------------ */
22258    .balign 64
22259.L_ALT_OP_UNUSED_41FF: /* 0x141 */
22260/* File: armv5te/alt_stub.S */
22261/*
22262 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22263 * any interesting requests and then jump to the real instruction
22264 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22265 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22266 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22267 * bail to the real handler if breakFlags==0.
22268 */
22269    ldrb   r3, [rSELF, #offThread_breakFlags]
22270    adrl   lr, dvmAsmInstructionStart + (321 * 64)
22271    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22272    cmp    r3, #0
22273    bxeq   lr                   @ nothing to do - jump to real handler
22274    EXPORT_PC()
22275    mov    r0, rPC              @ arg0
22276    mov    r1, rFP              @ arg1
22277    mov    r2, rSELF            @ arg2
22278    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22279
22280/* ------------------------------ */
22281    .balign 64
22282.L_ALT_OP_UNUSED_42FF: /* 0x142 */
22283/* File: armv5te/alt_stub.S */
22284/*
22285 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22286 * any interesting requests and then jump to the real instruction
22287 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22288 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22289 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22290 * bail to the real handler if breakFlags==0.
22291 */
22292    ldrb   r3, [rSELF, #offThread_breakFlags]
22293    adrl   lr, dvmAsmInstructionStart + (322 * 64)
22294    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22295    cmp    r3, #0
22296    bxeq   lr                   @ nothing to do - jump to real handler
22297    EXPORT_PC()
22298    mov    r0, rPC              @ arg0
22299    mov    r1, rFP              @ arg1
22300    mov    r2, rSELF            @ arg2
22301    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22302
22303/* ------------------------------ */
22304    .balign 64
22305.L_ALT_OP_UNUSED_43FF: /* 0x143 */
22306/* File: armv5te/alt_stub.S */
22307/*
22308 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22309 * any interesting requests and then jump to the real instruction
22310 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22311 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22312 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22313 * bail to the real handler if breakFlags==0.
22314 */
22315    ldrb   r3, [rSELF, #offThread_breakFlags]
22316    adrl   lr, dvmAsmInstructionStart + (323 * 64)
22317    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22318    cmp    r3, #0
22319    bxeq   lr                   @ nothing to do - jump to real handler
22320    EXPORT_PC()
22321    mov    r0, rPC              @ arg0
22322    mov    r1, rFP              @ arg1
22323    mov    r2, rSELF            @ arg2
22324    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22325
22326/* ------------------------------ */
22327    .balign 64
22328.L_ALT_OP_UNUSED_44FF: /* 0x144 */
22329/* File: armv5te/alt_stub.S */
22330/*
22331 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22332 * any interesting requests and then jump to the real instruction
22333 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22334 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22335 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22336 * bail to the real handler if breakFlags==0.
22337 */
22338    ldrb   r3, [rSELF, #offThread_breakFlags]
22339    adrl   lr, dvmAsmInstructionStart + (324 * 64)
22340    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22341    cmp    r3, #0
22342    bxeq   lr                   @ nothing to do - jump to real handler
22343    EXPORT_PC()
22344    mov    r0, rPC              @ arg0
22345    mov    r1, rFP              @ arg1
22346    mov    r2, rSELF            @ arg2
22347    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22348
22349/* ------------------------------ */
22350    .balign 64
22351.L_ALT_OP_UNUSED_45FF: /* 0x145 */
22352/* File: armv5te/alt_stub.S */
22353/*
22354 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22355 * any interesting requests and then jump to the real instruction
22356 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22357 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22358 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22359 * bail to the real handler if breakFlags==0.
22360 */
22361    ldrb   r3, [rSELF, #offThread_breakFlags]
22362    adrl   lr, dvmAsmInstructionStart + (325 * 64)
22363    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22364    cmp    r3, #0
22365    bxeq   lr                   @ nothing to do - jump to real handler
22366    EXPORT_PC()
22367    mov    r0, rPC              @ arg0
22368    mov    r1, rFP              @ arg1
22369    mov    r2, rSELF            @ arg2
22370    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22371
22372/* ------------------------------ */
22373    .balign 64
22374.L_ALT_OP_UNUSED_46FF: /* 0x146 */
22375/* File: armv5te/alt_stub.S */
22376/*
22377 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22378 * any interesting requests and then jump to the real instruction
22379 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22380 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22381 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22382 * bail to the real handler if breakFlags==0.
22383 */
22384    ldrb   r3, [rSELF, #offThread_breakFlags]
22385    adrl   lr, dvmAsmInstructionStart + (326 * 64)
22386    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22387    cmp    r3, #0
22388    bxeq   lr                   @ nothing to do - jump to real handler
22389    EXPORT_PC()
22390    mov    r0, rPC              @ arg0
22391    mov    r1, rFP              @ arg1
22392    mov    r2, rSELF            @ arg2
22393    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22394
22395/* ------------------------------ */
22396    .balign 64
22397.L_ALT_OP_UNUSED_47FF: /* 0x147 */
22398/* File: armv5te/alt_stub.S */
22399/*
22400 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22401 * any interesting requests and then jump to the real instruction
22402 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22403 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22404 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22405 * bail to the real handler if breakFlags==0.
22406 */
22407    ldrb   r3, [rSELF, #offThread_breakFlags]
22408    adrl   lr, dvmAsmInstructionStart + (327 * 64)
22409    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22410    cmp    r3, #0
22411    bxeq   lr                   @ nothing to do - jump to real handler
22412    EXPORT_PC()
22413    mov    r0, rPC              @ arg0
22414    mov    r1, rFP              @ arg1
22415    mov    r2, rSELF            @ arg2
22416    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22417
22418/* ------------------------------ */
22419    .balign 64
22420.L_ALT_OP_UNUSED_48FF: /* 0x148 */
22421/* File: armv5te/alt_stub.S */
22422/*
22423 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22424 * any interesting requests and then jump to the real instruction
22425 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22426 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22427 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22428 * bail to the real handler if breakFlags==0.
22429 */
22430    ldrb   r3, [rSELF, #offThread_breakFlags]
22431    adrl   lr, dvmAsmInstructionStart + (328 * 64)
22432    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22433    cmp    r3, #0
22434    bxeq   lr                   @ nothing to do - jump to real handler
22435    EXPORT_PC()
22436    mov    r0, rPC              @ arg0
22437    mov    r1, rFP              @ arg1
22438    mov    r2, rSELF            @ arg2
22439    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22440
22441/* ------------------------------ */
22442    .balign 64
22443.L_ALT_OP_UNUSED_49FF: /* 0x149 */
22444/* File: armv5te/alt_stub.S */
22445/*
22446 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22447 * any interesting requests and then jump to the real instruction
22448 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22449 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22450 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22451 * bail to the real handler if breakFlags==0.
22452 */
22453    ldrb   r3, [rSELF, #offThread_breakFlags]
22454    adrl   lr, dvmAsmInstructionStart + (329 * 64)
22455    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22456    cmp    r3, #0
22457    bxeq   lr                   @ nothing to do - jump to real handler
22458    EXPORT_PC()
22459    mov    r0, rPC              @ arg0
22460    mov    r1, rFP              @ arg1
22461    mov    r2, rSELF            @ arg2
22462    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22463
22464/* ------------------------------ */
22465    .balign 64
22466.L_ALT_OP_UNUSED_4AFF: /* 0x14a */
22467/* File: armv5te/alt_stub.S */
22468/*
22469 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22470 * any interesting requests and then jump to the real instruction
22471 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22472 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22473 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22474 * bail to the real handler if breakFlags==0.
22475 */
22476    ldrb   r3, [rSELF, #offThread_breakFlags]
22477    adrl   lr, dvmAsmInstructionStart + (330 * 64)
22478    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22479    cmp    r3, #0
22480    bxeq   lr                   @ nothing to do - jump to real handler
22481    EXPORT_PC()
22482    mov    r0, rPC              @ arg0
22483    mov    r1, rFP              @ arg1
22484    mov    r2, rSELF            @ arg2
22485    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22486
22487/* ------------------------------ */
22488    .balign 64
22489.L_ALT_OP_UNUSED_4BFF: /* 0x14b */
22490/* File: armv5te/alt_stub.S */
22491/*
22492 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22493 * any interesting requests and then jump to the real instruction
22494 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22495 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22496 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22497 * bail to the real handler if breakFlags==0.
22498 */
22499    ldrb   r3, [rSELF, #offThread_breakFlags]
22500    adrl   lr, dvmAsmInstructionStart + (331 * 64)
22501    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22502    cmp    r3, #0
22503    bxeq   lr                   @ nothing to do - jump to real handler
22504    EXPORT_PC()
22505    mov    r0, rPC              @ arg0
22506    mov    r1, rFP              @ arg1
22507    mov    r2, rSELF            @ arg2
22508    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22509
22510/* ------------------------------ */
22511    .balign 64
22512.L_ALT_OP_UNUSED_4CFF: /* 0x14c */
22513/* File: armv5te/alt_stub.S */
22514/*
22515 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22516 * any interesting requests and then jump to the real instruction
22517 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22518 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22519 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22520 * bail to the real handler if breakFlags==0.
22521 */
22522    ldrb   r3, [rSELF, #offThread_breakFlags]
22523    adrl   lr, dvmAsmInstructionStart + (332 * 64)
22524    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22525    cmp    r3, #0
22526    bxeq   lr                   @ nothing to do - jump to real handler
22527    EXPORT_PC()
22528    mov    r0, rPC              @ arg0
22529    mov    r1, rFP              @ arg1
22530    mov    r2, rSELF            @ arg2
22531    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22532
22533/* ------------------------------ */
22534    .balign 64
22535.L_ALT_OP_UNUSED_4DFF: /* 0x14d */
22536/* File: armv5te/alt_stub.S */
22537/*
22538 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22539 * any interesting requests and then jump to the real instruction
22540 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22541 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22542 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22543 * bail to the real handler if breakFlags==0.
22544 */
22545    ldrb   r3, [rSELF, #offThread_breakFlags]
22546    adrl   lr, dvmAsmInstructionStart + (333 * 64)
22547    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22548    cmp    r3, #0
22549    bxeq   lr                   @ nothing to do - jump to real handler
22550    EXPORT_PC()
22551    mov    r0, rPC              @ arg0
22552    mov    r1, rFP              @ arg1
22553    mov    r2, rSELF            @ arg2
22554    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22555
22556/* ------------------------------ */
22557    .balign 64
22558.L_ALT_OP_UNUSED_4EFF: /* 0x14e */
22559/* File: armv5te/alt_stub.S */
22560/*
22561 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22562 * any interesting requests and then jump to the real instruction
22563 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22564 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22565 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22566 * bail to the real handler if breakFlags==0.
22567 */
22568    ldrb   r3, [rSELF, #offThread_breakFlags]
22569    adrl   lr, dvmAsmInstructionStart + (334 * 64)
22570    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22571    cmp    r3, #0
22572    bxeq   lr                   @ nothing to do - jump to real handler
22573    EXPORT_PC()
22574    mov    r0, rPC              @ arg0
22575    mov    r1, rFP              @ arg1
22576    mov    r2, rSELF            @ arg2
22577    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22578
22579/* ------------------------------ */
22580    .balign 64
22581.L_ALT_OP_UNUSED_4FFF: /* 0x14f */
22582/* File: armv5te/alt_stub.S */
22583/*
22584 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22585 * any interesting requests and then jump to the real instruction
22586 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22587 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22588 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22589 * bail to the real handler if breakFlags==0.
22590 */
22591    ldrb   r3, [rSELF, #offThread_breakFlags]
22592    adrl   lr, dvmAsmInstructionStart + (335 * 64)
22593    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22594    cmp    r3, #0
22595    bxeq   lr                   @ nothing to do - jump to real handler
22596    EXPORT_PC()
22597    mov    r0, rPC              @ arg0
22598    mov    r1, rFP              @ arg1
22599    mov    r2, rSELF            @ arg2
22600    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22601
22602/* ------------------------------ */
22603    .balign 64
22604.L_ALT_OP_UNUSED_50FF: /* 0x150 */
22605/* File: armv5te/alt_stub.S */
22606/*
22607 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22608 * any interesting requests and then jump to the real instruction
22609 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22610 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22611 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22612 * bail to the real handler if breakFlags==0.
22613 */
22614    ldrb   r3, [rSELF, #offThread_breakFlags]
22615    adrl   lr, dvmAsmInstructionStart + (336 * 64)
22616    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22617    cmp    r3, #0
22618    bxeq   lr                   @ nothing to do - jump to real handler
22619    EXPORT_PC()
22620    mov    r0, rPC              @ arg0
22621    mov    r1, rFP              @ arg1
22622    mov    r2, rSELF            @ arg2
22623    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22624
22625/* ------------------------------ */
22626    .balign 64
22627.L_ALT_OP_UNUSED_51FF: /* 0x151 */
22628/* File: armv5te/alt_stub.S */
22629/*
22630 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22631 * any interesting requests and then jump to the real instruction
22632 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22633 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22634 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22635 * bail to the real handler if breakFlags==0.
22636 */
22637    ldrb   r3, [rSELF, #offThread_breakFlags]
22638    adrl   lr, dvmAsmInstructionStart + (337 * 64)
22639    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22640    cmp    r3, #0
22641    bxeq   lr                   @ nothing to do - jump to real handler
22642    EXPORT_PC()
22643    mov    r0, rPC              @ arg0
22644    mov    r1, rFP              @ arg1
22645    mov    r2, rSELF            @ arg2
22646    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22647
22648/* ------------------------------ */
22649    .balign 64
22650.L_ALT_OP_UNUSED_52FF: /* 0x152 */
22651/* File: armv5te/alt_stub.S */
22652/*
22653 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22654 * any interesting requests and then jump to the real instruction
22655 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22656 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22657 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22658 * bail to the real handler if breakFlags==0.
22659 */
22660    ldrb   r3, [rSELF, #offThread_breakFlags]
22661    adrl   lr, dvmAsmInstructionStart + (338 * 64)
22662    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22663    cmp    r3, #0
22664    bxeq   lr                   @ nothing to do - jump to real handler
22665    EXPORT_PC()
22666    mov    r0, rPC              @ arg0
22667    mov    r1, rFP              @ arg1
22668    mov    r2, rSELF            @ arg2
22669    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22670
22671/* ------------------------------ */
22672    .balign 64
22673.L_ALT_OP_UNUSED_53FF: /* 0x153 */
22674/* File: armv5te/alt_stub.S */
22675/*
22676 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22677 * any interesting requests and then jump to the real instruction
22678 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22679 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22680 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22681 * bail to the real handler if breakFlags==0.
22682 */
22683    ldrb   r3, [rSELF, #offThread_breakFlags]
22684    adrl   lr, dvmAsmInstructionStart + (339 * 64)
22685    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22686    cmp    r3, #0
22687    bxeq   lr                   @ nothing to do - jump to real handler
22688    EXPORT_PC()
22689    mov    r0, rPC              @ arg0
22690    mov    r1, rFP              @ arg1
22691    mov    r2, rSELF            @ arg2
22692    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22693
22694/* ------------------------------ */
22695    .balign 64
22696.L_ALT_OP_UNUSED_54FF: /* 0x154 */
22697/* File: armv5te/alt_stub.S */
22698/*
22699 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22700 * any interesting requests and then jump to the real instruction
22701 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22702 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22703 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22704 * bail to the real handler if breakFlags==0.
22705 */
22706    ldrb   r3, [rSELF, #offThread_breakFlags]
22707    adrl   lr, dvmAsmInstructionStart + (340 * 64)
22708    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22709    cmp    r3, #0
22710    bxeq   lr                   @ nothing to do - jump to real handler
22711    EXPORT_PC()
22712    mov    r0, rPC              @ arg0
22713    mov    r1, rFP              @ arg1
22714    mov    r2, rSELF            @ arg2
22715    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22716
22717/* ------------------------------ */
22718    .balign 64
22719.L_ALT_OP_UNUSED_55FF: /* 0x155 */
22720/* File: armv5te/alt_stub.S */
22721/*
22722 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22723 * any interesting requests and then jump to the real instruction
22724 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22725 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22726 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22727 * bail to the real handler if breakFlags==0.
22728 */
22729    ldrb   r3, [rSELF, #offThread_breakFlags]
22730    adrl   lr, dvmAsmInstructionStart + (341 * 64)
22731    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22732    cmp    r3, #0
22733    bxeq   lr                   @ nothing to do - jump to real handler
22734    EXPORT_PC()
22735    mov    r0, rPC              @ arg0
22736    mov    r1, rFP              @ arg1
22737    mov    r2, rSELF            @ arg2
22738    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22739
22740/* ------------------------------ */
22741    .balign 64
22742.L_ALT_OP_UNUSED_56FF: /* 0x156 */
22743/* File: armv5te/alt_stub.S */
22744/*
22745 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22746 * any interesting requests and then jump to the real instruction
22747 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22748 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22749 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22750 * bail to the real handler if breakFlags==0.
22751 */
22752    ldrb   r3, [rSELF, #offThread_breakFlags]
22753    adrl   lr, dvmAsmInstructionStart + (342 * 64)
22754    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22755    cmp    r3, #0
22756    bxeq   lr                   @ nothing to do - jump to real handler
22757    EXPORT_PC()
22758    mov    r0, rPC              @ arg0
22759    mov    r1, rFP              @ arg1
22760    mov    r2, rSELF            @ arg2
22761    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22762
22763/* ------------------------------ */
22764    .balign 64
22765.L_ALT_OP_UNUSED_57FF: /* 0x157 */
22766/* File: armv5te/alt_stub.S */
22767/*
22768 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22769 * any interesting requests and then jump to the real instruction
22770 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22771 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22772 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22773 * bail to the real handler if breakFlags==0.
22774 */
22775    ldrb   r3, [rSELF, #offThread_breakFlags]
22776    adrl   lr, dvmAsmInstructionStart + (343 * 64)
22777    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22778    cmp    r3, #0
22779    bxeq   lr                   @ nothing to do - jump to real handler
22780    EXPORT_PC()
22781    mov    r0, rPC              @ arg0
22782    mov    r1, rFP              @ arg1
22783    mov    r2, rSELF            @ arg2
22784    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22785
22786/* ------------------------------ */
22787    .balign 64
22788.L_ALT_OP_UNUSED_58FF: /* 0x158 */
22789/* File: armv5te/alt_stub.S */
22790/*
22791 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22792 * any interesting requests and then jump to the real instruction
22793 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22794 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22795 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22796 * bail to the real handler if breakFlags==0.
22797 */
22798    ldrb   r3, [rSELF, #offThread_breakFlags]
22799    adrl   lr, dvmAsmInstructionStart + (344 * 64)
22800    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22801    cmp    r3, #0
22802    bxeq   lr                   @ nothing to do - jump to real handler
22803    EXPORT_PC()
22804    mov    r0, rPC              @ arg0
22805    mov    r1, rFP              @ arg1
22806    mov    r2, rSELF            @ arg2
22807    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22808
22809/* ------------------------------ */
22810    .balign 64
22811.L_ALT_OP_UNUSED_59FF: /* 0x159 */
22812/* File: armv5te/alt_stub.S */
22813/*
22814 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22815 * any interesting requests and then jump to the real instruction
22816 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22817 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22818 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22819 * bail to the real handler if breakFlags==0.
22820 */
22821    ldrb   r3, [rSELF, #offThread_breakFlags]
22822    adrl   lr, dvmAsmInstructionStart + (345 * 64)
22823    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22824    cmp    r3, #0
22825    bxeq   lr                   @ nothing to do - jump to real handler
22826    EXPORT_PC()
22827    mov    r0, rPC              @ arg0
22828    mov    r1, rFP              @ arg1
22829    mov    r2, rSELF            @ arg2
22830    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22831
22832/* ------------------------------ */
22833    .balign 64
22834.L_ALT_OP_UNUSED_5AFF: /* 0x15a */
22835/* File: armv5te/alt_stub.S */
22836/*
22837 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22838 * any interesting requests and then jump to the real instruction
22839 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22840 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22841 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22842 * bail to the real handler if breakFlags==0.
22843 */
22844    ldrb   r3, [rSELF, #offThread_breakFlags]
22845    adrl   lr, dvmAsmInstructionStart + (346 * 64)
22846    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22847    cmp    r3, #0
22848    bxeq   lr                   @ nothing to do - jump to real handler
22849    EXPORT_PC()
22850    mov    r0, rPC              @ arg0
22851    mov    r1, rFP              @ arg1
22852    mov    r2, rSELF            @ arg2
22853    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22854
22855/* ------------------------------ */
22856    .balign 64
22857.L_ALT_OP_UNUSED_5BFF: /* 0x15b */
22858/* File: armv5te/alt_stub.S */
22859/*
22860 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22861 * any interesting requests and then jump to the real instruction
22862 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22863 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22864 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22865 * bail to the real handler if breakFlags==0.
22866 */
22867    ldrb   r3, [rSELF, #offThread_breakFlags]
22868    adrl   lr, dvmAsmInstructionStart + (347 * 64)
22869    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22870    cmp    r3, #0
22871    bxeq   lr                   @ nothing to do - jump to real handler
22872    EXPORT_PC()
22873    mov    r0, rPC              @ arg0
22874    mov    r1, rFP              @ arg1
22875    mov    r2, rSELF            @ arg2
22876    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22877
22878/* ------------------------------ */
22879    .balign 64
22880.L_ALT_OP_UNUSED_5CFF: /* 0x15c */
22881/* File: armv5te/alt_stub.S */
22882/*
22883 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22884 * any interesting requests and then jump to the real instruction
22885 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22886 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22887 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22888 * bail to the real handler if breakFlags==0.
22889 */
22890    ldrb   r3, [rSELF, #offThread_breakFlags]
22891    adrl   lr, dvmAsmInstructionStart + (348 * 64)
22892    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22893    cmp    r3, #0
22894    bxeq   lr                   @ nothing to do - jump to real handler
22895    EXPORT_PC()
22896    mov    r0, rPC              @ arg0
22897    mov    r1, rFP              @ arg1
22898    mov    r2, rSELF            @ arg2
22899    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22900
22901/* ------------------------------ */
22902    .balign 64
22903.L_ALT_OP_UNUSED_5DFF: /* 0x15d */
22904/* File: armv5te/alt_stub.S */
22905/*
22906 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22907 * any interesting requests and then jump to the real instruction
22908 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22909 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22910 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22911 * bail to the real handler if breakFlags==0.
22912 */
22913    ldrb   r3, [rSELF, #offThread_breakFlags]
22914    adrl   lr, dvmAsmInstructionStart + (349 * 64)
22915    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22916    cmp    r3, #0
22917    bxeq   lr                   @ nothing to do - jump to real handler
22918    EXPORT_PC()
22919    mov    r0, rPC              @ arg0
22920    mov    r1, rFP              @ arg1
22921    mov    r2, rSELF            @ arg2
22922    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22923
22924/* ------------------------------ */
22925    .balign 64
22926.L_ALT_OP_UNUSED_5EFF: /* 0x15e */
22927/* File: armv5te/alt_stub.S */
22928/*
22929 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22930 * any interesting requests and then jump to the real instruction
22931 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22932 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22933 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22934 * bail to the real handler if breakFlags==0.
22935 */
22936    ldrb   r3, [rSELF, #offThread_breakFlags]
22937    adrl   lr, dvmAsmInstructionStart + (350 * 64)
22938    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22939    cmp    r3, #0
22940    bxeq   lr                   @ nothing to do - jump to real handler
22941    EXPORT_PC()
22942    mov    r0, rPC              @ arg0
22943    mov    r1, rFP              @ arg1
22944    mov    r2, rSELF            @ arg2
22945    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22946
22947/* ------------------------------ */
22948    .balign 64
22949.L_ALT_OP_UNUSED_5FFF: /* 0x15f */
22950/* File: armv5te/alt_stub.S */
22951/*
22952 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22953 * any interesting requests and then jump to the real instruction
22954 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22955 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22956 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22957 * bail to the real handler if breakFlags==0.
22958 */
22959    ldrb   r3, [rSELF, #offThread_breakFlags]
22960    adrl   lr, dvmAsmInstructionStart + (351 * 64)
22961    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22962    cmp    r3, #0
22963    bxeq   lr                   @ nothing to do - jump to real handler
22964    EXPORT_PC()
22965    mov    r0, rPC              @ arg0
22966    mov    r1, rFP              @ arg1
22967    mov    r2, rSELF            @ arg2
22968    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22969
22970/* ------------------------------ */
22971    .balign 64
22972.L_ALT_OP_UNUSED_60FF: /* 0x160 */
22973/* File: armv5te/alt_stub.S */
22974/*
22975 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22976 * any interesting requests and then jump to the real instruction
22977 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22978 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22979 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22980 * bail to the real handler if breakFlags==0.
22981 */
22982    ldrb   r3, [rSELF, #offThread_breakFlags]
22983    adrl   lr, dvmAsmInstructionStart + (352 * 64)
22984    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22985    cmp    r3, #0
22986    bxeq   lr                   @ nothing to do - jump to real handler
22987    EXPORT_PC()
22988    mov    r0, rPC              @ arg0
22989    mov    r1, rFP              @ arg1
22990    mov    r2, rSELF            @ arg2
22991    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22992
22993/* ------------------------------ */
22994    .balign 64
22995.L_ALT_OP_UNUSED_61FF: /* 0x161 */
22996/* File: armv5te/alt_stub.S */
22997/*
22998 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22999 * any interesting requests and then jump to the real instruction
23000 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23001 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23002 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23003 * bail to the real handler if breakFlags==0.
23004 */
23005    ldrb   r3, [rSELF, #offThread_breakFlags]
23006    adrl   lr, dvmAsmInstructionStart + (353 * 64)
23007    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23008    cmp    r3, #0
23009    bxeq   lr                   @ nothing to do - jump to real handler
23010    EXPORT_PC()
23011    mov    r0, rPC              @ arg0
23012    mov    r1, rFP              @ arg1
23013    mov    r2, rSELF            @ arg2
23014    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23015
23016/* ------------------------------ */
23017    .balign 64
23018.L_ALT_OP_UNUSED_62FF: /* 0x162 */
23019/* File: armv5te/alt_stub.S */
23020/*
23021 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23022 * any interesting requests and then jump to the real instruction
23023 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23024 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23025 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23026 * bail to the real handler if breakFlags==0.
23027 */
23028    ldrb   r3, [rSELF, #offThread_breakFlags]
23029    adrl   lr, dvmAsmInstructionStart + (354 * 64)
23030    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23031    cmp    r3, #0
23032    bxeq   lr                   @ nothing to do - jump to real handler
23033    EXPORT_PC()
23034    mov    r0, rPC              @ arg0
23035    mov    r1, rFP              @ arg1
23036    mov    r2, rSELF            @ arg2
23037    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23038
23039/* ------------------------------ */
23040    .balign 64
23041.L_ALT_OP_UNUSED_63FF: /* 0x163 */
23042/* File: armv5te/alt_stub.S */
23043/*
23044 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23045 * any interesting requests and then jump to the real instruction
23046 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23047 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23048 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23049 * bail to the real handler if breakFlags==0.
23050 */
23051    ldrb   r3, [rSELF, #offThread_breakFlags]
23052    adrl   lr, dvmAsmInstructionStart + (355 * 64)
23053    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23054    cmp    r3, #0
23055    bxeq   lr                   @ nothing to do - jump to real handler
23056    EXPORT_PC()
23057    mov    r0, rPC              @ arg0
23058    mov    r1, rFP              @ arg1
23059    mov    r2, rSELF            @ arg2
23060    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23061
23062/* ------------------------------ */
23063    .balign 64
23064.L_ALT_OP_UNUSED_64FF: /* 0x164 */
23065/* File: armv5te/alt_stub.S */
23066/*
23067 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23068 * any interesting requests and then jump to the real instruction
23069 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23070 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23071 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23072 * bail to the real handler if breakFlags==0.
23073 */
23074    ldrb   r3, [rSELF, #offThread_breakFlags]
23075    adrl   lr, dvmAsmInstructionStart + (356 * 64)
23076    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23077    cmp    r3, #0
23078    bxeq   lr                   @ nothing to do - jump to real handler
23079    EXPORT_PC()
23080    mov    r0, rPC              @ arg0
23081    mov    r1, rFP              @ arg1
23082    mov    r2, rSELF            @ arg2
23083    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23084
23085/* ------------------------------ */
23086    .balign 64
23087.L_ALT_OP_UNUSED_65FF: /* 0x165 */
23088/* File: armv5te/alt_stub.S */
23089/*
23090 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23091 * any interesting requests and then jump to the real instruction
23092 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23093 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23094 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23095 * bail to the real handler if breakFlags==0.
23096 */
23097    ldrb   r3, [rSELF, #offThread_breakFlags]
23098    adrl   lr, dvmAsmInstructionStart + (357 * 64)
23099    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23100    cmp    r3, #0
23101    bxeq   lr                   @ nothing to do - jump to real handler
23102    EXPORT_PC()
23103    mov    r0, rPC              @ arg0
23104    mov    r1, rFP              @ arg1
23105    mov    r2, rSELF            @ arg2
23106    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23107
23108/* ------------------------------ */
23109    .balign 64
23110.L_ALT_OP_UNUSED_66FF: /* 0x166 */
23111/* File: armv5te/alt_stub.S */
23112/*
23113 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23114 * any interesting requests and then jump to the real instruction
23115 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23116 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23117 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23118 * bail to the real handler if breakFlags==0.
23119 */
23120    ldrb   r3, [rSELF, #offThread_breakFlags]
23121    adrl   lr, dvmAsmInstructionStart + (358 * 64)
23122    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23123    cmp    r3, #0
23124    bxeq   lr                   @ nothing to do - jump to real handler
23125    EXPORT_PC()
23126    mov    r0, rPC              @ arg0
23127    mov    r1, rFP              @ arg1
23128    mov    r2, rSELF            @ arg2
23129    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23130
23131/* ------------------------------ */
23132    .balign 64
23133.L_ALT_OP_UNUSED_67FF: /* 0x167 */
23134/* File: armv5te/alt_stub.S */
23135/*
23136 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23137 * any interesting requests and then jump to the real instruction
23138 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23139 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23140 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23141 * bail to the real handler if breakFlags==0.
23142 */
23143    ldrb   r3, [rSELF, #offThread_breakFlags]
23144    adrl   lr, dvmAsmInstructionStart + (359 * 64)
23145    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23146    cmp    r3, #0
23147    bxeq   lr                   @ nothing to do - jump to real handler
23148    EXPORT_PC()
23149    mov    r0, rPC              @ arg0
23150    mov    r1, rFP              @ arg1
23151    mov    r2, rSELF            @ arg2
23152    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23153
23154/* ------------------------------ */
23155    .balign 64
23156.L_ALT_OP_UNUSED_68FF: /* 0x168 */
23157/* File: armv5te/alt_stub.S */
23158/*
23159 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23160 * any interesting requests and then jump to the real instruction
23161 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23162 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23163 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23164 * bail to the real handler if breakFlags==0.
23165 */
23166    ldrb   r3, [rSELF, #offThread_breakFlags]
23167    adrl   lr, dvmAsmInstructionStart + (360 * 64)
23168    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23169    cmp    r3, #0
23170    bxeq   lr                   @ nothing to do - jump to real handler
23171    EXPORT_PC()
23172    mov    r0, rPC              @ arg0
23173    mov    r1, rFP              @ arg1
23174    mov    r2, rSELF            @ arg2
23175    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23176
23177/* ------------------------------ */
23178    .balign 64
23179.L_ALT_OP_UNUSED_69FF: /* 0x169 */
23180/* File: armv5te/alt_stub.S */
23181/*
23182 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23183 * any interesting requests and then jump to the real instruction
23184 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23185 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23186 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23187 * bail to the real handler if breakFlags==0.
23188 */
23189    ldrb   r3, [rSELF, #offThread_breakFlags]
23190    adrl   lr, dvmAsmInstructionStart + (361 * 64)
23191    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23192    cmp    r3, #0
23193    bxeq   lr                   @ nothing to do - jump to real handler
23194    EXPORT_PC()
23195    mov    r0, rPC              @ arg0
23196    mov    r1, rFP              @ arg1
23197    mov    r2, rSELF            @ arg2
23198    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23199
23200/* ------------------------------ */
23201    .balign 64
23202.L_ALT_OP_UNUSED_6AFF: /* 0x16a */
23203/* File: armv5te/alt_stub.S */
23204/*
23205 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23206 * any interesting requests and then jump to the real instruction
23207 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23208 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23209 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23210 * bail to the real handler if breakFlags==0.
23211 */
23212    ldrb   r3, [rSELF, #offThread_breakFlags]
23213    adrl   lr, dvmAsmInstructionStart + (362 * 64)
23214    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23215    cmp    r3, #0
23216    bxeq   lr                   @ nothing to do - jump to real handler
23217    EXPORT_PC()
23218    mov    r0, rPC              @ arg0
23219    mov    r1, rFP              @ arg1
23220    mov    r2, rSELF            @ arg2
23221    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23222
23223/* ------------------------------ */
23224    .balign 64
23225.L_ALT_OP_UNUSED_6BFF: /* 0x16b */
23226/* File: armv5te/alt_stub.S */
23227/*
23228 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23229 * any interesting requests and then jump to the real instruction
23230 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23231 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23232 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23233 * bail to the real handler if breakFlags==0.
23234 */
23235    ldrb   r3, [rSELF, #offThread_breakFlags]
23236    adrl   lr, dvmAsmInstructionStart + (363 * 64)
23237    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23238    cmp    r3, #0
23239    bxeq   lr                   @ nothing to do - jump to real handler
23240    EXPORT_PC()
23241    mov    r0, rPC              @ arg0
23242    mov    r1, rFP              @ arg1
23243    mov    r2, rSELF            @ arg2
23244    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23245
23246/* ------------------------------ */
23247    .balign 64
23248.L_ALT_OP_UNUSED_6CFF: /* 0x16c */
23249/* File: armv5te/alt_stub.S */
23250/*
23251 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23252 * any interesting requests and then jump to the real instruction
23253 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23254 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23255 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23256 * bail to the real handler if breakFlags==0.
23257 */
23258    ldrb   r3, [rSELF, #offThread_breakFlags]
23259    adrl   lr, dvmAsmInstructionStart + (364 * 64)
23260    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23261    cmp    r3, #0
23262    bxeq   lr                   @ nothing to do - jump to real handler
23263    EXPORT_PC()
23264    mov    r0, rPC              @ arg0
23265    mov    r1, rFP              @ arg1
23266    mov    r2, rSELF            @ arg2
23267    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23268
23269/* ------------------------------ */
23270    .balign 64
23271.L_ALT_OP_UNUSED_6DFF: /* 0x16d */
23272/* File: armv5te/alt_stub.S */
23273/*
23274 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23275 * any interesting requests and then jump to the real instruction
23276 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23277 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23278 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23279 * bail to the real handler if breakFlags==0.
23280 */
23281    ldrb   r3, [rSELF, #offThread_breakFlags]
23282    adrl   lr, dvmAsmInstructionStart + (365 * 64)
23283    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23284    cmp    r3, #0
23285    bxeq   lr                   @ nothing to do - jump to real handler
23286    EXPORT_PC()
23287    mov    r0, rPC              @ arg0
23288    mov    r1, rFP              @ arg1
23289    mov    r2, rSELF            @ arg2
23290    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23291
23292/* ------------------------------ */
23293    .balign 64
23294.L_ALT_OP_UNUSED_6EFF: /* 0x16e */
23295/* File: armv5te/alt_stub.S */
23296/*
23297 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23298 * any interesting requests and then jump to the real instruction
23299 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23300 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23301 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23302 * bail to the real handler if breakFlags==0.
23303 */
23304    ldrb   r3, [rSELF, #offThread_breakFlags]
23305    adrl   lr, dvmAsmInstructionStart + (366 * 64)
23306    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23307    cmp    r3, #0
23308    bxeq   lr                   @ nothing to do - jump to real handler
23309    EXPORT_PC()
23310    mov    r0, rPC              @ arg0
23311    mov    r1, rFP              @ arg1
23312    mov    r2, rSELF            @ arg2
23313    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23314
23315/* ------------------------------ */
23316    .balign 64
23317.L_ALT_OP_UNUSED_6FFF: /* 0x16f */
23318/* File: armv5te/alt_stub.S */
23319/*
23320 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23321 * any interesting requests and then jump to the real instruction
23322 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23323 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23324 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23325 * bail to the real handler if breakFlags==0.
23326 */
23327    ldrb   r3, [rSELF, #offThread_breakFlags]
23328    adrl   lr, dvmAsmInstructionStart + (367 * 64)
23329    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23330    cmp    r3, #0
23331    bxeq   lr                   @ nothing to do - jump to real handler
23332    EXPORT_PC()
23333    mov    r0, rPC              @ arg0
23334    mov    r1, rFP              @ arg1
23335    mov    r2, rSELF            @ arg2
23336    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23337
23338/* ------------------------------ */
23339    .balign 64
23340.L_ALT_OP_UNUSED_70FF: /* 0x170 */
23341/* File: armv5te/alt_stub.S */
23342/*
23343 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23344 * any interesting requests and then jump to the real instruction
23345 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23346 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23347 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23348 * bail to the real handler if breakFlags==0.
23349 */
23350    ldrb   r3, [rSELF, #offThread_breakFlags]
23351    adrl   lr, dvmAsmInstructionStart + (368 * 64)
23352    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23353    cmp    r3, #0
23354    bxeq   lr                   @ nothing to do - jump to real handler
23355    EXPORT_PC()
23356    mov    r0, rPC              @ arg0
23357    mov    r1, rFP              @ arg1
23358    mov    r2, rSELF            @ arg2
23359    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23360
23361/* ------------------------------ */
23362    .balign 64
23363.L_ALT_OP_UNUSED_71FF: /* 0x171 */
23364/* File: armv5te/alt_stub.S */
23365/*
23366 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23367 * any interesting requests and then jump to the real instruction
23368 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23369 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23370 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23371 * bail to the real handler if breakFlags==0.
23372 */
23373    ldrb   r3, [rSELF, #offThread_breakFlags]
23374    adrl   lr, dvmAsmInstructionStart + (369 * 64)
23375    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23376    cmp    r3, #0
23377    bxeq   lr                   @ nothing to do - jump to real handler
23378    EXPORT_PC()
23379    mov    r0, rPC              @ arg0
23380    mov    r1, rFP              @ arg1
23381    mov    r2, rSELF            @ arg2
23382    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23383
23384/* ------------------------------ */
23385    .balign 64
23386.L_ALT_OP_UNUSED_72FF: /* 0x172 */
23387/* File: armv5te/alt_stub.S */
23388/*
23389 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23390 * any interesting requests and then jump to the real instruction
23391 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23392 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23393 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23394 * bail to the real handler if breakFlags==0.
23395 */
23396    ldrb   r3, [rSELF, #offThread_breakFlags]
23397    adrl   lr, dvmAsmInstructionStart + (370 * 64)
23398    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23399    cmp    r3, #0
23400    bxeq   lr                   @ nothing to do - jump to real handler
23401    EXPORT_PC()
23402    mov    r0, rPC              @ arg0
23403    mov    r1, rFP              @ arg1
23404    mov    r2, rSELF            @ arg2
23405    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23406
23407/* ------------------------------ */
23408    .balign 64
23409.L_ALT_OP_UNUSED_73FF: /* 0x173 */
23410/* File: armv5te/alt_stub.S */
23411/*
23412 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23413 * any interesting requests and then jump to the real instruction
23414 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23415 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23416 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23417 * bail to the real handler if breakFlags==0.
23418 */
23419    ldrb   r3, [rSELF, #offThread_breakFlags]
23420    adrl   lr, dvmAsmInstructionStart + (371 * 64)
23421    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23422    cmp    r3, #0
23423    bxeq   lr                   @ nothing to do - jump to real handler
23424    EXPORT_PC()
23425    mov    r0, rPC              @ arg0
23426    mov    r1, rFP              @ arg1
23427    mov    r2, rSELF            @ arg2
23428    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23429
23430/* ------------------------------ */
23431    .balign 64
23432.L_ALT_OP_UNUSED_74FF: /* 0x174 */
23433/* File: armv5te/alt_stub.S */
23434/*
23435 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23436 * any interesting requests and then jump to the real instruction
23437 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23438 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23439 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23440 * bail to the real handler if breakFlags==0.
23441 */
23442    ldrb   r3, [rSELF, #offThread_breakFlags]
23443    adrl   lr, dvmAsmInstructionStart + (372 * 64)
23444    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23445    cmp    r3, #0
23446    bxeq   lr                   @ nothing to do - jump to real handler
23447    EXPORT_PC()
23448    mov    r0, rPC              @ arg0
23449    mov    r1, rFP              @ arg1
23450    mov    r2, rSELF            @ arg2
23451    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23452
23453/* ------------------------------ */
23454    .balign 64
23455.L_ALT_OP_UNUSED_75FF: /* 0x175 */
23456/* File: armv5te/alt_stub.S */
23457/*
23458 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23459 * any interesting requests and then jump to the real instruction
23460 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23461 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23462 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23463 * bail to the real handler if breakFlags==0.
23464 */
23465    ldrb   r3, [rSELF, #offThread_breakFlags]
23466    adrl   lr, dvmAsmInstructionStart + (373 * 64)
23467    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23468    cmp    r3, #0
23469    bxeq   lr                   @ nothing to do - jump to real handler
23470    EXPORT_PC()
23471    mov    r0, rPC              @ arg0
23472    mov    r1, rFP              @ arg1
23473    mov    r2, rSELF            @ arg2
23474    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23475
23476/* ------------------------------ */
23477    .balign 64
23478.L_ALT_OP_UNUSED_76FF: /* 0x176 */
23479/* File: armv5te/alt_stub.S */
23480/*
23481 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23482 * any interesting requests and then jump to the real instruction
23483 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23484 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23485 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23486 * bail to the real handler if breakFlags==0.
23487 */
23488    ldrb   r3, [rSELF, #offThread_breakFlags]
23489    adrl   lr, dvmAsmInstructionStart + (374 * 64)
23490    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23491    cmp    r3, #0
23492    bxeq   lr                   @ nothing to do - jump to real handler
23493    EXPORT_PC()
23494    mov    r0, rPC              @ arg0
23495    mov    r1, rFP              @ arg1
23496    mov    r2, rSELF            @ arg2
23497    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23498
23499/* ------------------------------ */
23500    .balign 64
23501.L_ALT_OP_UNUSED_77FF: /* 0x177 */
23502/* File: armv5te/alt_stub.S */
23503/*
23504 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23505 * any interesting requests and then jump to the real instruction
23506 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23507 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23508 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23509 * bail to the real handler if breakFlags==0.
23510 */
23511    ldrb   r3, [rSELF, #offThread_breakFlags]
23512    adrl   lr, dvmAsmInstructionStart + (375 * 64)
23513    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23514    cmp    r3, #0
23515    bxeq   lr                   @ nothing to do - jump to real handler
23516    EXPORT_PC()
23517    mov    r0, rPC              @ arg0
23518    mov    r1, rFP              @ arg1
23519    mov    r2, rSELF            @ arg2
23520    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23521
23522/* ------------------------------ */
23523    .balign 64
23524.L_ALT_OP_UNUSED_78FF: /* 0x178 */
23525/* File: armv5te/alt_stub.S */
23526/*
23527 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23528 * any interesting requests and then jump to the real instruction
23529 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23530 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23531 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23532 * bail to the real handler if breakFlags==0.
23533 */
23534    ldrb   r3, [rSELF, #offThread_breakFlags]
23535    adrl   lr, dvmAsmInstructionStart + (376 * 64)
23536    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23537    cmp    r3, #0
23538    bxeq   lr                   @ nothing to do - jump to real handler
23539    EXPORT_PC()
23540    mov    r0, rPC              @ arg0
23541    mov    r1, rFP              @ arg1
23542    mov    r2, rSELF            @ arg2
23543    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23544
23545/* ------------------------------ */
23546    .balign 64
23547.L_ALT_OP_UNUSED_79FF: /* 0x179 */
23548/* File: armv5te/alt_stub.S */
23549/*
23550 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23551 * any interesting requests and then jump to the real instruction
23552 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23553 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23554 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23555 * bail to the real handler if breakFlags==0.
23556 */
23557    ldrb   r3, [rSELF, #offThread_breakFlags]
23558    adrl   lr, dvmAsmInstructionStart + (377 * 64)
23559    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23560    cmp    r3, #0
23561    bxeq   lr                   @ nothing to do - jump to real handler
23562    EXPORT_PC()
23563    mov    r0, rPC              @ arg0
23564    mov    r1, rFP              @ arg1
23565    mov    r2, rSELF            @ arg2
23566    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23567
23568/* ------------------------------ */
23569    .balign 64
23570.L_ALT_OP_UNUSED_7AFF: /* 0x17a */
23571/* File: armv5te/alt_stub.S */
23572/*
23573 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23574 * any interesting requests and then jump to the real instruction
23575 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23576 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23577 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23578 * bail to the real handler if breakFlags==0.
23579 */
23580    ldrb   r3, [rSELF, #offThread_breakFlags]
23581    adrl   lr, dvmAsmInstructionStart + (378 * 64)
23582    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23583    cmp    r3, #0
23584    bxeq   lr                   @ nothing to do - jump to real handler
23585    EXPORT_PC()
23586    mov    r0, rPC              @ arg0
23587    mov    r1, rFP              @ arg1
23588    mov    r2, rSELF            @ arg2
23589    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23590
23591/* ------------------------------ */
23592    .balign 64
23593.L_ALT_OP_UNUSED_7BFF: /* 0x17b */
23594/* File: armv5te/alt_stub.S */
23595/*
23596 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23597 * any interesting requests and then jump to the real instruction
23598 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23599 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23600 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23601 * bail to the real handler if breakFlags==0.
23602 */
23603    ldrb   r3, [rSELF, #offThread_breakFlags]
23604    adrl   lr, dvmAsmInstructionStart + (379 * 64)
23605    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23606    cmp    r3, #0
23607    bxeq   lr                   @ nothing to do - jump to real handler
23608    EXPORT_PC()
23609    mov    r0, rPC              @ arg0
23610    mov    r1, rFP              @ arg1
23611    mov    r2, rSELF            @ arg2
23612    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23613
23614/* ------------------------------ */
23615    .balign 64
23616.L_ALT_OP_UNUSED_7CFF: /* 0x17c */
23617/* File: armv5te/alt_stub.S */
23618/*
23619 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23620 * any interesting requests and then jump to the real instruction
23621 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23622 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23623 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23624 * bail to the real handler if breakFlags==0.
23625 */
23626    ldrb   r3, [rSELF, #offThread_breakFlags]
23627    adrl   lr, dvmAsmInstructionStart + (380 * 64)
23628    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23629    cmp    r3, #0
23630    bxeq   lr                   @ nothing to do - jump to real handler
23631    EXPORT_PC()
23632    mov    r0, rPC              @ arg0
23633    mov    r1, rFP              @ arg1
23634    mov    r2, rSELF            @ arg2
23635    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23636
23637/* ------------------------------ */
23638    .balign 64
23639.L_ALT_OP_UNUSED_7DFF: /* 0x17d */
23640/* File: armv5te/alt_stub.S */
23641/*
23642 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23643 * any interesting requests and then jump to the real instruction
23644 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23645 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23646 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23647 * bail to the real handler if breakFlags==0.
23648 */
23649    ldrb   r3, [rSELF, #offThread_breakFlags]
23650    adrl   lr, dvmAsmInstructionStart + (381 * 64)
23651    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23652    cmp    r3, #0
23653    bxeq   lr                   @ nothing to do - jump to real handler
23654    EXPORT_PC()
23655    mov    r0, rPC              @ arg0
23656    mov    r1, rFP              @ arg1
23657    mov    r2, rSELF            @ arg2
23658    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23659
23660/* ------------------------------ */
23661    .balign 64
23662.L_ALT_OP_UNUSED_7EFF: /* 0x17e */
23663/* File: armv5te/alt_stub.S */
23664/*
23665 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23666 * any interesting requests and then jump to the real instruction
23667 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23668 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23669 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23670 * bail to the real handler if breakFlags==0.
23671 */
23672    ldrb   r3, [rSELF, #offThread_breakFlags]
23673    adrl   lr, dvmAsmInstructionStart + (382 * 64)
23674    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23675    cmp    r3, #0
23676    bxeq   lr                   @ nothing to do - jump to real handler
23677    EXPORT_PC()
23678    mov    r0, rPC              @ arg0
23679    mov    r1, rFP              @ arg1
23680    mov    r2, rSELF            @ arg2
23681    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23682
23683/* ------------------------------ */
23684    .balign 64
23685.L_ALT_OP_UNUSED_7FFF: /* 0x17f */
23686/* File: armv5te/alt_stub.S */
23687/*
23688 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23689 * any interesting requests and then jump to the real instruction
23690 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23691 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23692 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23693 * bail to the real handler if breakFlags==0.
23694 */
23695    ldrb   r3, [rSELF, #offThread_breakFlags]
23696    adrl   lr, dvmAsmInstructionStart + (383 * 64)
23697    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23698    cmp    r3, #0
23699    bxeq   lr                   @ nothing to do - jump to real handler
23700    EXPORT_PC()
23701    mov    r0, rPC              @ arg0
23702    mov    r1, rFP              @ arg1
23703    mov    r2, rSELF            @ arg2
23704    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23705
23706/* ------------------------------ */
23707    .balign 64
23708.L_ALT_OP_UNUSED_80FF: /* 0x180 */
23709/* File: armv5te/alt_stub.S */
23710/*
23711 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23712 * any interesting requests and then jump to the real instruction
23713 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23714 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23715 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23716 * bail to the real handler if breakFlags==0.
23717 */
23718    ldrb   r3, [rSELF, #offThread_breakFlags]
23719    adrl   lr, dvmAsmInstructionStart + (384 * 64)
23720    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23721    cmp    r3, #0
23722    bxeq   lr                   @ nothing to do - jump to real handler
23723    EXPORT_PC()
23724    mov    r0, rPC              @ arg0
23725    mov    r1, rFP              @ arg1
23726    mov    r2, rSELF            @ arg2
23727    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23728
23729/* ------------------------------ */
23730    .balign 64
23731.L_ALT_OP_UNUSED_81FF: /* 0x181 */
23732/* File: armv5te/alt_stub.S */
23733/*
23734 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23735 * any interesting requests and then jump to the real instruction
23736 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23737 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23738 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23739 * bail to the real handler if breakFlags==0.
23740 */
23741    ldrb   r3, [rSELF, #offThread_breakFlags]
23742    adrl   lr, dvmAsmInstructionStart + (385 * 64)
23743    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23744    cmp    r3, #0
23745    bxeq   lr                   @ nothing to do - jump to real handler
23746    EXPORT_PC()
23747    mov    r0, rPC              @ arg0
23748    mov    r1, rFP              @ arg1
23749    mov    r2, rSELF            @ arg2
23750    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23751
23752/* ------------------------------ */
23753    .balign 64
23754.L_ALT_OP_UNUSED_82FF: /* 0x182 */
23755/* File: armv5te/alt_stub.S */
23756/*
23757 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23758 * any interesting requests and then jump to the real instruction
23759 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23760 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23761 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23762 * bail to the real handler if breakFlags==0.
23763 */
23764    ldrb   r3, [rSELF, #offThread_breakFlags]
23765    adrl   lr, dvmAsmInstructionStart + (386 * 64)
23766    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23767    cmp    r3, #0
23768    bxeq   lr                   @ nothing to do - jump to real handler
23769    EXPORT_PC()
23770    mov    r0, rPC              @ arg0
23771    mov    r1, rFP              @ arg1
23772    mov    r2, rSELF            @ arg2
23773    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23774
23775/* ------------------------------ */
23776    .balign 64
23777.L_ALT_OP_UNUSED_83FF: /* 0x183 */
23778/* File: armv5te/alt_stub.S */
23779/*
23780 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23781 * any interesting requests and then jump to the real instruction
23782 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23783 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23784 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23785 * bail to the real handler if breakFlags==0.
23786 */
23787    ldrb   r3, [rSELF, #offThread_breakFlags]
23788    adrl   lr, dvmAsmInstructionStart + (387 * 64)
23789    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23790    cmp    r3, #0
23791    bxeq   lr                   @ nothing to do - jump to real handler
23792    EXPORT_PC()
23793    mov    r0, rPC              @ arg0
23794    mov    r1, rFP              @ arg1
23795    mov    r2, rSELF            @ arg2
23796    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23797
23798/* ------------------------------ */
23799    .balign 64
23800.L_ALT_OP_UNUSED_84FF: /* 0x184 */
23801/* File: armv5te/alt_stub.S */
23802/*
23803 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23804 * any interesting requests and then jump to the real instruction
23805 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23806 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23807 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23808 * bail to the real handler if breakFlags==0.
23809 */
23810    ldrb   r3, [rSELF, #offThread_breakFlags]
23811    adrl   lr, dvmAsmInstructionStart + (388 * 64)
23812    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23813    cmp    r3, #0
23814    bxeq   lr                   @ nothing to do - jump to real handler
23815    EXPORT_PC()
23816    mov    r0, rPC              @ arg0
23817    mov    r1, rFP              @ arg1
23818    mov    r2, rSELF            @ arg2
23819    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23820
23821/* ------------------------------ */
23822    .balign 64
23823.L_ALT_OP_UNUSED_85FF: /* 0x185 */
23824/* File: armv5te/alt_stub.S */
23825/*
23826 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23827 * any interesting requests and then jump to the real instruction
23828 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23829 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23830 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23831 * bail to the real handler if breakFlags==0.
23832 */
23833    ldrb   r3, [rSELF, #offThread_breakFlags]
23834    adrl   lr, dvmAsmInstructionStart + (389 * 64)
23835    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23836    cmp    r3, #0
23837    bxeq   lr                   @ nothing to do - jump to real handler
23838    EXPORT_PC()
23839    mov    r0, rPC              @ arg0
23840    mov    r1, rFP              @ arg1
23841    mov    r2, rSELF            @ arg2
23842    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23843
23844/* ------------------------------ */
23845    .balign 64
23846.L_ALT_OP_UNUSED_86FF: /* 0x186 */
23847/* File: armv5te/alt_stub.S */
23848/*
23849 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23850 * any interesting requests and then jump to the real instruction
23851 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23852 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23853 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23854 * bail to the real handler if breakFlags==0.
23855 */
23856    ldrb   r3, [rSELF, #offThread_breakFlags]
23857    adrl   lr, dvmAsmInstructionStart + (390 * 64)
23858    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23859    cmp    r3, #0
23860    bxeq   lr                   @ nothing to do - jump to real handler
23861    EXPORT_PC()
23862    mov    r0, rPC              @ arg0
23863    mov    r1, rFP              @ arg1
23864    mov    r2, rSELF            @ arg2
23865    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23866
23867/* ------------------------------ */
23868    .balign 64
23869.L_ALT_OP_UNUSED_87FF: /* 0x187 */
23870/* File: armv5te/alt_stub.S */
23871/*
23872 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23873 * any interesting requests and then jump to the real instruction
23874 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23875 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23876 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23877 * bail to the real handler if breakFlags==0.
23878 */
23879    ldrb   r3, [rSELF, #offThread_breakFlags]
23880    adrl   lr, dvmAsmInstructionStart + (391 * 64)
23881    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23882    cmp    r3, #0
23883    bxeq   lr                   @ nothing to do - jump to real handler
23884    EXPORT_PC()
23885    mov    r0, rPC              @ arg0
23886    mov    r1, rFP              @ arg1
23887    mov    r2, rSELF            @ arg2
23888    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23889
23890/* ------------------------------ */
23891    .balign 64
23892.L_ALT_OP_UNUSED_88FF: /* 0x188 */
23893/* File: armv5te/alt_stub.S */
23894/*
23895 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23896 * any interesting requests and then jump to the real instruction
23897 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23898 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23899 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23900 * bail to the real handler if breakFlags==0.
23901 */
23902    ldrb   r3, [rSELF, #offThread_breakFlags]
23903    adrl   lr, dvmAsmInstructionStart + (392 * 64)
23904    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23905    cmp    r3, #0
23906    bxeq   lr                   @ nothing to do - jump to real handler
23907    EXPORT_PC()
23908    mov    r0, rPC              @ arg0
23909    mov    r1, rFP              @ arg1
23910    mov    r2, rSELF            @ arg2
23911    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23912
23913/* ------------------------------ */
23914    .balign 64
23915.L_ALT_OP_UNUSED_89FF: /* 0x189 */
23916/* File: armv5te/alt_stub.S */
23917/*
23918 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23919 * any interesting requests and then jump to the real instruction
23920 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23921 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23922 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23923 * bail to the real handler if breakFlags==0.
23924 */
23925    ldrb   r3, [rSELF, #offThread_breakFlags]
23926    adrl   lr, dvmAsmInstructionStart + (393 * 64)
23927    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23928    cmp    r3, #0
23929    bxeq   lr                   @ nothing to do - jump to real handler
23930    EXPORT_PC()
23931    mov    r0, rPC              @ arg0
23932    mov    r1, rFP              @ arg1
23933    mov    r2, rSELF            @ arg2
23934    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23935
23936/* ------------------------------ */
23937    .balign 64
23938.L_ALT_OP_UNUSED_8AFF: /* 0x18a */
23939/* File: armv5te/alt_stub.S */
23940/*
23941 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23942 * any interesting requests and then jump to the real instruction
23943 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23944 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23945 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23946 * bail to the real handler if breakFlags==0.
23947 */
23948    ldrb   r3, [rSELF, #offThread_breakFlags]
23949    adrl   lr, dvmAsmInstructionStart + (394 * 64)
23950    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23951    cmp    r3, #0
23952    bxeq   lr                   @ nothing to do - jump to real handler
23953    EXPORT_PC()
23954    mov    r0, rPC              @ arg0
23955    mov    r1, rFP              @ arg1
23956    mov    r2, rSELF            @ arg2
23957    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23958
23959/* ------------------------------ */
23960    .balign 64
23961.L_ALT_OP_UNUSED_8BFF: /* 0x18b */
23962/* File: armv5te/alt_stub.S */
23963/*
23964 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23965 * any interesting requests and then jump to the real instruction
23966 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23967 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23968 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23969 * bail to the real handler if breakFlags==0.
23970 */
23971    ldrb   r3, [rSELF, #offThread_breakFlags]
23972    adrl   lr, dvmAsmInstructionStart + (395 * 64)
23973    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23974    cmp    r3, #0
23975    bxeq   lr                   @ nothing to do - jump to real handler
23976    EXPORT_PC()
23977    mov    r0, rPC              @ arg0
23978    mov    r1, rFP              @ arg1
23979    mov    r2, rSELF            @ arg2
23980    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23981
23982/* ------------------------------ */
23983    .balign 64
23984.L_ALT_OP_UNUSED_8CFF: /* 0x18c */
23985/* File: armv5te/alt_stub.S */
23986/*
23987 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23988 * any interesting requests and then jump to the real instruction
23989 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23990 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23991 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23992 * bail to the real handler if breakFlags==0.
23993 */
23994    ldrb   r3, [rSELF, #offThread_breakFlags]
23995    adrl   lr, dvmAsmInstructionStart + (396 * 64)
23996    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23997    cmp    r3, #0
23998    bxeq   lr                   @ nothing to do - jump to real handler
23999    EXPORT_PC()
24000    mov    r0, rPC              @ arg0
24001    mov    r1, rFP              @ arg1
24002    mov    r2, rSELF            @ arg2
24003    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24004
24005/* ------------------------------ */
24006    .balign 64
24007.L_ALT_OP_UNUSED_8DFF: /* 0x18d */
24008/* File: armv5te/alt_stub.S */
24009/*
24010 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24011 * any interesting requests and then jump to the real instruction
24012 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24013 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24014 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24015 * bail to the real handler if breakFlags==0.
24016 */
24017    ldrb   r3, [rSELF, #offThread_breakFlags]
24018    adrl   lr, dvmAsmInstructionStart + (397 * 64)
24019    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24020    cmp    r3, #0
24021    bxeq   lr                   @ nothing to do - jump to real handler
24022    EXPORT_PC()
24023    mov    r0, rPC              @ arg0
24024    mov    r1, rFP              @ arg1
24025    mov    r2, rSELF            @ arg2
24026    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24027
24028/* ------------------------------ */
24029    .balign 64
24030.L_ALT_OP_UNUSED_8EFF: /* 0x18e */
24031/* File: armv5te/alt_stub.S */
24032/*
24033 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24034 * any interesting requests and then jump to the real instruction
24035 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24036 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24037 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24038 * bail to the real handler if breakFlags==0.
24039 */
24040    ldrb   r3, [rSELF, #offThread_breakFlags]
24041    adrl   lr, dvmAsmInstructionStart + (398 * 64)
24042    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24043    cmp    r3, #0
24044    bxeq   lr                   @ nothing to do - jump to real handler
24045    EXPORT_PC()
24046    mov    r0, rPC              @ arg0
24047    mov    r1, rFP              @ arg1
24048    mov    r2, rSELF            @ arg2
24049    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24050
24051/* ------------------------------ */
24052    .balign 64
24053.L_ALT_OP_UNUSED_8FFF: /* 0x18f */
24054/* File: armv5te/alt_stub.S */
24055/*
24056 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24057 * any interesting requests and then jump to the real instruction
24058 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24059 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24060 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24061 * bail to the real handler if breakFlags==0.
24062 */
24063    ldrb   r3, [rSELF, #offThread_breakFlags]
24064    adrl   lr, dvmAsmInstructionStart + (399 * 64)
24065    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24066    cmp    r3, #0
24067    bxeq   lr                   @ nothing to do - jump to real handler
24068    EXPORT_PC()
24069    mov    r0, rPC              @ arg0
24070    mov    r1, rFP              @ arg1
24071    mov    r2, rSELF            @ arg2
24072    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24073
24074/* ------------------------------ */
24075    .balign 64
24076.L_ALT_OP_UNUSED_90FF: /* 0x190 */
24077/* File: armv5te/alt_stub.S */
24078/*
24079 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24080 * any interesting requests and then jump to the real instruction
24081 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24082 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24083 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24084 * bail to the real handler if breakFlags==0.
24085 */
24086    ldrb   r3, [rSELF, #offThread_breakFlags]
24087    adrl   lr, dvmAsmInstructionStart + (400 * 64)
24088    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24089    cmp    r3, #0
24090    bxeq   lr                   @ nothing to do - jump to real handler
24091    EXPORT_PC()
24092    mov    r0, rPC              @ arg0
24093    mov    r1, rFP              @ arg1
24094    mov    r2, rSELF            @ arg2
24095    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24096
24097/* ------------------------------ */
24098    .balign 64
24099.L_ALT_OP_UNUSED_91FF: /* 0x191 */
24100/* File: armv5te/alt_stub.S */
24101/*
24102 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24103 * any interesting requests and then jump to the real instruction
24104 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24105 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24106 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24107 * bail to the real handler if breakFlags==0.
24108 */
24109    ldrb   r3, [rSELF, #offThread_breakFlags]
24110    adrl   lr, dvmAsmInstructionStart + (401 * 64)
24111    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24112    cmp    r3, #0
24113    bxeq   lr                   @ nothing to do - jump to real handler
24114    EXPORT_PC()
24115    mov    r0, rPC              @ arg0
24116    mov    r1, rFP              @ arg1
24117    mov    r2, rSELF            @ arg2
24118    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24119
24120/* ------------------------------ */
24121    .balign 64
24122.L_ALT_OP_UNUSED_92FF: /* 0x192 */
24123/* File: armv5te/alt_stub.S */
24124/*
24125 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24126 * any interesting requests and then jump to the real instruction
24127 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24128 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24129 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24130 * bail to the real handler if breakFlags==0.
24131 */
24132    ldrb   r3, [rSELF, #offThread_breakFlags]
24133    adrl   lr, dvmAsmInstructionStart + (402 * 64)
24134    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24135    cmp    r3, #0
24136    bxeq   lr                   @ nothing to do - jump to real handler
24137    EXPORT_PC()
24138    mov    r0, rPC              @ arg0
24139    mov    r1, rFP              @ arg1
24140    mov    r2, rSELF            @ arg2
24141    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24142
24143/* ------------------------------ */
24144    .balign 64
24145.L_ALT_OP_UNUSED_93FF: /* 0x193 */
24146/* File: armv5te/alt_stub.S */
24147/*
24148 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24149 * any interesting requests and then jump to the real instruction
24150 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24151 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24152 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24153 * bail to the real handler if breakFlags==0.
24154 */
24155    ldrb   r3, [rSELF, #offThread_breakFlags]
24156    adrl   lr, dvmAsmInstructionStart + (403 * 64)
24157    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24158    cmp    r3, #0
24159    bxeq   lr                   @ nothing to do - jump to real handler
24160    EXPORT_PC()
24161    mov    r0, rPC              @ arg0
24162    mov    r1, rFP              @ arg1
24163    mov    r2, rSELF            @ arg2
24164    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24165
24166/* ------------------------------ */
24167    .balign 64
24168.L_ALT_OP_UNUSED_94FF: /* 0x194 */
24169/* File: armv5te/alt_stub.S */
24170/*
24171 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24172 * any interesting requests and then jump to the real instruction
24173 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24174 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24175 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24176 * bail to the real handler if breakFlags==0.
24177 */
24178    ldrb   r3, [rSELF, #offThread_breakFlags]
24179    adrl   lr, dvmAsmInstructionStart + (404 * 64)
24180    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24181    cmp    r3, #0
24182    bxeq   lr                   @ nothing to do - jump to real handler
24183    EXPORT_PC()
24184    mov    r0, rPC              @ arg0
24185    mov    r1, rFP              @ arg1
24186    mov    r2, rSELF            @ arg2
24187    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24188
24189/* ------------------------------ */
24190    .balign 64
24191.L_ALT_OP_UNUSED_95FF: /* 0x195 */
24192/* File: armv5te/alt_stub.S */
24193/*
24194 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24195 * any interesting requests and then jump to the real instruction
24196 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24197 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24198 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24199 * bail to the real handler if breakFlags==0.
24200 */
24201    ldrb   r3, [rSELF, #offThread_breakFlags]
24202    adrl   lr, dvmAsmInstructionStart + (405 * 64)
24203    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24204    cmp    r3, #0
24205    bxeq   lr                   @ nothing to do - jump to real handler
24206    EXPORT_PC()
24207    mov    r0, rPC              @ arg0
24208    mov    r1, rFP              @ arg1
24209    mov    r2, rSELF            @ arg2
24210    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24211
24212/* ------------------------------ */
24213    .balign 64
24214.L_ALT_OP_UNUSED_96FF: /* 0x196 */
24215/* File: armv5te/alt_stub.S */
24216/*
24217 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24218 * any interesting requests and then jump to the real instruction
24219 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24220 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24221 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24222 * bail to the real handler if breakFlags==0.
24223 */
24224    ldrb   r3, [rSELF, #offThread_breakFlags]
24225    adrl   lr, dvmAsmInstructionStart + (406 * 64)
24226    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24227    cmp    r3, #0
24228    bxeq   lr                   @ nothing to do - jump to real handler
24229    EXPORT_PC()
24230    mov    r0, rPC              @ arg0
24231    mov    r1, rFP              @ arg1
24232    mov    r2, rSELF            @ arg2
24233    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24234
24235/* ------------------------------ */
24236    .balign 64
24237.L_ALT_OP_UNUSED_97FF: /* 0x197 */
24238/* File: armv5te/alt_stub.S */
24239/*
24240 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24241 * any interesting requests and then jump to the real instruction
24242 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24243 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24244 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24245 * bail to the real handler if breakFlags==0.
24246 */
24247    ldrb   r3, [rSELF, #offThread_breakFlags]
24248    adrl   lr, dvmAsmInstructionStart + (407 * 64)
24249    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24250    cmp    r3, #0
24251    bxeq   lr                   @ nothing to do - jump to real handler
24252    EXPORT_PC()
24253    mov    r0, rPC              @ arg0
24254    mov    r1, rFP              @ arg1
24255    mov    r2, rSELF            @ arg2
24256    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24257
24258/* ------------------------------ */
24259    .balign 64
24260.L_ALT_OP_UNUSED_98FF: /* 0x198 */
24261/* File: armv5te/alt_stub.S */
24262/*
24263 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24264 * any interesting requests and then jump to the real instruction
24265 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24266 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24267 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24268 * bail to the real handler if breakFlags==0.
24269 */
24270    ldrb   r3, [rSELF, #offThread_breakFlags]
24271    adrl   lr, dvmAsmInstructionStart + (408 * 64)
24272    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24273    cmp    r3, #0
24274    bxeq   lr                   @ nothing to do - jump to real handler
24275    EXPORT_PC()
24276    mov    r0, rPC              @ arg0
24277    mov    r1, rFP              @ arg1
24278    mov    r2, rSELF            @ arg2
24279    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24280
24281/* ------------------------------ */
24282    .balign 64
24283.L_ALT_OP_UNUSED_99FF: /* 0x199 */
24284/* File: armv5te/alt_stub.S */
24285/*
24286 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24287 * any interesting requests and then jump to the real instruction
24288 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24289 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24290 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24291 * bail to the real handler if breakFlags==0.
24292 */
24293    ldrb   r3, [rSELF, #offThread_breakFlags]
24294    adrl   lr, dvmAsmInstructionStart + (409 * 64)
24295    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24296    cmp    r3, #0
24297    bxeq   lr                   @ nothing to do - jump to real handler
24298    EXPORT_PC()
24299    mov    r0, rPC              @ arg0
24300    mov    r1, rFP              @ arg1
24301    mov    r2, rSELF            @ arg2
24302    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24303
24304/* ------------------------------ */
24305    .balign 64
24306.L_ALT_OP_UNUSED_9AFF: /* 0x19a */
24307/* File: armv5te/alt_stub.S */
24308/*
24309 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24310 * any interesting requests and then jump to the real instruction
24311 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24312 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24313 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24314 * bail to the real handler if breakFlags==0.
24315 */
24316    ldrb   r3, [rSELF, #offThread_breakFlags]
24317    adrl   lr, dvmAsmInstructionStart + (410 * 64)
24318    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24319    cmp    r3, #0
24320    bxeq   lr                   @ nothing to do - jump to real handler
24321    EXPORT_PC()
24322    mov    r0, rPC              @ arg0
24323    mov    r1, rFP              @ arg1
24324    mov    r2, rSELF            @ arg2
24325    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24326
24327/* ------------------------------ */
24328    .balign 64
24329.L_ALT_OP_UNUSED_9BFF: /* 0x19b */
24330/* File: armv5te/alt_stub.S */
24331/*
24332 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24333 * any interesting requests and then jump to the real instruction
24334 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24335 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24336 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24337 * bail to the real handler if breakFlags==0.
24338 */
24339    ldrb   r3, [rSELF, #offThread_breakFlags]
24340    adrl   lr, dvmAsmInstructionStart + (411 * 64)
24341    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24342    cmp    r3, #0
24343    bxeq   lr                   @ nothing to do - jump to real handler
24344    EXPORT_PC()
24345    mov    r0, rPC              @ arg0
24346    mov    r1, rFP              @ arg1
24347    mov    r2, rSELF            @ arg2
24348    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24349
24350/* ------------------------------ */
24351    .balign 64
24352.L_ALT_OP_UNUSED_9CFF: /* 0x19c */
24353/* File: armv5te/alt_stub.S */
24354/*
24355 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24356 * any interesting requests and then jump to the real instruction
24357 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24358 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24359 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24360 * bail to the real handler if breakFlags==0.
24361 */
24362    ldrb   r3, [rSELF, #offThread_breakFlags]
24363    adrl   lr, dvmAsmInstructionStart + (412 * 64)
24364    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24365    cmp    r3, #0
24366    bxeq   lr                   @ nothing to do - jump to real handler
24367    EXPORT_PC()
24368    mov    r0, rPC              @ arg0
24369    mov    r1, rFP              @ arg1
24370    mov    r2, rSELF            @ arg2
24371    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24372
24373/* ------------------------------ */
24374    .balign 64
24375.L_ALT_OP_UNUSED_9DFF: /* 0x19d */
24376/* File: armv5te/alt_stub.S */
24377/*
24378 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24379 * any interesting requests and then jump to the real instruction
24380 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24381 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24382 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24383 * bail to the real handler if breakFlags==0.
24384 */
24385    ldrb   r3, [rSELF, #offThread_breakFlags]
24386    adrl   lr, dvmAsmInstructionStart + (413 * 64)
24387    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24388    cmp    r3, #0
24389    bxeq   lr                   @ nothing to do - jump to real handler
24390    EXPORT_PC()
24391    mov    r0, rPC              @ arg0
24392    mov    r1, rFP              @ arg1
24393    mov    r2, rSELF            @ arg2
24394    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24395
24396/* ------------------------------ */
24397    .balign 64
24398.L_ALT_OP_UNUSED_9EFF: /* 0x19e */
24399/* File: armv5te/alt_stub.S */
24400/*
24401 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24402 * any interesting requests and then jump to the real instruction
24403 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24404 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24405 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24406 * bail to the real handler if breakFlags==0.
24407 */
24408    ldrb   r3, [rSELF, #offThread_breakFlags]
24409    adrl   lr, dvmAsmInstructionStart + (414 * 64)
24410    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24411    cmp    r3, #0
24412    bxeq   lr                   @ nothing to do - jump to real handler
24413    EXPORT_PC()
24414    mov    r0, rPC              @ arg0
24415    mov    r1, rFP              @ arg1
24416    mov    r2, rSELF            @ arg2
24417    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24418
24419/* ------------------------------ */
24420    .balign 64
24421.L_ALT_OP_UNUSED_9FFF: /* 0x19f */
24422/* File: armv5te/alt_stub.S */
24423/*
24424 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24425 * any interesting requests and then jump to the real instruction
24426 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24427 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24428 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24429 * bail to the real handler if breakFlags==0.
24430 */
24431    ldrb   r3, [rSELF, #offThread_breakFlags]
24432    adrl   lr, dvmAsmInstructionStart + (415 * 64)
24433    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24434    cmp    r3, #0
24435    bxeq   lr                   @ nothing to do - jump to real handler
24436    EXPORT_PC()
24437    mov    r0, rPC              @ arg0
24438    mov    r1, rFP              @ arg1
24439    mov    r2, rSELF            @ arg2
24440    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24441
24442/* ------------------------------ */
24443    .balign 64
24444.L_ALT_OP_UNUSED_A0FF: /* 0x1a0 */
24445/* File: armv5te/alt_stub.S */
24446/*
24447 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24448 * any interesting requests and then jump to the real instruction
24449 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24450 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24451 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24452 * bail to the real handler if breakFlags==0.
24453 */
24454    ldrb   r3, [rSELF, #offThread_breakFlags]
24455    adrl   lr, dvmAsmInstructionStart + (416 * 64)
24456    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24457    cmp    r3, #0
24458    bxeq   lr                   @ nothing to do - jump to real handler
24459    EXPORT_PC()
24460    mov    r0, rPC              @ arg0
24461    mov    r1, rFP              @ arg1
24462    mov    r2, rSELF            @ arg2
24463    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24464
24465/* ------------------------------ */
24466    .balign 64
24467.L_ALT_OP_UNUSED_A1FF: /* 0x1a1 */
24468/* File: armv5te/alt_stub.S */
24469/*
24470 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24471 * any interesting requests and then jump to the real instruction
24472 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24473 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24474 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24475 * bail to the real handler if breakFlags==0.
24476 */
24477    ldrb   r3, [rSELF, #offThread_breakFlags]
24478    adrl   lr, dvmAsmInstructionStart + (417 * 64)
24479    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24480    cmp    r3, #0
24481    bxeq   lr                   @ nothing to do - jump to real handler
24482    EXPORT_PC()
24483    mov    r0, rPC              @ arg0
24484    mov    r1, rFP              @ arg1
24485    mov    r2, rSELF            @ arg2
24486    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24487
24488/* ------------------------------ */
24489    .balign 64
24490.L_ALT_OP_UNUSED_A2FF: /* 0x1a2 */
24491/* File: armv5te/alt_stub.S */
24492/*
24493 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24494 * any interesting requests and then jump to the real instruction
24495 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24496 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24497 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24498 * bail to the real handler if breakFlags==0.
24499 */
24500    ldrb   r3, [rSELF, #offThread_breakFlags]
24501    adrl   lr, dvmAsmInstructionStart + (418 * 64)
24502    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24503    cmp    r3, #0
24504    bxeq   lr                   @ nothing to do - jump to real handler
24505    EXPORT_PC()
24506    mov    r0, rPC              @ arg0
24507    mov    r1, rFP              @ arg1
24508    mov    r2, rSELF            @ arg2
24509    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24510
24511/* ------------------------------ */
24512    .balign 64
24513.L_ALT_OP_UNUSED_A3FF: /* 0x1a3 */
24514/* File: armv5te/alt_stub.S */
24515/*
24516 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24517 * any interesting requests and then jump to the real instruction
24518 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24519 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24520 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24521 * bail to the real handler if breakFlags==0.
24522 */
24523    ldrb   r3, [rSELF, #offThread_breakFlags]
24524    adrl   lr, dvmAsmInstructionStart + (419 * 64)
24525    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24526    cmp    r3, #0
24527    bxeq   lr                   @ nothing to do - jump to real handler
24528    EXPORT_PC()
24529    mov    r0, rPC              @ arg0
24530    mov    r1, rFP              @ arg1
24531    mov    r2, rSELF            @ arg2
24532    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24533
24534/* ------------------------------ */
24535    .balign 64
24536.L_ALT_OP_UNUSED_A4FF: /* 0x1a4 */
24537/* File: armv5te/alt_stub.S */
24538/*
24539 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24540 * any interesting requests and then jump to the real instruction
24541 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24542 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24543 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24544 * bail to the real handler if breakFlags==0.
24545 */
24546    ldrb   r3, [rSELF, #offThread_breakFlags]
24547    adrl   lr, dvmAsmInstructionStart + (420 * 64)
24548    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24549    cmp    r3, #0
24550    bxeq   lr                   @ nothing to do - jump to real handler
24551    EXPORT_PC()
24552    mov    r0, rPC              @ arg0
24553    mov    r1, rFP              @ arg1
24554    mov    r2, rSELF            @ arg2
24555    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24556
24557/* ------------------------------ */
24558    .balign 64
24559.L_ALT_OP_UNUSED_A5FF: /* 0x1a5 */
24560/* File: armv5te/alt_stub.S */
24561/*
24562 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24563 * any interesting requests and then jump to the real instruction
24564 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24565 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24566 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24567 * bail to the real handler if breakFlags==0.
24568 */
24569    ldrb   r3, [rSELF, #offThread_breakFlags]
24570    adrl   lr, dvmAsmInstructionStart + (421 * 64)
24571    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24572    cmp    r3, #0
24573    bxeq   lr                   @ nothing to do - jump to real handler
24574    EXPORT_PC()
24575    mov    r0, rPC              @ arg0
24576    mov    r1, rFP              @ arg1
24577    mov    r2, rSELF            @ arg2
24578    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24579
24580/* ------------------------------ */
24581    .balign 64
24582.L_ALT_OP_UNUSED_A6FF: /* 0x1a6 */
24583/* File: armv5te/alt_stub.S */
24584/*
24585 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24586 * any interesting requests and then jump to the real instruction
24587 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24588 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24589 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24590 * bail to the real handler if breakFlags==0.
24591 */
24592    ldrb   r3, [rSELF, #offThread_breakFlags]
24593    adrl   lr, dvmAsmInstructionStart + (422 * 64)
24594    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24595    cmp    r3, #0
24596    bxeq   lr                   @ nothing to do - jump to real handler
24597    EXPORT_PC()
24598    mov    r0, rPC              @ arg0
24599    mov    r1, rFP              @ arg1
24600    mov    r2, rSELF            @ arg2
24601    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24602
24603/* ------------------------------ */
24604    .balign 64
24605.L_ALT_OP_UNUSED_A7FF: /* 0x1a7 */
24606/* File: armv5te/alt_stub.S */
24607/*
24608 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24609 * any interesting requests and then jump to the real instruction
24610 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24611 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24612 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24613 * bail to the real handler if breakFlags==0.
24614 */
24615    ldrb   r3, [rSELF, #offThread_breakFlags]
24616    adrl   lr, dvmAsmInstructionStart + (423 * 64)
24617    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24618    cmp    r3, #0
24619    bxeq   lr                   @ nothing to do - jump to real handler
24620    EXPORT_PC()
24621    mov    r0, rPC              @ arg0
24622    mov    r1, rFP              @ arg1
24623    mov    r2, rSELF            @ arg2
24624    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24625
24626/* ------------------------------ */
24627    .balign 64
24628.L_ALT_OP_UNUSED_A8FF: /* 0x1a8 */
24629/* File: armv5te/alt_stub.S */
24630/*
24631 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24632 * any interesting requests and then jump to the real instruction
24633 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24634 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24635 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24636 * bail to the real handler if breakFlags==0.
24637 */
24638    ldrb   r3, [rSELF, #offThread_breakFlags]
24639    adrl   lr, dvmAsmInstructionStart + (424 * 64)
24640    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24641    cmp    r3, #0
24642    bxeq   lr                   @ nothing to do - jump to real handler
24643    EXPORT_PC()
24644    mov    r0, rPC              @ arg0
24645    mov    r1, rFP              @ arg1
24646    mov    r2, rSELF            @ arg2
24647    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24648
24649/* ------------------------------ */
24650    .balign 64
24651.L_ALT_OP_UNUSED_A9FF: /* 0x1a9 */
24652/* File: armv5te/alt_stub.S */
24653/*
24654 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24655 * any interesting requests and then jump to the real instruction
24656 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24657 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24658 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24659 * bail to the real handler if breakFlags==0.
24660 */
24661    ldrb   r3, [rSELF, #offThread_breakFlags]
24662    adrl   lr, dvmAsmInstructionStart + (425 * 64)
24663    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24664    cmp    r3, #0
24665    bxeq   lr                   @ nothing to do - jump to real handler
24666    EXPORT_PC()
24667    mov    r0, rPC              @ arg0
24668    mov    r1, rFP              @ arg1
24669    mov    r2, rSELF            @ arg2
24670    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24671
24672/* ------------------------------ */
24673    .balign 64
24674.L_ALT_OP_UNUSED_AAFF: /* 0x1aa */
24675/* File: armv5te/alt_stub.S */
24676/*
24677 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24678 * any interesting requests and then jump to the real instruction
24679 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24680 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24681 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24682 * bail to the real handler if breakFlags==0.
24683 */
24684    ldrb   r3, [rSELF, #offThread_breakFlags]
24685    adrl   lr, dvmAsmInstructionStart + (426 * 64)
24686    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24687    cmp    r3, #0
24688    bxeq   lr                   @ nothing to do - jump to real handler
24689    EXPORT_PC()
24690    mov    r0, rPC              @ arg0
24691    mov    r1, rFP              @ arg1
24692    mov    r2, rSELF            @ arg2
24693    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24694
24695/* ------------------------------ */
24696    .balign 64
24697.L_ALT_OP_UNUSED_ABFF: /* 0x1ab */
24698/* File: armv5te/alt_stub.S */
24699/*
24700 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24701 * any interesting requests and then jump to the real instruction
24702 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24703 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24704 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24705 * bail to the real handler if breakFlags==0.
24706 */
24707    ldrb   r3, [rSELF, #offThread_breakFlags]
24708    adrl   lr, dvmAsmInstructionStart + (427 * 64)
24709    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24710    cmp    r3, #0
24711    bxeq   lr                   @ nothing to do - jump to real handler
24712    EXPORT_PC()
24713    mov    r0, rPC              @ arg0
24714    mov    r1, rFP              @ arg1
24715    mov    r2, rSELF            @ arg2
24716    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24717
24718/* ------------------------------ */
24719    .balign 64
24720.L_ALT_OP_UNUSED_ACFF: /* 0x1ac */
24721/* File: armv5te/alt_stub.S */
24722/*
24723 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24724 * any interesting requests and then jump to the real instruction
24725 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24726 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24727 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24728 * bail to the real handler if breakFlags==0.
24729 */
24730    ldrb   r3, [rSELF, #offThread_breakFlags]
24731    adrl   lr, dvmAsmInstructionStart + (428 * 64)
24732    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24733    cmp    r3, #0
24734    bxeq   lr                   @ nothing to do - jump to real handler
24735    EXPORT_PC()
24736    mov    r0, rPC              @ arg0
24737    mov    r1, rFP              @ arg1
24738    mov    r2, rSELF            @ arg2
24739    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24740
24741/* ------------------------------ */
24742    .balign 64
24743.L_ALT_OP_UNUSED_ADFF: /* 0x1ad */
24744/* File: armv5te/alt_stub.S */
24745/*
24746 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24747 * any interesting requests and then jump to the real instruction
24748 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24749 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24750 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24751 * bail to the real handler if breakFlags==0.
24752 */
24753    ldrb   r3, [rSELF, #offThread_breakFlags]
24754    adrl   lr, dvmAsmInstructionStart + (429 * 64)
24755    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24756    cmp    r3, #0
24757    bxeq   lr                   @ nothing to do - jump to real handler
24758    EXPORT_PC()
24759    mov    r0, rPC              @ arg0
24760    mov    r1, rFP              @ arg1
24761    mov    r2, rSELF            @ arg2
24762    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24763
24764/* ------------------------------ */
24765    .balign 64
24766.L_ALT_OP_UNUSED_AEFF: /* 0x1ae */
24767/* File: armv5te/alt_stub.S */
24768/*
24769 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24770 * any interesting requests and then jump to the real instruction
24771 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24772 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24773 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24774 * bail to the real handler if breakFlags==0.
24775 */
24776    ldrb   r3, [rSELF, #offThread_breakFlags]
24777    adrl   lr, dvmAsmInstructionStart + (430 * 64)
24778    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24779    cmp    r3, #0
24780    bxeq   lr                   @ nothing to do - jump to real handler
24781    EXPORT_PC()
24782    mov    r0, rPC              @ arg0
24783    mov    r1, rFP              @ arg1
24784    mov    r2, rSELF            @ arg2
24785    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24786
24787/* ------------------------------ */
24788    .balign 64
24789.L_ALT_OP_UNUSED_AFFF: /* 0x1af */
24790/* File: armv5te/alt_stub.S */
24791/*
24792 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24793 * any interesting requests and then jump to the real instruction
24794 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24795 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24796 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24797 * bail to the real handler if breakFlags==0.
24798 */
24799    ldrb   r3, [rSELF, #offThread_breakFlags]
24800    adrl   lr, dvmAsmInstructionStart + (431 * 64)
24801    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24802    cmp    r3, #0
24803    bxeq   lr                   @ nothing to do - jump to real handler
24804    EXPORT_PC()
24805    mov    r0, rPC              @ arg0
24806    mov    r1, rFP              @ arg1
24807    mov    r2, rSELF            @ arg2
24808    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24809
24810/* ------------------------------ */
24811    .balign 64
24812.L_ALT_OP_UNUSED_B0FF: /* 0x1b0 */
24813/* File: armv5te/alt_stub.S */
24814/*
24815 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24816 * any interesting requests and then jump to the real instruction
24817 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24818 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24819 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24820 * bail to the real handler if breakFlags==0.
24821 */
24822    ldrb   r3, [rSELF, #offThread_breakFlags]
24823    adrl   lr, dvmAsmInstructionStart + (432 * 64)
24824    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24825    cmp    r3, #0
24826    bxeq   lr                   @ nothing to do - jump to real handler
24827    EXPORT_PC()
24828    mov    r0, rPC              @ arg0
24829    mov    r1, rFP              @ arg1
24830    mov    r2, rSELF            @ arg2
24831    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24832
24833/* ------------------------------ */
24834    .balign 64
24835.L_ALT_OP_UNUSED_B1FF: /* 0x1b1 */
24836/* File: armv5te/alt_stub.S */
24837/*
24838 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24839 * any interesting requests and then jump to the real instruction
24840 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24841 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24842 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24843 * bail to the real handler if breakFlags==0.
24844 */
24845    ldrb   r3, [rSELF, #offThread_breakFlags]
24846    adrl   lr, dvmAsmInstructionStart + (433 * 64)
24847    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24848    cmp    r3, #0
24849    bxeq   lr                   @ nothing to do - jump to real handler
24850    EXPORT_PC()
24851    mov    r0, rPC              @ arg0
24852    mov    r1, rFP              @ arg1
24853    mov    r2, rSELF            @ arg2
24854    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24855
24856/* ------------------------------ */
24857    .balign 64
24858.L_ALT_OP_UNUSED_B2FF: /* 0x1b2 */
24859/* File: armv5te/alt_stub.S */
24860/*
24861 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24862 * any interesting requests and then jump to the real instruction
24863 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24864 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24865 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24866 * bail to the real handler if breakFlags==0.
24867 */
24868    ldrb   r3, [rSELF, #offThread_breakFlags]
24869    adrl   lr, dvmAsmInstructionStart + (434 * 64)
24870    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24871    cmp    r3, #0
24872    bxeq   lr                   @ nothing to do - jump to real handler
24873    EXPORT_PC()
24874    mov    r0, rPC              @ arg0
24875    mov    r1, rFP              @ arg1
24876    mov    r2, rSELF            @ arg2
24877    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24878
24879/* ------------------------------ */
24880    .balign 64
24881.L_ALT_OP_UNUSED_B3FF: /* 0x1b3 */
24882/* File: armv5te/alt_stub.S */
24883/*
24884 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24885 * any interesting requests and then jump to the real instruction
24886 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24887 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24888 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24889 * bail to the real handler if breakFlags==0.
24890 */
24891    ldrb   r3, [rSELF, #offThread_breakFlags]
24892    adrl   lr, dvmAsmInstructionStart + (435 * 64)
24893    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24894    cmp    r3, #0
24895    bxeq   lr                   @ nothing to do - jump to real handler
24896    EXPORT_PC()
24897    mov    r0, rPC              @ arg0
24898    mov    r1, rFP              @ arg1
24899    mov    r2, rSELF            @ arg2
24900    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24901
24902/* ------------------------------ */
24903    .balign 64
24904.L_ALT_OP_UNUSED_B4FF: /* 0x1b4 */
24905/* File: armv5te/alt_stub.S */
24906/*
24907 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24908 * any interesting requests and then jump to the real instruction
24909 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24910 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24911 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24912 * bail to the real handler if breakFlags==0.
24913 */
24914    ldrb   r3, [rSELF, #offThread_breakFlags]
24915    adrl   lr, dvmAsmInstructionStart + (436 * 64)
24916    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24917    cmp    r3, #0
24918    bxeq   lr                   @ nothing to do - jump to real handler
24919    EXPORT_PC()
24920    mov    r0, rPC              @ arg0
24921    mov    r1, rFP              @ arg1
24922    mov    r2, rSELF            @ arg2
24923    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24924
24925/* ------------------------------ */
24926    .balign 64
24927.L_ALT_OP_UNUSED_B5FF: /* 0x1b5 */
24928/* File: armv5te/alt_stub.S */
24929/*
24930 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24931 * any interesting requests and then jump to the real instruction
24932 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24933 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24934 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24935 * bail to the real handler if breakFlags==0.
24936 */
24937    ldrb   r3, [rSELF, #offThread_breakFlags]
24938    adrl   lr, dvmAsmInstructionStart + (437 * 64)
24939    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24940    cmp    r3, #0
24941    bxeq   lr                   @ nothing to do - jump to real handler
24942    EXPORT_PC()
24943    mov    r0, rPC              @ arg0
24944    mov    r1, rFP              @ arg1
24945    mov    r2, rSELF            @ arg2
24946    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24947
24948/* ------------------------------ */
24949    .balign 64
24950.L_ALT_OP_UNUSED_B6FF: /* 0x1b6 */
24951/* File: armv5te/alt_stub.S */
24952/*
24953 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24954 * any interesting requests and then jump to the real instruction
24955 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24956 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24957 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24958 * bail to the real handler if breakFlags==0.
24959 */
24960    ldrb   r3, [rSELF, #offThread_breakFlags]
24961    adrl   lr, dvmAsmInstructionStart + (438 * 64)
24962    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24963    cmp    r3, #0
24964    bxeq   lr                   @ nothing to do - jump to real handler
24965    EXPORT_PC()
24966    mov    r0, rPC              @ arg0
24967    mov    r1, rFP              @ arg1
24968    mov    r2, rSELF            @ arg2
24969    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24970
24971/* ------------------------------ */
24972    .balign 64
24973.L_ALT_OP_UNUSED_B7FF: /* 0x1b7 */
24974/* File: armv5te/alt_stub.S */
24975/*
24976 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24977 * any interesting requests and then jump to the real instruction
24978 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24979 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24980 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24981 * bail to the real handler if breakFlags==0.
24982 */
24983    ldrb   r3, [rSELF, #offThread_breakFlags]
24984    adrl   lr, dvmAsmInstructionStart + (439 * 64)
24985    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24986    cmp    r3, #0
24987    bxeq   lr                   @ nothing to do - jump to real handler
24988    EXPORT_PC()
24989    mov    r0, rPC              @ arg0
24990    mov    r1, rFP              @ arg1
24991    mov    r2, rSELF            @ arg2
24992    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24993
24994/* ------------------------------ */
24995    .balign 64
24996.L_ALT_OP_UNUSED_B8FF: /* 0x1b8 */
24997/* File: armv5te/alt_stub.S */
24998/*
24999 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25000 * any interesting requests and then jump to the real instruction
25001 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25002 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25003 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25004 * bail to the real handler if breakFlags==0.
25005 */
25006    ldrb   r3, [rSELF, #offThread_breakFlags]
25007    adrl   lr, dvmAsmInstructionStart + (440 * 64)
25008    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25009    cmp    r3, #0
25010    bxeq   lr                   @ nothing to do - jump to real handler
25011    EXPORT_PC()
25012    mov    r0, rPC              @ arg0
25013    mov    r1, rFP              @ arg1
25014    mov    r2, rSELF            @ arg2
25015    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25016
25017/* ------------------------------ */
25018    .balign 64
25019.L_ALT_OP_UNUSED_B9FF: /* 0x1b9 */
25020/* File: armv5te/alt_stub.S */
25021/*
25022 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25023 * any interesting requests and then jump to the real instruction
25024 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25025 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25026 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25027 * bail to the real handler if breakFlags==0.
25028 */
25029    ldrb   r3, [rSELF, #offThread_breakFlags]
25030    adrl   lr, dvmAsmInstructionStart + (441 * 64)
25031    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25032    cmp    r3, #0
25033    bxeq   lr                   @ nothing to do - jump to real handler
25034    EXPORT_PC()
25035    mov    r0, rPC              @ arg0
25036    mov    r1, rFP              @ arg1
25037    mov    r2, rSELF            @ arg2
25038    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25039
25040/* ------------------------------ */
25041    .balign 64
25042.L_ALT_OP_UNUSED_BAFF: /* 0x1ba */
25043/* File: armv5te/alt_stub.S */
25044/*
25045 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25046 * any interesting requests and then jump to the real instruction
25047 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25048 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25049 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25050 * bail to the real handler if breakFlags==0.
25051 */
25052    ldrb   r3, [rSELF, #offThread_breakFlags]
25053    adrl   lr, dvmAsmInstructionStart + (442 * 64)
25054    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25055    cmp    r3, #0
25056    bxeq   lr                   @ nothing to do - jump to real handler
25057    EXPORT_PC()
25058    mov    r0, rPC              @ arg0
25059    mov    r1, rFP              @ arg1
25060    mov    r2, rSELF            @ arg2
25061    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25062
25063/* ------------------------------ */
25064    .balign 64
25065.L_ALT_OP_UNUSED_BBFF: /* 0x1bb */
25066/* File: armv5te/alt_stub.S */
25067/*
25068 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25069 * any interesting requests and then jump to the real instruction
25070 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25071 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25072 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25073 * bail to the real handler if breakFlags==0.
25074 */
25075    ldrb   r3, [rSELF, #offThread_breakFlags]
25076    adrl   lr, dvmAsmInstructionStart + (443 * 64)
25077    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25078    cmp    r3, #0
25079    bxeq   lr                   @ nothing to do - jump to real handler
25080    EXPORT_PC()
25081    mov    r0, rPC              @ arg0
25082    mov    r1, rFP              @ arg1
25083    mov    r2, rSELF            @ arg2
25084    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25085
25086/* ------------------------------ */
25087    .balign 64
25088.L_ALT_OP_UNUSED_BCFF: /* 0x1bc */
25089/* File: armv5te/alt_stub.S */
25090/*
25091 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25092 * any interesting requests and then jump to the real instruction
25093 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25094 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25095 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25096 * bail to the real handler if breakFlags==0.
25097 */
25098    ldrb   r3, [rSELF, #offThread_breakFlags]
25099    adrl   lr, dvmAsmInstructionStart + (444 * 64)
25100    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25101    cmp    r3, #0
25102    bxeq   lr                   @ nothing to do - jump to real handler
25103    EXPORT_PC()
25104    mov    r0, rPC              @ arg0
25105    mov    r1, rFP              @ arg1
25106    mov    r2, rSELF            @ arg2
25107    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25108
25109/* ------------------------------ */
25110    .balign 64
25111.L_ALT_OP_UNUSED_BDFF: /* 0x1bd */
25112/* File: armv5te/alt_stub.S */
25113/*
25114 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25115 * any interesting requests and then jump to the real instruction
25116 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25117 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25118 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25119 * bail to the real handler if breakFlags==0.
25120 */
25121    ldrb   r3, [rSELF, #offThread_breakFlags]
25122    adrl   lr, dvmAsmInstructionStart + (445 * 64)
25123    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25124    cmp    r3, #0
25125    bxeq   lr                   @ nothing to do - jump to real handler
25126    EXPORT_PC()
25127    mov    r0, rPC              @ arg0
25128    mov    r1, rFP              @ arg1
25129    mov    r2, rSELF            @ arg2
25130    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25131
25132/* ------------------------------ */
25133    .balign 64
25134.L_ALT_OP_UNUSED_BEFF: /* 0x1be */
25135/* File: armv5te/alt_stub.S */
25136/*
25137 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25138 * any interesting requests and then jump to the real instruction
25139 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25140 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25141 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25142 * bail to the real handler if breakFlags==0.
25143 */
25144    ldrb   r3, [rSELF, #offThread_breakFlags]
25145    adrl   lr, dvmAsmInstructionStart + (446 * 64)
25146    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25147    cmp    r3, #0
25148    bxeq   lr                   @ nothing to do - jump to real handler
25149    EXPORT_PC()
25150    mov    r0, rPC              @ arg0
25151    mov    r1, rFP              @ arg1
25152    mov    r2, rSELF            @ arg2
25153    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25154
25155/* ------------------------------ */
25156    .balign 64
25157.L_ALT_OP_UNUSED_BFFF: /* 0x1bf */
25158/* File: armv5te/alt_stub.S */
25159/*
25160 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25161 * any interesting requests and then jump to the real instruction
25162 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25163 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25164 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25165 * bail to the real handler if breakFlags==0.
25166 */
25167    ldrb   r3, [rSELF, #offThread_breakFlags]
25168    adrl   lr, dvmAsmInstructionStart + (447 * 64)
25169    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25170    cmp    r3, #0
25171    bxeq   lr                   @ nothing to do - jump to real handler
25172    EXPORT_PC()
25173    mov    r0, rPC              @ arg0
25174    mov    r1, rFP              @ arg1
25175    mov    r2, rSELF            @ arg2
25176    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25177
25178/* ------------------------------ */
25179    .balign 64
25180.L_ALT_OP_UNUSED_C0FF: /* 0x1c0 */
25181/* File: armv5te/alt_stub.S */
25182/*
25183 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25184 * any interesting requests and then jump to the real instruction
25185 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25186 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25187 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25188 * bail to the real handler if breakFlags==0.
25189 */
25190    ldrb   r3, [rSELF, #offThread_breakFlags]
25191    adrl   lr, dvmAsmInstructionStart + (448 * 64)
25192    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25193    cmp    r3, #0
25194    bxeq   lr                   @ nothing to do - jump to real handler
25195    EXPORT_PC()
25196    mov    r0, rPC              @ arg0
25197    mov    r1, rFP              @ arg1
25198    mov    r2, rSELF            @ arg2
25199    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25200
25201/* ------------------------------ */
25202    .balign 64
25203.L_ALT_OP_UNUSED_C1FF: /* 0x1c1 */
25204/* File: armv5te/alt_stub.S */
25205/*
25206 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25207 * any interesting requests and then jump to the real instruction
25208 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25209 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25210 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25211 * bail to the real handler if breakFlags==0.
25212 */
25213    ldrb   r3, [rSELF, #offThread_breakFlags]
25214    adrl   lr, dvmAsmInstructionStart + (449 * 64)
25215    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25216    cmp    r3, #0
25217    bxeq   lr                   @ nothing to do - jump to real handler
25218    EXPORT_PC()
25219    mov    r0, rPC              @ arg0
25220    mov    r1, rFP              @ arg1
25221    mov    r2, rSELF            @ arg2
25222    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25223
25224/* ------------------------------ */
25225    .balign 64
25226.L_ALT_OP_UNUSED_C2FF: /* 0x1c2 */
25227/* File: armv5te/alt_stub.S */
25228/*
25229 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25230 * any interesting requests and then jump to the real instruction
25231 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25232 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25233 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25234 * bail to the real handler if breakFlags==0.
25235 */
25236    ldrb   r3, [rSELF, #offThread_breakFlags]
25237    adrl   lr, dvmAsmInstructionStart + (450 * 64)
25238    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25239    cmp    r3, #0
25240    bxeq   lr                   @ nothing to do - jump to real handler
25241    EXPORT_PC()
25242    mov    r0, rPC              @ arg0
25243    mov    r1, rFP              @ arg1
25244    mov    r2, rSELF            @ arg2
25245    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25246
25247/* ------------------------------ */
25248    .balign 64
25249.L_ALT_OP_UNUSED_C3FF: /* 0x1c3 */
25250/* File: armv5te/alt_stub.S */
25251/*
25252 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25253 * any interesting requests and then jump to the real instruction
25254 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25255 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25256 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25257 * bail to the real handler if breakFlags==0.
25258 */
25259    ldrb   r3, [rSELF, #offThread_breakFlags]
25260    adrl   lr, dvmAsmInstructionStart + (451 * 64)
25261    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25262    cmp    r3, #0
25263    bxeq   lr                   @ nothing to do - jump to real handler
25264    EXPORT_PC()
25265    mov    r0, rPC              @ arg0
25266    mov    r1, rFP              @ arg1
25267    mov    r2, rSELF            @ arg2
25268    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25269
25270/* ------------------------------ */
25271    .balign 64
25272.L_ALT_OP_UNUSED_C4FF: /* 0x1c4 */
25273/* File: armv5te/alt_stub.S */
25274/*
25275 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25276 * any interesting requests and then jump to the real instruction
25277 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25278 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25279 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25280 * bail to the real handler if breakFlags==0.
25281 */
25282    ldrb   r3, [rSELF, #offThread_breakFlags]
25283    adrl   lr, dvmAsmInstructionStart + (452 * 64)
25284    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25285    cmp    r3, #0
25286    bxeq   lr                   @ nothing to do - jump to real handler
25287    EXPORT_PC()
25288    mov    r0, rPC              @ arg0
25289    mov    r1, rFP              @ arg1
25290    mov    r2, rSELF            @ arg2
25291    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25292
25293/* ------------------------------ */
25294    .balign 64
25295.L_ALT_OP_UNUSED_C5FF: /* 0x1c5 */
25296/* File: armv5te/alt_stub.S */
25297/*
25298 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25299 * any interesting requests and then jump to the real instruction
25300 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25301 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25302 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25303 * bail to the real handler if breakFlags==0.
25304 */
25305    ldrb   r3, [rSELF, #offThread_breakFlags]
25306    adrl   lr, dvmAsmInstructionStart + (453 * 64)
25307    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25308    cmp    r3, #0
25309    bxeq   lr                   @ nothing to do - jump to real handler
25310    EXPORT_PC()
25311    mov    r0, rPC              @ arg0
25312    mov    r1, rFP              @ arg1
25313    mov    r2, rSELF            @ arg2
25314    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25315
25316/* ------------------------------ */
25317    .balign 64
25318.L_ALT_OP_UNUSED_C6FF: /* 0x1c6 */
25319/* File: armv5te/alt_stub.S */
25320/*
25321 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25322 * any interesting requests and then jump to the real instruction
25323 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25324 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25325 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25326 * bail to the real handler if breakFlags==0.
25327 */
25328    ldrb   r3, [rSELF, #offThread_breakFlags]
25329    adrl   lr, dvmAsmInstructionStart + (454 * 64)
25330    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25331    cmp    r3, #0
25332    bxeq   lr                   @ nothing to do - jump to real handler
25333    EXPORT_PC()
25334    mov    r0, rPC              @ arg0
25335    mov    r1, rFP              @ arg1
25336    mov    r2, rSELF            @ arg2
25337    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25338
25339/* ------------------------------ */
25340    .balign 64
25341.L_ALT_OP_UNUSED_C7FF: /* 0x1c7 */
25342/* File: armv5te/alt_stub.S */
25343/*
25344 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25345 * any interesting requests and then jump to the real instruction
25346 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25347 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25348 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25349 * bail to the real handler if breakFlags==0.
25350 */
25351    ldrb   r3, [rSELF, #offThread_breakFlags]
25352    adrl   lr, dvmAsmInstructionStart + (455 * 64)
25353    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25354    cmp    r3, #0
25355    bxeq   lr                   @ nothing to do - jump to real handler
25356    EXPORT_PC()
25357    mov    r0, rPC              @ arg0
25358    mov    r1, rFP              @ arg1
25359    mov    r2, rSELF            @ arg2
25360    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25361
25362/* ------------------------------ */
25363    .balign 64
25364.L_ALT_OP_UNUSED_C8FF: /* 0x1c8 */
25365/* File: armv5te/alt_stub.S */
25366/*
25367 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25368 * any interesting requests and then jump to the real instruction
25369 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25370 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25371 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25372 * bail to the real handler if breakFlags==0.
25373 */
25374    ldrb   r3, [rSELF, #offThread_breakFlags]
25375    adrl   lr, dvmAsmInstructionStart + (456 * 64)
25376    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25377    cmp    r3, #0
25378    bxeq   lr                   @ nothing to do - jump to real handler
25379    EXPORT_PC()
25380    mov    r0, rPC              @ arg0
25381    mov    r1, rFP              @ arg1
25382    mov    r2, rSELF            @ arg2
25383    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25384
25385/* ------------------------------ */
25386    .balign 64
25387.L_ALT_OP_UNUSED_C9FF: /* 0x1c9 */
25388/* File: armv5te/alt_stub.S */
25389/*
25390 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25391 * any interesting requests and then jump to the real instruction
25392 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25393 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25394 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25395 * bail to the real handler if breakFlags==0.
25396 */
25397    ldrb   r3, [rSELF, #offThread_breakFlags]
25398    adrl   lr, dvmAsmInstructionStart + (457 * 64)
25399    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25400    cmp    r3, #0
25401    bxeq   lr                   @ nothing to do - jump to real handler
25402    EXPORT_PC()
25403    mov    r0, rPC              @ arg0
25404    mov    r1, rFP              @ arg1
25405    mov    r2, rSELF            @ arg2
25406    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25407
25408/* ------------------------------ */
25409    .balign 64
25410.L_ALT_OP_UNUSED_CAFF: /* 0x1ca */
25411/* File: armv5te/alt_stub.S */
25412/*
25413 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25414 * any interesting requests and then jump to the real instruction
25415 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25416 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25417 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25418 * bail to the real handler if breakFlags==0.
25419 */
25420    ldrb   r3, [rSELF, #offThread_breakFlags]
25421    adrl   lr, dvmAsmInstructionStart + (458 * 64)
25422    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25423    cmp    r3, #0
25424    bxeq   lr                   @ nothing to do - jump to real handler
25425    EXPORT_PC()
25426    mov    r0, rPC              @ arg0
25427    mov    r1, rFP              @ arg1
25428    mov    r2, rSELF            @ arg2
25429    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25430
25431/* ------------------------------ */
25432    .balign 64
25433.L_ALT_OP_UNUSED_CBFF: /* 0x1cb */
25434/* File: armv5te/alt_stub.S */
25435/*
25436 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25437 * any interesting requests and then jump to the real instruction
25438 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25439 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25440 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25441 * bail to the real handler if breakFlags==0.
25442 */
25443    ldrb   r3, [rSELF, #offThread_breakFlags]
25444    adrl   lr, dvmAsmInstructionStart + (459 * 64)
25445    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25446    cmp    r3, #0
25447    bxeq   lr                   @ nothing to do - jump to real handler
25448    EXPORT_PC()
25449    mov    r0, rPC              @ arg0
25450    mov    r1, rFP              @ arg1
25451    mov    r2, rSELF            @ arg2
25452    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25453
25454/* ------------------------------ */
25455    .balign 64
25456.L_ALT_OP_UNUSED_CCFF: /* 0x1cc */
25457/* File: armv5te/alt_stub.S */
25458/*
25459 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25460 * any interesting requests and then jump to the real instruction
25461 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25462 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25463 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25464 * bail to the real handler if breakFlags==0.
25465 */
25466    ldrb   r3, [rSELF, #offThread_breakFlags]
25467    adrl   lr, dvmAsmInstructionStart + (460 * 64)
25468    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25469    cmp    r3, #0
25470    bxeq   lr                   @ nothing to do - jump to real handler
25471    EXPORT_PC()
25472    mov    r0, rPC              @ arg0
25473    mov    r1, rFP              @ arg1
25474    mov    r2, rSELF            @ arg2
25475    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25476
25477/* ------------------------------ */
25478    .balign 64
25479.L_ALT_OP_UNUSED_CDFF: /* 0x1cd */
25480/* File: armv5te/alt_stub.S */
25481/*
25482 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25483 * any interesting requests and then jump to the real instruction
25484 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25485 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25486 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25487 * bail to the real handler if breakFlags==0.
25488 */
25489    ldrb   r3, [rSELF, #offThread_breakFlags]
25490    adrl   lr, dvmAsmInstructionStart + (461 * 64)
25491    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25492    cmp    r3, #0
25493    bxeq   lr                   @ nothing to do - jump to real handler
25494    EXPORT_PC()
25495    mov    r0, rPC              @ arg0
25496    mov    r1, rFP              @ arg1
25497    mov    r2, rSELF            @ arg2
25498    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25499
25500/* ------------------------------ */
25501    .balign 64
25502.L_ALT_OP_UNUSED_CEFF: /* 0x1ce */
25503/* File: armv5te/alt_stub.S */
25504/*
25505 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25506 * any interesting requests and then jump to the real instruction
25507 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25508 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25509 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25510 * bail to the real handler if breakFlags==0.
25511 */
25512    ldrb   r3, [rSELF, #offThread_breakFlags]
25513    adrl   lr, dvmAsmInstructionStart + (462 * 64)
25514    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25515    cmp    r3, #0
25516    bxeq   lr                   @ nothing to do - jump to real handler
25517    EXPORT_PC()
25518    mov    r0, rPC              @ arg0
25519    mov    r1, rFP              @ arg1
25520    mov    r2, rSELF            @ arg2
25521    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25522
25523/* ------------------------------ */
25524    .balign 64
25525.L_ALT_OP_UNUSED_CFFF: /* 0x1cf */
25526/* File: armv5te/alt_stub.S */
25527/*
25528 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25529 * any interesting requests and then jump to the real instruction
25530 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25531 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25532 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25533 * bail to the real handler if breakFlags==0.
25534 */
25535    ldrb   r3, [rSELF, #offThread_breakFlags]
25536    adrl   lr, dvmAsmInstructionStart + (463 * 64)
25537    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25538    cmp    r3, #0
25539    bxeq   lr                   @ nothing to do - jump to real handler
25540    EXPORT_PC()
25541    mov    r0, rPC              @ arg0
25542    mov    r1, rFP              @ arg1
25543    mov    r2, rSELF            @ arg2
25544    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25545
25546/* ------------------------------ */
25547    .balign 64
25548.L_ALT_OP_UNUSED_D0FF: /* 0x1d0 */
25549/* File: armv5te/alt_stub.S */
25550/*
25551 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25552 * any interesting requests and then jump to the real instruction
25553 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25554 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25555 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25556 * bail to the real handler if breakFlags==0.
25557 */
25558    ldrb   r3, [rSELF, #offThread_breakFlags]
25559    adrl   lr, dvmAsmInstructionStart + (464 * 64)
25560    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25561    cmp    r3, #0
25562    bxeq   lr                   @ nothing to do - jump to real handler
25563    EXPORT_PC()
25564    mov    r0, rPC              @ arg0
25565    mov    r1, rFP              @ arg1
25566    mov    r2, rSELF            @ arg2
25567    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25568
25569/* ------------------------------ */
25570    .balign 64
25571.L_ALT_OP_UNUSED_D1FF: /* 0x1d1 */
25572/* File: armv5te/alt_stub.S */
25573/*
25574 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25575 * any interesting requests and then jump to the real instruction
25576 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25577 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25578 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25579 * bail to the real handler if breakFlags==0.
25580 */
25581    ldrb   r3, [rSELF, #offThread_breakFlags]
25582    adrl   lr, dvmAsmInstructionStart + (465 * 64)
25583    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25584    cmp    r3, #0
25585    bxeq   lr                   @ nothing to do - jump to real handler
25586    EXPORT_PC()
25587    mov    r0, rPC              @ arg0
25588    mov    r1, rFP              @ arg1
25589    mov    r2, rSELF            @ arg2
25590    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25591
25592/* ------------------------------ */
25593    .balign 64
25594.L_ALT_OP_UNUSED_D2FF: /* 0x1d2 */
25595/* File: armv5te/alt_stub.S */
25596/*
25597 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25598 * any interesting requests and then jump to the real instruction
25599 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25600 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25601 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25602 * bail to the real handler if breakFlags==0.
25603 */
25604    ldrb   r3, [rSELF, #offThread_breakFlags]
25605    adrl   lr, dvmAsmInstructionStart + (466 * 64)
25606    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25607    cmp    r3, #0
25608    bxeq   lr                   @ nothing to do - jump to real handler
25609    EXPORT_PC()
25610    mov    r0, rPC              @ arg0
25611    mov    r1, rFP              @ arg1
25612    mov    r2, rSELF            @ arg2
25613    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25614
25615/* ------------------------------ */
25616    .balign 64
25617.L_ALT_OP_UNUSED_D3FF: /* 0x1d3 */
25618/* File: armv5te/alt_stub.S */
25619/*
25620 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25621 * any interesting requests and then jump to the real instruction
25622 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25623 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25624 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25625 * bail to the real handler if breakFlags==0.
25626 */
25627    ldrb   r3, [rSELF, #offThread_breakFlags]
25628    adrl   lr, dvmAsmInstructionStart + (467 * 64)
25629    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25630    cmp    r3, #0
25631    bxeq   lr                   @ nothing to do - jump to real handler
25632    EXPORT_PC()
25633    mov    r0, rPC              @ arg0
25634    mov    r1, rFP              @ arg1
25635    mov    r2, rSELF            @ arg2
25636    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25637
25638/* ------------------------------ */
25639    .balign 64
25640.L_ALT_OP_UNUSED_D4FF: /* 0x1d4 */
25641/* File: armv5te/alt_stub.S */
25642/*
25643 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25644 * any interesting requests and then jump to the real instruction
25645 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25646 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25647 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25648 * bail to the real handler if breakFlags==0.
25649 */
25650    ldrb   r3, [rSELF, #offThread_breakFlags]
25651    adrl   lr, dvmAsmInstructionStart + (468 * 64)
25652    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25653    cmp    r3, #0
25654    bxeq   lr                   @ nothing to do - jump to real handler
25655    EXPORT_PC()
25656    mov    r0, rPC              @ arg0
25657    mov    r1, rFP              @ arg1
25658    mov    r2, rSELF            @ arg2
25659    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25660
25661/* ------------------------------ */
25662    .balign 64
25663.L_ALT_OP_UNUSED_D5FF: /* 0x1d5 */
25664/* File: armv5te/alt_stub.S */
25665/*
25666 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25667 * any interesting requests and then jump to the real instruction
25668 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25669 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25670 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25671 * bail to the real handler if breakFlags==0.
25672 */
25673    ldrb   r3, [rSELF, #offThread_breakFlags]
25674    adrl   lr, dvmAsmInstructionStart + (469 * 64)
25675    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25676    cmp    r3, #0
25677    bxeq   lr                   @ nothing to do - jump to real handler
25678    EXPORT_PC()
25679    mov    r0, rPC              @ arg0
25680    mov    r1, rFP              @ arg1
25681    mov    r2, rSELF            @ arg2
25682    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25683
25684/* ------------------------------ */
25685    .balign 64
25686.L_ALT_OP_UNUSED_D6FF: /* 0x1d6 */
25687/* File: armv5te/alt_stub.S */
25688/*
25689 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25690 * any interesting requests and then jump to the real instruction
25691 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25692 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25693 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25694 * bail to the real handler if breakFlags==0.
25695 */
25696    ldrb   r3, [rSELF, #offThread_breakFlags]
25697    adrl   lr, dvmAsmInstructionStart + (470 * 64)
25698    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25699    cmp    r3, #0
25700    bxeq   lr                   @ nothing to do - jump to real handler
25701    EXPORT_PC()
25702    mov    r0, rPC              @ arg0
25703    mov    r1, rFP              @ arg1
25704    mov    r2, rSELF            @ arg2
25705    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25706
25707/* ------------------------------ */
25708    .balign 64
25709.L_ALT_OP_UNUSED_D7FF: /* 0x1d7 */
25710/* File: armv5te/alt_stub.S */
25711/*
25712 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25713 * any interesting requests and then jump to the real instruction
25714 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25715 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25716 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25717 * bail to the real handler if breakFlags==0.
25718 */
25719    ldrb   r3, [rSELF, #offThread_breakFlags]
25720    adrl   lr, dvmAsmInstructionStart + (471 * 64)
25721    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25722    cmp    r3, #0
25723    bxeq   lr                   @ nothing to do - jump to real handler
25724    EXPORT_PC()
25725    mov    r0, rPC              @ arg0
25726    mov    r1, rFP              @ arg1
25727    mov    r2, rSELF            @ arg2
25728    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25729
25730/* ------------------------------ */
25731    .balign 64
25732.L_ALT_OP_UNUSED_D8FF: /* 0x1d8 */
25733/* File: armv5te/alt_stub.S */
25734/*
25735 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25736 * any interesting requests and then jump to the real instruction
25737 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25738 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25739 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25740 * bail to the real handler if breakFlags==0.
25741 */
25742    ldrb   r3, [rSELF, #offThread_breakFlags]
25743    adrl   lr, dvmAsmInstructionStart + (472 * 64)
25744    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25745    cmp    r3, #0
25746    bxeq   lr                   @ nothing to do - jump to real handler
25747    EXPORT_PC()
25748    mov    r0, rPC              @ arg0
25749    mov    r1, rFP              @ arg1
25750    mov    r2, rSELF            @ arg2
25751    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25752
25753/* ------------------------------ */
25754    .balign 64
25755.L_ALT_OP_UNUSED_D9FF: /* 0x1d9 */
25756/* File: armv5te/alt_stub.S */
25757/*
25758 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25759 * any interesting requests and then jump to the real instruction
25760 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25761 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25762 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25763 * bail to the real handler if breakFlags==0.
25764 */
25765    ldrb   r3, [rSELF, #offThread_breakFlags]
25766    adrl   lr, dvmAsmInstructionStart + (473 * 64)
25767    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25768    cmp    r3, #0
25769    bxeq   lr                   @ nothing to do - jump to real handler
25770    EXPORT_PC()
25771    mov    r0, rPC              @ arg0
25772    mov    r1, rFP              @ arg1
25773    mov    r2, rSELF            @ arg2
25774    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25775
25776/* ------------------------------ */
25777    .balign 64
25778.L_ALT_OP_UNUSED_DAFF: /* 0x1da */
25779/* File: armv5te/alt_stub.S */
25780/*
25781 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25782 * any interesting requests and then jump to the real instruction
25783 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25784 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25785 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25786 * bail to the real handler if breakFlags==0.
25787 */
25788    ldrb   r3, [rSELF, #offThread_breakFlags]
25789    adrl   lr, dvmAsmInstructionStart + (474 * 64)
25790    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25791    cmp    r3, #0
25792    bxeq   lr                   @ nothing to do - jump to real handler
25793    EXPORT_PC()
25794    mov    r0, rPC              @ arg0
25795    mov    r1, rFP              @ arg1
25796    mov    r2, rSELF            @ arg2
25797    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25798
25799/* ------------------------------ */
25800    .balign 64
25801.L_ALT_OP_UNUSED_DBFF: /* 0x1db */
25802/* File: armv5te/alt_stub.S */
25803/*
25804 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25805 * any interesting requests and then jump to the real instruction
25806 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25807 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25808 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25809 * bail to the real handler if breakFlags==0.
25810 */
25811    ldrb   r3, [rSELF, #offThread_breakFlags]
25812    adrl   lr, dvmAsmInstructionStart + (475 * 64)
25813    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25814    cmp    r3, #0
25815    bxeq   lr                   @ nothing to do - jump to real handler
25816    EXPORT_PC()
25817    mov    r0, rPC              @ arg0
25818    mov    r1, rFP              @ arg1
25819    mov    r2, rSELF            @ arg2
25820    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25821
25822/* ------------------------------ */
25823    .balign 64
25824.L_ALT_OP_UNUSED_DCFF: /* 0x1dc */
25825/* File: armv5te/alt_stub.S */
25826/*
25827 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25828 * any interesting requests and then jump to the real instruction
25829 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25830 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25831 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25832 * bail to the real handler if breakFlags==0.
25833 */
25834    ldrb   r3, [rSELF, #offThread_breakFlags]
25835    adrl   lr, dvmAsmInstructionStart + (476 * 64)
25836    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25837    cmp    r3, #0
25838    bxeq   lr                   @ nothing to do - jump to real handler
25839    EXPORT_PC()
25840    mov    r0, rPC              @ arg0
25841    mov    r1, rFP              @ arg1
25842    mov    r2, rSELF            @ arg2
25843    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25844
25845/* ------------------------------ */
25846    .balign 64
25847.L_ALT_OP_UNUSED_DDFF: /* 0x1dd */
25848/* File: armv5te/alt_stub.S */
25849/*
25850 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25851 * any interesting requests and then jump to the real instruction
25852 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25853 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25854 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25855 * bail to the real handler if breakFlags==0.
25856 */
25857    ldrb   r3, [rSELF, #offThread_breakFlags]
25858    adrl   lr, dvmAsmInstructionStart + (477 * 64)
25859    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25860    cmp    r3, #0
25861    bxeq   lr                   @ nothing to do - jump to real handler
25862    EXPORT_PC()
25863    mov    r0, rPC              @ arg0
25864    mov    r1, rFP              @ arg1
25865    mov    r2, rSELF            @ arg2
25866    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25867
25868/* ------------------------------ */
25869    .balign 64
25870.L_ALT_OP_UNUSED_DEFF: /* 0x1de */
25871/* File: armv5te/alt_stub.S */
25872/*
25873 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25874 * any interesting requests and then jump to the real instruction
25875 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25876 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25877 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25878 * bail to the real handler if breakFlags==0.
25879 */
25880    ldrb   r3, [rSELF, #offThread_breakFlags]
25881    adrl   lr, dvmAsmInstructionStart + (478 * 64)
25882    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25883    cmp    r3, #0
25884    bxeq   lr                   @ nothing to do - jump to real handler
25885    EXPORT_PC()
25886    mov    r0, rPC              @ arg0
25887    mov    r1, rFP              @ arg1
25888    mov    r2, rSELF            @ arg2
25889    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25890
25891/* ------------------------------ */
25892    .balign 64
25893.L_ALT_OP_UNUSED_DFFF: /* 0x1df */
25894/* File: armv5te/alt_stub.S */
25895/*
25896 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25897 * any interesting requests and then jump to the real instruction
25898 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25899 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25900 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25901 * bail to the real handler if breakFlags==0.
25902 */
25903    ldrb   r3, [rSELF, #offThread_breakFlags]
25904    adrl   lr, dvmAsmInstructionStart + (479 * 64)
25905    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25906    cmp    r3, #0
25907    bxeq   lr                   @ nothing to do - jump to real handler
25908    EXPORT_PC()
25909    mov    r0, rPC              @ arg0
25910    mov    r1, rFP              @ arg1
25911    mov    r2, rSELF            @ arg2
25912    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25913
25914/* ------------------------------ */
25915    .balign 64
25916.L_ALT_OP_UNUSED_E0FF: /* 0x1e0 */
25917/* File: armv5te/alt_stub.S */
25918/*
25919 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25920 * any interesting requests and then jump to the real instruction
25921 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25922 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25923 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25924 * bail to the real handler if breakFlags==0.
25925 */
25926    ldrb   r3, [rSELF, #offThread_breakFlags]
25927    adrl   lr, dvmAsmInstructionStart + (480 * 64)
25928    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25929    cmp    r3, #0
25930    bxeq   lr                   @ nothing to do - jump to real handler
25931    EXPORT_PC()
25932    mov    r0, rPC              @ arg0
25933    mov    r1, rFP              @ arg1
25934    mov    r2, rSELF            @ arg2
25935    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25936
25937/* ------------------------------ */
25938    .balign 64
25939.L_ALT_OP_UNUSED_E1FF: /* 0x1e1 */
25940/* File: armv5te/alt_stub.S */
25941/*
25942 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25943 * any interesting requests and then jump to the real instruction
25944 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25945 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25946 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25947 * bail to the real handler if breakFlags==0.
25948 */
25949    ldrb   r3, [rSELF, #offThread_breakFlags]
25950    adrl   lr, dvmAsmInstructionStart + (481 * 64)
25951    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25952    cmp    r3, #0
25953    bxeq   lr                   @ nothing to do - jump to real handler
25954    EXPORT_PC()
25955    mov    r0, rPC              @ arg0
25956    mov    r1, rFP              @ arg1
25957    mov    r2, rSELF            @ arg2
25958    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25959
25960/* ------------------------------ */
25961    .balign 64
25962.L_ALT_OP_UNUSED_E2FF: /* 0x1e2 */
25963/* File: armv5te/alt_stub.S */
25964/*
25965 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25966 * any interesting requests and then jump to the real instruction
25967 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25968 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25969 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25970 * bail to the real handler if breakFlags==0.
25971 */
25972    ldrb   r3, [rSELF, #offThread_breakFlags]
25973    adrl   lr, dvmAsmInstructionStart + (482 * 64)
25974    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25975    cmp    r3, #0
25976    bxeq   lr                   @ nothing to do - jump to real handler
25977    EXPORT_PC()
25978    mov    r0, rPC              @ arg0
25979    mov    r1, rFP              @ arg1
25980    mov    r2, rSELF            @ arg2
25981    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25982
25983/* ------------------------------ */
25984    .balign 64
25985.L_ALT_OP_UNUSED_E3FF: /* 0x1e3 */
25986/* File: armv5te/alt_stub.S */
25987/*
25988 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25989 * any interesting requests and then jump to the real instruction
25990 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25991 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25992 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25993 * bail to the real handler if breakFlags==0.
25994 */
25995    ldrb   r3, [rSELF, #offThread_breakFlags]
25996    adrl   lr, dvmAsmInstructionStart + (483 * 64)
25997    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25998    cmp    r3, #0
25999    bxeq   lr                   @ nothing to do - jump to real handler
26000    EXPORT_PC()
26001    mov    r0, rPC              @ arg0
26002    mov    r1, rFP              @ arg1
26003    mov    r2, rSELF            @ arg2
26004    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26005
26006/* ------------------------------ */
26007    .balign 64
26008.L_ALT_OP_UNUSED_E4FF: /* 0x1e4 */
26009/* File: armv5te/alt_stub.S */
26010/*
26011 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26012 * any interesting requests and then jump to the real instruction
26013 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26014 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26015 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26016 * bail to the real handler if breakFlags==0.
26017 */
26018    ldrb   r3, [rSELF, #offThread_breakFlags]
26019    adrl   lr, dvmAsmInstructionStart + (484 * 64)
26020    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26021    cmp    r3, #0
26022    bxeq   lr                   @ nothing to do - jump to real handler
26023    EXPORT_PC()
26024    mov    r0, rPC              @ arg0
26025    mov    r1, rFP              @ arg1
26026    mov    r2, rSELF            @ arg2
26027    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26028
26029/* ------------------------------ */
26030    .balign 64
26031.L_ALT_OP_UNUSED_E5FF: /* 0x1e5 */
26032/* File: armv5te/alt_stub.S */
26033/*
26034 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26035 * any interesting requests and then jump to the real instruction
26036 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26037 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26038 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26039 * bail to the real handler if breakFlags==0.
26040 */
26041    ldrb   r3, [rSELF, #offThread_breakFlags]
26042    adrl   lr, dvmAsmInstructionStart + (485 * 64)
26043    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26044    cmp    r3, #0
26045    bxeq   lr                   @ nothing to do - jump to real handler
26046    EXPORT_PC()
26047    mov    r0, rPC              @ arg0
26048    mov    r1, rFP              @ arg1
26049    mov    r2, rSELF            @ arg2
26050    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26051
26052/* ------------------------------ */
26053    .balign 64
26054.L_ALT_OP_UNUSED_E6FF: /* 0x1e6 */
26055/* File: armv5te/alt_stub.S */
26056/*
26057 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26058 * any interesting requests and then jump to the real instruction
26059 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26060 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26061 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26062 * bail to the real handler if breakFlags==0.
26063 */
26064    ldrb   r3, [rSELF, #offThread_breakFlags]
26065    adrl   lr, dvmAsmInstructionStart + (486 * 64)
26066    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26067    cmp    r3, #0
26068    bxeq   lr                   @ nothing to do - jump to real handler
26069    EXPORT_PC()
26070    mov    r0, rPC              @ arg0
26071    mov    r1, rFP              @ arg1
26072    mov    r2, rSELF            @ arg2
26073    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26074
26075/* ------------------------------ */
26076    .balign 64
26077.L_ALT_OP_UNUSED_E7FF: /* 0x1e7 */
26078/* File: armv5te/alt_stub.S */
26079/*
26080 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26081 * any interesting requests and then jump to the real instruction
26082 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26083 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26084 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26085 * bail to the real handler if breakFlags==0.
26086 */
26087    ldrb   r3, [rSELF, #offThread_breakFlags]
26088    adrl   lr, dvmAsmInstructionStart + (487 * 64)
26089    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26090    cmp    r3, #0
26091    bxeq   lr                   @ nothing to do - jump to real handler
26092    EXPORT_PC()
26093    mov    r0, rPC              @ arg0
26094    mov    r1, rFP              @ arg1
26095    mov    r2, rSELF            @ arg2
26096    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26097
26098/* ------------------------------ */
26099    .balign 64
26100.L_ALT_OP_UNUSED_E8FF: /* 0x1e8 */
26101/* File: armv5te/alt_stub.S */
26102/*
26103 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26104 * any interesting requests and then jump to the real instruction
26105 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26106 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26107 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26108 * bail to the real handler if breakFlags==0.
26109 */
26110    ldrb   r3, [rSELF, #offThread_breakFlags]
26111    adrl   lr, dvmAsmInstructionStart + (488 * 64)
26112    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26113    cmp    r3, #0
26114    bxeq   lr                   @ nothing to do - jump to real handler
26115    EXPORT_PC()
26116    mov    r0, rPC              @ arg0
26117    mov    r1, rFP              @ arg1
26118    mov    r2, rSELF            @ arg2
26119    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26120
26121/* ------------------------------ */
26122    .balign 64
26123.L_ALT_OP_UNUSED_E9FF: /* 0x1e9 */
26124/* File: armv5te/alt_stub.S */
26125/*
26126 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26127 * any interesting requests and then jump to the real instruction
26128 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26129 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26130 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26131 * bail to the real handler if breakFlags==0.
26132 */
26133    ldrb   r3, [rSELF, #offThread_breakFlags]
26134    adrl   lr, dvmAsmInstructionStart + (489 * 64)
26135    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26136    cmp    r3, #0
26137    bxeq   lr                   @ nothing to do - jump to real handler
26138    EXPORT_PC()
26139    mov    r0, rPC              @ arg0
26140    mov    r1, rFP              @ arg1
26141    mov    r2, rSELF            @ arg2
26142    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26143
26144/* ------------------------------ */
26145    .balign 64
26146.L_ALT_OP_UNUSED_EAFF: /* 0x1ea */
26147/* File: armv5te/alt_stub.S */
26148/*
26149 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26150 * any interesting requests and then jump to the real instruction
26151 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26152 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26153 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26154 * bail to the real handler if breakFlags==0.
26155 */
26156    ldrb   r3, [rSELF, #offThread_breakFlags]
26157    adrl   lr, dvmAsmInstructionStart + (490 * 64)
26158    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26159    cmp    r3, #0
26160    bxeq   lr                   @ nothing to do - jump to real handler
26161    EXPORT_PC()
26162    mov    r0, rPC              @ arg0
26163    mov    r1, rFP              @ arg1
26164    mov    r2, rSELF            @ arg2
26165    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26166
26167/* ------------------------------ */
26168    .balign 64
26169.L_ALT_OP_UNUSED_EBFF: /* 0x1eb */
26170/* File: armv5te/alt_stub.S */
26171/*
26172 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26173 * any interesting requests and then jump to the real instruction
26174 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26175 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26176 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26177 * bail to the real handler if breakFlags==0.
26178 */
26179    ldrb   r3, [rSELF, #offThread_breakFlags]
26180    adrl   lr, dvmAsmInstructionStart + (491 * 64)
26181    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26182    cmp    r3, #0
26183    bxeq   lr                   @ nothing to do - jump to real handler
26184    EXPORT_PC()
26185    mov    r0, rPC              @ arg0
26186    mov    r1, rFP              @ arg1
26187    mov    r2, rSELF            @ arg2
26188    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26189
26190/* ------------------------------ */
26191    .balign 64
26192.L_ALT_OP_UNUSED_ECFF: /* 0x1ec */
26193/* File: armv5te/alt_stub.S */
26194/*
26195 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26196 * any interesting requests and then jump to the real instruction
26197 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26198 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26199 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26200 * bail to the real handler if breakFlags==0.
26201 */
26202    ldrb   r3, [rSELF, #offThread_breakFlags]
26203    adrl   lr, dvmAsmInstructionStart + (492 * 64)
26204    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26205    cmp    r3, #0
26206    bxeq   lr                   @ nothing to do - jump to real handler
26207    EXPORT_PC()
26208    mov    r0, rPC              @ arg0
26209    mov    r1, rFP              @ arg1
26210    mov    r2, rSELF            @ arg2
26211    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26212
26213/* ------------------------------ */
26214    .balign 64
26215.L_ALT_OP_UNUSED_EDFF: /* 0x1ed */
26216/* File: armv5te/alt_stub.S */
26217/*
26218 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26219 * any interesting requests and then jump to the real instruction
26220 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26221 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26222 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26223 * bail to the real handler if breakFlags==0.
26224 */
26225    ldrb   r3, [rSELF, #offThread_breakFlags]
26226    adrl   lr, dvmAsmInstructionStart + (493 * 64)
26227    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26228    cmp    r3, #0
26229    bxeq   lr                   @ nothing to do - jump to real handler
26230    EXPORT_PC()
26231    mov    r0, rPC              @ arg0
26232    mov    r1, rFP              @ arg1
26233    mov    r2, rSELF            @ arg2
26234    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26235
26236/* ------------------------------ */
26237    .balign 64
26238.L_ALT_OP_UNUSED_EEFF: /* 0x1ee */
26239/* File: armv5te/alt_stub.S */
26240/*
26241 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26242 * any interesting requests and then jump to the real instruction
26243 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26244 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26245 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26246 * bail to the real handler if breakFlags==0.
26247 */
26248    ldrb   r3, [rSELF, #offThread_breakFlags]
26249    adrl   lr, dvmAsmInstructionStart + (494 * 64)
26250    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26251    cmp    r3, #0
26252    bxeq   lr                   @ nothing to do - jump to real handler
26253    EXPORT_PC()
26254    mov    r0, rPC              @ arg0
26255    mov    r1, rFP              @ arg1
26256    mov    r2, rSELF            @ arg2
26257    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26258
26259/* ------------------------------ */
26260    .balign 64
26261.L_ALT_OP_UNUSED_EFFF: /* 0x1ef */
26262/* File: armv5te/alt_stub.S */
26263/*
26264 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26265 * any interesting requests and then jump to the real instruction
26266 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26267 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26268 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26269 * bail to the real handler if breakFlags==0.
26270 */
26271    ldrb   r3, [rSELF, #offThread_breakFlags]
26272    adrl   lr, dvmAsmInstructionStart + (495 * 64)
26273    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26274    cmp    r3, #0
26275    bxeq   lr                   @ nothing to do - jump to real handler
26276    EXPORT_PC()
26277    mov    r0, rPC              @ arg0
26278    mov    r1, rFP              @ arg1
26279    mov    r2, rSELF            @ arg2
26280    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26281
26282/* ------------------------------ */
26283    .balign 64
26284.L_ALT_OP_UNUSED_F0FF: /* 0x1f0 */
26285/* File: armv5te/alt_stub.S */
26286/*
26287 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26288 * any interesting requests and then jump to the real instruction
26289 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26290 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26291 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26292 * bail to the real handler if breakFlags==0.
26293 */
26294    ldrb   r3, [rSELF, #offThread_breakFlags]
26295    adrl   lr, dvmAsmInstructionStart + (496 * 64)
26296    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26297    cmp    r3, #0
26298    bxeq   lr                   @ nothing to do - jump to real handler
26299    EXPORT_PC()
26300    mov    r0, rPC              @ arg0
26301    mov    r1, rFP              @ arg1
26302    mov    r2, rSELF            @ arg2
26303    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26304
26305/* ------------------------------ */
26306    .balign 64
26307.L_ALT_OP_UNUSED_F1FF: /* 0x1f1 */
26308/* File: armv5te/alt_stub.S */
26309/*
26310 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26311 * any interesting requests and then jump to the real instruction
26312 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26313 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26314 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26315 * bail to the real handler if breakFlags==0.
26316 */
26317    ldrb   r3, [rSELF, #offThread_breakFlags]
26318    adrl   lr, dvmAsmInstructionStart + (497 * 64)
26319    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26320    cmp    r3, #0
26321    bxeq   lr                   @ nothing to do - jump to real handler
26322    EXPORT_PC()
26323    mov    r0, rPC              @ arg0
26324    mov    r1, rFP              @ arg1
26325    mov    r2, rSELF            @ arg2
26326    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26327
26328/* ------------------------------ */
26329    .balign 64
26330.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
26331/* File: armv5te/alt_stub.S */
26332/*
26333 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26334 * any interesting requests and then jump to the real instruction
26335 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26336 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26337 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26338 * bail to the real handler if breakFlags==0.
26339 */
26340    ldrb   r3, [rSELF, #offThread_breakFlags]
26341    adrl   lr, dvmAsmInstructionStart + (498 * 64)
26342    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26343    cmp    r3, #0
26344    bxeq   lr                   @ nothing to do - jump to real handler
26345    EXPORT_PC()
26346    mov    r0, rPC              @ arg0
26347    mov    r1, rFP              @ arg1
26348    mov    r2, rSELF            @ arg2
26349    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26350
26351/* ------------------------------ */
26352    .balign 64
26353.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
26354/* File: armv5te/alt_stub.S */
26355/*
26356 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26357 * any interesting requests and then jump to the real instruction
26358 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26359 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26360 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26361 * bail to the real handler if breakFlags==0.
26362 */
26363    ldrb   r3, [rSELF, #offThread_breakFlags]
26364    adrl   lr, dvmAsmInstructionStart + (499 * 64)
26365    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26366    cmp    r3, #0
26367    bxeq   lr                   @ nothing to do - jump to real handler
26368    EXPORT_PC()
26369    mov    r0, rPC              @ arg0
26370    mov    r1, rFP              @ arg1
26371    mov    r2, rSELF            @ arg2
26372    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26373
26374/* ------------------------------ */
26375    .balign 64
26376.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
26377/* File: armv5te/alt_stub.S */
26378/*
26379 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26380 * any interesting requests and then jump to the real instruction
26381 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26382 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26383 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26384 * bail to the real handler if breakFlags==0.
26385 */
26386    ldrb   r3, [rSELF, #offThread_breakFlags]
26387    adrl   lr, dvmAsmInstructionStart + (500 * 64)
26388    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26389    cmp    r3, #0
26390    bxeq   lr                   @ nothing to do - jump to real handler
26391    EXPORT_PC()
26392    mov    r0, rPC              @ arg0
26393    mov    r1, rFP              @ arg1
26394    mov    r2, rSELF            @ arg2
26395    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26396
26397/* ------------------------------ */
26398    .balign 64
26399.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
26400/* File: armv5te/alt_stub.S */
26401/*
26402 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26403 * any interesting requests and then jump to the real instruction
26404 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26405 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26406 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26407 * bail to the real handler if breakFlags==0.
26408 */
26409    ldrb   r3, [rSELF, #offThread_breakFlags]
26410    adrl   lr, dvmAsmInstructionStart + (501 * 64)
26411    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26412    cmp    r3, #0
26413    bxeq   lr                   @ nothing to do - jump to real handler
26414    EXPORT_PC()
26415    mov    r0, rPC              @ arg0
26416    mov    r1, rFP              @ arg1
26417    mov    r2, rSELF            @ arg2
26418    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26419
26420/* ------------------------------ */
26421    .balign 64
26422.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
26423/* File: armv5te/alt_stub.S */
26424/*
26425 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26426 * any interesting requests and then jump to the real instruction
26427 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26428 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26429 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26430 * bail to the real handler if breakFlags==0.
26431 */
26432    ldrb   r3, [rSELF, #offThread_breakFlags]
26433    adrl   lr, dvmAsmInstructionStart + (502 * 64)
26434    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26435    cmp    r3, #0
26436    bxeq   lr                   @ nothing to do - jump to real handler
26437    EXPORT_PC()
26438    mov    r0, rPC              @ arg0
26439    mov    r1, rFP              @ arg1
26440    mov    r2, rSELF            @ arg2
26441    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26442
26443/* ------------------------------ */
26444    .balign 64
26445.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
26446/* File: armv5te/alt_stub.S */
26447/*
26448 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26449 * any interesting requests and then jump to the real instruction
26450 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26451 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26452 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26453 * bail to the real handler if breakFlags==0.
26454 */
26455    ldrb   r3, [rSELF, #offThread_breakFlags]
26456    adrl   lr, dvmAsmInstructionStart + (503 * 64)
26457    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26458    cmp    r3, #0
26459    bxeq   lr                   @ nothing to do - jump to real handler
26460    EXPORT_PC()
26461    mov    r0, rPC              @ arg0
26462    mov    r1, rFP              @ arg1
26463    mov    r2, rSELF            @ arg2
26464    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26465
26466/* ------------------------------ */
26467    .balign 64
26468.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
26469/* File: armv5te/alt_stub.S */
26470/*
26471 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26472 * any interesting requests and then jump to the real instruction
26473 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26474 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26475 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26476 * bail to the real handler if breakFlags==0.
26477 */
26478    ldrb   r3, [rSELF, #offThread_breakFlags]
26479    adrl   lr, dvmAsmInstructionStart + (504 * 64)
26480    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26481    cmp    r3, #0
26482    bxeq   lr                   @ nothing to do - jump to real handler
26483    EXPORT_PC()
26484    mov    r0, rPC              @ arg0
26485    mov    r1, rFP              @ arg1
26486    mov    r2, rSELF            @ arg2
26487    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26488
26489/* ------------------------------ */
26490    .balign 64
26491.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
26492/* File: armv5te/alt_stub.S */
26493/*
26494 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26495 * any interesting requests and then jump to the real instruction
26496 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26497 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26498 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26499 * bail to the real handler if breakFlags==0.
26500 */
26501    ldrb   r3, [rSELF, #offThread_breakFlags]
26502    adrl   lr, dvmAsmInstructionStart + (505 * 64)
26503    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26504    cmp    r3, #0
26505    bxeq   lr                   @ nothing to do - jump to real handler
26506    EXPORT_PC()
26507    mov    r0, rPC              @ arg0
26508    mov    r1, rFP              @ arg1
26509    mov    r2, rSELF            @ arg2
26510    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26511
26512/* ------------------------------ */
26513    .balign 64
26514.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
26515/* File: armv5te/alt_stub.S */
26516/*
26517 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26518 * any interesting requests and then jump to the real instruction
26519 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26520 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26521 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26522 * bail to the real handler if breakFlags==0.
26523 */
26524    ldrb   r3, [rSELF, #offThread_breakFlags]
26525    adrl   lr, dvmAsmInstructionStart + (506 * 64)
26526    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26527    cmp    r3, #0
26528    bxeq   lr                   @ nothing to do - jump to real handler
26529    EXPORT_PC()
26530    mov    r0, rPC              @ arg0
26531    mov    r1, rFP              @ arg1
26532    mov    r2, rSELF            @ arg2
26533    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26534
26535/* ------------------------------ */
26536    .balign 64
26537.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
26538/* File: armv5te/alt_stub.S */
26539/*
26540 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26541 * any interesting requests and then jump to the real instruction
26542 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26543 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26544 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26545 * bail to the real handler if breakFlags==0.
26546 */
26547    ldrb   r3, [rSELF, #offThread_breakFlags]
26548    adrl   lr, dvmAsmInstructionStart + (507 * 64)
26549    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26550    cmp    r3, #0
26551    bxeq   lr                   @ nothing to do - jump to real handler
26552    EXPORT_PC()
26553    mov    r0, rPC              @ arg0
26554    mov    r1, rFP              @ arg1
26555    mov    r2, rSELF            @ arg2
26556    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26557
26558/* ------------------------------ */
26559    .balign 64
26560.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
26561/* File: armv5te/alt_stub.S */
26562/*
26563 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26564 * any interesting requests and then jump to the real instruction
26565 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26566 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26567 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26568 * bail to the real handler if breakFlags==0.
26569 */
26570    ldrb   r3, [rSELF, #offThread_breakFlags]
26571    adrl   lr, dvmAsmInstructionStart + (508 * 64)
26572    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26573    cmp    r3, #0
26574    bxeq   lr                   @ nothing to do - jump to real handler
26575    EXPORT_PC()
26576    mov    r0, rPC              @ arg0
26577    mov    r1, rFP              @ arg1
26578    mov    r2, rSELF            @ arg2
26579    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26580
26581/* ------------------------------ */
26582    .balign 64
26583.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
26584/* File: armv5te/alt_stub.S */
26585/*
26586 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26587 * any interesting requests and then jump to the real instruction
26588 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26589 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26590 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26591 * bail to the real handler if breakFlags==0.
26592 */
26593    ldrb   r3, [rSELF, #offThread_breakFlags]
26594    adrl   lr, dvmAsmInstructionStart + (509 * 64)
26595    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26596    cmp    r3, #0
26597    bxeq   lr                   @ nothing to do - jump to real handler
26598    EXPORT_PC()
26599    mov    r0, rPC              @ arg0
26600    mov    r1, rFP              @ arg1
26601    mov    r2, rSELF            @ arg2
26602    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26603
26604/* ------------------------------ */
26605    .balign 64
26606.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
26607/* File: armv5te/alt_stub.S */
26608/*
26609 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26610 * any interesting requests and then jump to the real instruction
26611 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26612 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26613 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26614 * bail to the real handler if breakFlags==0.
26615 */
26616    ldrb   r3, [rSELF, #offThread_breakFlags]
26617    adrl   lr, dvmAsmInstructionStart + (510 * 64)
26618    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26619    cmp    r3, #0
26620    bxeq   lr                   @ nothing to do - jump to real handler
26621    EXPORT_PC()
26622    mov    r0, rPC              @ arg0
26623    mov    r1, rFP              @ arg1
26624    mov    r2, rSELF            @ arg2
26625    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26626
26627/* ------------------------------ */
26628    .balign 64
26629.L_ALT_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
26630/* File: armv5te/alt_stub.S */
26631/*
26632 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26633 * any interesting requests and then jump to the real instruction
26634 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26635 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26636 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26637 * bail to the real handler if breakFlags==0.
26638 */
26639    ldrb   r3, [rSELF, #offThread_breakFlags]
26640    adrl   lr, dvmAsmInstructionStart + (511 * 64)
26641    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26642    cmp    r3, #0
26643    bxeq   lr                   @ nothing to do - jump to real handler
26644    EXPORT_PC()
26645    mov    r0, rPC              @ arg0
26646    mov    r1, rFP              @ arg1
26647    mov    r2, rSELF            @ arg2
26648    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26649
26650    .balign 64
26651    .size   dvmAsmAltInstructionStart, .-dvmAsmAltInstructionStart
26652    .global dvmAsmAltInstructionEnd
26653dvmAsmAltInstructionEnd:
26654/* File: armv5te/footer.S */
26655/*
26656 * ===========================================================================
26657 *  Common subroutines and data
26658 * ===========================================================================
26659 */
26660
26661    .text
26662    .align  2
26663
26664#if defined(WITH_JIT)
26665
26666#if defined(WITH_SELF_VERIFICATION)
26667/*
26668 * "longjmp" to a translation after single-stepping.  Before returning
26669 * to translation, must save state for self-verification.
26670 */
26671    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26672dvmJitResumeTranslation:
26673    mov    rSELF, r0                             @ restore self
26674    mov    rPC, r1                               @ restore Dalvik pc
26675    mov    rFP, r2                               @ restore Dalvik fp
26676    ldr    r10, [rSELF,#offThread_jitResumeNPC]  @ resume address
26677    mov    r2, #0
26678    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26679    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26680    b      jitSVShadowRunStart                   @ resume as if cache hit
26681                                                 @ expects resume addr in r10
26682
26683    .global dvmJitToInterpPunt
26684dvmJitToInterpPunt:
26685    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
26686    mov    r3, #0
26687    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26688    b      jitSVShadowRunEnd            @ doesn't return
26689
26690    .global dvmJitToInterpSingleStep
26691dvmJitToInterpSingleStep:
26692    mov    rPC, r0              @ set up dalvik pc
26693    EXPORT_PC()
26694    str    lr, [rSELF,#offThread_jitResumeNPC]
26695    str    sp, [rSELF,#offThread_jitResumeNSP]
26696    str    r1, [rSELF,#offThread_jitResumeDPC]
26697    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
26698    b      jitSVShadowRunEnd            @ doesn't return
26699
26700
26701    .global dvmJitToInterpNoChainNoProfile
26702dvmJitToInterpNoChainNoProfile:
26703    mov    r0,rPC                       @ pass our target PC
26704    mov    r2,#kSVSNoProfile            @ r2<- interpreter entry point
26705    mov    r3, #0                       @ 0 means !inJitCodeCache
26706    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26707    b      jitSVShadowRunEnd            @ doesn't return
26708
26709    .global dvmJitToInterpTraceSelectNoChain
26710dvmJitToInterpTraceSelectNoChain:
26711    mov    r0,rPC                       @ pass our target PC
26712    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26713    mov    r3, #0                       @ 0 means !inJitCodeCache
26714    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26715    b      jitSVShadowRunEnd            @ doesn't return
26716
26717    .global dvmJitToInterpTraceSelect
26718dvmJitToInterpTraceSelect:
26719    ldr    r0,[lr, #-1]                 @ pass our target PC
26720    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26721    mov    r3, #0                       @ 0 means !inJitCodeCache
26722    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26723    b      jitSVShadowRunEnd            @ doesn't return
26724
26725    .global dvmJitToInterpBackwardBranch
26726dvmJitToInterpBackwardBranch:
26727    ldr    r0,[lr, #-1]                 @ pass our target PC
26728    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
26729    mov    r3, #0                       @ 0 means !inJitCodeCache
26730    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26731    b      jitSVShadowRunEnd            @ doesn't return
26732
26733    .global dvmJitToInterpNormal
26734dvmJitToInterpNormal:
26735    ldr    r0,[lr, #-1]                 @ pass our target PC
26736    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
26737    mov    r3, #0                       @ 0 means !inJitCodeCache
26738    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26739    b      jitSVShadowRunEnd            @ doesn't return
26740
26741    .global dvmJitToInterpNoChain
26742dvmJitToInterpNoChain:
26743    mov    r0,rPC                       @ pass our target PC
26744    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
26745    mov    r3, #0                       @ 0 means !inJitCodeCache
26746    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26747    b      jitSVShadowRunEnd            @ doesn't return
26748#else
26749
26750/*
26751 * "longjmp" to a translation after single-stepping.
26752 */
26753    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26754dvmJitResumeTranslation:
26755    mov    rSELF, r0                             @ restore self
26756    mov    rPC, r1                               @ restore Dalvik pc
26757    mov    rFP, r2                               @ restore Dalvik fp
26758    ldr    r0, [rSELF,#offThread_jitResumeNPC]
26759    mov    r2, #0
26760    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26761    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26762    bx     r0                                    @ resume translation
26763
26764/*
26765 * Return from the translation cache to the interpreter when the compiler is
26766 * having issues translating/executing a Dalvik instruction. We have to skip
26767 * the code cache lookup otherwise it is possible to indefinitely bouce
26768 * between the interpreter and the code cache if the instruction that fails
26769 * to be compiled happens to be at a trace start.
26770 */
26771    .global dvmJitToInterpPunt
26772dvmJitToInterpPunt:
26773    mov    rPC, r0
26774#if defined(WITH_JIT_TUNING)
26775    mov    r0,lr
26776    bl     dvmBumpPunt;
26777#endif
26778    EXPORT_PC()
26779    mov    r0, #0
26780    str    r0, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26781    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26782    FETCH_INST()
26783    GET_INST_OPCODE(ip)
26784    GOTO_OPCODE(ip)
26785
26786/*
26787 * Return to the interpreter to handle a single instruction.
26788 * We'll use the normal single-stepping mechanism via interpBreak,
26789 * but also save the native pc of the resume point in the translation
26790 * and the native sp so that we can later do the equivalent of a
26791 * longjmp() to resume.
26792 * On entry:
26793 *    dPC <= Dalvik PC of instrucion to interpret
26794 *    lr <= resume point in translation
26795 *    r1 <= Dalvik PC of next instruction
26796 */
26797    .global dvmJitToInterpSingleStep
26798dvmJitToInterpSingleStep:
26799    mov    rPC, r0              @ set up dalvik pc
26800    EXPORT_PC()
26801    str    lr, [rSELF,#offThread_jitResumeNPC]
26802    str    sp, [rSELF,#offThread_jitResumeNSP]
26803    str    r1, [rSELF,#offThread_jitResumeDPC]
26804    mov    r1, #1
26805    str    r1, [rSELF,#offThread_singleStepCount]  @ just step once
26806    mov    r0, rSELF
26807    mov    r1, #kSubModeCountedStep
26808    bl     dvmEnableSubMode     @ (self, newMode)
26809    ldr    rIBASE, [rSELF,#offThread_curHandlerTable]
26810    FETCH_INST()
26811    GET_INST_OPCODE(ip)
26812    GOTO_OPCODE(ip)
26813
26814/*
26815 * Return from the translation cache and immediately request
26816 * a translation for the exit target.  Commonly used for callees.
26817 */
26818    .global dvmJitToInterpTraceSelectNoChain
26819dvmJitToInterpTraceSelectNoChain:
26820#if defined(WITH_JIT_TUNING)
26821    bl     dvmBumpNoChain
26822#endif
26823    mov    r0,rPC
26824    mov    r1,rSELF
26825    bl     dvmJitGetTraceAddrThread @ (pc, self)
26826    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26827    mov    r1, rPC                  @ arg1 of translation may need this
26828    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26829    cmp    r0,#0                    @ !0 means translation exists
26830    bxne   r0                       @ continue native execution if so
26831    b      2f                       @ branch over to use the interpreter
26832
26833/*
26834 * Return from the translation cache and immediately request
26835 * a translation for the exit target.  Commonly used following
26836 * invokes.
26837 */
26838    .global dvmJitToInterpTraceSelect
26839dvmJitToInterpTraceSelect:
26840    ldr    rPC,[lr, #-1]           @ get our target PC
26841    add    rINST,lr,#-5            @ save start of chain branch
26842    add    rINST, #-4              @  .. which is 9 bytes back
26843    mov    r0,rPC
26844    mov    r1,rSELF
26845    bl     dvmJitGetTraceAddrThread @ (pc, self)
26846    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26847    cmp    r0,#0
26848    beq    2f
26849    mov    r1,rINST
26850    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26851    mov    r1, rPC                  @ arg1 of translation may need this
26852    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
26853    cmp    r0,#0                    @ successful chain?
26854    bxne   r0                       @ continue native execution
26855    b      toInterpreter            @ didn't chain - resume with interpreter
26856
26857/* No translation, so request one if profiling isn't disabled*/
268582:
26859    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26860    ldr    r0, [rSELF, #offThread_pJitProfTable]
26861    FETCH_INST()
26862    cmp    r0, #0
26863    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
26864    bne    common_selectTrace
26865    GET_INST_OPCODE(ip)
26866    GOTO_OPCODE(ip)
26867
26868/*
26869 * Return from the translation cache to the interpreter.
26870 * The return was done with a BLX from thumb mode, and
26871 * the following 32-bit word contains the target rPC value.
26872 * Note that lr (r14) will have its low-order bit set to denote
26873 * its thumb-mode origin.
26874 *
26875 * We'll need to stash our lr origin away, recover the new
26876 * target and then check to see if there is a translation available
26877 * for our new target.  If so, we do a translation chain and
26878 * go back to native execution.  Otherwise, it's back to the
26879 * interpreter (after treating this entry as a potential
26880 * trace start).
26881 */
26882    .global dvmJitToInterpNormal
26883dvmJitToInterpNormal:
26884    ldr    rPC,[lr, #-1]           @ get our target PC
26885    add    rINST,lr,#-5            @ save start of chain branch
26886    add    rINST,#-4               @ .. which is 9 bytes back
26887#if defined(WITH_JIT_TUNING)
26888    bl     dvmBumpNormal
26889#endif
26890    mov    r0,rPC
26891    mov    r1,rSELF
26892    bl     dvmJitGetTraceAddrThread @ (pc, self)
26893    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26894    cmp    r0,#0
26895    beq    toInterpreter            @ go if not, otherwise do chain
26896    mov    r1,rINST
26897    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26898    mov    r1, rPC                  @ arg1 of translation may need this
26899    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26900    cmp    r0,#0                    @ successful chain?
26901    bxne   r0                       @ continue native execution
26902    b      toInterpreter            @ didn't chain - resume with interpreter
26903
26904/*
26905 * Return from the translation cache to the interpreter to do method invocation.
26906 * Check if translation exists for the callee, but don't chain to it.
26907 */
26908    .global dvmJitToInterpNoChainNoProfile
26909dvmJitToInterpNoChainNoProfile:
26910#if defined(WITH_JIT_TUNING)
26911    bl     dvmBumpNoChain
26912#endif
26913    mov    r0,rPC
26914    mov    r1,rSELF
26915    bl     dvmJitGetTraceAddrThread @ (pc, self)
26916    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26917    mov    r1, rPC                  @ arg1 of translation may need this
26918    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26919    cmp    r0,#0
26920    bxne   r0                       @ continue native execution if so
26921    EXPORT_PC()
26922    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26923    FETCH_INST()
26924    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26925    GOTO_OPCODE(ip)                     @ jump to next instruction
26926
26927/*
26928 * Return from the translation cache to the interpreter to do method invocation.
26929 * Check if translation exists for the callee, but don't chain to it.
26930 */
26931    .global dvmJitToInterpNoChain
26932dvmJitToInterpNoChain:
26933#if defined(WITH_JIT_TUNING)
26934    bl     dvmBumpNoChain
26935#endif
26936    mov    r0,rPC
26937    mov    r1,rSELF
26938    bl     dvmJitGetTraceAddrThread @ (pc, self)
26939    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26940    mov    r1, rPC                  @ arg1 of translation may need this
26941    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26942    cmp    r0,#0
26943    bxne   r0                       @ continue native execution if so
26944#endif
26945
26946/*
26947 * No translation, restore interpreter regs and start interpreting.
26948 * rSELF & rFP were preserved in the translated code, and rPC has
26949 * already been restored by the time we get here.  We'll need to set
26950 * up rIBASE & rINST, and load the address of the JitTable into r0.
26951 */
26952toInterpreter:
26953    EXPORT_PC()
26954    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26955    FETCH_INST()
26956    ldr    r0, [rSELF, #offThread_pJitProfTable]
26957    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26958    @ NOTE: intended fallthrough
26959
26960/*
26961 * Similar to common_updateProfile, but tests for null pJitProfTable
26962 * r0 holds pJifProfTAble, rINST is loaded, rPC is current and
26963 * rIBASE has been recently refreshed.
26964 */
26965common_testUpdateProfile:
26966    cmp     r0, #0               @ JIT switched off?
26967    beq     4f                   @ return to interp if so
26968
26969/*
26970 * Common code to update potential trace start counter, and initiate
26971 * a trace-build if appropriate.
26972 * On entry here:
26973 *    r0    <= pJitProfTable (verified non-NULL)
26974 *    rPC   <= Dalvik PC
26975 *    rINST <= next instruction
26976 */
26977common_updateProfile:
26978    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
26979    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
26980    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
26981    GET_INST_OPCODE(ip)
26982    subs    r1,r1,#1           @ decrement counter
26983    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
26984    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
26985
26986    /* Looks good, reset the counter */
26987    ldr     r1, [rSELF, #offThread_jitThreshold]
26988    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
26989    EXPORT_PC()
26990    mov     r0,rPC
26991    mov     r1,rSELF
26992    bl      dvmJitGetTraceAddrThread    @ (pc, self)
26993    str     r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26994    mov     r1, rPC                     @ arg1 of translation may need this
26995    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
26996    cmp     r0,#0
26997#if !defined(WITH_SELF_VERIFICATION)
26998    bxne    r0                          @ jump to the translation
26999    mov     r2,#kJitTSelectRequest      @ ask for trace selection
27000    @ fall-through to common_selectTrace
27001#else
27002    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
27003    beq     common_selectTrace
27004    /*
27005     * At this point, we have a target translation.  However, if
27006     * that translation is actually the interpret-only pseudo-translation
27007     * we want to treat it the same as no translation.
27008     */
27009    mov     r10, r0                     @ save target
27010    bl      dvmCompilerGetInterpretTemplate
27011    cmp     r0, r10                     @ special case?
27012    bne     jitSVShadowRunStart         @ set up self verification shadow space
27013    @ Need to clear the inJitCodeCache flag
27014    mov    r3, #0                       @ 0 means not in the JIT code cache
27015    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
27016    GET_INST_OPCODE(ip)
27017    GOTO_OPCODE(ip)
27018    /* no return */
27019#endif
27020
27021/*
27022 * On entry:
27023 *  r2 is jit state.
27024 */
27025common_selectTrace:
27026    ldrh    r0,[rSELF,#offThread_subMode]
27027    ands    r0, #(kSubModeJitTraceBuild | kSubModeJitSV)
27028    bne     3f                         @ already doing JIT work, continue
27029    str     r2,[rSELF,#offThread_jitState]
27030    mov     r0, rSELF
27031/*
27032 * Call out to validate trace-building request.  If successful,
27033 * rIBASE will be swapped to to send us into single-stepping trace
27034 * building mode, so we need to refresh before we continue.
27035 */
27036    EXPORT_PC()
27037    SAVE_PC_FP_TO_SELF()                 @ copy of pc/fp to Thread
27038    bl      dvmJitCheckTraceRequest
270393:
27040    FETCH_INST()
27041    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
270424:
27043    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27044    GOTO_OPCODE(ip)
27045    /* no return */
27046#endif
27047
27048#if defined(WITH_SELF_VERIFICATION)
27049/*
27050 * Save PC and registers to shadow memory for self verification mode
27051 * before jumping to native translation.
27052 * On entry:
27053 *    rPC, rFP, rSELF: the values that they should contain
27054 *    r10: the address of the target translation.
27055 */
27056jitSVShadowRunStart:
27057    mov     r0,rPC                      @ r0<- program counter
27058    mov     r1,rFP                      @ r1<- frame pointer
27059    mov     r2,rSELF                    @ r2<- self (Thread) pointer
27060    mov     r3,r10                      @ r3<- target translation
27061    bl      dvmSelfVerificationSaveState @ save registers to shadow space
27062    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
27063    bx      r10                         @ jump to the translation
27064
27065/*
27066 * Restore PC, registers, and interpreter state to original values
27067 * before jumping back to the interpreter.
27068 * On entry:
27069 *   r0:  dPC
27070 *   r2:  self verification state
27071 */
27072jitSVShadowRunEnd:
27073    mov    r1,rFP                        @ pass ending fp
27074    mov    r3,rSELF                      @ pass self ptr for convenience
27075    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
27076    LOAD_PC_FP_FROM_SELF()               @ restore pc, fp
27077    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
27078    cmp    r1,#0                         @ check for punt condition
27079    beq    1f
27080    @ Set up SV single-stepping
27081    mov    r0, rSELF
27082    mov    r1, #kSubModeJitSV
27083    bl     dvmEnableSubMode              @ (self, subMode)
27084    mov    r2,#kJitSelfVerification      @ ask for self verification
27085    str    r2,[rSELF,#offThread_jitState]
27086    @ intentional fallthrough
270871:                                       @ exit to interpreter without check
27088    EXPORT_PC()
27089    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
27090    FETCH_INST()
27091    GET_INST_OPCODE(ip)
27092    GOTO_OPCODE(ip)
27093#endif
27094
27095/*
27096 * The equivalent of "goto bail", this calls through the "bail handler".
27097 * It will end this interpreter activation, and return to the caller
27098 * of dvmMterpStdRun.
27099 *
27100 * State registers will be saved to the "thread" area before bailing
27101 * debugging purposes
27102 */
27103common_gotoBail:
27104    SAVE_PC_FP_TO_SELF()                @ export state to "thread"
27105    mov     r0, rSELF                   @ r0<- self ptr
27106    b       dvmMterpStdBail             @ call(self, changeInterp)
27107
27108/*
27109 * The JIT's invoke method needs to remember the callsite class and
27110 * target pair.  Save them here so that they are available to
27111 * dvmCheckJit following the interpretation of this invoke.
27112 */
27113#if defined(WITH_JIT)
27114save_callsiteinfo:
27115    cmp     r9, #0
27116    ldrne   r9, [r9, #offObject_clazz]
27117    str     r0, [rSELF, #offThread_methodToCall]
27118    str     r9, [rSELF, #offThread_callsiteClass]
27119    bx      lr
27120#endif
27121
27122/*
27123 * Common code for jumbo method invocation.
27124 * NOTE: this adjusts rPC to account for the difference in instruction width.
27125 * As a result, the savedPc in the stack frame will not be wholly accurate. So
27126 * long as that is only used for source file line number calculations, we're
27127 * okay.
27128 */
27129common_invokeMethodJumboNoThis:
27130#if defined(WITH_JIT)
27131 /* On entry: r0 is "Method* methodToCall */
27132    mov     r9, #0                      @ clear "this"
27133#endif
27134common_invokeMethodJumbo:
27135 /* On entry: r0 is "Method* methodToCall, r9 is "this" */
27136.LinvokeNewJumbo:
27137#if defined(WITH_JIT)
27138    ldrh    r1, [rSELF, #offThread_subMode]
27139    ands    r1, #kSubModeJitTraceBuild
27140    blne    save_callsiteinfo
27141#endif
27142    @ prepare to copy args to "outs" area of current frame
27143    add     rPC, rPC, #4                @ adjust pc to make return consistent
27144    FETCH(r2, 1)                        @ r2<- BBBB (arg count)
27145    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
27146    cmp     r2, #0                      @ no args?
27147    beq     .LinvokeArgsDone            @ if no args, skip the rest
27148    FETCH(r1, 2)                        @ r1<- CCCC
27149    b       .LinvokeRangeArgs           @ handle args like invoke range
27150
27151/*
27152 * Common code for method invocation with range.
27153 *
27154 * On entry:
27155 *  r0 is "Method* methodToCall", r9 is "this"
27156 */
27157common_invokeMethodRange:
27158.LinvokeNewRange:
27159#if defined(WITH_JIT)
27160    ldrh    r1, [rSELF, #offThread_subMode]
27161    ands    r1, #kSubModeJitTraceBuild
27162    blne    save_callsiteinfo
27163#endif
27164    @ prepare to copy args to "outs" area of current frame
27165    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
27166    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
27167    beq     .LinvokeArgsDone            @ if no args, skip the rest
27168    FETCH(r1, 2)                        @ r1<- CCCC
27169
27170.LinvokeRangeArgs:
27171    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
27172    @ (very few methods have > 10 args; could unroll for common cases)
27173    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
27174    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
271751:  ldr     r1, [r3], #4                @ val = *fp++
27176    subs    r2, r2, #1                  @ count--
27177    str     r1, [r10], #4               @ *outs++ = val
27178    bne     1b                          @ ...while count != 0
27179    b       .LinvokeArgsDone
27180
27181/*
27182 * Common code for method invocation without range.
27183 *
27184 * On entry:
27185 *  r0 is "Method* methodToCall", r9 is "this"
27186 */
27187common_invokeMethodNoRange:
27188.LinvokeNewNoRange:
27189#if defined(WITH_JIT)
27190    ldrh    r1, [rSELF, #offThread_subMode]
27191    ands    r1, #kSubModeJitTraceBuild
27192    blne    save_callsiteinfo
27193#endif
27194    @ prepare to copy args to "outs" area of current frame
27195    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
27196    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
27197    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
27198    beq     .LinvokeArgsDone
27199
27200    @ r0=methodToCall, r1=GFED, r2=count, r10=outs
27201.LinvokeNonRange:
27202    rsb     r2, r2, #5                  @ r2<- 5-r2
27203    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
27204    bl      common_abort                @ (skipped due to ARM prefetch)
272055:  and     ip, rINST, #0x0f00          @ isolate A
27206    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
27207    mov     r0, r0                      @ nop
27208    str     r2, [r10, #-4]!             @ *--outs = vA
272094:  and     ip, r1, #0xf000             @ isolate G
27210    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
27211    mov     r0, r0                      @ nop
27212    str     r2, [r10, #-4]!             @ *--outs = vG
272133:  and     ip, r1, #0x0f00             @ isolate F
27214    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
27215    mov     r0, r0                      @ nop
27216    str     r2, [r10, #-4]!             @ *--outs = vF
272172:  and     ip, r1, #0x00f0             @ isolate E
27218    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
27219    mov     r0, r0                      @ nop
27220    str     r2, [r10, #-4]!             @ *--outs = vE
272211:  and     ip, r1, #0x000f             @ isolate D
27222    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
27223    mov     r0, r0                      @ nop
27224    str     r2, [r10, #-4]!             @ *--outs = vD
272250:  @ fall through to .LinvokeArgsDone
27226
27227.LinvokeArgsDone: @ r0=methodToCall
27228    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
27229    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
27230    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
27231    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
27232    @ find space for the new stack frame, check for overflow
27233    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
27234    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
27235    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
27236@    bl      common_dumpRegs
27237    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
27238    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
27239    cmp     r3, r9                      @ bottom < interpStackEnd?
27240    ldrh    lr, [rSELF, #offThread_subMode]
27241    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
27242    blo     .LstackOverflow             @ yes, this frame will overflow stack
27243
27244    @ set up newSaveArea
27245#ifdef EASY_GDB
27246    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
27247    str     ip, [r10, #offStackSaveArea_prevSave]
27248#endif
27249    str     rFP, [r10, #offStackSaveArea_prevFrame]
27250    str     rPC, [r10, #offStackSaveArea_savedPc]
27251#if defined(WITH_JIT)
27252    mov     r9, #0
27253    str     r9, [r10, #offStackSaveArea_returnAddr]
27254#endif
27255    str     r0, [r10, #offStackSaveArea_method]
27256
27257    @ Profiling?
27258    cmp     lr, #0                      @ any special modes happening?
27259    bne     2f                          @ go if so
272601:
27261    tst     r3, #ACC_NATIVE
27262    bne     .LinvokeNative
27263
27264    /*
27265    stmfd   sp!, {r0-r3}
27266    bl      common_printNewline
27267    mov     r0, rFP
27268    mov     r1, #0
27269    bl      dvmDumpFp
27270    ldmfd   sp!, {r0-r3}
27271    stmfd   sp!, {r0-r3}
27272    mov     r0, r1
27273    mov     r1, r10
27274    bl      dvmDumpFp
27275    bl      common_printNewline
27276    ldmfd   sp!, {r0-r3}
27277    */
27278
27279    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
27280    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
27281    mov     rPC, r2                         @ publish new rPC
27282
27283    @ Update state values for the new method
27284    @ r0=methodToCall, r1=newFp, r3=newMethodClass, r9=newINST
27285    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
27286    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
27287    mov     r2, #1
27288    str     r2, [rSELF, #offThread_debugIsMethodEntry]
27289#if defined(WITH_JIT)
27290    ldr     r0, [rSELF, #offThread_pJitProfTable]
27291    mov     rFP, r1                         @ fp = newFp
27292    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
27293    mov     rINST, r9                       @ publish new rINST
27294    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
27295    cmp     r0,#0
27296    bne     common_updateProfile
27297    GOTO_OPCODE(ip)                         @ jump to next instruction
27298#else
27299    mov     rFP, r1                         @ fp = newFp
27300    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
27301    mov     rINST, r9                       @ publish new rINST
27302    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
27303    GOTO_OPCODE(ip)                         @ jump to next instruction
27304#endif
27305
273062:
27307    @ Profiling - record method entry.  r0: methodToCall
27308    stmfd   sp!, {r0-r3}                @ preserve r0-r3
27309    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
27310    mov     r1, r0
27311    mov     r0, rSELF
27312    bl      dvmReportInvoke             @ (self, method)
27313    ldmfd   sp!, {r0-r3}                @ restore r0-r3
27314    b       1b
27315
27316.LinvokeNative:
27317    @ Prep for the native call
27318    @ r0=methodToCall, r1=newFp, r10=newSaveArea
27319    ldrh    lr, [rSELF, #offThread_subMode]
27320    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
27321    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
27322    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
27323    mov     r2, r0                      @ r2<- methodToCall
27324    mov     r0, r1                      @ r0<- newFp (points to args)
27325    add     r1, rSELF, #offThread_retval  @ r1<- &retval
27326    mov     r3, rSELF                   @ arg3<- self
27327
27328#ifdef ASSIST_DEBUGGER
27329    /* insert fake function header to help gdb find the stack frame */
27330    b       .Lskip
27331    .type   dalvik_mterp, %function
27332dalvik_mterp:
27333    .fnstart
27334    MTERP_ENTRY1
27335    MTERP_ENTRY2
27336.Lskip:
27337#endif
27338
27339    cmp     lr, #0                      @ any special SubModes active?
27340    bne     11f                         @ go handle them if so
27341    mov     lr, pc                      @ set return addr
27342    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
273437:
27344
27345    @ native return; r10=newSaveArea
27346    @ equivalent to dvmPopJniLocals
27347    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
27348    ldr     r1, [rSELF, #offThread_exception] @ check for exception
27349    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
27350    cmp     r1, #0                      @ null?
27351    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
27352    bne     common_exceptionThrown      @ no, handle exception
27353
27354    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
27355    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27356    GOTO_OPCODE(ip)                     @ jump to next instruction
27357
2735811:
27359    @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
27360    stmfd   sp!, {r0-r3}                @ save all but subModes
27361    mov     r0, r2                      @ r0<- methodToCall
27362    mov     r1, rSELF
27363    mov     r2, rFP
27364    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
27365    ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
27366
27367    @ Call the native method
27368    mov     lr, pc                      @ set return addr
27369    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
27370
27371    @ Restore the pre-call arguments
27372    ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
27373
27374    @ Finish up any post-invoke subMode requirements
27375    mov     r0, r2                      @ r0<- methodToCall
27376    mov     r1, rSELF
27377    mov     r2, rFP
27378    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
27379    b       7b                          @ resume
27380
27381.LstackOverflow:    @ r0=methodToCall
27382    mov     r1, r0                      @ r1<- methodToCall
27383    mov     r0, rSELF                   @ r0<- self
27384    bl      dvmHandleStackOverflow
27385    b       common_exceptionThrown
27386#ifdef ASSIST_DEBUGGER
27387    .fnend
27388    .size   dalvik_mterp, .-dalvik_mterp
27389#endif
27390
27391
27392    /*
27393     * Common code for method invocation, calling through "glue code".
27394     *
27395     * TODO: now that we have range and non-range invoke handlers, this
27396     *       needs to be split into two.  Maybe just create entry points
27397     *       that set r9 and jump here?
27398     *
27399     * On entry:
27400     *  r0 is "Method* methodToCall", the method we're trying to call
27401     *  r9 is "bool methodCallRange", indicating if this is a /range variant
27402     */
27403     .if    0
27404.LinvokeOld:
27405    sub     sp, sp, #8                  @ space for args + pad
27406    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
27407    mov     r2, r0                      @ A2<- methodToCall
27408    mov     r0, rSELF                   @ A0<- self
27409    SAVE_PC_FP_TO_SELF()                @ export state to "self"
27410    mov     r1, r9                      @ A1<- methodCallRange
27411    mov     r3, rINST, lsr #8           @ A3<- AA
27412    str     ip, [sp, #0]                @ A4<- ip
27413    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
27414    add     sp, sp, #8                  @ remove arg area
27415    b       common_resumeAfterGlueCall  @ continue to next instruction
27416    .endif
27417
27418
27419
27420/*
27421 * Common code for handling a return instruction.
27422 *
27423 * This does not return.
27424 */
27425common_returnFromMethod:
27426.LreturnNew:
27427    ldrh    lr, [rSELF, #offThread_subMode]
27428    SAVEAREA_FROM_FP(r0, rFP)
27429    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
27430    cmp     lr, #0                      @ any special subMode handling needed?
27431    bne     19f
2743214:
27433    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
27434    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
27435                                        @ r2<- method we're returning to
27436    cmp     r2, #0                      @ is this a break frame?
27437#if defined(WORKAROUND_CORTEX_A9_745320)
27438    /* Don't use conditional loads if the HW defect exists */
27439    beq     15f
27440    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
2744115:
27442#else
27443    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
27444#endif
27445    beq     common_gotoBail             @ break frame, bail out completely
27446
27447    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
27448    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
27449    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
27450    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
27451    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
27452#if defined(WITH_JIT)
27453    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
27454    mov     rPC, r9                     @ publish new rPC
27455    str     r1, [rSELF, #offThread_methodClassDex]
27456    str     r10, [rSELF, #offThread_inJitCodeCache]  @ may return to JIT'ed land
27457    cmp     r10, #0                      @ caller is compiled code
27458    blxne   r10
27459    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27460    GOTO_OPCODE(ip)                     @ jump to next instruction
27461#else
27462    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27463    mov     rPC, r9                     @ publish new rPC
27464    str     r1, [rSELF, #offThread_methodClassDex]
27465    GOTO_OPCODE(ip)                     @ jump to next instruction
27466#endif
27467
2746819:
27469    @ Handle special actions
27470    @ On entry, r0: StackSaveArea
27471    ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
27472    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
27473    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
27474    mov     r0, rSELF
27475    bl      dvmReportReturn             @ (self)
27476    SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
27477    b       14b                         @ continue
27478
27479    /*
27480     * Return handling, calls through "glue code".
27481     */
27482     .if    0
27483.LreturnOld:
27484    SAVE_PC_FP_TO_SELF()                @ export state
27485    mov     r0, rSELF                   @ arg to function
27486    bl      dvmMterp_returnFromMethod
27487    b       common_resumeAfterGlueCall
27488    .endif
27489
27490
27491/*
27492 * Somebody has thrown an exception.  Handle it.
27493 *
27494 * If the exception processing code returns to us (instead of falling
27495 * out of the interpreter), continue with whatever the next instruction
27496 * now happens to be.
27497 *
27498 * This does not return.
27499 */
27500     .global dvmMterpCommonExceptionThrown
27501dvmMterpCommonExceptionThrown:
27502common_exceptionThrown:
27503.LexceptionNew:
27504
27505    EXPORT_PC()
27506
27507    mov     r0, rSELF
27508    bl      dvmCheckSuspendPending
27509
27510    ldr     r9, [rSELF, #offThread_exception] @ r9<- self->exception
27511    mov     r1, rSELF                   @ r1<- self
27512    mov     r0, r9                      @ r0<- exception
27513    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
27514    ldrh    r2, [rSELF, #offThread_subMode]  @ get subMode flags
27515    mov     r3, #0                      @ r3<- NULL
27516    str     r3, [rSELF, #offThread_exception] @ self->exception = NULL
27517
27518    @ Special subMode?
27519    cmp     r2, #0                      @ any special subMode handling needed?
27520    bne     7f                          @ go if so
275218:
27522    /* set up args and a local for "&fp" */
27523    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
27524    str     rFP, [sp, #-4]!             @ *--sp = fp
27525    mov     ip, sp                      @ ip<- &fp
27526    mov     r3, #0                      @ r3<- false
27527    str     ip, [sp, #-4]!              @ *--sp = &fp
27528    ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
27529    mov     r0, rSELF                   @ r0<- self
27530    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
27531    ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
27532    mov     r2, r9                      @ r2<- exception
27533    sub     r1, rPC, r1                 @ r1<- pc - method->insns
27534    mov     r1, r1, asr #1              @ r1<- offset in code units
27535
27536    /* call, r0 gets catchRelPc (a code-unit offset) */
27537    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
27538
27539    /* fix earlier stack overflow if necessary; may trash rFP */
27540    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27541    cmp     r1, #0                      @ did we overflow earlier?
27542    beq     1f                          @ no, skip ahead
27543    mov     rFP, r0                     @ save relPc result in rFP
27544    mov     r0, rSELF                   @ r0<- self
27545    mov     r1, r9                      @ r1<- exception
27546    bl      dvmCleanupStackOverflow     @ call(self)
27547    mov     r0, rFP                     @ restore result
275481:
27549
27550    /* update frame pointer and check result from dvmFindCatchBlock */
27551    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
27552    cmp     r0, #0                      @ is catchRelPc < 0?
27553    add     sp, sp, #8                  @ restore stack
27554    bmi     .LnotCaughtLocally
27555
27556    /* adjust locals to match self->interpSave.curFrame and updated PC */
27557    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
27558    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
27559    str     r1, [rSELF, #offThread_method]  @ self->method = new method
27560    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
27561    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
27562    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
27563    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
27564    str     r2, [rSELF, #offThread_methodClassDex] @ self->pDvmDex = meth...
27565
27566    /* release the tracked alloc on the exception */
27567    mov     r0, r9                      @ r0<- exception
27568    mov     r1, rSELF                   @ r1<- self
27569    bl      dvmReleaseTrackedAlloc      @ release the exception
27570
27571    /* restore the exception if the handler wants it */
27572    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
27573    FETCH_INST()                        @ load rINST from rPC
27574    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27575    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
27576    streq   r9, [rSELF, #offThread_exception] @ yes, restore the exception
27577    GOTO_OPCODE(ip)                     @ jump to next instruction
27578
27579    @ Manage debugger bookkeeping
275807:
27581    str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
27582    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
27583    mov     r0, rSELF                       @ arg0<- self
27584    mov     r1, r9                          @ arg1<- exception
27585    bl      dvmReportExceptionThrow         @ (self, exception)
27586    b       8b                              @ resume with normal handling
27587
27588.LnotCaughtLocally: @ r9=exception
27589    /* fix stack overflow if necessary */
27590    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27591    cmp     r1, #0                      @ did we overflow earlier?
27592    movne   r0, rSELF                   @ if yes: r0<- self
27593    movne   r1, r9                      @ if yes: r1<- exception
27594    blne    dvmCleanupStackOverflow     @ if yes: call(self)
27595
27596    @ may want to show "not caught locally" debug messages here
27597#if DVM_SHOW_EXCEPTION >= 2
27598    /* call __android_log_print(prio, tag, format, ...) */
27599    /* "Exception %s from %s:%d not caught locally" */
27600    @ dvmLineNumFromPC(method, pc - method->insns)
27601    ldr     r0, [rSELF, #offThread_method]
27602    ldr     r1, [r0, #offMethod_insns]
27603    sub     r1, rPC, r1
27604    asr     r1, r1, #1
27605    bl      dvmLineNumFromPC
27606    str     r0, [sp, #-4]!
27607    @ dvmGetMethodSourceFile(method)
27608    ldr     r0, [rSELF, #offThread_method]
27609    bl      dvmGetMethodSourceFile
27610    str     r0, [sp, #-4]!
27611    @ exception->clazz->descriptor
27612    ldr     r3, [r9, #offObject_clazz]
27613    ldr     r3, [r3, #offClassObject_descriptor]
27614    @
27615    ldr     r2, strExceptionNotCaughtLocally
27616    ldr     r1, strLogTag
27617    mov     r0, #3                      @ LOG_DEBUG
27618    bl      __android_log_print
27619#endif
27620    str     r9, [rSELF, #offThread_exception] @ restore exception
27621    mov     r0, r9                      @ r0<- exception
27622    mov     r1, rSELF                   @ r1<- self
27623    bl      dvmReleaseTrackedAlloc      @ release the exception
27624    b       common_gotoBail             @ bail out
27625
27626
27627    /*
27628     * Exception handling, calls through "glue code".
27629     */
27630    .if     0
27631.LexceptionOld:
27632    SAVE_PC_FP_TO_SELF()                @ export state
27633    mov     r0, rSELF                   @ arg to function
27634    bl      dvmMterp_exceptionThrown
27635    b       common_resumeAfterGlueCall
27636    .endif
27637
27638#if defined(WITH_JIT)
27639    /*
27640     * If the JIT is actively building a trace we need to make sure
27641     * that the field is fully resolved before including the current
27642     * instruction.
27643     *
27644     * On entry:
27645     *     r10: &dvmDex->pResFields[field]
27646     *     r0:  field pointer (must preserve)
27647     */
27648common_verifyField:
27649    ldrh    r3, [rSELF, #offThread_subMode]  @ r3 <- submode byte
27650    ands    r3, #kSubModeJitTraceBuild
27651    bxeq    lr                          @ Not building trace, continue
27652    ldr     r1, [r10]                   @ r1<- reload resolved StaticField ptr
27653    cmp     r1, #0                      @ resolution complete?
27654    bxne    lr                          @ yes, continue
27655    stmfd   sp!, {r0-r2,lr}             @ save regs
27656    mov     r0, rSELF
27657    mov     r1, rPC
27658    bl      dvmJitEndTraceSelect        @ (self,pc) end trace before this inst
27659    ldmfd   sp!, {r0-r2, lr}
27660    bx      lr                          @ return
27661#endif
27662
27663/*
27664 * After returning from a "glued" function, pull out the updated
27665 * values and start executing at the next instruction.
27666 */
27667common_resumeAfterGlueCall:
27668    LOAD_PC_FP_FROM_SELF()              @ pull rPC and rFP out of thread
27669    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh
27670    FETCH_INST()                        @ load rINST from rPC
27671    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27672    GOTO_OPCODE(ip)                     @ jump to next instruction
27673
27674/*
27675 * Invalid array index. Note that our calling convention is strange; we use r1
27676 * and r3 because those just happen to be the registers all our callers are
27677 * using. We move r3 before calling the C function, but r1 happens to match.
27678 * r1: index
27679 * r3: size
27680 */
27681common_errArrayIndex:
27682    EXPORT_PC()
27683    mov     r0, r3
27684    bl      dvmThrowArrayIndexOutOfBoundsException
27685    b       common_exceptionThrown
27686
27687/*
27688 * Integer divide or mod by zero.
27689 */
27690common_errDivideByZero:
27691    EXPORT_PC()
27692    ldr     r0, strDivideByZero
27693    bl      dvmThrowArithmeticException
27694    b       common_exceptionThrown
27695
27696/*
27697 * Attempt to allocate an array with a negative size.
27698 * On entry: length in r1
27699 */
27700common_errNegativeArraySize:
27701    EXPORT_PC()
27702    mov     r0, r1                                @ arg0 <- len
27703    bl      dvmThrowNegativeArraySizeException    @ (len)
27704    b       common_exceptionThrown
27705
27706/*
27707 * Invocation of a non-existent method.
27708 * On entry: method name in r1
27709 */
27710common_errNoSuchMethod:
27711    EXPORT_PC()
27712    mov     r0, r1
27713    bl      dvmThrowNoSuchMethodError
27714    b       common_exceptionThrown
27715
27716/*
27717 * We encountered a null object when we weren't expecting one.  We
27718 * export the PC, throw a NullPointerException, and goto the exception
27719 * processing code.
27720 */
27721common_errNullObject:
27722    EXPORT_PC()
27723    mov     r0, #0
27724    bl      dvmThrowNullPointerException
27725    b       common_exceptionThrown
27726
27727/*
27728 * For debugging, cause an immediate fault.  The source address will
27729 * be in lr (use a bl instruction to jump here).
27730 */
27731common_abort:
27732    ldr     pc, .LdeadFood
27733.LdeadFood:
27734    .word   0xdeadf00d
27735
27736/*
27737 * Spit out a "we were here", preserving all registers.  (The attempt
27738 * to save ip won't work, but we need to save an even number of
27739 * registers for EABI 64-bit stack alignment.)
27740 */
27741    .macro  SQUEAK num
27742common_squeak\num:
27743    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27744    ldr     r0, strSqueak
27745    mov     r1, #\num
27746    bl      printf
27747    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27748    bx      lr
27749    .endm
27750
27751    SQUEAK  0
27752    SQUEAK  1
27753    SQUEAK  2
27754    SQUEAK  3
27755    SQUEAK  4
27756    SQUEAK  5
27757
27758/*
27759 * Spit out the number in r0, preserving registers.
27760 */
27761common_printNum:
27762    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27763    mov     r1, r0
27764    ldr     r0, strSqueak
27765    bl      printf
27766    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27767    bx      lr
27768
27769/*
27770 * Print a newline, preserving registers.
27771 */
27772common_printNewline:
27773    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27774    ldr     r0, strNewline
27775    bl      printf
27776    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27777    bx      lr
27778
27779    /*
27780     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
27781     */
27782common_printHex:
27783    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27784    mov     r1, r0
27785    ldr     r0, strPrintHex
27786    bl      printf
27787    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27788    bx      lr
27789
27790/*
27791 * Print the 64-bit quantity in r0-r1, preserving registers.
27792 */
27793common_printLong:
27794    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27795    mov     r3, r1
27796    mov     r2, r0
27797    ldr     r0, strPrintLong
27798    bl      printf
27799    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27800    bx      lr
27801
27802/*
27803 * Print full method info.  Pass the Method* in r0.  Preserves regs.
27804 */
27805common_printMethod:
27806    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27807    bl      dvmMterpPrintMethod
27808    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27809    bx      lr
27810
27811/*
27812 * Call a C helper function that dumps regs and possibly some
27813 * additional info.  Requires the C function to be compiled in.
27814 */
27815    .if     0
27816common_dumpRegs:
27817    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27818    bl      dvmMterpDumpArmRegs
27819    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27820    bx      lr
27821    .endif
27822
27823#if 0
27824/*
27825 * Experiment on VFP mode.
27826 *
27827 * uint32_t setFPSCR(uint32_t val, uint32_t mask)
27828 *
27829 * Updates the bits specified by "mask", setting them to the values in "val".
27830 */
27831setFPSCR:
27832    and     r0, r0, r1                  @ make sure no stray bits are set
27833    fmrx    r2, fpscr                   @ get VFP reg
27834    mvn     r1, r1                      @ bit-invert mask
27835    and     r2, r2, r1                  @ clear masked bits
27836    orr     r2, r2, r0                  @ set specified bits
27837    fmxr    fpscr, r2                   @ set VFP reg
27838    mov     r0, r2                      @ return new value
27839    bx      lr
27840
27841    .align  2
27842    .global dvmConfigureFP
27843    .type   dvmConfigureFP, %function
27844dvmConfigureFP:
27845    stmfd   sp!, {ip, lr}
27846    /* 0x03000000 sets DN/FZ */
27847    /* 0x00009f00 clears the six exception enable flags */
27848    bl      common_squeak0
27849    mov     r0, #0x03000000             @ r0<- 0x03000000
27850    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
27851    bl      setFPSCR
27852    ldmfd   sp!, {ip, pc}
27853#endif
27854
27855
27856/*
27857 * String references, must be close to the code that uses them.
27858 */
27859    .align  2
27860strDivideByZero:
27861    .word   .LstrDivideByZero
27862strLogTag:
27863    .word   .LstrLogTag
27864strExceptionNotCaughtLocally:
27865    .word   .LstrExceptionNotCaughtLocally
27866
27867strNewline:
27868    .word   .LstrNewline
27869strSqueak:
27870    .word   .LstrSqueak
27871strPrintHex:
27872    .word   .LstrPrintHex
27873strPrintLong:
27874    .word   .LstrPrintLong
27875
27876/*
27877 * Zero-terminated ASCII string data.
27878 *
27879 * On ARM we have two choices: do like gcc does, and LDR from a .word
27880 * with the address, or use an ADR pseudo-op to get the address
27881 * directly.  ADR saves 4 bytes and an indirection, but it's using a
27882 * PC-relative addressing mode and hence has a limited range, which
27883 * makes it not work well with mergeable string sections.
27884 */
27885    .section .rodata.str1.4,"aMS",%progbits,1
27886
27887.LstrBadEntryPoint:
27888    .asciz  "Bad entry point %d\n"
27889.LstrFilledNewArrayNotImpl:
27890    .asciz  "filled-new-array only implemented for objects and 'int'"
27891.LstrDivideByZero:
27892    .asciz  "divide by zero"
27893.LstrLogTag:
27894    .asciz  "mterp"
27895.LstrExceptionNotCaughtLocally:
27896    .asciz  "Exception %s from %s:%d not caught locally\n"
27897
27898.LstrNewline:
27899    .asciz  "\n"
27900.LstrSqueak:
27901    .asciz  "<%d>"
27902.LstrPrintHex:
27903    .asciz  "<%#x>"
27904.LstrPrintLong:
27905    .asciz  "<%lld>"
27906
27907