InterpAsm-armv5te-vfp.S revision 8b095215a4d5bde723819087f3455bdcc250a78f
1/*
2 * This file was generated automatically by gen-mterp.py for 'armv5te-vfp'.
3 *
4 * --> DO NOT EDIT <--
5 */
6
7/* File: armv5te/header.S */
8/*
9 * Copyright (C) 2008 The Android Open Source Project
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 *      http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 */
23
24/*
25 * ARMv5 definitions and declarations.
26 */
27
28/*
29ARM EABI general notes:
30
31r0-r3 hold first 4 args to a method; they are not preserved across method calls
32r4-r8 are available for general use
33r9 is given special treatment in some situations, but not for us
34r10 (sl) seems to be generally available
35r11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
36r12 (ip) is scratch -- not preserved across method calls
37r13 (sp) should be managed carefully in case a signal arrives
38r14 (lr) must be preserved
39r15 (pc) can be tinkered with directly
40
41r0 holds returns of <= 4 bytes
42r0-r1 hold returns of 8 bytes, low word in r0
43
44Callee must save/restore r4+ (except r12) if it modifies them.  If VFP
45is present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
46s0-s15 (d0-d7, q0-a3) do not need to be.
47
48Stack is "full descending".  Only the arguments that don't fit in the first 4
49registers are placed on the stack.  "sp" points at the first stacked argument
50(i.e. the 5th arg).
51
52VFP: single-precision results in s0, double-precision results in d0.
53
54In the EABI, "sp" must be 64-bit aligned on entry to a function, and any
5564-bit quantities (long long, double) must be 64-bit aligned.
56*/
57
58/*
59Mterp and ARM notes:
60
61The following registers have fixed assignments:
62
63  reg nick      purpose
64  r4  rPC       interpreted program counter, used for fetching instructions
65  r5  rFP       interpreted frame pointer, used for accessing locals and args
66  r6  rSELF     self (Thread) pointer
67  r7  rINST     first 16-bit code unit of current instruction
68  r8  rIBASE    interpreted instruction base pointer, used for computed goto
69
70Macros are provided for common operations.  Each macro MUST emit only
71one instruction to make instruction-counting easier.  They MUST NOT alter
72unspecified registers or condition codes.
73*/
74
75/* single-purpose registers, given names for clarity */
76#define rPC     r4
77#define rFP     r5
78#define rSELF   r6
79#define rINST   r7
80#define rIBASE  r8
81
82/* save/restore the PC and/or FP from the thread struct */
83#define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
84#define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
85#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
86#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
87#define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
88#define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
89
90/*
91 * "export" the PC to the stack frame, f/b/o future exception objects.  Must
92 * be done *before* something throws.
93 *
94 * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
95 * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
96 *
97 * It's okay to do this more than once.
98 */
99#define EXPORT_PC() \
100    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
101
102/*
103 * Given a frame pointer, find the stack save area.
104 *
105 * In C this is "((StackSaveArea*)(_fp) -1)".
106 */
107#define SAVEAREA_FROM_FP(_reg, _fpreg) \
108    sub     _reg, _fpreg, #sizeofStackSaveArea
109
110/*
111 * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
112 */
113#define FETCH_INST()            ldrh    rINST, [rPC]
114
115/*
116 * Fetch the next instruction from the specified offset.  Advances rPC
117 * to point to the next instruction.  "_count" is in 16-bit code units.
118 *
119 * Because of the limited size of immediate constants on ARM, this is only
120 * suitable for small forward movements (i.e. don't try to implement "goto"
121 * with this).
122 *
123 * This must come AFTER anything that can throw an exception, or the
124 * exception catch may miss.  (This also implies that it must come after
125 * EXPORT_PC().)
126 */
127#define FETCH_ADVANCE_INST(_count) ldrh    rINST, [rPC, #((_count)*2)]!
128
129/*
130 * The operation performed here is similar to FETCH_ADVANCE_INST, except the
131 * src and dest registers are parameterized (not hard-wired to rPC and rINST).
132 */
133#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
134        ldrh    _dreg, [_sreg, #((_count)*2)]!
135
136/*
137 * Fetch the next instruction from an offset specified by _reg.  Updates
138 * rPC to point to the next instruction.  "_reg" must specify the distance
139 * in bytes, *not* 16-bit code units, and may be a signed value.
140 *
141 * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
142 * bits that hold the shift distance are used for the half/byte/sign flags.
143 * In some cases we can pre-double _reg for free, so we require a byte offset
144 * here.
145 */
146#define FETCH_ADVANCE_INST_RB(_reg) ldrh    rINST, [rPC, _reg]!
147
148/*
149 * Fetch a half-word code unit from an offset past the current PC.  The
150 * "_count" value is in 16-bit code units.  Does not advance rPC.
151 *
152 * The "_S" variant works the same but treats the value as signed.
153 */
154#define FETCH(_reg, _count)     ldrh    _reg, [rPC, #((_count)*2)]
155#define FETCH_S(_reg, _count)   ldrsh   _reg, [rPC, #((_count)*2)]
156
157/*
158 * Fetch one byte from an offset past the current PC.  Pass in the same
159 * "_count" as you would for FETCH, and an additional 0/1 indicating which
160 * byte of the halfword you want (lo/hi).
161 */
162#define FETCH_B(_reg, _count, _byte) ldrb     _reg, [rPC, #((_count)*2+(_byte))]
163
164/*
165 * Put the instruction's opcode field into the specified register.
166 */
167#define GET_INST_OPCODE(_reg)   and     _reg, rINST, #255
168
169/*
170 * Put the prefetched instruction's opcode field into the specified register.
171 */
172#define GET_PREFETCHED_OPCODE(_oreg, _ireg)   and     _oreg, _ireg, #255
173
174/*
175 * Begin executing the opcode in _reg.  Because this only jumps within the
176 * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
177 */
178#define GOTO_OPCODE(_reg)       add     pc, rIBASE, _reg, lsl #6
179#define GOTO_OPCODE_BASE(_base,_reg)  add     pc, _base, _reg, lsl #6
180#define GOTO_OPCODE_IFEQ(_reg)  addeq   pc, rIBASE, _reg, lsl #6
181#define GOTO_OPCODE_IFNE(_reg)  addne   pc, rIBASE, _reg, lsl #6
182
183/*
184 * Get/set the 32-bit value from a Dalvik register.
185 */
186#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
187#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
188
189/*
190 * Convert a virtual register index into an address.
191 */
192#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
193        add     _reg, rFP, _vreg, lsl #2
194
195/*
196 * This is a #include, not a %include, because we want the C pre-processor
197 * to expand the macros into assembler assignment statements.
198 */
199#include "../common/asm-constants.h"
200
201#if defined(WITH_JIT)
202#include "../common/jit-config.h"
203#endif
204
205/* File: armv5te/platform.S */
206/*
207 * ===========================================================================
208 *  CPU-version-specific defines
209 * ===========================================================================
210 */
211
212/*
213 * Macro for data memory barrier; not meaningful pre-ARMv6K.
214 */
215.macro  SMP_DMB
216.endm
217
218/*
219 * Macro for data memory barrier; not meaningful pre-ARMv6K.
220 */
221.macro  SMP_DMB_ST
222.endm
223
224/* File: armv5te/entry.S */
225/*
226 * Copyright (C) 2008 The Android Open Source Project
227 *
228 * Licensed under the Apache License, Version 2.0 (the "License");
229 * you may not use this file except in compliance with the License.
230 * You may obtain a copy of the License at
231 *
232 *      http://www.apache.org/licenses/LICENSE-2.0
233 *
234 * Unless required by applicable law or agreed to in writing, software
235 * distributed under the License is distributed on an "AS IS" BASIS,
236 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
237 * See the License for the specific language governing permissions and
238 * limitations under the License.
239 */
240/*
241 * Interpreter entry point.
242 */
243
244/*
245 * We don't have formal stack frames, so gdb scans upward in the code
246 * to find the start of the function (a label with the %function type),
247 * and then looks at the next few instructions to figure out what
248 * got pushed onto the stack.  From this it figures out how to restore
249 * the registers, including PC, for the previous stack frame.  If gdb
250 * sees a non-function label, it stops scanning, so either we need to
251 * have nothing but assembler-local labels between the entry point and
252 * the break, or we need to fake it out.
253 *
254 * When this is defined, we add some stuff to make gdb less confused.
255 */
256#define ASSIST_DEBUGGER 1
257
258    .text
259    .align  2
260    .global dvmMterpStdRun
261    .type   dvmMterpStdRun, %function
262
263/*
264 * On entry:
265 *  r0  Thread* self
266 *
267 * The return comes via a call to dvmMterpStdBail().
268 */
269dvmMterpStdRun:
270#define MTERP_ENTRY1 \
271    .save {r4-r10,fp,lr}; \
272    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
273#define MTERP_ENTRY2 \
274    .pad    #4; \
275    sub     sp, sp, #4                  @ align 64
276
277    .fnstart
278    MTERP_ENTRY1
279    MTERP_ENTRY2
280
281    /* save stack pointer, add magic word for debuggerd */
282    str     sp, [r0, #offThread_bailPtr]  @ save SP for eventual return
283
284    /* set up "named" registers, figure out entry point */
285    mov     rSELF, r0                   @ set rSELF
286    LOAD_PC_FP_FROM_SELF()              @ load rPC and rFP from "thread"
287    ldr     rIBASE, [rSELF, #offThread_curHandlerTable] @ set rIBASE
288
289#if defined(WITH_JIT)
290.LentryInstr:
291    /* Entry is always a possible trace start */
292    ldr     r0, [rSELF, #offThread_pJitProfTable]
293    FETCH_INST()
294    mov     r1, #0                      @ prepare the value for the new state
295    str     r1, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
296    cmp     r0,#0                       @ is profiling disabled?
297#if !defined(WITH_SELF_VERIFICATION)
298    bne     common_updateProfile        @ profiling is enabled
299#else
300    ldr     r2, [rSELF, #offThread_shadowSpace] @ to find out the jit exit state
301    beq     1f                          @ profiling is disabled
302    ldr     r3, [r2, #offShadowSpace_jitExitState]  @ jit exit state
303    cmp     r3, #kSVSTraceSelect        @ hot trace following?
304    moveq   r2,#kJitTSelectRequestHot   @ ask for trace selection
305    beq     common_selectTrace          @ go build the trace
306    cmp     r3, #kSVSNoProfile          @ don't profile the next instruction?
307    beq     1f                          @ intrepret the next instruction
308    b       common_updateProfile        @ collect profiles
309#endif
3101:
311    GET_INST_OPCODE(ip)
312    GOTO_OPCODE(ip)
313#else
314    /* start executing the instruction at rPC */
315    FETCH_INST()                        @ load rINST from rPC
316    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
317    GOTO_OPCODE(ip)                     @ jump to next instruction
318#endif
319
320.Lbad_arg:
321    ldr     r0, strBadEntryPoint
322    @ r1 holds value of entryPoint
323    bl      printf
324    bl      dvmAbort
325    .fnend
326    .size   dvmMterpStdRun, .-dvmMterpStdRun
327
328
329    .global dvmMterpStdBail
330    .type   dvmMterpStdBail, %function
331
332/*
333 * Restore the stack pointer and PC from the save point established on entry.
334 * This is essentially the same as a longjmp, but should be cheaper.  The
335 * last instruction causes us to return to whoever called dvmMterpStdRun.
336 *
337 * We pushed some registers on the stack in dvmMterpStdRun, then saved
338 * SP and LR.  Here we restore SP, restore the registers, and then restore
339 * LR to PC.
340 *
341 * On entry:
342 *  r0  Thread* self
343 */
344dvmMterpStdBail:
345    ldr     sp, [r0, #offThread_bailPtr]    @ sp<- saved SP
346    add     sp, sp, #4                      @ un-align 64
347    ldmfd   sp!, {r4-r10,fp,pc}             @ restore 9 regs and return
348
349
350/*
351 * String references.
352 */
353strBadEntryPoint:
354    .word   .LstrBadEntryPoint
355
356
357    .global dvmAsmInstructionStart
358    .type   dvmAsmInstructionStart, %function
359dvmAsmInstructionStart = .L_OP_NOP
360    .text
361
362/* ------------------------------ */
363    .balign 64
364.L_OP_NOP: /* 0x00 */
365/* File: armv5te/OP_NOP.S */
366    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
367    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
368    GOTO_OPCODE(ip)                     @ execute it
369
370#ifdef ASSIST_DEBUGGER
371    /* insert fake function header to help gdb find the stack frame */
372    .type   dalvik_inst, %function
373dalvik_inst:
374    .fnstart
375    MTERP_ENTRY1
376    MTERP_ENTRY2
377    .fnend
378#endif
379
380/* ------------------------------ */
381    .balign 64
382.L_OP_MOVE: /* 0x01 */
383/* File: armv5te/OP_MOVE.S */
384    /* for move, move-object, long-to-int */
385    /* op vA, vB */
386    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
387    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
388    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
389    GET_VREG(r2, r1)                    @ r2<- fp[B]
390    and     r0, r0, #15
391    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
392    SET_VREG(r2, r0)                    @ fp[A]<- r2
393    GOTO_OPCODE(ip)                     @ execute next instruction
394
395/* ------------------------------ */
396    .balign 64
397.L_OP_MOVE_FROM16: /* 0x02 */
398/* File: armv5te/OP_MOVE_FROM16.S */
399    /* for: move/from16, move-object/from16 */
400    /* op vAA, vBBBB */
401    FETCH(r1, 1)                        @ r1<- BBBB
402    mov     r0, rINST, lsr #8           @ r0<- AA
403    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
404    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
405    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
406    SET_VREG(r2, r0)                    @ fp[AA]<- r2
407    GOTO_OPCODE(ip)                     @ jump to next instruction
408
409/* ------------------------------ */
410    .balign 64
411.L_OP_MOVE_16: /* 0x03 */
412/* File: armv5te/OP_MOVE_16.S */
413    /* for: move/16, move-object/16 */
414    /* op vAAAA, vBBBB */
415    FETCH(r1, 2)                        @ r1<- BBBB
416    FETCH(r0, 1)                        @ r0<- AAAA
417    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
418    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
419    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
420    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
421    GOTO_OPCODE(ip)                     @ jump to next instruction
422
423/* ------------------------------ */
424    .balign 64
425.L_OP_MOVE_WIDE: /* 0x04 */
426/* File: armv5te/OP_MOVE_WIDE.S */
427    /* move-wide vA, vB */
428    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
429    mov     r2, rINST, lsr #8           @ r2<- A(+)
430    mov     r3, rINST, lsr #12          @ r3<- B
431    and     r2, r2, #15
432    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
433    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
434    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
435    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
436    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
437    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
438    GOTO_OPCODE(ip)                     @ jump to next instruction
439
440/* ------------------------------ */
441    .balign 64
442.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
443/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
444    /* move-wide/from16 vAA, vBBBB */
445    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
446    FETCH(r3, 1)                        @ r3<- BBBB
447    mov     r2, rINST, lsr #8           @ r2<- AA
448    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
449    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
450    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
451    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
452    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
453    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
454    GOTO_OPCODE(ip)                     @ jump to next instruction
455
456/* ------------------------------ */
457    .balign 64
458.L_OP_MOVE_WIDE_16: /* 0x06 */
459/* File: armv5te/OP_MOVE_WIDE_16.S */
460    /* move-wide/16 vAAAA, vBBBB */
461    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
462    FETCH(r3, 2)                        @ r3<- BBBB
463    FETCH(r2, 1)                        @ r2<- AAAA
464    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
465    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
466    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
467    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
468    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
469    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
470    GOTO_OPCODE(ip)                     @ jump to next instruction
471
472/* ------------------------------ */
473    .balign 64
474.L_OP_MOVE_OBJECT: /* 0x07 */
475/* File: armv5te/OP_MOVE_OBJECT.S */
476/* File: armv5te/OP_MOVE.S */
477    /* for move, move-object, long-to-int */
478    /* op vA, vB */
479    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
480    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
481    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
482    GET_VREG(r2, r1)                    @ r2<- fp[B]
483    and     r0, r0, #15
484    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
485    SET_VREG(r2, r0)                    @ fp[A]<- r2
486    GOTO_OPCODE(ip)                     @ execute next instruction
487
488
489/* ------------------------------ */
490    .balign 64
491.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
492/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
493/* File: armv5te/OP_MOVE_FROM16.S */
494    /* for: move/from16, move-object/from16 */
495    /* op vAA, vBBBB */
496    FETCH(r1, 1)                        @ r1<- BBBB
497    mov     r0, rINST, lsr #8           @ r0<- AA
498    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
499    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
500    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
501    SET_VREG(r2, r0)                    @ fp[AA]<- r2
502    GOTO_OPCODE(ip)                     @ jump to next instruction
503
504
505/* ------------------------------ */
506    .balign 64
507.L_OP_MOVE_OBJECT_16: /* 0x09 */
508/* File: armv5te/OP_MOVE_OBJECT_16.S */
509/* File: armv5te/OP_MOVE_16.S */
510    /* for: move/16, move-object/16 */
511    /* op vAAAA, vBBBB */
512    FETCH(r1, 2)                        @ r1<- BBBB
513    FETCH(r0, 1)                        @ r0<- AAAA
514    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
515    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
516    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
517    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
518    GOTO_OPCODE(ip)                     @ jump to next instruction
519
520
521/* ------------------------------ */
522    .balign 64
523.L_OP_MOVE_RESULT: /* 0x0a */
524/* File: armv5te/OP_MOVE_RESULT.S */
525    /* for: move-result, move-result-object */
526    /* op vAA */
527    mov     r2, rINST, lsr #8           @ r2<- AA
528    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
529    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
530    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
531    SET_VREG(r0, r2)                    @ fp[AA]<- r0
532    GOTO_OPCODE(ip)                     @ jump to next instruction
533
534/* ------------------------------ */
535    .balign 64
536.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
537/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
538    /* move-result-wide vAA */
539    mov     r2, rINST, lsr #8           @ r2<- AA
540    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
541    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
542    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
543    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
544    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
545    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
546    GOTO_OPCODE(ip)                     @ jump to next instruction
547
548/* ------------------------------ */
549    .balign 64
550.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
551/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
552/* File: armv5te/OP_MOVE_RESULT.S */
553    /* for: move-result, move-result-object */
554    /* op vAA */
555    mov     r2, rINST, lsr #8           @ r2<- AA
556    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
557    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
558    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
559    SET_VREG(r0, r2)                    @ fp[AA]<- r0
560    GOTO_OPCODE(ip)                     @ jump to next instruction
561
562
563/* ------------------------------ */
564    .balign 64
565.L_OP_MOVE_EXCEPTION: /* 0x0d */
566/* File: armv5te/OP_MOVE_EXCEPTION.S */
567    /* move-exception vAA */
568    mov     r2, rINST, lsr #8           @ r2<- AA
569    ldr     r3, [rSELF, #offThread_exception]  @ r3<- dvmGetException bypass
570    mov     r1, #0                      @ r1<- 0
571    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
572    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
573    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
574    str     r1, [rSELF, #offThread_exception]  @ dvmClearException bypass
575    GOTO_OPCODE(ip)                     @ jump to next instruction
576
577/* ------------------------------ */
578    .balign 64
579.L_OP_RETURN_VOID: /* 0x0e */
580/* File: armv5te/OP_RETURN_VOID.S */
581    b       common_returnFromMethod
582
583/* ------------------------------ */
584    .balign 64
585.L_OP_RETURN: /* 0x0f */
586/* File: armv5te/OP_RETURN.S */
587    /*
588     * Return a 32-bit value.  Copies the return value into the "thread"
589     * structure, then jumps to the return handler.
590     *
591     * for: return, return-object
592     */
593    /* op vAA */
594    mov     r2, rINST, lsr #8           @ r2<- AA
595    GET_VREG(r0, r2)                    @ r0<- vAA
596    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
597    b       common_returnFromMethod
598
599/* ------------------------------ */
600    .balign 64
601.L_OP_RETURN_WIDE: /* 0x10 */
602/* File: armv5te/OP_RETURN_WIDE.S */
603    /*
604     * Return a 64-bit value.  Copies the return value into the "thread"
605     * structure, then jumps to the return handler.
606     */
607    /* return-wide vAA */
608    mov     r2, rINST, lsr #8           @ r2<- AA
609    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
610    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
611    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
612    stmia   r3, {r0-r1}                 @ retval<- r0/r1
613    b       common_returnFromMethod
614
615/* ------------------------------ */
616    .balign 64
617.L_OP_RETURN_OBJECT: /* 0x11 */
618/* File: armv5te/OP_RETURN_OBJECT.S */
619/* File: armv5te/OP_RETURN.S */
620    /*
621     * Return a 32-bit value.  Copies the return value into the "thread"
622     * structure, then jumps to the return handler.
623     *
624     * for: return, return-object
625     */
626    /* op vAA */
627    mov     r2, rINST, lsr #8           @ r2<- AA
628    GET_VREG(r0, r2)                    @ r0<- vAA
629    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
630    b       common_returnFromMethod
631
632
633/* ------------------------------ */
634    .balign 64
635.L_OP_CONST_4: /* 0x12 */
636/* File: armv5te/OP_CONST_4.S */
637    /* const/4 vA, #+B */
638    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
639    mov     r0, rINST, lsr #8           @ r0<- A+
640    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
641    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
642    and     r0, r0, #15
643    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
644    SET_VREG(r1, r0)                    @ fp[A]<- r1
645    GOTO_OPCODE(ip)                     @ execute next instruction
646
647/* ------------------------------ */
648    .balign 64
649.L_OP_CONST_16: /* 0x13 */
650/* File: armv5te/OP_CONST_16.S */
651    /* const/16 vAA, #+BBBB */
652    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
653    mov     r3, rINST, lsr #8           @ r3<- AA
654    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
655    SET_VREG(r0, r3)                    @ vAA<- r0
656    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
657    GOTO_OPCODE(ip)                     @ jump to next instruction
658
659/* ------------------------------ */
660    .balign 64
661.L_OP_CONST: /* 0x14 */
662/* File: armv5te/OP_CONST.S */
663    /* const vAA, #+BBBBbbbb */
664    mov     r3, rINST, lsr #8           @ r3<- AA
665    FETCH(r0, 1)                        @ r0<- bbbb (low)
666    FETCH(r1, 2)                        @ r1<- BBBB (high)
667    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
668    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
669    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
670    SET_VREG(r0, r3)                    @ vAA<- r0
671    GOTO_OPCODE(ip)                     @ jump to next instruction
672
673/* ------------------------------ */
674    .balign 64
675.L_OP_CONST_HIGH16: /* 0x15 */
676/* File: armv5te/OP_CONST_HIGH16.S */
677    /* const/high16 vAA, #+BBBB0000 */
678    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
679    mov     r3, rINST, lsr #8           @ r3<- AA
680    mov     r0, r0, lsl #16             @ r0<- BBBB0000
681    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
682    SET_VREG(r0, r3)                    @ vAA<- r0
683    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
684    GOTO_OPCODE(ip)                     @ jump to next instruction
685
686/* ------------------------------ */
687    .balign 64
688.L_OP_CONST_WIDE_16: /* 0x16 */
689/* File: armv5te/OP_CONST_WIDE_16.S */
690    /* const-wide/16 vAA, #+BBBB */
691    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
692    mov     r3, rINST, lsr #8           @ r3<- AA
693    mov     r1, r0, asr #31             @ r1<- ssssssss
694    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
695    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
697    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
698    GOTO_OPCODE(ip)                     @ jump to next instruction
699
700/* ------------------------------ */
701    .balign 64
702.L_OP_CONST_WIDE_32: /* 0x17 */
703/* File: armv5te/OP_CONST_WIDE_32.S */
704    /* const-wide/32 vAA, #+BBBBbbbb */
705    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
706    mov     r3, rINST, lsr #8           @ r3<- AA
707    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
708    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
709    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
710    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
711    mov     r1, r0, asr #31             @ r1<- ssssssss
712    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
713    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
714    GOTO_OPCODE(ip)                     @ jump to next instruction
715
716/* ------------------------------ */
717    .balign 64
718.L_OP_CONST_WIDE: /* 0x18 */
719/* File: armv5te/OP_CONST_WIDE.S */
720    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
721    FETCH(r0, 1)                        @ r0<- bbbb (low)
722    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
723    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
724    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
725    FETCH(r3, 4)                        @ r3<- HHHH (high)
726    mov     r9, rINST, lsr #8           @ r9<- AA
727    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
728    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
729    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
730    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
731    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
732    GOTO_OPCODE(ip)                     @ jump to next instruction
733
734/* ------------------------------ */
735    .balign 64
736.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
737/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
738    /* const-wide/high16 vAA, #+BBBB000000000000 */
739    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
740    mov     r3, rINST, lsr #8           @ r3<- AA
741    mov     r0, #0                      @ r0<- 00000000
742    mov     r1, r1, lsl #16             @ r1<- BBBB0000
743    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
744    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
745    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
746    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
747    GOTO_OPCODE(ip)                     @ jump to next instruction
748
749/* ------------------------------ */
750    .balign 64
751.L_OP_CONST_STRING: /* 0x1a */
752/* File: armv5te/OP_CONST_STRING.S */
753    /* const/string vAA, String@BBBB */
754    FETCH(r1, 1)                        @ r1<- BBBB
755    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
756    mov     r9, rINST, lsr #8           @ r9<- AA
757    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
758    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
759    cmp     r0, #0                      @ not yet resolved?
760    beq     .LOP_CONST_STRING_resolve
761    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
762    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
763    SET_VREG(r0, r9)                    @ vAA<- r0
764    GOTO_OPCODE(ip)                     @ jump to next instruction
765
766/* ------------------------------ */
767    .balign 64
768.L_OP_CONST_STRING_JUMBO: /* 0x1b */
769/* File: armv5te/OP_CONST_STRING_JUMBO.S */
770    /* const/string vAA, String@BBBBBBBB */
771    FETCH(r0, 1)                        @ r0<- bbbb (low)
772    FETCH(r1, 2)                        @ r1<- BBBB (high)
773    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
774    mov     r9, rINST, lsr #8           @ r9<- AA
775    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
776    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
777    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
778    cmp     r0, #0
779    beq     .LOP_CONST_STRING_JUMBO_resolve
780    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
781    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
782    SET_VREG(r0, r9)                    @ vAA<- r0
783    GOTO_OPCODE(ip)                     @ jump to next instruction
784
785/* ------------------------------ */
786    .balign 64
787.L_OP_CONST_CLASS: /* 0x1c */
788/* File: armv5te/OP_CONST_CLASS.S */
789    /* const/class vAA, Class@BBBB */
790    FETCH(r1, 1)                        @ r1<- BBBB
791    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
792    mov     r9, rINST, lsr #8           @ r9<- AA
793    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
794    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
795    cmp     r0, #0                      @ not yet resolved?
796    beq     .LOP_CONST_CLASS_resolve
797    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
798    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
799    SET_VREG(r0, r9)                    @ vAA<- r0
800    GOTO_OPCODE(ip)                     @ jump to next instruction
801
802/* ------------------------------ */
803    .balign 64
804.L_OP_MONITOR_ENTER: /* 0x1d */
805/* File: armv5te/OP_MONITOR_ENTER.S */
806    /*
807     * Synchronize on an object.
808     */
809    /* monitor-enter vAA */
810    mov     r2, rINST, lsr #8           @ r2<- AA
811    GET_VREG(r1, r2)                    @ r1<- vAA (object)
812    mov     r0, rSELF                   @ r0<- self
813    cmp     r1, #0                      @ null object?
814    EXPORT_PC()                         @ need for precise GC
815    beq     common_errNullObject        @ null object, throw an exception
816    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
817    bl      dvmLockObject               @ call(self, obj)
818    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
819    GOTO_OPCODE(ip)                     @ jump to next instruction
820
821/* ------------------------------ */
822    .balign 64
823.L_OP_MONITOR_EXIT: /* 0x1e */
824/* File: armv5te/OP_MONITOR_EXIT.S */
825    /*
826     * Unlock an object.
827     *
828     * Exceptions that occur when unlocking a monitor need to appear as
829     * if they happened at the following instruction.  See the Dalvik
830     * instruction spec.
831     */
832    /* monitor-exit vAA */
833    mov     r2, rINST, lsr #8           @ r2<- AA
834    EXPORT_PC()                         @ before fetch: export the PC
835    GET_VREG(r1, r2)                    @ r1<- vAA (object)
836    cmp     r1, #0                      @ null object?
837    beq     1f                          @ yes
838    mov     r0, rSELF                   @ r0<- self
839    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
840    cmp     r0, #0                      @ failed?
841    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
842    beq     common_exceptionThrown      @ yes, exception is pending
843    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
844    GOTO_OPCODE(ip)                     @ jump to next instruction
8451:
846    FETCH_ADVANCE_INST(1)               @ advance before throw
847    b      common_errNullObject
848
849/* ------------------------------ */
850    .balign 64
851.L_OP_CHECK_CAST: /* 0x1f */
852/* File: armv5te/OP_CHECK_CAST.S */
853    /*
854     * Check to see if a cast from one class to another is allowed.
855     */
856    /* check-cast vAA, class@BBBB */
857    mov     r3, rINST, lsr #8           @ r3<- AA
858    FETCH(r2, 1)                        @ r2<- BBBB
859    GET_VREG(r9, r3)                    @ r9<- object
860    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
861    cmp     r9, #0                      @ is object null?
862    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
863    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
864    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
865    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
866    cmp     r1, #0                      @ have we resolved this before?
867    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
868.LOP_CHECK_CAST_resolved:
869    cmp     r0, r1                      @ same class (trivial success)?
870    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
871.LOP_CHECK_CAST_okay:
872    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
873    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
874    GOTO_OPCODE(ip)                     @ jump to next instruction
875
876/* ------------------------------ */
877    .balign 64
878.L_OP_INSTANCE_OF: /* 0x20 */
879/* File: armv5te/OP_INSTANCE_OF.S */
880    /*
881     * Check to see if an object reference is an instance of a class.
882     *
883     * Most common situation is a non-null object, being compared against
884     * an already-resolved class.
885     */
886    /* instance-of vA, vB, class@CCCC */
887    mov     r3, rINST, lsr #12          @ r3<- B
888    mov     r9, rINST, lsr #8           @ r9<- A+
889    GET_VREG(r0, r3)                    @ r0<- vB (object)
890    and     r9, r9, #15                 @ r9<- A
891    cmp     r0, #0                      @ is object null?
892    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
893    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
894    FETCH(r3, 1)                        @ r3<- CCCC
895    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
896    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
897    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
898    cmp     r1, #0                      @ have we resolved this before?
899    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
900.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
901    cmp     r0, r1                      @ same class (trivial success)?
902    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
903    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
904
905/* ------------------------------ */
906    .balign 64
907.L_OP_ARRAY_LENGTH: /* 0x21 */
908/* File: armv5te/OP_ARRAY_LENGTH.S */
909    /*
910     * Return the length of an array.
911     */
912    mov     r1, rINST, lsr #12          @ r1<- B
913    mov     r2, rINST, lsr #8           @ r2<- A+
914    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
915    and     r2, r2, #15                 @ r2<- A
916    cmp     r0, #0                      @ is object null?
917    beq     common_errNullObject        @ yup, fail
918    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
919    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
920    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
921    SET_VREG(r3, r2)                    @ vB<- length
922    GOTO_OPCODE(ip)                     @ jump to next instruction
923
924/* ------------------------------ */
925    .balign 64
926.L_OP_NEW_INSTANCE: /* 0x22 */
927/* File: armv5te/OP_NEW_INSTANCE.S */
928    /*
929     * Create a new instance of a class.
930     */
931    /* new-instance vAA, class@BBBB */
932    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
933    FETCH(r1, 1)                        @ r1<- BBBB
934    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
935    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
936#if defined(WITH_JIT)
937    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
938#endif
939    EXPORT_PC()                         @ req'd for init, resolve, alloc
940    cmp     r0, #0                      @ already resolved?
941    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
942.LOP_NEW_INSTANCE_resolved:   @ r0=class
943    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
944    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
945    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
946.LOP_NEW_INSTANCE_initialized: @ r0=class
947    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
948    bl      dvmAllocObject              @ r0<- new object
949    b       .LOP_NEW_INSTANCE_finish          @ continue
950
951/* ------------------------------ */
952    .balign 64
953.L_OP_NEW_ARRAY: /* 0x23 */
954/* File: armv5te/OP_NEW_ARRAY.S */
955    /*
956     * Allocate an array of objects, specified with the array class
957     * and a count.
958     *
959     * The verifier guarantees that this is an array class, so we don't
960     * check for it here.
961     */
962    /* new-array vA, vB, class@CCCC */
963    mov     r0, rINST, lsr #12          @ r0<- B
964    FETCH(r2, 1)                        @ r2<- CCCC
965    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
966    GET_VREG(r1, r0)                    @ r1<- vB (array length)
967    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
968    cmp     r1, #0                      @ check length
969    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
970    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
971    cmp     r0, #0                      @ already resolved?
972    EXPORT_PC()                         @ req'd for resolve, alloc
973    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
974    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
975
976/* ------------------------------ */
977    .balign 64
978.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
979/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
980    /*
981     * Create a new array with elements filled from registers.
982     *
983     * for: filled-new-array, filled-new-array/range
984     */
985    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
986    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
987    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
988    FETCH(r1, 1)                        @ r1<- BBBB
989    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
990    EXPORT_PC()                         @ need for resolve and alloc
991    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
992    mov     r10, rINST, lsr #8          @ r10<- AA or BA
993    cmp     r0, #0                      @ already resolved?
994    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
9958:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
996    mov     r2, #0                      @ r2<- false
997    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
998    bl      dvmResolveClass             @ r0<- call(clazz, ref)
999    cmp     r0, #0                      @ got null?
1000    beq     common_exceptionThrown      @ yes, handle exception
1001    b       .LOP_FILLED_NEW_ARRAY_continue
1002
1003/* ------------------------------ */
1004    .balign 64
1005.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1006/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1007/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1008    /*
1009     * Create a new array with elements filled from registers.
1010     *
1011     * for: filled-new-array, filled-new-array/range
1012     */
1013    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1014    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
1015    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
1016    FETCH(r1, 1)                        @ r1<- BBBB
1017    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1018    EXPORT_PC()                         @ need for resolve and alloc
1019    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1020    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1021    cmp     r0, #0                      @ already resolved?
1022    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
10238:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1024    mov     r2, #0                      @ r2<- false
1025    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1026    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1027    cmp     r0, #0                      @ got null?
1028    beq     common_exceptionThrown      @ yes, handle exception
1029    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1030
1031
1032/* ------------------------------ */
1033    .balign 64
1034.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1035/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1036    /* fill-array-data vAA, +BBBBBBBB */
1037    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1038    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1039    mov     r3, rINST, lsr #8           @ r3<- AA
1040    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1041    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1042    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1043    EXPORT_PC();
1044    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1045    cmp     r0, #0                      @ 0 means an exception is thrown
1046    beq     common_exceptionThrown      @ has exception
1047    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1048    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1049    GOTO_OPCODE(ip)                     @ jump to next instruction
1050
1051/* ------------------------------ */
1052    .balign 64
1053.L_OP_THROW: /* 0x27 */
1054/* File: armv5te/OP_THROW.S */
1055    /*
1056     * Throw an exception object in the current thread.
1057     */
1058    /* throw vAA */
1059    mov     r2, rINST, lsr #8           @ r2<- AA
1060    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
1061    EXPORT_PC()                         @ exception handler can throw
1062    cmp     r1, #0                      @ null object?
1063    beq     common_errNullObject        @ yes, throw an NPE instead
1064    @ bypass dvmSetException, just store it
1065    str     r1, [rSELF, #offThread_exception]  @ thread->exception<- obj
1066    b       common_exceptionThrown
1067
1068/* ------------------------------ */
1069    .balign 64
1070.L_OP_GOTO: /* 0x28 */
1071/* File: armv5te/OP_GOTO.S */
1072    /*
1073     * Unconditional branch, 8-bit offset.
1074     *
1075     * The branch distance is a signed code-unit offset, which we need to
1076     * double to get a byte offset.
1077     */
1078    /* goto +AA */
1079    /* tuning: use sbfx for 6t2+ targets */
1080    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
1081    movs    r1, r0, asr #24             @ r1<- ssssssAA (sign-extended)
1082    add     r2, r1, r1                  @ r2<- byte offset, set flags
1083       @ If backwards branch refresh rIBASE
1084    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1085    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1086#if defined(WITH_JIT)
1087    ldr     r0, [rSELF, #offThread_pJitProfTable]
1088    bmi     common_testUpdateProfile    @ (r0) check for trace hotness
1089#endif
1090    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1091    GOTO_OPCODE(ip)                     @ jump to next instruction
1092
1093/* ------------------------------ */
1094    .balign 64
1095.L_OP_GOTO_16: /* 0x29 */
1096/* File: armv5te/OP_GOTO_16.S */
1097    /*
1098     * Unconditional branch, 16-bit offset.
1099     *
1100     * The branch distance is a signed code-unit offset, which we need to
1101     * double to get a byte offset.
1102     */
1103    /* goto/16 +AAAA */
1104    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
1105    adds    r1, r0, r0                  @ r1<- byte offset, flags set
1106    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1107    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1108#if defined(WITH_JIT)
1109    ldr     r0, [rSELF, #offThread_pJitProfTable]
1110    bmi     common_testUpdateProfile    @ (r0) hot trace head?
1111#endif
1112    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1113    GOTO_OPCODE(ip)                     @ jump to next instruction
1114
1115/* ------------------------------ */
1116    .balign 64
1117.L_OP_GOTO_32: /* 0x2a */
1118/* File: armv5te/OP_GOTO_32.S */
1119    /*
1120     * Unconditional branch, 32-bit offset.
1121     *
1122     * The branch distance is a signed code-unit offset, which we need to
1123     * double to get a byte offset.
1124     *
1125     * Unlike most opcodes, this one is allowed to branch to itself, so
1126     * our "backward branch" test must be "<=0" instead of "<0".  Because
1127     * we need the V bit set, we'll use an adds to convert from Dalvik
1128     * offset to byte offset.
1129     */
1130    /* goto/32 +AAAAAAAA */
1131    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1132    FETCH(r1, 2)                        @ r1<- AAAA (hi)
1133    orr     r0, r0, r1, lsl #16         @ r0<- AAAAaaaa
1134    adds    r1, r0, r0                  @ r1<- byte offset
1135#if defined(WITH_JIT)
1136    ldr     r0, [rSELF, #offThread_pJitProfTable]
1137    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1138    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1139    ble     common_testUpdateProfile    @ (r0) hot trace head?
1140#else
1141    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1142    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1143#endif
1144    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1145    GOTO_OPCODE(ip)                     @ jump to next instruction
1146
1147/* ------------------------------ */
1148    .balign 64
1149.L_OP_PACKED_SWITCH: /* 0x2b */
1150/* File: armv5te/OP_PACKED_SWITCH.S */
1151    /*
1152     * Handle a packed-switch or sparse-switch instruction.  In both cases
1153     * we decode it and hand it off to a helper function.
1154     *
1155     * We don't really expect backward branches in a switch statement, but
1156     * they're perfectly legal, so we check for them here.
1157     *
1158     * When the JIT is present, all targets are considered treated as
1159     * a potential trace heads regardless of branch direction.
1160     *
1161     * for: packed-switch, sparse-switch
1162     */
1163    /* op vAA, +BBBB */
1164    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1165    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1166    mov     r3, rINST, lsr #8           @ r3<- AA
1167    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1168    GET_VREG(r1, r3)                    @ r1<- vAA
1169    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1170    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
1171    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1172#if defined(WITH_JIT)
1173    ldr     r0, [rSELF, #offThread_pJitProfTable]
1174    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1175    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1176    cmp     r0, #0
1177    bne     common_updateProfile
1178#else
1179    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1180    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1181#endif
1182    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1183    GOTO_OPCODE(ip)                     @ jump to next instruction
1184
1185/* ------------------------------ */
1186    .balign 64
1187.L_OP_SPARSE_SWITCH: /* 0x2c */
1188/* File: armv5te/OP_SPARSE_SWITCH.S */
1189/* File: armv5te/OP_PACKED_SWITCH.S */
1190    /*
1191     * Handle a packed-switch or sparse-switch instruction.  In both cases
1192     * we decode it and hand it off to a helper function.
1193     *
1194     * We don't really expect backward branches in a switch statement, but
1195     * they're perfectly legal, so we check for them here.
1196     *
1197     * When the JIT is present, all targets are considered treated as
1198     * a potential trace heads regardless of branch direction.
1199     *
1200     * for: packed-switch, sparse-switch
1201     */
1202    /* op vAA, +BBBB */
1203    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1204    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1205    mov     r3, rINST, lsr #8           @ r3<- AA
1206    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1207    GET_VREG(r1, r3)                    @ r1<- vAA
1208    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1209    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
1210    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1211#if defined(WITH_JIT)
1212    ldr     r0, [rSELF, #offThread_pJitProfTable]
1213    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1214    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1215    cmp     r0, #0
1216    bne     common_updateProfile
1217#else
1218    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1219    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1220#endif
1221    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1222    GOTO_OPCODE(ip)                     @ jump to next instruction
1223
1224
1225/* ------------------------------ */
1226    .balign 64
1227.L_OP_CMPL_FLOAT: /* 0x2d */
1228/* File: arm-vfp/OP_CMPL_FLOAT.S */
1229    /*
1230     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1231     * destination register based on the results of the comparison.
1232     *
1233     * int compare(x, y) {
1234     *     if (x == y) {
1235     *         return 0;
1236     *     } else if (x > y) {
1237     *         return 1;
1238     *     } else if (x < y) {
1239     *         return -1;
1240     *     } else {
1241     *         return -1;
1242     *     }
1243     * }
1244     */
1245    /* op vAA, vBB, vCC */
1246    FETCH(r0, 1)                        @ r0<- CCBB
1247    mov     r9, rINST, lsr #8           @ r9<- AA
1248    and     r2, r0, #255                @ r2<- BB
1249    mov     r3, r0, lsr #8              @ r3<- CC
1250    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1251    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1252    flds    s0, [r2]                    @ s0<- vBB
1253    flds    s1, [r3]                    @ s1<- vCC
1254    fcmpes  s0, s1                      @ compare (vBB, vCC)
1255    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1256    mvn     r0, #0                      @ r0<- -1 (default)
1257    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1258    fmstat                              @ export status flags
1259    movgt   r0, #1                      @ (greater than) r1<- 1
1260    moveq   r0, #0                      @ (equal) r1<- 0
1261    b       .LOP_CMPL_FLOAT_finish          @ argh
1262
1263
1264/* ------------------------------ */
1265    .balign 64
1266.L_OP_CMPG_FLOAT: /* 0x2e */
1267/* File: arm-vfp/OP_CMPG_FLOAT.S */
1268    /*
1269     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1270     * destination register based on the results of the comparison.
1271     *
1272     * int compare(x, y) {
1273     *     if (x == y) {
1274     *         return 0;
1275     *     } else if (x < y) {
1276     *         return -1;
1277     *     } else if (x > y) {
1278     *         return 1;
1279     *     } else {
1280     *         return 1;
1281     *     }
1282     * }
1283     */
1284    /* op vAA, vBB, vCC */
1285    FETCH(r0, 1)                        @ r0<- CCBB
1286    mov     r9, rINST, lsr #8           @ r9<- AA
1287    and     r2, r0, #255                @ r2<- BB
1288    mov     r3, r0, lsr #8              @ r3<- CC
1289    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1290    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1291    flds    s0, [r2]                    @ s0<- vBB
1292    flds    s1, [r3]                    @ s1<- vCC
1293    fcmpes  s0, s1                      @ compare (vBB, vCC)
1294    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1295    mov     r0, #1                      @ r0<- 1 (default)
1296    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1297    fmstat                              @ export status flags
1298    mvnmi   r0, #0                      @ (less than) r1<- -1
1299    moveq   r0, #0                      @ (equal) r1<- 0
1300    b       .LOP_CMPG_FLOAT_finish          @ argh
1301
1302
1303/* ------------------------------ */
1304    .balign 64
1305.L_OP_CMPL_DOUBLE: /* 0x2f */
1306/* File: arm-vfp/OP_CMPL_DOUBLE.S */
1307    /*
1308     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1309     * destination register based on the results of the comparison.
1310     *
1311     * int compare(x, y) {
1312     *     if (x == y) {
1313     *         return 0;
1314     *     } else if (x > y) {
1315     *         return 1;
1316     *     } else if (x < y) {
1317     *         return -1;
1318     *     } else {
1319     *         return -1;
1320     *     }
1321     * }
1322     */
1323    /* op vAA, vBB, vCC */
1324    FETCH(r0, 1)                        @ r0<- CCBB
1325    mov     r9, rINST, lsr #8           @ r9<- AA
1326    and     r2, r0, #255                @ r2<- BB
1327    mov     r3, r0, lsr #8              @ r3<- CC
1328    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1329    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1330    fldd    d0, [r2]                    @ d0<- vBB
1331    fldd    d1, [r3]                    @ d1<- vCC
1332    fcmped  d0, d1                      @ compare (vBB, vCC)
1333    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1334    mvn     r0, #0                      @ r0<- -1 (default)
1335    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1336    fmstat                              @ export status flags
1337    movgt   r0, #1                      @ (greater than) r1<- 1
1338    moveq   r0, #0                      @ (equal) r1<- 0
1339    b       .LOP_CMPL_DOUBLE_finish          @ argh
1340
1341
1342/* ------------------------------ */
1343    .balign 64
1344.L_OP_CMPG_DOUBLE: /* 0x30 */
1345/* File: arm-vfp/OP_CMPG_DOUBLE.S */
1346    /*
1347     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1348     * destination register based on the results of the comparison.
1349     *
1350     * int compare(x, y) {
1351     *     if (x == y) {
1352     *         return 0;
1353     *     } else if (x < y) {
1354     *         return -1;
1355     *     } else if (x > y) {
1356     *         return 1;
1357     *     } else {
1358     *         return 1;
1359     *     }
1360     * }
1361     */
1362    /* op vAA, vBB, vCC */
1363    FETCH(r0, 1)                        @ r0<- CCBB
1364    mov     r9, rINST, lsr #8           @ r9<- AA
1365    and     r2, r0, #255                @ r2<- BB
1366    mov     r3, r0, lsr #8              @ r3<- CC
1367    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
1368    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
1369    fldd    d0, [r2]                    @ d0<- vBB
1370    fldd    d1, [r3]                    @ d1<- vCC
1371    fcmped  d0, d1                      @ compare (vBB, vCC)
1372    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1373    mov     r0, #1                      @ r0<- 1 (default)
1374    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1375    fmstat                              @ export status flags
1376    mvnmi   r0, #0                      @ (less than) r1<- -1
1377    moveq   r0, #0                      @ (equal) r1<- 0
1378    b       .LOP_CMPG_DOUBLE_finish          @ argh
1379
1380
1381/* ------------------------------ */
1382    .balign 64
1383.L_OP_CMP_LONG: /* 0x31 */
1384/* File: armv5te/OP_CMP_LONG.S */
1385    /*
1386     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1387     * register based on the results of the comparison.
1388     *
1389     * We load the full values with LDM, but in practice many values could
1390     * be resolved by only looking at the high word.  This could be made
1391     * faster or slower by splitting the LDM into a pair of LDRs.
1392     *
1393     * If we just wanted to set condition flags, we could do this:
1394     *  subs    ip, r0, r2
1395     *  sbcs    ip, r1, r3
1396     *  subeqs  ip, r0, r2
1397     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1398     * integer value, which we can do with 2 conditional mov/mvn instructions
1399     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1400     * us a constant 5-cycle path plus a branch at the end to the
1401     * instruction epilogue code.  The multi-compare approach below needs
1402     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1403     * in the worst case (the 64-bit values are equal).
1404     */
1405    /* cmp-long vAA, vBB, vCC */
1406    FETCH(r0, 1)                        @ r0<- CCBB
1407    mov     r9, rINST, lsr #8           @ r9<- AA
1408    and     r2, r0, #255                @ r2<- BB
1409    mov     r3, r0, lsr #8              @ r3<- CC
1410    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1411    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1412    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1413    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1414    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1415    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1416    bgt     .LOP_CMP_LONG_greater
1417    subs    r1, r0, r2                  @ r1<- r0 - r2
1418    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1419    bne     .LOP_CMP_LONG_less
1420    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1421
1422/* ------------------------------ */
1423    .balign 64
1424.L_OP_IF_EQ: /* 0x32 */
1425/* File: armv5te/OP_IF_EQ.S */
1426/* File: armv5te/bincmp.S */
1427    /*
1428     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1429     * fragment that specifies the *reverse* comparison to perform, e.g.
1430     * for "if-le" you would use "gt".
1431     *
1432     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1433     */
1434    /* if-cmp vA, vB, +CCCC */
1435    mov     r0, rINST, lsr #8           @ r0<- A+
1436    mov     r1, rINST, lsr #12          @ r1<- B
1437    and     r0, r0, #15
1438    GET_VREG(r3, r1)                    @ r3<- vB
1439    GET_VREG(r2, r0)                    @ r2<- vA
1440    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1441    cmp     r2, r3                      @ compare (vA, vB)
1442    movne r1, #2                 @ r1<- BYTE branch dist for not-taken
1443    adds    r2, r1, r1                  @ convert to bytes, check sign
1444    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1445#if defined(WITH_JIT)
1446    ldr     r0, [rSELF, #offThread_pJitProfTable]
1447    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1448    cmp     r0,#0
1449    bne     common_updateProfile
1450#else
1451    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1452#endif
1453    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1454    GOTO_OPCODE(ip)                     @ jump to next instruction
1455
1456
1457/* ------------------------------ */
1458    .balign 64
1459.L_OP_IF_NE: /* 0x33 */
1460/* File: armv5te/OP_IF_NE.S */
1461/* File: armv5te/bincmp.S */
1462    /*
1463     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1464     * fragment that specifies the *reverse* comparison to perform, e.g.
1465     * for "if-le" you would use "gt".
1466     *
1467     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1468     */
1469    /* if-cmp vA, vB, +CCCC */
1470    mov     r0, rINST, lsr #8           @ r0<- A+
1471    mov     r1, rINST, lsr #12          @ r1<- B
1472    and     r0, r0, #15
1473    GET_VREG(r3, r1)                    @ r3<- vB
1474    GET_VREG(r2, r0)                    @ r2<- vA
1475    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1476    cmp     r2, r3                      @ compare (vA, vB)
1477    moveq r1, #2                 @ r1<- BYTE branch dist for not-taken
1478    adds    r2, r1, r1                  @ convert to bytes, check sign
1479    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1480#if defined(WITH_JIT)
1481    ldr     r0, [rSELF, #offThread_pJitProfTable]
1482    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1483    cmp     r0,#0
1484    bne     common_updateProfile
1485#else
1486    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1487#endif
1488    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1489    GOTO_OPCODE(ip)                     @ jump to next instruction
1490
1491
1492/* ------------------------------ */
1493    .balign 64
1494.L_OP_IF_LT: /* 0x34 */
1495/* File: armv5te/OP_IF_LT.S */
1496/* File: armv5te/bincmp.S */
1497    /*
1498     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1499     * fragment that specifies the *reverse* comparison to perform, e.g.
1500     * for "if-le" you would use "gt".
1501     *
1502     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1503     */
1504    /* if-cmp vA, vB, +CCCC */
1505    mov     r0, rINST, lsr #8           @ r0<- A+
1506    mov     r1, rINST, lsr #12          @ r1<- B
1507    and     r0, r0, #15
1508    GET_VREG(r3, r1)                    @ r3<- vB
1509    GET_VREG(r2, r0)                    @ r2<- vA
1510    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1511    cmp     r2, r3                      @ compare (vA, vB)
1512    movge r1, #2                 @ r1<- BYTE branch dist for not-taken
1513    adds    r2, r1, r1                  @ convert to bytes, check sign
1514    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1515#if defined(WITH_JIT)
1516    ldr     r0, [rSELF, #offThread_pJitProfTable]
1517    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1518    cmp     r0,#0
1519    bne     common_updateProfile
1520#else
1521    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1522#endif
1523    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1524    GOTO_OPCODE(ip)                     @ jump to next instruction
1525
1526
1527/* ------------------------------ */
1528    .balign 64
1529.L_OP_IF_GE: /* 0x35 */
1530/* File: armv5te/OP_IF_GE.S */
1531/* File: armv5te/bincmp.S */
1532    /*
1533     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1534     * fragment that specifies the *reverse* comparison to perform, e.g.
1535     * for "if-le" you would use "gt".
1536     *
1537     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1538     */
1539    /* if-cmp vA, vB, +CCCC */
1540    mov     r0, rINST, lsr #8           @ r0<- A+
1541    mov     r1, rINST, lsr #12          @ r1<- B
1542    and     r0, r0, #15
1543    GET_VREG(r3, r1)                    @ r3<- vB
1544    GET_VREG(r2, r0)                    @ r2<- vA
1545    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1546    cmp     r2, r3                      @ compare (vA, vB)
1547    movlt r1, #2                 @ r1<- BYTE branch dist for not-taken
1548    adds    r2, r1, r1                  @ convert to bytes, check sign
1549    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1550#if defined(WITH_JIT)
1551    ldr     r0, [rSELF, #offThread_pJitProfTable]
1552    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1553    cmp     r0,#0
1554    bne     common_updateProfile
1555#else
1556    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1557#endif
1558    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1559    GOTO_OPCODE(ip)                     @ jump to next instruction
1560
1561
1562/* ------------------------------ */
1563    .balign 64
1564.L_OP_IF_GT: /* 0x36 */
1565/* File: armv5te/OP_IF_GT.S */
1566/* File: armv5te/bincmp.S */
1567    /*
1568     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1569     * fragment that specifies the *reverse* comparison to perform, e.g.
1570     * for "if-le" you would use "gt".
1571     *
1572     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1573     */
1574    /* if-cmp vA, vB, +CCCC */
1575    mov     r0, rINST, lsr #8           @ r0<- A+
1576    mov     r1, rINST, lsr #12          @ r1<- B
1577    and     r0, r0, #15
1578    GET_VREG(r3, r1)                    @ r3<- vB
1579    GET_VREG(r2, r0)                    @ r2<- vA
1580    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1581    cmp     r2, r3                      @ compare (vA, vB)
1582    movle r1, #2                 @ r1<- BYTE branch dist for not-taken
1583    adds    r2, r1, r1                  @ convert to bytes, check sign
1584    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1585#if defined(WITH_JIT)
1586    ldr     r0, [rSELF, #offThread_pJitProfTable]
1587    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1588    cmp     r0,#0
1589    bne     common_updateProfile
1590#else
1591    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1592#endif
1593    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1594    GOTO_OPCODE(ip)                     @ jump to next instruction
1595
1596
1597/* ------------------------------ */
1598    .balign 64
1599.L_OP_IF_LE: /* 0x37 */
1600/* File: armv5te/OP_IF_LE.S */
1601/* File: armv5te/bincmp.S */
1602    /*
1603     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1604     * fragment that specifies the *reverse* comparison to perform, e.g.
1605     * for "if-le" you would use "gt".
1606     *
1607     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1608     */
1609    /* if-cmp vA, vB, +CCCC */
1610    mov     r0, rINST, lsr #8           @ r0<- A+
1611    mov     r1, rINST, lsr #12          @ r1<- B
1612    and     r0, r0, #15
1613    GET_VREG(r3, r1)                    @ r3<- vB
1614    GET_VREG(r2, r0)                    @ r2<- vA
1615    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1616    cmp     r2, r3                      @ compare (vA, vB)
1617    movgt r1, #2                 @ r1<- BYTE branch dist for not-taken
1618    adds    r2, r1, r1                  @ convert to bytes, check sign
1619    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1620#if defined(WITH_JIT)
1621    ldr     r0, [rSELF, #offThread_pJitProfTable]
1622    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1623    cmp     r0,#0
1624    bne     common_updateProfile
1625#else
1626    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
1627#endif
1628    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1629    GOTO_OPCODE(ip)                     @ jump to next instruction
1630
1631
1632/* ------------------------------ */
1633    .balign 64
1634.L_OP_IF_EQZ: /* 0x38 */
1635/* File: armv5te/OP_IF_EQZ.S */
1636/* File: armv5te/zcmp.S */
1637    /*
1638     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1639     * fragment that specifies the *reverse* comparison to perform, e.g.
1640     * for "if-le" you would use "gt".
1641     *
1642     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1643     */
1644    /* if-cmp vAA, +BBBB */
1645    mov     r0, rINST, lsr #8           @ r0<- AA
1646    GET_VREG(r2, r0)                    @ r2<- vAA
1647    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1648    cmp     r2, #0                      @ compare (vA, 0)
1649    movne r1, #2                 @ r1<- inst branch dist for not-taken
1650    adds    r1, r1, r1                  @ convert to bytes & set flags
1651    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1652#if defined(WITH_JIT)
1653    ldr     r0, [rSELF, #offThread_pJitProfTable]
1654    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1655    cmp     r0,#0
1656    bne     common_updateProfile        @ test for JIT off at target
1657#else
1658    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1659#endif
1660    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1661    GOTO_OPCODE(ip)                     @ jump to next instruction
1662
1663
1664/* ------------------------------ */
1665    .balign 64
1666.L_OP_IF_NEZ: /* 0x39 */
1667/* File: armv5te/OP_IF_NEZ.S */
1668/* File: armv5te/zcmp.S */
1669    /*
1670     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1671     * fragment that specifies the *reverse* comparison to perform, e.g.
1672     * for "if-le" you would use "gt".
1673     *
1674     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1675     */
1676    /* if-cmp vAA, +BBBB */
1677    mov     r0, rINST, lsr #8           @ r0<- AA
1678    GET_VREG(r2, r0)                    @ r2<- vAA
1679    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1680    cmp     r2, #0                      @ compare (vA, 0)
1681    moveq r1, #2                 @ r1<- inst branch dist for not-taken
1682    adds    r1, r1, r1                  @ convert to bytes & set flags
1683    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1684#if defined(WITH_JIT)
1685    ldr     r0, [rSELF, #offThread_pJitProfTable]
1686    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1687    cmp     r0,#0
1688    bne     common_updateProfile        @ test for JIT off at target
1689#else
1690    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1691#endif
1692    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1693    GOTO_OPCODE(ip)                     @ jump to next instruction
1694
1695
1696/* ------------------------------ */
1697    .balign 64
1698.L_OP_IF_LTZ: /* 0x3a */
1699/* File: armv5te/OP_IF_LTZ.S */
1700/* File: armv5te/zcmp.S */
1701    /*
1702     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1703     * fragment that specifies the *reverse* comparison to perform, e.g.
1704     * for "if-le" you would use "gt".
1705     *
1706     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1707     */
1708    /* if-cmp vAA, +BBBB */
1709    mov     r0, rINST, lsr #8           @ r0<- AA
1710    GET_VREG(r2, r0)                    @ r2<- vAA
1711    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1712    cmp     r2, #0                      @ compare (vA, 0)
1713    movge r1, #2                 @ r1<- inst branch dist for not-taken
1714    adds    r1, r1, r1                  @ convert to bytes & set flags
1715    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1716#if defined(WITH_JIT)
1717    ldr     r0, [rSELF, #offThread_pJitProfTable]
1718    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1719    cmp     r0,#0
1720    bne     common_updateProfile        @ test for JIT off at target
1721#else
1722    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1723#endif
1724    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1725    GOTO_OPCODE(ip)                     @ jump to next instruction
1726
1727
1728/* ------------------------------ */
1729    .balign 64
1730.L_OP_IF_GEZ: /* 0x3b */
1731/* File: armv5te/OP_IF_GEZ.S */
1732/* File: armv5te/zcmp.S */
1733    /*
1734     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1735     * fragment that specifies the *reverse* comparison to perform, e.g.
1736     * for "if-le" you would use "gt".
1737     *
1738     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1739     */
1740    /* if-cmp vAA, +BBBB */
1741    mov     r0, rINST, lsr #8           @ r0<- AA
1742    GET_VREG(r2, r0)                    @ r2<- vAA
1743    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1744    cmp     r2, #0                      @ compare (vA, 0)
1745    movlt r1, #2                 @ r1<- inst branch dist for not-taken
1746    adds    r1, r1, r1                  @ convert to bytes & set flags
1747    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1748#if defined(WITH_JIT)
1749    ldr     r0, [rSELF, #offThread_pJitProfTable]
1750    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1751    cmp     r0,#0
1752    bne     common_updateProfile        @ test for JIT off at target
1753#else
1754    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1755#endif
1756    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1757    GOTO_OPCODE(ip)                     @ jump to next instruction
1758
1759
1760/* ------------------------------ */
1761    .balign 64
1762.L_OP_IF_GTZ: /* 0x3c */
1763/* File: armv5te/OP_IF_GTZ.S */
1764/* File: armv5te/zcmp.S */
1765    /*
1766     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1767     * fragment that specifies the *reverse* comparison to perform, e.g.
1768     * for "if-le" you would use "gt".
1769     *
1770     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1771     */
1772    /* if-cmp vAA, +BBBB */
1773    mov     r0, rINST, lsr #8           @ r0<- AA
1774    GET_VREG(r2, r0)                    @ r2<- vAA
1775    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1776    cmp     r2, #0                      @ compare (vA, 0)
1777    movle r1, #2                 @ r1<- inst branch dist for not-taken
1778    adds    r1, r1, r1                  @ convert to bytes & set flags
1779    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1780#if defined(WITH_JIT)
1781    ldr     r0, [rSELF, #offThread_pJitProfTable]
1782    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1783    cmp     r0,#0
1784    bne     common_updateProfile        @ test for JIT off at target
1785#else
1786    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1787#endif
1788    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1789    GOTO_OPCODE(ip)                     @ jump to next instruction
1790
1791
1792/* ------------------------------ */
1793    .balign 64
1794.L_OP_IF_LEZ: /* 0x3d */
1795/* File: armv5te/OP_IF_LEZ.S */
1796/* File: armv5te/zcmp.S */
1797    /*
1798     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1799     * fragment that specifies the *reverse* comparison to perform, e.g.
1800     * for "if-le" you would use "gt".
1801     *
1802     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1803     */
1804    /* if-cmp vAA, +BBBB */
1805    mov     r0, rINST, lsr #8           @ r0<- AA
1806    GET_VREG(r2, r0)                    @ r2<- vAA
1807    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1808    cmp     r2, #0                      @ compare (vA, 0)
1809    movgt r1, #2                 @ r1<- inst branch dist for not-taken
1810    adds    r1, r1, r1                  @ convert to bytes & set flags
1811    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1812#if defined(WITH_JIT)
1813    ldr     r0, [rSELF, #offThread_pJitProfTable]
1814    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1815    cmp     r0,#0
1816    bne     common_updateProfile        @ test for JIT off at target
1817#else
1818    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1819#endif
1820    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1821    GOTO_OPCODE(ip)                     @ jump to next instruction
1822
1823
1824/* ------------------------------ */
1825    .balign 64
1826.L_OP_UNUSED_3E: /* 0x3e */
1827/* File: armv5te/OP_UNUSED_3E.S */
1828/* File: armv5te/unused.S */
1829    bl      common_abort
1830
1831
1832/* ------------------------------ */
1833    .balign 64
1834.L_OP_UNUSED_3F: /* 0x3f */
1835/* File: armv5te/OP_UNUSED_3F.S */
1836/* File: armv5te/unused.S */
1837    bl      common_abort
1838
1839
1840/* ------------------------------ */
1841    .balign 64
1842.L_OP_UNUSED_40: /* 0x40 */
1843/* File: armv5te/OP_UNUSED_40.S */
1844/* File: armv5te/unused.S */
1845    bl      common_abort
1846
1847
1848/* ------------------------------ */
1849    .balign 64
1850.L_OP_UNUSED_41: /* 0x41 */
1851/* File: armv5te/OP_UNUSED_41.S */
1852/* File: armv5te/unused.S */
1853    bl      common_abort
1854
1855
1856/* ------------------------------ */
1857    .balign 64
1858.L_OP_UNUSED_42: /* 0x42 */
1859/* File: armv5te/OP_UNUSED_42.S */
1860/* File: armv5te/unused.S */
1861    bl      common_abort
1862
1863
1864/* ------------------------------ */
1865    .balign 64
1866.L_OP_UNUSED_43: /* 0x43 */
1867/* File: armv5te/OP_UNUSED_43.S */
1868/* File: armv5te/unused.S */
1869    bl      common_abort
1870
1871
1872/* ------------------------------ */
1873    .balign 64
1874.L_OP_AGET: /* 0x44 */
1875/* File: armv5te/OP_AGET.S */
1876    /*
1877     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1878     *
1879     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1880     * instructions.  We use a pair of FETCH_Bs instead.
1881     *
1882     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1883     */
1884    /* op vAA, vBB, vCC */
1885    FETCH_B(r2, 1, 0)                   @ r2<- BB
1886    mov     r9, rINST, lsr #8           @ r9<- AA
1887    FETCH_B(r3, 1, 1)                   @ r3<- CC
1888    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1889    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1890    cmp     r0, #0                      @ null array object?
1891    beq     common_errNullObject        @ yes, bail
1892    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1893    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1894    cmp     r1, r3                      @ compare unsigned index, length
1895    bcs     common_errArrayIndex        @ index >= length, bail
1896    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1897    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1898    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1899    SET_VREG(r2, r9)                    @ vAA<- r2
1900    GOTO_OPCODE(ip)                     @ jump to next instruction
1901
1902/* ------------------------------ */
1903    .balign 64
1904.L_OP_AGET_WIDE: /* 0x45 */
1905/* File: armv5te/OP_AGET_WIDE.S */
1906    /*
1907     * Array get, 64 bits.  vAA <- vBB[vCC].
1908     *
1909     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
1910     */
1911    /* aget-wide vAA, vBB, vCC */
1912    FETCH(r0, 1)                        @ r0<- CCBB
1913    mov     r9, rINST, lsr #8           @ r9<- AA
1914    and     r2, r0, #255                @ r2<- BB
1915    mov     r3, r0, lsr #8              @ r3<- CC
1916    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1917    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1918    cmp     r0, #0                      @ null array object?
1919    beq     common_errNullObject        @ yes, bail
1920    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1921    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
1922    cmp     r1, r3                      @ compare unsigned index, length
1923    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
1924    b       common_errArrayIndex        @ index >= length, bail
1925    @ May want to swap the order of these two branches depending on how the
1926    @ branch prediction (if any) handles conditional forward branches vs.
1927    @ unconditional forward branches.
1928
1929/* ------------------------------ */
1930    .balign 64
1931.L_OP_AGET_OBJECT: /* 0x46 */
1932/* File: armv5te/OP_AGET_OBJECT.S */
1933/* File: armv5te/OP_AGET.S */
1934    /*
1935     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1936     *
1937     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1938     * instructions.  We use a pair of FETCH_Bs instead.
1939     *
1940     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1941     */
1942    /* op vAA, vBB, vCC */
1943    FETCH_B(r2, 1, 0)                   @ r2<- BB
1944    mov     r9, rINST, lsr #8           @ r9<- AA
1945    FETCH_B(r3, 1, 1)                   @ r3<- CC
1946    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1947    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1948    cmp     r0, #0                      @ null array object?
1949    beq     common_errNullObject        @ yes, bail
1950    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1951    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1952    cmp     r1, r3                      @ compare unsigned index, length
1953    bcs     common_errArrayIndex        @ index >= length, bail
1954    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1955    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1956    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1957    SET_VREG(r2, r9)                    @ vAA<- r2
1958    GOTO_OPCODE(ip)                     @ jump to next instruction
1959
1960
1961/* ------------------------------ */
1962    .balign 64
1963.L_OP_AGET_BOOLEAN: /* 0x47 */
1964/* File: armv5te/OP_AGET_BOOLEAN.S */
1965/* File: armv5te/OP_AGET.S */
1966    /*
1967     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1968     *
1969     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1970     * instructions.  We use a pair of FETCH_Bs instead.
1971     *
1972     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1973     */
1974    /* op vAA, vBB, vCC */
1975    FETCH_B(r2, 1, 0)                   @ r2<- BB
1976    mov     r9, rINST, lsr #8           @ r9<- AA
1977    FETCH_B(r3, 1, 1)                   @ r3<- CC
1978    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1979    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1980    cmp     r0, #0                      @ null array object?
1981    beq     common_errNullObject        @ yes, bail
1982    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1983    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
1984    cmp     r1, r3                      @ compare unsigned index, length
1985    bcs     common_errArrayIndex        @ index >= length, bail
1986    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1987    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1988    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1989    SET_VREG(r2, r9)                    @ vAA<- r2
1990    GOTO_OPCODE(ip)                     @ jump to next instruction
1991
1992
1993/* ------------------------------ */
1994    .balign 64
1995.L_OP_AGET_BYTE: /* 0x48 */
1996/* File: armv5te/OP_AGET_BYTE.S */
1997/* File: armv5te/OP_AGET.S */
1998    /*
1999     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2000     *
2001     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2002     * instructions.  We use a pair of FETCH_Bs instead.
2003     *
2004     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2005     */
2006    /* op vAA, vBB, vCC */
2007    FETCH_B(r2, 1, 0)                   @ r2<- BB
2008    mov     r9, rINST, lsr #8           @ r9<- AA
2009    FETCH_B(r3, 1, 1)                   @ r3<- CC
2010    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2011    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2012    cmp     r0, #0                      @ null array object?
2013    beq     common_errNullObject        @ yes, bail
2014    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2015    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2016    cmp     r1, r3                      @ compare unsigned index, length
2017    bcs     common_errArrayIndex        @ index >= length, bail
2018    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2019    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2020    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2021    SET_VREG(r2, r9)                    @ vAA<- r2
2022    GOTO_OPCODE(ip)                     @ jump to next instruction
2023
2024
2025/* ------------------------------ */
2026    .balign 64
2027.L_OP_AGET_CHAR: /* 0x49 */
2028/* File: armv5te/OP_AGET_CHAR.S */
2029/* File: armv5te/OP_AGET.S */
2030    /*
2031     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2032     *
2033     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2034     * instructions.  We use a pair of FETCH_Bs instead.
2035     *
2036     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2037     */
2038    /* op vAA, vBB, vCC */
2039    FETCH_B(r2, 1, 0)                   @ r2<- BB
2040    mov     r9, rINST, lsr #8           @ r9<- AA
2041    FETCH_B(r3, 1, 1)                   @ r3<- CC
2042    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2043    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2044    cmp     r0, #0                      @ null array object?
2045    beq     common_errNullObject        @ yes, bail
2046    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2047    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2048    cmp     r1, r3                      @ compare unsigned index, length
2049    bcs     common_errArrayIndex        @ index >= length, bail
2050    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2051    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2052    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2053    SET_VREG(r2, r9)                    @ vAA<- r2
2054    GOTO_OPCODE(ip)                     @ jump to next instruction
2055
2056
2057/* ------------------------------ */
2058    .balign 64
2059.L_OP_AGET_SHORT: /* 0x4a */
2060/* File: armv5te/OP_AGET_SHORT.S */
2061/* File: armv5te/OP_AGET.S */
2062    /*
2063     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2064     *
2065     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2066     * instructions.  We use a pair of FETCH_Bs instead.
2067     *
2068     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2069     */
2070    /* op vAA, vBB, vCC */
2071    FETCH_B(r2, 1, 0)                   @ r2<- BB
2072    mov     r9, rINST, lsr #8           @ r9<- AA
2073    FETCH_B(r3, 1, 1)                   @ r3<- CC
2074    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2075    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2076    cmp     r0, #0                      @ null array object?
2077    beq     common_errNullObject        @ yes, bail
2078    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2079    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2080    cmp     r1, r3                      @ compare unsigned index, length
2081    bcs     common_errArrayIndex        @ index >= length, bail
2082    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2083    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2084    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2085    SET_VREG(r2, r9)                    @ vAA<- r2
2086    GOTO_OPCODE(ip)                     @ jump to next instruction
2087
2088
2089/* ------------------------------ */
2090    .balign 64
2091.L_OP_APUT: /* 0x4b */
2092/* File: armv5te/OP_APUT.S */
2093    /*
2094     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2095     *
2096     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2097     * instructions.  We use a pair of FETCH_Bs instead.
2098     *
2099     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2100     */
2101    /* op vAA, vBB, vCC */
2102    FETCH_B(r2, 1, 0)                   @ r2<- BB
2103    mov     r9, rINST, lsr #8           @ r9<- AA
2104    FETCH_B(r3, 1, 1)                   @ r3<- CC
2105    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2106    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2107    cmp     r0, #0                      @ null array object?
2108    beq     common_errNullObject        @ yes, bail
2109    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2110    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2111    cmp     r1, r3                      @ compare unsigned index, length
2112    bcs     common_errArrayIndex        @ index >= length, bail
2113    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2114    GET_VREG(r2, r9)                    @ r2<- vAA
2115    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2116    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2117    GOTO_OPCODE(ip)                     @ jump to next instruction
2118
2119/* ------------------------------ */
2120    .balign 64
2121.L_OP_APUT_WIDE: /* 0x4c */
2122/* File: armv5te/OP_APUT_WIDE.S */
2123    /*
2124     * Array put, 64 bits.  vBB[vCC] <- vAA.
2125     *
2126     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2127     */
2128    /* aput-wide vAA, vBB, vCC */
2129    FETCH(r0, 1)                        @ r0<- CCBB
2130    mov     r9, rINST, lsr #8           @ r9<- AA
2131    and     r2, r0, #255                @ r2<- BB
2132    mov     r3, r0, lsr #8              @ r3<- CC
2133    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2134    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2135    cmp     r0, #0                      @ null array object?
2136    beq     common_errNullObject        @ yes, bail
2137    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2138    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2139    cmp     r1, r3                      @ compare unsigned index, length
2140    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2141    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2142    b       common_errArrayIndex        @ index >= length, bail
2143    @ May want to swap the order of these two branches depending on how the
2144    @ branch prediction (if any) handles conditional forward branches vs.
2145    @ unconditional forward branches.
2146
2147/* ------------------------------ */
2148    .balign 64
2149.L_OP_APUT_OBJECT: /* 0x4d */
2150/* File: armv5te/OP_APUT_OBJECT.S */
2151    /*
2152     * Store an object into an array.  vBB[vCC] <- vAA.
2153     */
2154    /* op vAA, vBB, vCC */
2155    FETCH(r0, 1)                        @ r0<- CCBB
2156    mov     r9, rINST, lsr #8           @ r9<- AA
2157    and     r2, r0, #255                @ r2<- BB
2158    mov     r3, r0, lsr #8              @ r3<- CC
2159    GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
2160    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2161    cmp     rINST, #0                   @ null array object?
2162    GET_VREG(r9, r9)                    @ r9<- vAA
2163    beq     common_errNullObject        @ yes, bail
2164    ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
2165    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
2166    cmp     r1, r3                      @ compare unsigned index, length
2167    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2168    b       common_errArrayIndex        @ index >= length, bail
2169
2170
2171/* ------------------------------ */
2172    .balign 64
2173.L_OP_APUT_BOOLEAN: /* 0x4e */
2174/* File: armv5te/OP_APUT_BOOLEAN.S */
2175/* File: armv5te/OP_APUT.S */
2176    /*
2177     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2178     *
2179     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2180     * instructions.  We use a pair of FETCH_Bs instead.
2181     *
2182     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2183     */
2184    /* op vAA, vBB, vCC */
2185    FETCH_B(r2, 1, 0)                   @ r2<- BB
2186    mov     r9, rINST, lsr #8           @ r9<- AA
2187    FETCH_B(r3, 1, 1)                   @ r3<- CC
2188    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2189    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2190    cmp     r0, #0                      @ null array object?
2191    beq     common_errNullObject        @ yes, bail
2192    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2193    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2194    cmp     r1, r3                      @ compare unsigned index, length
2195    bcs     common_errArrayIndex        @ index >= length, bail
2196    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2197    GET_VREG(r2, r9)                    @ r2<- vAA
2198    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2199    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2200    GOTO_OPCODE(ip)                     @ jump to next instruction
2201
2202
2203/* ------------------------------ */
2204    .balign 64
2205.L_OP_APUT_BYTE: /* 0x4f */
2206/* File: armv5te/OP_APUT_BYTE.S */
2207/* File: armv5te/OP_APUT.S */
2208    /*
2209     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2210     *
2211     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2212     * instructions.  We use a pair of FETCH_Bs instead.
2213     *
2214     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2215     */
2216    /* op vAA, vBB, vCC */
2217    FETCH_B(r2, 1, 0)                   @ r2<- BB
2218    mov     r9, rINST, lsr #8           @ r9<- AA
2219    FETCH_B(r3, 1, 1)                   @ r3<- CC
2220    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2221    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2222    cmp     r0, #0                      @ null array object?
2223    beq     common_errNullObject        @ yes, bail
2224    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2225    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2226    cmp     r1, r3                      @ compare unsigned index, length
2227    bcs     common_errArrayIndex        @ index >= length, bail
2228    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2229    GET_VREG(r2, r9)                    @ r2<- vAA
2230    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2231    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2232    GOTO_OPCODE(ip)                     @ jump to next instruction
2233
2234
2235/* ------------------------------ */
2236    .balign 64
2237.L_OP_APUT_CHAR: /* 0x50 */
2238/* File: armv5te/OP_APUT_CHAR.S */
2239/* File: armv5te/OP_APUT.S */
2240    /*
2241     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2242     *
2243     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2244     * instructions.  We use a pair of FETCH_Bs instead.
2245     *
2246     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2247     */
2248    /* op vAA, vBB, vCC */
2249    FETCH_B(r2, 1, 0)                   @ r2<- BB
2250    mov     r9, rINST, lsr #8           @ r9<- AA
2251    FETCH_B(r3, 1, 1)                   @ r3<- CC
2252    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2253    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2254    cmp     r0, #0                      @ null array object?
2255    beq     common_errNullObject        @ yes, bail
2256    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2257    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2258    cmp     r1, r3                      @ compare unsigned index, length
2259    bcs     common_errArrayIndex        @ index >= length, bail
2260    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2261    GET_VREG(r2, r9)                    @ r2<- vAA
2262    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2263    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2264    GOTO_OPCODE(ip)                     @ jump to next instruction
2265
2266
2267/* ------------------------------ */
2268    .balign 64
2269.L_OP_APUT_SHORT: /* 0x51 */
2270/* File: armv5te/OP_APUT_SHORT.S */
2271/* File: armv5te/OP_APUT.S */
2272    /*
2273     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2274     *
2275     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2276     * instructions.  We use a pair of FETCH_Bs instead.
2277     *
2278     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2279     */
2280    /* op vAA, vBB, vCC */
2281    FETCH_B(r2, 1, 0)                   @ r2<- BB
2282    mov     r9, rINST, lsr #8           @ r9<- AA
2283    FETCH_B(r3, 1, 1)                   @ r3<- CC
2284    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2285    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2286    cmp     r0, #0                      @ null array object?
2287    beq     common_errNullObject        @ yes, bail
2288    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2289    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2290    cmp     r1, r3                      @ compare unsigned index, length
2291    bcs     common_errArrayIndex        @ index >= length, bail
2292    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2293    GET_VREG(r2, r9)                    @ r2<- vAA
2294    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2295    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2296    GOTO_OPCODE(ip)                     @ jump to next instruction
2297
2298
2299/* ------------------------------ */
2300    .balign 64
2301.L_OP_IGET: /* 0x52 */
2302/* File: armv5te/OP_IGET.S */
2303    /*
2304     * General 32-bit instance field get.
2305     *
2306     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2307     */
2308    /* op vA, vB, field@CCCC */
2309    mov     r0, rINST, lsr #12          @ r0<- B
2310    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2311    FETCH(r1, 1)                        @ r1<- field ref CCCC
2312    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2313    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2314    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2315    cmp     r0, #0                      @ is resolved entry null?
2316    bne     .LOP_IGET_finish          @ no, already resolved
23178:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2318    EXPORT_PC()                         @ resolve() could throw
2319    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2320    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2321    cmp     r0, #0
2322    bne     .LOP_IGET_finish
2323    b       common_exceptionThrown
2324
2325/* ------------------------------ */
2326    .balign 64
2327.L_OP_IGET_WIDE: /* 0x53 */
2328/* File: armv5te/OP_IGET_WIDE.S */
2329    /*
2330     * Wide 32-bit instance field get.
2331     */
2332    /* iget-wide vA, vB, field@CCCC */
2333    mov     r0, rINST, lsr #12          @ r0<- B
2334    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2335    FETCH(r1, 1)                        @ r1<- field ref CCCC
2336    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2337    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2338    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2339    cmp     r0, #0                      @ is resolved entry null?
2340    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
23418:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2342    EXPORT_PC()                         @ resolve() could throw
2343    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2344    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2345    cmp     r0, #0
2346    bne     .LOP_IGET_WIDE_finish
2347    b       common_exceptionThrown
2348
2349/* ------------------------------ */
2350    .balign 64
2351.L_OP_IGET_OBJECT: /* 0x54 */
2352/* File: armv5te/OP_IGET_OBJECT.S */
2353/* File: armv5te/OP_IGET.S */
2354    /*
2355     * General 32-bit instance field get.
2356     *
2357     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2358     */
2359    /* op vA, vB, field@CCCC */
2360    mov     r0, rINST, lsr #12          @ r0<- B
2361    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2362    FETCH(r1, 1)                        @ r1<- field ref CCCC
2363    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2364    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2365    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2366    cmp     r0, #0                      @ is resolved entry null?
2367    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
23688:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2369    EXPORT_PC()                         @ resolve() could throw
2370    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2371    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2372    cmp     r0, #0
2373    bne     .LOP_IGET_OBJECT_finish
2374    b       common_exceptionThrown
2375
2376
2377/* ------------------------------ */
2378    .balign 64
2379.L_OP_IGET_BOOLEAN: /* 0x55 */
2380/* File: armv5te/OP_IGET_BOOLEAN.S */
2381@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2382/* File: armv5te/OP_IGET.S */
2383    /*
2384     * General 32-bit instance field get.
2385     *
2386     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2387     */
2388    /* op vA, vB, field@CCCC */
2389    mov     r0, rINST, lsr #12          @ r0<- B
2390    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2391    FETCH(r1, 1)                        @ r1<- field ref CCCC
2392    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2393    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2394    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2395    cmp     r0, #0                      @ is resolved entry null?
2396    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
23978:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2398    EXPORT_PC()                         @ resolve() could throw
2399    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2400    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2401    cmp     r0, #0
2402    bne     .LOP_IGET_BOOLEAN_finish
2403    b       common_exceptionThrown
2404
2405
2406/* ------------------------------ */
2407    .balign 64
2408.L_OP_IGET_BYTE: /* 0x56 */
2409/* File: armv5te/OP_IGET_BYTE.S */
2410@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2411/* File: armv5te/OP_IGET.S */
2412    /*
2413     * General 32-bit instance field get.
2414     *
2415     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2416     */
2417    /* op vA, vB, field@CCCC */
2418    mov     r0, rINST, lsr #12          @ r0<- B
2419    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2420    FETCH(r1, 1)                        @ r1<- field ref CCCC
2421    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2422    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2423    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2424    cmp     r0, #0                      @ is resolved entry null?
2425    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
24268:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2427    EXPORT_PC()                         @ resolve() could throw
2428    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2429    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2430    cmp     r0, #0
2431    bne     .LOP_IGET_BYTE_finish
2432    b       common_exceptionThrown
2433
2434
2435/* ------------------------------ */
2436    .balign 64
2437.L_OP_IGET_CHAR: /* 0x57 */
2438/* File: armv5te/OP_IGET_CHAR.S */
2439@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2440/* File: armv5te/OP_IGET.S */
2441    /*
2442     * General 32-bit instance field get.
2443     *
2444     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2445     */
2446    /* op vA, vB, field@CCCC */
2447    mov     r0, rINST, lsr #12          @ r0<- B
2448    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2449    FETCH(r1, 1)                        @ r1<- field ref CCCC
2450    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2451    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2452    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2453    cmp     r0, #0                      @ is resolved entry null?
2454    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
24558:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2456    EXPORT_PC()                         @ resolve() could throw
2457    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2458    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2459    cmp     r0, #0
2460    bne     .LOP_IGET_CHAR_finish
2461    b       common_exceptionThrown
2462
2463
2464/* ------------------------------ */
2465    .balign 64
2466.L_OP_IGET_SHORT: /* 0x58 */
2467/* File: armv5te/OP_IGET_SHORT.S */
2468@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2469/* File: armv5te/OP_IGET.S */
2470    /*
2471     * General 32-bit instance field get.
2472     *
2473     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2474     */
2475    /* op vA, vB, field@CCCC */
2476    mov     r0, rINST, lsr #12          @ r0<- B
2477    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2478    FETCH(r1, 1)                        @ r1<- field ref CCCC
2479    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2480    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2481    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2482    cmp     r0, #0                      @ is resolved entry null?
2483    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
24848:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2485    EXPORT_PC()                         @ resolve() could throw
2486    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2487    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2488    cmp     r0, #0
2489    bne     .LOP_IGET_SHORT_finish
2490    b       common_exceptionThrown
2491
2492
2493/* ------------------------------ */
2494    .balign 64
2495.L_OP_IPUT: /* 0x59 */
2496/* File: armv5te/OP_IPUT.S */
2497    /*
2498     * General 32-bit instance field put.
2499     *
2500     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2501     */
2502    /* op vA, vB, field@CCCC */
2503    mov     r0, rINST, lsr #12          @ r0<- B
2504    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2505    FETCH(r1, 1)                        @ r1<- field ref CCCC
2506    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2507    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2508    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2509    cmp     r0, #0                      @ is resolved entry null?
2510    bne     .LOP_IPUT_finish          @ no, already resolved
25118:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2512    EXPORT_PC()                         @ resolve() could throw
2513    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2514    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2515    cmp     r0, #0                      @ success?
2516    bne     .LOP_IPUT_finish          @ yes, finish up
2517    b       common_exceptionThrown
2518
2519/* ------------------------------ */
2520    .balign 64
2521.L_OP_IPUT_WIDE: /* 0x5a */
2522/* File: armv5te/OP_IPUT_WIDE.S */
2523    /* iput-wide vA, vB, field@CCCC */
2524    mov     r0, rINST, lsr #12          @ r0<- B
2525    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2526    FETCH(r1, 1)                        @ r1<- field ref CCCC
2527    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2528    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2529    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2530    cmp     r0, #0                      @ is resolved entry null?
2531    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
25328:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2533    EXPORT_PC()                         @ resolve() could throw
2534    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2535    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2536    cmp     r0, #0                      @ success?
2537    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2538    b       common_exceptionThrown
2539
2540/* ------------------------------ */
2541    .balign 64
2542.L_OP_IPUT_OBJECT: /* 0x5b */
2543/* File: armv5te/OP_IPUT_OBJECT.S */
2544    /*
2545     * 32-bit instance field put.
2546     *
2547     * for: iput-object, iput-object-volatile
2548     */
2549    /* op vA, vB, field@CCCC */
2550    mov     r0, rINST, lsr #12          @ r0<- B
2551    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2552    FETCH(r1, 1)                        @ r1<- field ref CCCC
2553    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2554    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2555    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2556    cmp     r0, #0                      @ is resolved entry null?
2557    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
25588:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2559    EXPORT_PC()                         @ resolve() could throw
2560    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2561    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2562    cmp     r0, #0                      @ success?
2563    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2564    b       common_exceptionThrown
2565
2566/* ------------------------------ */
2567    .balign 64
2568.L_OP_IPUT_BOOLEAN: /* 0x5c */
2569/* File: armv5te/OP_IPUT_BOOLEAN.S */
2570@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2571/* File: armv5te/OP_IPUT.S */
2572    /*
2573     * General 32-bit instance field put.
2574     *
2575     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2576     */
2577    /* op vA, vB, field@CCCC */
2578    mov     r0, rINST, lsr #12          @ r0<- B
2579    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2580    FETCH(r1, 1)                        @ r1<- field ref CCCC
2581    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2582    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2583    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2584    cmp     r0, #0                      @ is resolved entry null?
2585    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
25868:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2587    EXPORT_PC()                         @ resolve() could throw
2588    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2589    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2590    cmp     r0, #0                      @ success?
2591    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2592    b       common_exceptionThrown
2593
2594
2595/* ------------------------------ */
2596    .balign 64
2597.L_OP_IPUT_BYTE: /* 0x5d */
2598/* File: armv5te/OP_IPUT_BYTE.S */
2599@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2600/* File: armv5te/OP_IPUT.S */
2601    /*
2602     * General 32-bit instance field put.
2603     *
2604     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2605     */
2606    /* op vA, vB, field@CCCC */
2607    mov     r0, rINST, lsr #12          @ r0<- B
2608    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2609    FETCH(r1, 1)                        @ r1<- field ref CCCC
2610    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2611    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2612    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2613    cmp     r0, #0                      @ is resolved entry null?
2614    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
26158:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2616    EXPORT_PC()                         @ resolve() could throw
2617    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2618    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2619    cmp     r0, #0                      @ success?
2620    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2621    b       common_exceptionThrown
2622
2623
2624/* ------------------------------ */
2625    .balign 64
2626.L_OP_IPUT_CHAR: /* 0x5e */
2627/* File: armv5te/OP_IPUT_CHAR.S */
2628@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2629/* File: armv5te/OP_IPUT.S */
2630    /*
2631     * General 32-bit instance field put.
2632     *
2633     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2634     */
2635    /* op vA, vB, field@CCCC */
2636    mov     r0, rINST, lsr #12          @ r0<- B
2637    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2638    FETCH(r1, 1)                        @ r1<- field ref CCCC
2639    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2640    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2641    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2642    cmp     r0, #0                      @ is resolved entry null?
2643    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
26448:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2645    EXPORT_PC()                         @ resolve() could throw
2646    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2647    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2648    cmp     r0, #0                      @ success?
2649    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2650    b       common_exceptionThrown
2651
2652
2653/* ------------------------------ */
2654    .balign 64
2655.L_OP_IPUT_SHORT: /* 0x5f */
2656/* File: armv5te/OP_IPUT_SHORT.S */
2657@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2658/* File: armv5te/OP_IPUT.S */
2659    /*
2660     * General 32-bit instance field put.
2661     *
2662     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2663     */
2664    /* op vA, vB, field@CCCC */
2665    mov     r0, rINST, lsr #12          @ r0<- B
2666    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2667    FETCH(r1, 1)                        @ r1<- field ref CCCC
2668    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2669    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2670    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2671    cmp     r0, #0                      @ is resolved entry null?
2672    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
26738:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2674    EXPORT_PC()                         @ resolve() could throw
2675    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2676    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2677    cmp     r0, #0                      @ success?
2678    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2679    b       common_exceptionThrown
2680
2681
2682/* ------------------------------ */
2683    .balign 64
2684.L_OP_SGET: /* 0x60 */
2685/* File: armv5te/OP_SGET.S */
2686    /*
2687     * General 32-bit SGET handler.
2688     *
2689     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2690     */
2691    /* op vAA, field@BBBB */
2692    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2693    FETCH(r1, 1)                        @ r1<- field ref BBBB
2694    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2695    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2696    cmp     r0, #0                      @ is resolved entry null?
2697    beq     .LOP_SGET_resolve         @ yes, do resolve
2698.LOP_SGET_finish: @ field ptr in r0
2699    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2700    @ no-op                             @ acquiring load
2701    mov     r2, rINST, lsr #8           @ r2<- AA
2702    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2703    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2704    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2705    GOTO_OPCODE(ip)                     @ jump to next instruction
2706
2707/* ------------------------------ */
2708    .balign 64
2709.L_OP_SGET_WIDE: /* 0x61 */
2710/* File: armv5te/OP_SGET_WIDE.S */
2711    /*
2712     * 64-bit SGET handler.
2713     */
2714    /* sget-wide vAA, field@BBBB */
2715    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2716    FETCH(r1, 1)                        @ r1<- field ref BBBB
2717    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2718    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2719    cmp     r0, #0                      @ is resolved entry null?
2720    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2721.LOP_SGET_WIDE_finish:
2722    mov     r9, rINST, lsr #8           @ r9<- AA
2723    .if 0
2724    add     r0, r0, #offStaticField_value @ r0<- pointer to data
2725    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
2726    .else
2727    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2728    .endif
2729    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2730    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2731    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2732    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2733    GOTO_OPCODE(ip)                     @ jump to next instruction
2734
2735/* ------------------------------ */
2736    .balign 64
2737.L_OP_SGET_OBJECT: /* 0x62 */
2738/* File: armv5te/OP_SGET_OBJECT.S */
2739/* File: armv5te/OP_SGET.S */
2740    /*
2741     * General 32-bit SGET handler.
2742     *
2743     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2744     */
2745    /* op vAA, field@BBBB */
2746    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2747    FETCH(r1, 1)                        @ r1<- field ref BBBB
2748    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2749    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2750    cmp     r0, #0                      @ is resolved entry null?
2751    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2752.LOP_SGET_OBJECT_finish: @ field ptr in r0
2753    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2754    @ no-op                             @ acquiring load
2755    mov     r2, rINST, lsr #8           @ r2<- AA
2756    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2757    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2758    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2759    GOTO_OPCODE(ip)                     @ jump to next instruction
2760
2761
2762/* ------------------------------ */
2763    .balign 64
2764.L_OP_SGET_BOOLEAN: /* 0x63 */
2765/* File: armv5te/OP_SGET_BOOLEAN.S */
2766/* File: armv5te/OP_SGET.S */
2767    /*
2768     * General 32-bit SGET handler.
2769     *
2770     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2771     */
2772    /* op vAA, field@BBBB */
2773    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2774    FETCH(r1, 1)                        @ r1<- field ref BBBB
2775    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2776    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2777    cmp     r0, #0                      @ is resolved entry null?
2778    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2779.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2780    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2781    @ no-op                             @ acquiring load
2782    mov     r2, rINST, lsr #8           @ r2<- AA
2783    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2784    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2785    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2786    GOTO_OPCODE(ip)                     @ jump to next instruction
2787
2788
2789/* ------------------------------ */
2790    .balign 64
2791.L_OP_SGET_BYTE: /* 0x64 */
2792/* File: armv5te/OP_SGET_BYTE.S */
2793/* File: armv5te/OP_SGET.S */
2794    /*
2795     * General 32-bit SGET handler.
2796     *
2797     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2798     */
2799    /* op vAA, field@BBBB */
2800    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2801    FETCH(r1, 1)                        @ r1<- field ref BBBB
2802    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2803    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2804    cmp     r0, #0                      @ is resolved entry null?
2805    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2806.LOP_SGET_BYTE_finish: @ field ptr in r0
2807    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2808    @ no-op                             @ acquiring load
2809    mov     r2, rINST, lsr #8           @ r2<- AA
2810    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2811    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2812    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2813    GOTO_OPCODE(ip)                     @ jump to next instruction
2814
2815
2816/* ------------------------------ */
2817    .balign 64
2818.L_OP_SGET_CHAR: /* 0x65 */
2819/* File: armv5te/OP_SGET_CHAR.S */
2820/* File: armv5te/OP_SGET.S */
2821    /*
2822     * General 32-bit SGET handler.
2823     *
2824     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2825     */
2826    /* op vAA, field@BBBB */
2827    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2828    FETCH(r1, 1)                        @ r1<- field ref BBBB
2829    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2830    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2831    cmp     r0, #0                      @ is resolved entry null?
2832    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2833.LOP_SGET_CHAR_finish: @ field ptr in r0
2834    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2835    @ no-op                             @ acquiring load
2836    mov     r2, rINST, lsr #8           @ r2<- AA
2837    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2838    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2839    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2840    GOTO_OPCODE(ip)                     @ jump to next instruction
2841
2842
2843/* ------------------------------ */
2844    .balign 64
2845.L_OP_SGET_SHORT: /* 0x66 */
2846/* File: armv5te/OP_SGET_SHORT.S */
2847/* File: armv5te/OP_SGET.S */
2848    /*
2849     * General 32-bit SGET handler.
2850     *
2851     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2852     */
2853    /* op vAA, field@BBBB */
2854    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2855    FETCH(r1, 1)                        @ r1<- field ref BBBB
2856    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2857    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2858    cmp     r0, #0                      @ is resolved entry null?
2859    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
2860.LOP_SGET_SHORT_finish: @ field ptr in r0
2861    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
2862    @ no-op                             @ acquiring load
2863    mov     r2, rINST, lsr #8           @ r2<- AA
2864    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2865    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2866    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2867    GOTO_OPCODE(ip)                     @ jump to next instruction
2868
2869
2870/* ------------------------------ */
2871    .balign 64
2872.L_OP_SPUT: /* 0x67 */
2873/* File: armv5te/OP_SPUT.S */
2874    /*
2875     * General 32-bit SPUT handler.
2876     *
2877     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2878     */
2879    /* op vAA, field@BBBB */
2880    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2881    FETCH(r1, 1)                        @ r1<- field ref BBBB
2882    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2883    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2884    cmp     r0, #0                      @ is resolved entry null?
2885    beq     .LOP_SPUT_resolve         @ yes, do resolve
2886.LOP_SPUT_finish:   @ field ptr in r0
2887    mov     r2, rINST, lsr #8           @ r2<- AA
2888    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2889    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2890    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2891    @ no-op                        @ releasing store
2892    str     r1, [r0, #offStaticField_value] @ field<- vAA
2893    @ no-op
2894    GOTO_OPCODE(ip)                     @ jump to next instruction
2895
2896/* ------------------------------ */
2897    .balign 64
2898.L_OP_SPUT_WIDE: /* 0x68 */
2899/* File: armv5te/OP_SPUT_WIDE.S */
2900    /*
2901     * 64-bit SPUT handler.
2902     */
2903    /* sput-wide vAA, field@BBBB */
2904    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
2905    FETCH(r1, 1)                        @ r1<- field ref BBBB
2906    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2907    mov     r9, rINST, lsr #8           @ r9<- AA
2908    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
2909    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2910    cmp     r2, #0                      @ is resolved entry null?
2911    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
2912.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
2913    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2914    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
2915    GET_INST_OPCODE(r10)                @ extract opcode from rINST
2916    .if 0
2917    add     r2, r2, #offStaticField_value @ r2<- pointer to data
2918    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
2919    .else
2920    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
2921    .endif
2922    GOTO_OPCODE(r10)                    @ jump to next instruction
2923
2924/* ------------------------------ */
2925    .balign 64
2926.L_OP_SPUT_OBJECT: /* 0x69 */
2927/* File: armv5te/OP_SPUT_OBJECT.S */
2928    /*
2929     * 32-bit SPUT handler for objects
2930     *
2931     * for: sput-object, sput-object-volatile
2932     */
2933    /* op vAA, field@BBBB */
2934    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2935    FETCH(r1, 1)                        @ r1<- field ref BBBB
2936    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2937    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2938    cmp     r0, #0                      @ is resolved entry null?
2939    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
2940.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
2941    mov     r2, rINST, lsr #8           @ r2<- AA
2942    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2943    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2944    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
2945    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
2946    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2947    @ no-op                         @ releasing store
2948    b       .LOP_SPUT_OBJECT_end
2949
2950/* ------------------------------ */
2951    .balign 64
2952.L_OP_SPUT_BOOLEAN: /* 0x6a */
2953/* File: armv5te/OP_SPUT_BOOLEAN.S */
2954/* File: armv5te/OP_SPUT.S */
2955    /*
2956     * General 32-bit SPUT handler.
2957     *
2958     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2959     */
2960    /* op vAA, field@BBBB */
2961    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2962    FETCH(r1, 1)                        @ r1<- field ref BBBB
2963    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2964    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2965    cmp     r0, #0                      @ is resolved entry null?
2966    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
2967.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
2968    mov     r2, rINST, lsr #8           @ r2<- AA
2969    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2970    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2971    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2972    @ no-op                        @ releasing store
2973    str     r1, [r0, #offStaticField_value] @ field<- vAA
2974    @ no-op
2975    GOTO_OPCODE(ip)                     @ jump to next instruction
2976
2977
2978/* ------------------------------ */
2979    .balign 64
2980.L_OP_SPUT_BYTE: /* 0x6b */
2981/* File: armv5te/OP_SPUT_BYTE.S */
2982/* File: armv5te/OP_SPUT.S */
2983    /*
2984     * General 32-bit SPUT handler.
2985     *
2986     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2987     */
2988    /* op vAA, field@BBBB */
2989    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2990    FETCH(r1, 1)                        @ r1<- field ref BBBB
2991    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2992    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2993    cmp     r0, #0                      @ is resolved entry null?
2994    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
2995.LOP_SPUT_BYTE_finish:   @ field ptr in r0
2996    mov     r2, rINST, lsr #8           @ r2<- AA
2997    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2998    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2999    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3000    @ no-op                        @ releasing store
3001    str     r1, [r0, #offStaticField_value] @ field<- vAA
3002    @ no-op
3003    GOTO_OPCODE(ip)                     @ jump to next instruction
3004
3005
3006/* ------------------------------ */
3007    .balign 64
3008.L_OP_SPUT_CHAR: /* 0x6c */
3009/* File: armv5te/OP_SPUT_CHAR.S */
3010/* File: armv5te/OP_SPUT.S */
3011    /*
3012     * General 32-bit SPUT handler.
3013     *
3014     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3015     */
3016    /* op vAA, field@BBBB */
3017    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3018    FETCH(r1, 1)                        @ r1<- field ref BBBB
3019    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3020    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3021    cmp     r0, #0                      @ is resolved entry null?
3022    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3023.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3024    mov     r2, rINST, lsr #8           @ r2<- AA
3025    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3026    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3027    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3028    @ no-op                        @ releasing store
3029    str     r1, [r0, #offStaticField_value] @ field<- vAA
3030    @ no-op
3031    GOTO_OPCODE(ip)                     @ jump to next instruction
3032
3033
3034/* ------------------------------ */
3035    .balign 64
3036.L_OP_SPUT_SHORT: /* 0x6d */
3037/* File: armv5te/OP_SPUT_SHORT.S */
3038/* File: armv5te/OP_SPUT.S */
3039    /*
3040     * General 32-bit SPUT handler.
3041     *
3042     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3043     */
3044    /* op vAA, field@BBBB */
3045    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3046    FETCH(r1, 1)                        @ r1<- field ref BBBB
3047    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
3048    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3049    cmp     r0, #0                      @ is resolved entry null?
3050    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3051.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3052    mov     r2, rINST, lsr #8           @ r2<- AA
3053    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3054    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3055    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3056    @ no-op                        @ releasing store
3057    str     r1, [r0, #offStaticField_value] @ field<- vAA
3058    @ no-op
3059    GOTO_OPCODE(ip)                     @ jump to next instruction
3060
3061
3062/* ------------------------------ */
3063    .balign 64
3064.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3065/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3066    /*
3067     * Handle a virtual method call.
3068     *
3069     * for: invoke-virtual, invoke-virtual/range
3070     */
3071    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3072    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3073    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3074    FETCH(r1, 1)                        @ r1<- BBBB
3075    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3076    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3077    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3078    .if     (!0)
3079    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3080    .endif
3081    cmp     r0, #0                      @ already resolved?
3082    EXPORT_PC()                         @ must export for invoke
3083    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
3084    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3085    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3086    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3087    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3088    cmp     r0, #0                      @ got null?
3089    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3090    b       common_exceptionThrown      @ yes, handle exception
3091
3092/* ------------------------------ */
3093    .balign 64
3094.L_OP_INVOKE_SUPER: /* 0x6f */
3095/* File: armv5te/OP_INVOKE_SUPER.S */
3096    /*
3097     * Handle a "super" method call.
3098     *
3099     * for: invoke-super, invoke-super/range
3100     */
3101    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3102    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3103    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3104    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3105    .if     (!0)
3106    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3107    .endif
3108    FETCH(r1, 1)                        @ r1<- BBBB
3109    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3110    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3111    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3112    cmp     r9, #0                      @ null "this"?
3113    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3114    beq     common_errNullObject        @ null "this", throw exception
3115    cmp     r0, #0                      @ already resolved?
3116    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3117    EXPORT_PC()                         @ must export for invoke
3118    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3119    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3120
3121/* ------------------------------ */
3122    .balign 64
3123.L_OP_INVOKE_DIRECT: /* 0x70 */
3124/* File: armv5te/OP_INVOKE_DIRECT.S */
3125    /*
3126     * Handle a direct method call.
3127     *
3128     * (We could defer the "is 'this' pointer null" test to the common
3129     * method invocation code, and use a flag to indicate that static
3130     * calls don't count.  If we do this as part of copying the arguments
3131     * out we could avoiding loading the first arg twice.)
3132     *
3133     * for: invoke-direct, invoke-direct/range
3134     */
3135    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3136    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3137    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3138    FETCH(r1, 1)                        @ r1<- BBBB
3139    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3140    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3141    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3142    .if     (!0)
3143    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3144    .endif
3145    cmp     r0, #0                      @ already resolved?
3146    EXPORT_PC()                         @ must export for invoke
3147    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3148    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3149.LOP_INVOKE_DIRECT_finish:
3150    cmp     r9, #0                      @ null "this" ref?
3151    bne     common_invokeMethodNoRange   @ r0=method, r9="this"
3152    b       common_errNullObject        @ yes, throw exception
3153
3154/* ------------------------------ */
3155    .balign 64
3156.L_OP_INVOKE_STATIC: /* 0x71 */
3157/* File: armv5te/OP_INVOKE_STATIC.S */
3158    /*
3159     * Handle a static method call.
3160     *
3161     * for: invoke-static, invoke-static/range
3162     */
3163    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3164    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3165    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3166    FETCH(r1, 1)                        @ r1<- BBBB
3167    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3168    mov     r9, #0                      @ null "this" in delay slot
3169    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3170#if defined(WITH_JIT)
3171    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3172#endif
3173    cmp     r0, #0                      @ already resolved?
3174    EXPORT_PC()                         @ must export for invoke
3175    bne     common_invokeMethodNoRange @ yes, continue on
3176    b       .LOP_INVOKE_STATIC_resolve
3177
3178/* ------------------------------ */
3179    .balign 64
3180.L_OP_INVOKE_INTERFACE: /* 0x72 */
3181/* File: armv5te/OP_INVOKE_INTERFACE.S */
3182    /*
3183     * Handle an interface method call.
3184     *
3185     * for: invoke-interface, invoke-interface/range
3186     */
3187    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3188    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3189    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3190    FETCH(r1, 1)                        @ r1<- BBBB
3191    .if     (!0)
3192    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3193    .endif
3194    EXPORT_PC()                         @ must export for invoke
3195    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3196    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3197    cmp     r9, #0                      @ null obj?
3198    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3199    beq     common_errNullObject        @ yes, fail
3200    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3201    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3202    cmp     r0, #0                      @ failed?
3203    beq     common_exceptionThrown      @ yes, handle exception
3204    b       common_invokeMethodNoRange @ (r0=method, r9="this")
3205
3206/* ------------------------------ */
3207    .balign 64
3208.L_OP_UNUSED_73: /* 0x73 */
3209/* File: armv5te/OP_UNUSED_73.S */
3210/* File: armv5te/unused.S */
3211    bl      common_abort
3212
3213
3214/* ------------------------------ */
3215    .balign 64
3216.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3217/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3218/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3219    /*
3220     * Handle a virtual method call.
3221     *
3222     * for: invoke-virtual, invoke-virtual/range
3223     */
3224    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3225    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3226    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3227    FETCH(r1, 1)                        @ r1<- BBBB
3228    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3229    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3230    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3231    .if     (!1)
3232    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3233    .endif
3234    cmp     r0, #0                      @ already resolved?
3235    EXPORT_PC()                         @ must export for invoke
3236    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
3237    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3238    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3239    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3240    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3241    cmp     r0, #0                      @ got null?
3242    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3243    b       common_exceptionThrown      @ yes, handle exception
3244
3245
3246/* ------------------------------ */
3247    .balign 64
3248.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3249/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3250/* File: armv5te/OP_INVOKE_SUPER.S */
3251    /*
3252     * Handle a "super" method call.
3253     *
3254     * for: invoke-super, invoke-super/range
3255     */
3256    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3257    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3258    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3259    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3260    .if     (!1)
3261    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3262    .endif
3263    FETCH(r1, 1)                        @ r1<- BBBB
3264    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3265    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3266    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3267    cmp     r9, #0                      @ null "this"?
3268    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3269    beq     common_errNullObject        @ null "this", throw exception
3270    cmp     r0, #0                      @ already resolved?
3271    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3272    EXPORT_PC()                         @ must export for invoke
3273    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3274    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3275
3276
3277/* ------------------------------ */
3278    .balign 64
3279.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3280/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3281/* File: armv5te/OP_INVOKE_DIRECT.S */
3282    /*
3283     * Handle a direct method call.
3284     *
3285     * (We could defer the "is 'this' pointer null" test to the common
3286     * method invocation code, and use a flag to indicate that static
3287     * calls don't count.  If we do this as part of copying the arguments
3288     * out we could avoiding loading the first arg twice.)
3289     *
3290     * for: invoke-direct, invoke-direct/range
3291     */
3292    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3293    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3294    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3295    FETCH(r1, 1)                        @ r1<- BBBB
3296    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3297    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3298    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3299    .if     (!1)
3300    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3301    .endif
3302    cmp     r0, #0                      @ already resolved?
3303    EXPORT_PC()                         @ must export for invoke
3304    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3305    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3306.LOP_INVOKE_DIRECT_RANGE_finish:
3307    cmp     r9, #0                      @ null "this" ref?
3308    bne     common_invokeMethodRange   @ r0=method, r9="this"
3309    b       common_errNullObject        @ yes, throw exception
3310
3311
3312/* ------------------------------ */
3313    .balign 64
3314.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3315/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3316/* File: armv5te/OP_INVOKE_STATIC.S */
3317    /*
3318     * Handle a static method call.
3319     *
3320     * for: invoke-static, invoke-static/range
3321     */
3322    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3323    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3324    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3325    FETCH(r1, 1)                        @ r1<- BBBB
3326    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3327    mov     r9, #0                      @ null "this" in delay slot
3328    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3329#if defined(WITH_JIT)
3330    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
3331#endif
3332    cmp     r0, #0                      @ already resolved?
3333    EXPORT_PC()                         @ must export for invoke
3334    bne     common_invokeMethodRange @ yes, continue on
3335    b       .LOP_INVOKE_STATIC_RANGE_resolve
3336
3337
3338/* ------------------------------ */
3339    .balign 64
3340.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3341/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3342/* File: armv5te/OP_INVOKE_INTERFACE.S */
3343    /*
3344     * Handle an interface method call.
3345     *
3346     * for: invoke-interface, invoke-interface/range
3347     */
3348    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3349    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3350    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3351    FETCH(r1, 1)                        @ r1<- BBBB
3352    .if     (!1)
3353    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3354    .endif
3355    EXPORT_PC()                         @ must export for invoke
3356    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
3357    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
3358    cmp     r9, #0                      @ null obj?
3359    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3360    beq     common_errNullObject        @ yes, fail
3361    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3362    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3363    cmp     r0, #0                      @ failed?
3364    beq     common_exceptionThrown      @ yes, handle exception
3365    b       common_invokeMethodRange @ (r0=method, r9="this")
3366
3367
3368/* ------------------------------ */
3369    .balign 64
3370.L_OP_UNUSED_79: /* 0x79 */
3371/* File: armv5te/OP_UNUSED_79.S */
3372/* File: armv5te/unused.S */
3373    bl      common_abort
3374
3375
3376/* ------------------------------ */
3377    .balign 64
3378.L_OP_UNUSED_7A: /* 0x7a */
3379/* File: armv5te/OP_UNUSED_7A.S */
3380/* File: armv5te/unused.S */
3381    bl      common_abort
3382
3383
3384/* ------------------------------ */
3385    .balign 64
3386.L_OP_NEG_INT: /* 0x7b */
3387/* File: armv5te/OP_NEG_INT.S */
3388/* File: armv5te/unop.S */
3389    /*
3390     * Generic 32-bit unary operation.  Provide an "instr" line that
3391     * specifies an instruction that performs "result = op r0".
3392     * This could be an ARM instruction or a function call.
3393     *
3394     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3395     *      int-to-byte, int-to-char, int-to-short
3396     */
3397    /* unop vA, vB */
3398    mov     r3, rINST, lsr #12          @ r3<- B
3399    mov     r9, rINST, lsr #8           @ r9<- A+
3400    GET_VREG(r0, r3)                    @ r0<- vB
3401    and     r9, r9, #15
3402                               @ optional op; may set condition codes
3403    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3404    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3405    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3406    SET_VREG(r0, r9)                    @ vAA<- r0
3407    GOTO_OPCODE(ip)                     @ jump to next instruction
3408    /* 9-10 instructions */
3409
3410
3411/* ------------------------------ */
3412    .balign 64
3413.L_OP_NOT_INT: /* 0x7c */
3414/* File: armv5te/OP_NOT_INT.S */
3415/* File: armv5te/unop.S */
3416    /*
3417     * Generic 32-bit unary operation.  Provide an "instr" line that
3418     * specifies an instruction that performs "result = op r0".
3419     * This could be an ARM instruction or a function call.
3420     *
3421     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3422     *      int-to-byte, int-to-char, int-to-short
3423     */
3424    /* unop vA, vB */
3425    mov     r3, rINST, lsr #12          @ r3<- B
3426    mov     r9, rINST, lsr #8           @ r9<- A+
3427    GET_VREG(r0, r3)                    @ r0<- vB
3428    and     r9, r9, #15
3429                               @ optional op; may set condition codes
3430    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3431    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3432    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3433    SET_VREG(r0, r9)                    @ vAA<- r0
3434    GOTO_OPCODE(ip)                     @ jump to next instruction
3435    /* 9-10 instructions */
3436
3437
3438/* ------------------------------ */
3439    .balign 64
3440.L_OP_NEG_LONG: /* 0x7d */
3441/* File: armv5te/OP_NEG_LONG.S */
3442/* File: armv5te/unopWide.S */
3443    /*
3444     * Generic 64-bit unary operation.  Provide an "instr" line that
3445     * specifies an instruction that performs "result = op r0/r1".
3446     * This could be an ARM instruction or a function call.
3447     *
3448     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3449     */
3450    /* unop vA, vB */
3451    mov     r9, rINST, lsr #8           @ r9<- A+
3452    mov     r3, rINST, lsr #12          @ r3<- B
3453    and     r9, r9, #15
3454    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3455    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3456    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3457    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3458    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3459    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3460    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3461    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3462    GOTO_OPCODE(ip)                     @ jump to next instruction
3463    /* 12-13 instructions */
3464
3465
3466/* ------------------------------ */
3467    .balign 64
3468.L_OP_NOT_LONG: /* 0x7e */
3469/* File: armv5te/OP_NOT_LONG.S */
3470/* File: armv5te/unopWide.S */
3471    /*
3472     * Generic 64-bit unary operation.  Provide an "instr" line that
3473     * specifies an instruction that performs "result = op r0/r1".
3474     * This could be an ARM instruction or a function call.
3475     *
3476     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3477     */
3478    /* unop vA, vB */
3479    mov     r9, rINST, lsr #8           @ r9<- A+
3480    mov     r3, rINST, lsr #12          @ r3<- B
3481    and     r9, r9, #15
3482    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3483    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3484    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3485    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3486    mvn     r0, r0                           @ optional op; may set condition codes
3487    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3488    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3489    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3490    GOTO_OPCODE(ip)                     @ jump to next instruction
3491    /* 12-13 instructions */
3492
3493
3494/* ------------------------------ */
3495    .balign 64
3496.L_OP_NEG_FLOAT: /* 0x7f */
3497/* File: armv5te/OP_NEG_FLOAT.S */
3498/* File: armv5te/unop.S */
3499    /*
3500     * Generic 32-bit unary operation.  Provide an "instr" line that
3501     * specifies an instruction that performs "result = op r0".
3502     * This could be an ARM instruction or a function call.
3503     *
3504     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3505     *      int-to-byte, int-to-char, int-to-short
3506     */
3507    /* unop vA, vB */
3508    mov     r3, rINST, lsr #12          @ r3<- B
3509    mov     r9, rINST, lsr #8           @ r9<- A+
3510    GET_VREG(r0, r3)                    @ r0<- vB
3511    and     r9, r9, #15
3512                               @ optional op; may set condition codes
3513    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3514    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3515    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3516    SET_VREG(r0, r9)                    @ vAA<- r0
3517    GOTO_OPCODE(ip)                     @ jump to next instruction
3518    /* 9-10 instructions */
3519
3520
3521/* ------------------------------ */
3522    .balign 64
3523.L_OP_NEG_DOUBLE: /* 0x80 */
3524/* File: armv5te/OP_NEG_DOUBLE.S */
3525/* File: armv5te/unopWide.S */
3526    /*
3527     * Generic 64-bit unary operation.  Provide an "instr" line that
3528     * specifies an instruction that performs "result = op r0/r1".
3529     * This could be an ARM instruction or a function call.
3530     *
3531     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3532     */
3533    /* unop vA, vB */
3534    mov     r9, rINST, lsr #8           @ r9<- A+
3535    mov     r3, rINST, lsr #12          @ r3<- B
3536    and     r9, r9, #15
3537    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3538    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3539    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3540    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3541                               @ optional op; may set condition codes
3542    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3543    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3544    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3545    GOTO_OPCODE(ip)                     @ jump to next instruction
3546    /* 12-13 instructions */
3547
3548
3549/* ------------------------------ */
3550    .balign 64
3551.L_OP_INT_TO_LONG: /* 0x81 */
3552/* File: armv5te/OP_INT_TO_LONG.S */
3553/* File: armv5te/unopWider.S */
3554    /*
3555     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3556     * that specifies an instruction that performs "result = op r0", where
3557     * "result" is a 64-bit quantity in r0/r1.
3558     *
3559     * For: int-to-long, int-to-double, float-to-long, float-to-double
3560     */
3561    /* unop vA, vB */
3562    mov     r9, rINST, lsr #8           @ r9<- A+
3563    mov     r3, rINST, lsr #12          @ r3<- B
3564    and     r9, r9, #15
3565    GET_VREG(r0, r3)                    @ r0<- vB
3566    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3567                               @ optional op; may set condition codes
3568    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3569    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3570    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3571    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3572    GOTO_OPCODE(ip)                     @ jump to next instruction
3573    /* 10-11 instructions */
3574
3575
3576/* ------------------------------ */
3577    .balign 64
3578.L_OP_INT_TO_FLOAT: /* 0x82 */
3579/* File: arm-vfp/OP_INT_TO_FLOAT.S */
3580/* File: arm-vfp/funop.S */
3581    /*
3582     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3583     * line that specifies an instruction that performs "s1 = op s0".
3584     *
3585     * for: int-to-float, float-to-int
3586     */
3587    /* unop vA, vB */
3588    mov     r3, rINST, lsr #12          @ r3<- B
3589    mov     r9, rINST, lsr #8           @ r9<- A+
3590    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3591    flds    s0, [r3]                    @ s0<- vB
3592    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3593    and     r9, r9, #15                 @ r9<- A
3594    fsitos  s1, s0                              @ s1<- op
3595    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3596    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3597    fsts    s1, [r9]                    @ vA<- s1
3598    GOTO_OPCODE(ip)                     @ jump to next instruction
3599
3600
3601/* ------------------------------ */
3602    .balign 64
3603.L_OP_INT_TO_DOUBLE: /* 0x83 */
3604/* File: arm-vfp/OP_INT_TO_DOUBLE.S */
3605/* File: arm-vfp/funopWider.S */
3606    /*
3607     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3608     * "instr" line that specifies an instruction that performs "d0 = op s0".
3609     *
3610     * For: int-to-double, float-to-double
3611     */
3612    /* unop vA, vB */
3613    mov     r3, rINST, lsr #12          @ r3<- B
3614    mov     r9, rINST, lsr #8           @ r9<- A+
3615    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3616    flds    s0, [r3]                    @ s0<- vB
3617    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3618    and     r9, r9, #15                 @ r9<- A
3619    fsitod  d0, s0                              @ d0<- op
3620    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3621    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3622    fstd    d0, [r9]                    @ vA<- d0
3623    GOTO_OPCODE(ip)                     @ jump to next instruction
3624
3625
3626/* ------------------------------ */
3627    .balign 64
3628.L_OP_LONG_TO_INT: /* 0x84 */
3629/* File: armv5te/OP_LONG_TO_INT.S */
3630/* we ignore the high word, making this equivalent to a 32-bit reg move */
3631/* File: armv5te/OP_MOVE.S */
3632    /* for move, move-object, long-to-int */
3633    /* op vA, vB */
3634    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3635    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3636    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3637    GET_VREG(r2, r1)                    @ r2<- fp[B]
3638    and     r0, r0, #15
3639    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3640    SET_VREG(r2, r0)                    @ fp[A]<- r2
3641    GOTO_OPCODE(ip)                     @ execute next instruction
3642
3643
3644/* ------------------------------ */
3645    .balign 64
3646.L_OP_LONG_TO_FLOAT: /* 0x85 */
3647/* File: armv5te/OP_LONG_TO_FLOAT.S */
3648/* File: armv5te/unopNarrower.S */
3649    /*
3650     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3651     * that specifies an instruction that performs "result = op r0/r1", where
3652     * "result" is a 32-bit quantity in r0.
3653     *
3654     * For: long-to-float, double-to-int, double-to-float
3655     *
3656     * (This would work for long-to-int, but that instruction is actually
3657     * an exact match for OP_MOVE.)
3658     */
3659    /* unop vA, vB */
3660    mov     r3, rINST, lsr #12          @ r3<- B
3661    mov     r9, rINST, lsr #8           @ r9<- A+
3662    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3663    and     r9, r9, #15
3664    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3665    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3666                               @ optional op; may set condition codes
3667    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3668    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3669    SET_VREG(r0, r9)                    @ vA<- r0
3670    GOTO_OPCODE(ip)                     @ jump to next instruction
3671    /* 10-11 instructions */
3672
3673
3674/* ------------------------------ */
3675    .balign 64
3676.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3677/* File: armv5te/OP_LONG_TO_DOUBLE.S */
3678/* File: armv5te/unopWide.S */
3679    /*
3680     * Generic 64-bit unary operation.  Provide an "instr" line that
3681     * specifies an instruction that performs "result = op r0/r1".
3682     * This could be an ARM instruction or a function call.
3683     *
3684     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3685     */
3686    /* unop vA, vB */
3687    mov     r9, rINST, lsr #8           @ r9<- A+
3688    mov     r3, rINST, lsr #12          @ r3<- B
3689    and     r9, r9, #15
3690    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3691    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3692    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3693    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3694                               @ optional op; may set condition codes
3695    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3697    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3698    GOTO_OPCODE(ip)                     @ jump to next instruction
3699    /* 12-13 instructions */
3700
3701
3702/* ------------------------------ */
3703    .balign 64
3704.L_OP_FLOAT_TO_INT: /* 0x87 */
3705/* File: arm-vfp/OP_FLOAT_TO_INT.S */
3706/* File: arm-vfp/funop.S */
3707    /*
3708     * Generic 32-bit unary floating-point operation.  Provide an "instr"
3709     * line that specifies an instruction that performs "s1 = op s0".
3710     *
3711     * for: int-to-float, float-to-int
3712     */
3713    /* unop vA, vB */
3714    mov     r3, rINST, lsr #12          @ r3<- B
3715    mov     r9, rINST, lsr #8           @ r9<- A+
3716    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3717    flds    s0, [r3]                    @ s0<- vB
3718    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3719    and     r9, r9, #15                 @ r9<- A
3720    ftosizs s1, s0                              @ s1<- op
3721    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3722    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3723    fsts    s1, [r9]                    @ vA<- s1
3724    GOTO_OPCODE(ip)                     @ jump to next instruction
3725
3726
3727/* ------------------------------ */
3728    .balign 64
3729.L_OP_FLOAT_TO_LONG: /* 0x88 */
3730/* File: armv5te/OP_FLOAT_TO_LONG.S */
3731@include "armv5te/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3732/* File: armv5te/unopWider.S */
3733    /*
3734     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3735     * that specifies an instruction that performs "result = op r0", where
3736     * "result" is a 64-bit quantity in r0/r1.
3737     *
3738     * For: int-to-long, int-to-double, float-to-long, float-to-double
3739     */
3740    /* unop vA, vB */
3741    mov     r9, rINST, lsr #8           @ r9<- A+
3742    mov     r3, rINST, lsr #12          @ r3<- B
3743    and     r9, r9, #15
3744    GET_VREG(r0, r3)                    @ r0<- vB
3745    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3746                               @ optional op; may set condition codes
3747    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3748    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3749    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3750    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3751    GOTO_OPCODE(ip)                     @ jump to next instruction
3752    /* 10-11 instructions */
3753
3754
3755
3756/* ------------------------------ */
3757    .balign 64
3758.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3759/* File: arm-vfp/OP_FLOAT_TO_DOUBLE.S */
3760/* File: arm-vfp/funopWider.S */
3761    /*
3762     * Generic 32bit-to-64bit floating point unary operation.  Provide an
3763     * "instr" line that specifies an instruction that performs "d0 = op s0".
3764     *
3765     * For: int-to-double, float-to-double
3766     */
3767    /* unop vA, vB */
3768    mov     r3, rINST, lsr #12          @ r3<- B
3769    mov     r9, rINST, lsr #8           @ r9<- A+
3770    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3771    flds    s0, [r3]                    @ s0<- vB
3772    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3773    and     r9, r9, #15                 @ r9<- A
3774    fcvtds  d0, s0                              @ d0<- op
3775    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3776    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3777    fstd    d0, [r9]                    @ vA<- d0
3778    GOTO_OPCODE(ip)                     @ jump to next instruction
3779
3780
3781/* ------------------------------ */
3782    .balign 64
3783.L_OP_DOUBLE_TO_INT: /* 0x8a */
3784/* File: arm-vfp/OP_DOUBLE_TO_INT.S */
3785/* File: arm-vfp/funopNarrower.S */
3786    /*
3787     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3788     * "instr" line that specifies an instruction that performs "s0 = op d0".
3789     *
3790     * For: double-to-int, double-to-float
3791     */
3792    /* unop vA, vB */
3793    mov     r3, rINST, lsr #12          @ r3<- B
3794    mov     r9, rINST, lsr #8           @ r9<- A+
3795    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3796    fldd    d0, [r3]                    @ d0<- vB
3797    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3798    and     r9, r9, #15                 @ r9<- A
3799    ftosizd  s0, d0                              @ s0<- op
3800    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3801    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3802    fsts    s0, [r9]                    @ vA<- s0
3803    GOTO_OPCODE(ip)                     @ jump to next instruction
3804
3805
3806/* ------------------------------ */
3807    .balign 64
3808.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3809/* File: armv5te/OP_DOUBLE_TO_LONG.S */
3810@include "armv5te/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
3811/* File: armv5te/unopWide.S */
3812    /*
3813     * Generic 64-bit unary operation.  Provide an "instr" line that
3814     * specifies an instruction that performs "result = op r0/r1".
3815     * This could be an ARM instruction or a function call.
3816     *
3817     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3818     */
3819    /* unop vA, vB */
3820    mov     r9, rINST, lsr #8           @ r9<- A+
3821    mov     r3, rINST, lsr #12          @ r3<- B
3822    and     r9, r9, #15
3823    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3824    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3825    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3826    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3827                               @ optional op; may set condition codes
3828    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
3829    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3830    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3831    GOTO_OPCODE(ip)                     @ jump to next instruction
3832    /* 12-13 instructions */
3833
3834
3835
3836/* ------------------------------ */
3837    .balign 64
3838.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3839/* File: arm-vfp/OP_DOUBLE_TO_FLOAT.S */
3840/* File: arm-vfp/funopNarrower.S */
3841    /*
3842     * Generic 64bit-to-32bit unary floating point operation.  Provide an
3843     * "instr" line that specifies an instruction that performs "s0 = op d0".
3844     *
3845     * For: double-to-int, double-to-float
3846     */
3847    /* unop vA, vB */
3848    mov     r3, rINST, lsr #12          @ r3<- B
3849    mov     r9, rINST, lsr #8           @ r9<- A+
3850    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
3851    fldd    d0, [r3]                    @ d0<- vB
3852    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3853    and     r9, r9, #15                 @ r9<- A
3854    fcvtsd  s0, d0                              @ s0<- op
3855    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3856    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
3857    fsts    s0, [r9]                    @ vA<- s0
3858    GOTO_OPCODE(ip)                     @ jump to next instruction
3859
3860
3861/* ------------------------------ */
3862    .balign 64
3863.L_OP_INT_TO_BYTE: /* 0x8d */
3864/* File: armv5te/OP_INT_TO_BYTE.S */
3865/* File: armv5te/unop.S */
3866    /*
3867     * Generic 32-bit unary operation.  Provide an "instr" line that
3868     * specifies an instruction that performs "result = op r0".
3869     * This could be an ARM instruction or a function call.
3870     *
3871     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3872     *      int-to-byte, int-to-char, int-to-short
3873     */
3874    /* unop vA, vB */
3875    mov     r3, rINST, lsr #12          @ r3<- B
3876    mov     r9, rINST, lsr #8           @ r9<- A+
3877    GET_VREG(r0, r3)                    @ r0<- vB
3878    and     r9, r9, #15
3879    mov     r0, r0, asl #24                           @ optional op; may set condition codes
3880    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3881    mov     r0, r0, asr #24                              @ r0<- op, r0-r3 changed
3882    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3883    SET_VREG(r0, r9)                    @ vAA<- r0
3884    GOTO_OPCODE(ip)                     @ jump to next instruction
3885    /* 9-10 instructions */
3886
3887
3888/* ------------------------------ */
3889    .balign 64
3890.L_OP_INT_TO_CHAR: /* 0x8e */
3891/* File: armv5te/OP_INT_TO_CHAR.S */
3892/* File: armv5te/unop.S */
3893    /*
3894     * Generic 32-bit unary operation.  Provide an "instr" line that
3895     * specifies an instruction that performs "result = op r0".
3896     * This could be an ARM instruction or a function call.
3897     *
3898     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3899     *      int-to-byte, int-to-char, int-to-short
3900     */
3901    /* unop vA, vB */
3902    mov     r3, rINST, lsr #12          @ r3<- B
3903    mov     r9, rINST, lsr #8           @ r9<- A+
3904    GET_VREG(r0, r3)                    @ r0<- vB
3905    and     r9, r9, #15
3906    mov     r0, r0, asl #16                           @ optional op; may set condition codes
3907    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3908    mov     r0, r0, lsr #16                              @ r0<- op, r0-r3 changed
3909    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3910    SET_VREG(r0, r9)                    @ vAA<- r0
3911    GOTO_OPCODE(ip)                     @ jump to next instruction
3912    /* 9-10 instructions */
3913
3914
3915/* ------------------------------ */
3916    .balign 64
3917.L_OP_INT_TO_SHORT: /* 0x8f */
3918/* File: armv5te/OP_INT_TO_SHORT.S */
3919/* File: armv5te/unop.S */
3920    /*
3921     * Generic 32-bit unary operation.  Provide an "instr" line that
3922     * specifies an instruction that performs "result = op r0".
3923     * This could be an ARM instruction or a function call.
3924     *
3925     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3926     *      int-to-byte, int-to-char, int-to-short
3927     */
3928    /* unop vA, vB */
3929    mov     r3, rINST, lsr #12          @ r3<- B
3930    mov     r9, rINST, lsr #8           @ r9<- A+
3931    GET_VREG(r0, r3)                    @ r0<- vB
3932    and     r9, r9, #15
3933    mov     r0, r0, asl #16                           @ optional op; may set condition codes
3934    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3935    mov     r0, r0, asr #16                              @ r0<- op, r0-r3 changed
3936    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3937    SET_VREG(r0, r9)                    @ vAA<- r0
3938    GOTO_OPCODE(ip)                     @ jump to next instruction
3939    /* 9-10 instructions */
3940
3941
3942/* ------------------------------ */
3943    .balign 64
3944.L_OP_ADD_INT: /* 0x90 */
3945/* File: armv5te/OP_ADD_INT.S */
3946/* File: armv5te/binop.S */
3947    /*
3948     * Generic 32-bit binary operation.  Provide an "instr" line that
3949     * specifies an instruction that performs "result = r0 op r1".
3950     * This could be an ARM instruction or a function call.  (If the result
3951     * comes back in a register other than r0, you can override "result".)
3952     *
3953     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3954     * vCC (r1).  Useful for integer division and modulus.  Note that we
3955     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3956     * handles it correctly.
3957     *
3958     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
3959     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
3960     *      mul-float, div-float, rem-float
3961     */
3962    /* binop vAA, vBB, vCC */
3963    FETCH(r0, 1)                        @ r0<- CCBB
3964    mov     r9, rINST, lsr #8           @ r9<- AA
3965    mov     r3, r0, lsr #8              @ r3<- CC
3966    and     r2, r0, #255                @ r2<- BB
3967    GET_VREG(r1, r3)                    @ r1<- vCC
3968    GET_VREG(r0, r2)                    @ r0<- vBB
3969    .if 0
3970    cmp     r1, #0                      @ is second operand zero?
3971    beq     common_errDivideByZero
3972    .endif
3973
3974    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3975                               @ optional op; may set condition codes
3976    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
3977    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3978    SET_VREG(r0, r9)               @ vAA<- r0
3979    GOTO_OPCODE(ip)                     @ jump to next instruction
3980    /* 11-14 instructions */
3981
3982
3983/* ------------------------------ */
3984    .balign 64
3985.L_OP_SUB_INT: /* 0x91 */
3986/* File: armv5te/OP_SUB_INT.S */
3987/* File: armv5te/binop.S */
3988    /*
3989     * Generic 32-bit binary operation.  Provide an "instr" line that
3990     * specifies an instruction that performs "result = r0 op r1".
3991     * This could be an ARM instruction or a function call.  (If the result
3992     * comes back in a register other than r0, you can override "result".)
3993     *
3994     * If "chkzero" is set to 1, we perform a divide-by-zero check on
3995     * vCC (r1).  Useful for integer division and modulus.  Note that we
3996     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
3997     * handles it correctly.
3998     *
3999     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4000     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4001     *      mul-float, div-float, rem-float
4002     */
4003    /* binop vAA, vBB, vCC */
4004    FETCH(r0, 1)                        @ r0<- CCBB
4005    mov     r9, rINST, lsr #8           @ r9<- AA
4006    mov     r3, r0, lsr #8              @ r3<- CC
4007    and     r2, r0, #255                @ r2<- BB
4008    GET_VREG(r1, r3)                    @ r1<- vCC
4009    GET_VREG(r0, r2)                    @ r0<- vBB
4010    .if 0
4011    cmp     r1, #0                      @ is second operand zero?
4012    beq     common_errDivideByZero
4013    .endif
4014
4015    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4016                               @ optional op; may set condition codes
4017    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4018    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4019    SET_VREG(r0, r9)               @ vAA<- r0
4020    GOTO_OPCODE(ip)                     @ jump to next instruction
4021    /* 11-14 instructions */
4022
4023
4024/* ------------------------------ */
4025    .balign 64
4026.L_OP_MUL_INT: /* 0x92 */
4027/* File: armv5te/OP_MUL_INT.S */
4028/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4029/* File: armv5te/binop.S */
4030    /*
4031     * Generic 32-bit binary operation.  Provide an "instr" line that
4032     * specifies an instruction that performs "result = r0 op r1".
4033     * This could be an ARM instruction or a function call.  (If the result
4034     * comes back in a register other than r0, you can override "result".)
4035     *
4036     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4037     * vCC (r1).  Useful for integer division and modulus.  Note that we
4038     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4039     * handles it correctly.
4040     *
4041     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4042     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4043     *      mul-float, div-float, rem-float
4044     */
4045    /* binop vAA, vBB, vCC */
4046    FETCH(r0, 1)                        @ r0<- CCBB
4047    mov     r9, rINST, lsr #8           @ r9<- AA
4048    mov     r3, r0, lsr #8              @ r3<- CC
4049    and     r2, r0, #255                @ r2<- BB
4050    GET_VREG(r1, r3)                    @ r1<- vCC
4051    GET_VREG(r0, r2)                    @ r0<- vBB
4052    .if 0
4053    cmp     r1, #0                      @ is second operand zero?
4054    beq     common_errDivideByZero
4055    .endif
4056
4057    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4058                               @ optional op; may set condition codes
4059    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4060    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4061    SET_VREG(r0, r9)               @ vAA<- r0
4062    GOTO_OPCODE(ip)                     @ jump to next instruction
4063    /* 11-14 instructions */
4064
4065
4066/* ------------------------------ */
4067    .balign 64
4068.L_OP_DIV_INT: /* 0x93 */
4069/* File: armv5te/OP_DIV_INT.S */
4070/* File: armv5te/binop.S */
4071    /*
4072     * Generic 32-bit binary operation.  Provide an "instr" line that
4073     * specifies an instruction that performs "result = r0 op r1".
4074     * This could be an ARM instruction or a function call.  (If the result
4075     * comes back in a register other than r0, you can override "result".)
4076     *
4077     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4078     * vCC (r1).  Useful for integer division and modulus.  Note that we
4079     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4080     * handles it correctly.
4081     *
4082     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4083     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4084     *      mul-float, div-float, rem-float
4085     */
4086    /* binop vAA, vBB, vCC */
4087    FETCH(r0, 1)                        @ r0<- CCBB
4088    mov     r9, rINST, lsr #8           @ r9<- AA
4089    mov     r3, r0, lsr #8              @ r3<- CC
4090    and     r2, r0, #255                @ r2<- BB
4091    GET_VREG(r1, r3)                    @ r1<- vCC
4092    GET_VREG(r0, r2)                    @ r0<- vBB
4093    .if 1
4094    cmp     r1, #0                      @ is second operand zero?
4095    beq     common_errDivideByZero
4096    .endif
4097
4098    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4099                               @ optional op; may set condition codes
4100    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4101    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4102    SET_VREG(r0, r9)               @ vAA<- r0
4103    GOTO_OPCODE(ip)                     @ jump to next instruction
4104    /* 11-14 instructions */
4105
4106
4107/* ------------------------------ */
4108    .balign 64
4109.L_OP_REM_INT: /* 0x94 */
4110/* File: armv5te/OP_REM_INT.S */
4111/* idivmod returns quotient in r0 and remainder in r1 */
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 1
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    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4143    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4144    SET_VREG(r1, r9)               @ vAA<- r1
4145    GOTO_OPCODE(ip)                     @ jump to next instruction
4146    /* 11-14 instructions */
4147
4148
4149/* ------------------------------ */
4150    .balign 64
4151.L_OP_AND_INT: /* 0x95 */
4152/* File: armv5te/OP_AND_INT.S */
4153/* File: armv5te/binop.S */
4154    /*
4155     * Generic 32-bit binary operation.  Provide an "instr" line that
4156     * specifies an instruction that performs "result = r0 op r1".
4157     * This could be an ARM instruction or a function call.  (If the result
4158     * comes back in a register other than r0, you can override "result".)
4159     *
4160     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4161     * vCC (r1).  Useful for integer division and modulus.  Note that we
4162     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4163     * handles it correctly.
4164     *
4165     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4166     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4167     *      mul-float, div-float, rem-float
4168     */
4169    /* binop vAA, vBB, vCC */
4170    FETCH(r0, 1)                        @ r0<- CCBB
4171    mov     r9, rINST, lsr #8           @ r9<- AA
4172    mov     r3, r0, lsr #8              @ r3<- CC
4173    and     r2, r0, #255                @ r2<- BB
4174    GET_VREG(r1, r3)                    @ r1<- vCC
4175    GET_VREG(r0, r2)                    @ r0<- vBB
4176    .if 0
4177    cmp     r1, #0                      @ is second operand zero?
4178    beq     common_errDivideByZero
4179    .endif
4180
4181    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4182                               @ optional op; may set condition codes
4183    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4184    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4185    SET_VREG(r0, r9)               @ vAA<- r0
4186    GOTO_OPCODE(ip)                     @ jump to next instruction
4187    /* 11-14 instructions */
4188
4189
4190/* ------------------------------ */
4191    .balign 64
4192.L_OP_OR_INT: /* 0x96 */
4193/* File: armv5te/OP_OR_INT.S */
4194/* File: armv5te/binop.S */
4195    /*
4196     * Generic 32-bit binary operation.  Provide an "instr" line that
4197     * specifies an instruction that performs "result = r0 op r1".
4198     * This could be an ARM instruction or a function call.  (If the result
4199     * comes back in a register other than r0, you can override "result".)
4200     *
4201     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4202     * vCC (r1).  Useful for integer division and modulus.  Note that we
4203     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4204     * handles it correctly.
4205     *
4206     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4207     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4208     *      mul-float, div-float, rem-float
4209     */
4210    /* binop vAA, vBB, vCC */
4211    FETCH(r0, 1)                        @ r0<- CCBB
4212    mov     r9, rINST, lsr #8           @ r9<- AA
4213    mov     r3, r0, lsr #8              @ r3<- CC
4214    and     r2, r0, #255                @ r2<- BB
4215    GET_VREG(r1, r3)                    @ r1<- vCC
4216    GET_VREG(r0, r2)                    @ r0<- vBB
4217    .if 0
4218    cmp     r1, #0                      @ is second operand zero?
4219    beq     common_errDivideByZero
4220    .endif
4221
4222    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4223                               @ optional op; may set condition codes
4224    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4225    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4226    SET_VREG(r0, r9)               @ vAA<- r0
4227    GOTO_OPCODE(ip)                     @ jump to next instruction
4228    /* 11-14 instructions */
4229
4230
4231/* ------------------------------ */
4232    .balign 64
4233.L_OP_XOR_INT: /* 0x97 */
4234/* File: armv5te/OP_XOR_INT.S */
4235/* File: armv5te/binop.S */
4236    /*
4237     * Generic 32-bit binary operation.  Provide an "instr" line that
4238     * specifies an instruction that performs "result = r0 op r1".
4239     * This could be an ARM instruction or a function call.  (If the result
4240     * comes back in a register other than r0, you can override "result".)
4241     *
4242     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4243     * vCC (r1).  Useful for integer division and modulus.  Note that we
4244     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4245     * handles it correctly.
4246     *
4247     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4248     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4249     *      mul-float, div-float, rem-float
4250     */
4251    /* binop vAA, vBB, vCC */
4252    FETCH(r0, 1)                        @ r0<- CCBB
4253    mov     r9, rINST, lsr #8           @ r9<- AA
4254    mov     r3, r0, lsr #8              @ r3<- CC
4255    and     r2, r0, #255                @ r2<- BB
4256    GET_VREG(r1, r3)                    @ r1<- vCC
4257    GET_VREG(r0, r2)                    @ r0<- vBB
4258    .if 0
4259    cmp     r1, #0                      @ is second operand zero?
4260    beq     common_errDivideByZero
4261    .endif
4262
4263    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4264                               @ optional op; may set condition codes
4265    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4266    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4267    SET_VREG(r0, r9)               @ vAA<- r0
4268    GOTO_OPCODE(ip)                     @ jump to next instruction
4269    /* 11-14 instructions */
4270
4271
4272/* ------------------------------ */
4273    .balign 64
4274.L_OP_SHL_INT: /* 0x98 */
4275/* File: armv5te/OP_SHL_INT.S */
4276/* File: armv5te/binop.S */
4277    /*
4278     * Generic 32-bit binary operation.  Provide an "instr" line that
4279     * specifies an instruction that performs "result = r0 op r1".
4280     * This could be an ARM instruction or a function call.  (If the result
4281     * comes back in a register other than r0, you can override "result".)
4282     *
4283     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4284     * vCC (r1).  Useful for integer division and modulus.  Note that we
4285     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4286     * handles it correctly.
4287     *
4288     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4289     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4290     *      mul-float, div-float, rem-float
4291     */
4292    /* binop vAA, vBB, vCC */
4293    FETCH(r0, 1)                        @ r0<- CCBB
4294    mov     r9, rINST, lsr #8           @ r9<- AA
4295    mov     r3, r0, lsr #8              @ r3<- CC
4296    and     r2, r0, #255                @ r2<- BB
4297    GET_VREG(r1, r3)                    @ r1<- vCC
4298    GET_VREG(r0, r2)                    @ r0<- vBB
4299    .if 0
4300    cmp     r1, #0                      @ is second operand zero?
4301    beq     common_errDivideByZero
4302    .endif
4303
4304    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4305    and     r1, r1, #31                           @ optional op; may set condition codes
4306    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4307    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4308    SET_VREG(r0, r9)               @ vAA<- r0
4309    GOTO_OPCODE(ip)                     @ jump to next instruction
4310    /* 11-14 instructions */
4311
4312
4313/* ------------------------------ */
4314    .balign 64
4315.L_OP_SHR_INT: /* 0x99 */
4316/* File: armv5te/OP_SHR_INT.S */
4317/* File: armv5te/binop.S */
4318    /*
4319     * Generic 32-bit binary operation.  Provide an "instr" line that
4320     * specifies an instruction that performs "result = r0 op r1".
4321     * This could be an ARM instruction or a function call.  (If the result
4322     * comes back in a register other than r0, you can override "result".)
4323     *
4324     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4325     * vCC (r1).  Useful for integer division and modulus.  Note that we
4326     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4327     * handles it correctly.
4328     *
4329     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4330     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4331     *      mul-float, div-float, rem-float
4332     */
4333    /* binop vAA, vBB, vCC */
4334    FETCH(r0, 1)                        @ r0<- CCBB
4335    mov     r9, rINST, lsr #8           @ r9<- AA
4336    mov     r3, r0, lsr #8              @ r3<- CC
4337    and     r2, r0, #255                @ r2<- BB
4338    GET_VREG(r1, r3)                    @ r1<- vCC
4339    GET_VREG(r0, r2)                    @ r0<- vBB
4340    .if 0
4341    cmp     r1, #0                      @ is second operand zero?
4342    beq     common_errDivideByZero
4343    .endif
4344
4345    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4346    and     r1, r1, #31                           @ optional op; may set condition codes
4347    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4348    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4349    SET_VREG(r0, r9)               @ vAA<- r0
4350    GOTO_OPCODE(ip)                     @ jump to next instruction
4351    /* 11-14 instructions */
4352
4353
4354/* ------------------------------ */
4355    .balign 64
4356.L_OP_USHR_INT: /* 0x9a */
4357/* File: armv5te/OP_USHR_INT.S */
4358/* File: armv5te/binop.S */
4359    /*
4360     * Generic 32-bit binary operation.  Provide an "instr" line that
4361     * specifies an instruction that performs "result = r0 op r1".
4362     * This could be an ARM instruction or a function call.  (If the result
4363     * comes back in a register other than r0, you can override "result".)
4364     *
4365     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4366     * vCC (r1).  Useful for integer division and modulus.  Note that we
4367     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4368     * handles it correctly.
4369     *
4370     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4371     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4372     *      mul-float, div-float, rem-float
4373     */
4374    /* binop vAA, vBB, vCC */
4375    FETCH(r0, 1)                        @ r0<- CCBB
4376    mov     r9, rINST, lsr #8           @ r9<- AA
4377    mov     r3, r0, lsr #8              @ r3<- CC
4378    and     r2, r0, #255                @ r2<- BB
4379    GET_VREG(r1, r3)                    @ r1<- vCC
4380    GET_VREG(r0, r2)                    @ r0<- vBB
4381    .if 0
4382    cmp     r1, #0                      @ is second operand zero?
4383    beq     common_errDivideByZero
4384    .endif
4385
4386    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4387    and     r1, r1, #31                           @ optional op; may set condition codes
4388    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4389    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4390    SET_VREG(r0, r9)               @ vAA<- r0
4391    GOTO_OPCODE(ip)                     @ jump to next instruction
4392    /* 11-14 instructions */
4393
4394
4395/* ------------------------------ */
4396    .balign 64
4397.L_OP_ADD_LONG: /* 0x9b */
4398/* File: armv5te/OP_ADD_LONG.S */
4399/* File: armv5te/binopWide.S */
4400    /*
4401     * Generic 64-bit binary operation.  Provide an "instr" line that
4402     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4403     * This could be an ARM instruction or a function call.  (If the result
4404     * comes back in a register other than r0, you can override "result".)
4405     *
4406     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4407     * vCC (r1).  Useful for integer division and modulus.
4408     *
4409     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4410     *      xor-long, add-double, sub-double, mul-double, div-double,
4411     *      rem-double
4412     *
4413     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4414     */
4415    /* binop vAA, vBB, vCC */
4416    FETCH(r0, 1)                        @ r0<- CCBB
4417    mov     r9, rINST, lsr #8           @ r9<- AA
4418    and     r2, r0, #255                @ r2<- BB
4419    mov     r3, r0, lsr #8              @ r3<- CC
4420    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4421    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4422    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4423    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4424    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4425    .if 0
4426    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4427    beq     common_errDivideByZero
4428    .endif
4429    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4430
4431    adds    r0, r0, r2                           @ optional op; may set condition codes
4432    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4433    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4434    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4435    GOTO_OPCODE(ip)                     @ jump to next instruction
4436    /* 14-17 instructions */
4437
4438
4439/* ------------------------------ */
4440    .balign 64
4441.L_OP_SUB_LONG: /* 0x9c */
4442/* File: armv5te/OP_SUB_LONG.S */
4443/* File: armv5te/binopWide.S */
4444    /*
4445     * Generic 64-bit binary operation.  Provide an "instr" line that
4446     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4447     * This could be an ARM instruction or a function call.  (If the result
4448     * comes back in a register other than r0, you can override "result".)
4449     *
4450     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4451     * vCC (r1).  Useful for integer division and modulus.
4452     *
4453     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4454     *      xor-long, add-double, sub-double, mul-double, div-double,
4455     *      rem-double
4456     *
4457     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4458     */
4459    /* binop vAA, vBB, vCC */
4460    FETCH(r0, 1)                        @ r0<- CCBB
4461    mov     r9, rINST, lsr #8           @ r9<- AA
4462    and     r2, r0, #255                @ r2<- BB
4463    mov     r3, r0, lsr #8              @ r3<- CC
4464    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4465    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4466    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4467    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4468    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4469    .if 0
4470    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4471    beq     common_errDivideByZero
4472    .endif
4473    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4474
4475    subs    r0, r0, r2                           @ optional op; may set condition codes
4476    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4477    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4478    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4479    GOTO_OPCODE(ip)                     @ jump to next instruction
4480    /* 14-17 instructions */
4481
4482
4483/* ------------------------------ */
4484    .balign 64
4485.L_OP_MUL_LONG: /* 0x9d */
4486/* File: armv5te/OP_MUL_LONG.S */
4487    /*
4488     * Signed 64-bit integer multiply.
4489     *
4490     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4491     *        WX
4492     *      x YZ
4493     *  --------
4494     *     ZW ZX
4495     *  YW YX
4496     *
4497     * The low word of the result holds ZX, the high word holds
4498     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4499     * it doesn't fit in the low 64 bits.
4500     *
4501     * Unlike most ARM math operations, multiply instructions have
4502     * restrictions on using the same register more than once (Rd and Rm
4503     * cannot be the same).
4504     */
4505    /* mul-long vAA, vBB, vCC */
4506    FETCH(r0, 1)                        @ r0<- CCBB
4507    and     r2, r0, #255                @ r2<- BB
4508    mov     r3, r0, lsr #8              @ r3<- CC
4509    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4510    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4511    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4512    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4513    mul     ip, r2, r1                  @  ip<- ZxW
4514    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4515    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4516    mov     r0, rINST, lsr #8           @ r0<- AA
4517    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4518    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4519    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4520    b       .LOP_MUL_LONG_finish
4521
4522/* ------------------------------ */
4523    .balign 64
4524.L_OP_DIV_LONG: /* 0x9e */
4525/* File: armv5te/OP_DIV_LONG.S */
4526/* File: armv5te/binopWide.S */
4527    /*
4528     * Generic 64-bit binary operation.  Provide an "instr" line that
4529     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4530     * This could be an ARM instruction or a function call.  (If the result
4531     * comes back in a register other than r0, you can override "result".)
4532     *
4533     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4534     * vCC (r1).  Useful for integer division and modulus.
4535     *
4536     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4537     *      xor-long, add-double, sub-double, mul-double, div-double,
4538     *      rem-double
4539     *
4540     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4541     */
4542    /* binop vAA, vBB, vCC */
4543    FETCH(r0, 1)                        @ r0<- CCBB
4544    mov     r9, rINST, lsr #8           @ r9<- AA
4545    and     r2, r0, #255                @ r2<- BB
4546    mov     r3, r0, lsr #8              @ r3<- CC
4547    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4548    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4549    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4550    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4551    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4552    .if 1
4553    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4554    beq     common_errDivideByZero
4555    .endif
4556    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4557
4558                               @ optional op; may set condition codes
4559    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4560    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4561    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4562    GOTO_OPCODE(ip)                     @ jump to next instruction
4563    /* 14-17 instructions */
4564
4565
4566/* ------------------------------ */
4567    .balign 64
4568.L_OP_REM_LONG: /* 0x9f */
4569/* File: armv5te/OP_REM_LONG.S */
4570/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4571/* File: armv5te/binopWide.S */
4572    /*
4573     * Generic 64-bit binary operation.  Provide an "instr" line that
4574     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4575     * This could be an ARM instruction or a function call.  (If the result
4576     * comes back in a register other than r0, you can override "result".)
4577     *
4578     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4579     * vCC (r1).  Useful for integer division and modulus.
4580     *
4581     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4582     *      xor-long, add-double, sub-double, mul-double, div-double,
4583     *      rem-double
4584     *
4585     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4586     */
4587    /* binop vAA, vBB, vCC */
4588    FETCH(r0, 1)                        @ r0<- CCBB
4589    mov     r9, rINST, lsr #8           @ r9<- AA
4590    and     r2, r0, #255                @ r2<- BB
4591    mov     r3, r0, lsr #8              @ r3<- CC
4592    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4593    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4594    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4595    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4596    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4597    .if 1
4598    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4599    beq     common_errDivideByZero
4600    .endif
4601    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4602
4603                               @ optional op; may set condition codes
4604    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4605    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4606    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4607    GOTO_OPCODE(ip)                     @ jump to next instruction
4608    /* 14-17 instructions */
4609
4610
4611/* ------------------------------ */
4612    .balign 64
4613.L_OP_AND_LONG: /* 0xa0 */
4614/* File: armv5te/OP_AND_LONG.S */
4615/* File: armv5te/binopWide.S */
4616    /*
4617     * Generic 64-bit binary operation.  Provide an "instr" line that
4618     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4619     * This could be an ARM instruction or a function call.  (If the result
4620     * comes back in a register other than r0, you can override "result".)
4621     *
4622     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4623     * vCC (r1).  Useful for integer division and modulus.
4624     *
4625     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4626     *      xor-long, add-double, sub-double, mul-double, div-double,
4627     *      rem-double
4628     *
4629     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4630     */
4631    /* binop vAA, vBB, vCC */
4632    FETCH(r0, 1)                        @ r0<- CCBB
4633    mov     r9, rINST, lsr #8           @ r9<- AA
4634    and     r2, r0, #255                @ r2<- BB
4635    mov     r3, r0, lsr #8              @ r3<- CC
4636    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4637    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4638    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4639    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4640    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4641    .if 0
4642    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4643    beq     common_errDivideByZero
4644    .endif
4645    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4646
4647    and     r0, r0, r2                           @ optional op; may set condition codes
4648    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4649    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4650    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4651    GOTO_OPCODE(ip)                     @ jump to next instruction
4652    /* 14-17 instructions */
4653
4654
4655/* ------------------------------ */
4656    .balign 64
4657.L_OP_OR_LONG: /* 0xa1 */
4658/* File: armv5te/OP_OR_LONG.S */
4659/* File: armv5te/binopWide.S */
4660    /*
4661     * Generic 64-bit binary operation.  Provide an "instr" line that
4662     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4663     * This could be an ARM instruction or a function call.  (If the result
4664     * comes back in a register other than r0, you can override "result".)
4665     *
4666     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4667     * vCC (r1).  Useful for integer division and modulus.
4668     *
4669     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4670     *      xor-long, add-double, sub-double, mul-double, div-double,
4671     *      rem-double
4672     *
4673     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4674     */
4675    /* binop vAA, vBB, vCC */
4676    FETCH(r0, 1)                        @ r0<- CCBB
4677    mov     r9, rINST, lsr #8           @ r9<- AA
4678    and     r2, r0, #255                @ r2<- BB
4679    mov     r3, r0, lsr #8              @ r3<- CC
4680    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4681    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4682    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4683    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4684    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4685    .if 0
4686    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4687    beq     common_errDivideByZero
4688    .endif
4689    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4690
4691    orr     r0, r0, r2                           @ optional op; may set condition codes
4692    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4693    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4694    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4695    GOTO_OPCODE(ip)                     @ jump to next instruction
4696    /* 14-17 instructions */
4697
4698
4699/* ------------------------------ */
4700    .balign 64
4701.L_OP_XOR_LONG: /* 0xa2 */
4702/* File: armv5te/OP_XOR_LONG.S */
4703/* File: armv5te/binopWide.S */
4704    /*
4705     * Generic 64-bit binary operation.  Provide an "instr" line that
4706     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4707     * This could be an ARM instruction or a function call.  (If the result
4708     * comes back in a register other than r0, you can override "result".)
4709     *
4710     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4711     * vCC (r1).  Useful for integer division and modulus.
4712     *
4713     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4714     *      xor-long, add-double, sub-double, mul-double, div-double,
4715     *      rem-double
4716     *
4717     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4718     */
4719    /* binop vAA, vBB, vCC */
4720    FETCH(r0, 1)                        @ r0<- CCBB
4721    mov     r9, rINST, lsr #8           @ r9<- AA
4722    and     r2, r0, #255                @ r2<- BB
4723    mov     r3, r0, lsr #8              @ r3<- CC
4724    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4725    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4726    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4727    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4728    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4729    .if 0
4730    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4731    beq     common_errDivideByZero
4732    .endif
4733    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4734
4735    eor     r0, r0, r2                           @ optional op; may set condition codes
4736    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4737    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4738    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4739    GOTO_OPCODE(ip)                     @ jump to next instruction
4740    /* 14-17 instructions */
4741
4742
4743/* ------------------------------ */
4744    .balign 64
4745.L_OP_SHL_LONG: /* 0xa3 */
4746/* File: armv5te/OP_SHL_LONG.S */
4747    /*
4748     * Long integer shift.  This is different from the generic 32/64-bit
4749     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4750     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4751     * 6 bits of the shift distance.
4752     */
4753    /* shl-long vAA, vBB, vCC */
4754    FETCH(r0, 1)                        @ r0<- CCBB
4755    mov     r9, rINST, lsr #8           @ r9<- AA
4756    and     r3, r0, #255                @ r3<- BB
4757    mov     r0, r0, lsr #8              @ r0<- CC
4758    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4759    GET_VREG(r2, r0)                    @ r2<- vCC
4760    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4761    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4762    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4763
4764    mov     r1, r1, asl r2              @  r1<- r1 << r2
4765    rsb     r3, r2, #32                 @  r3<- 32 - r2
4766    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
4767    subs    ip, r2, #32                 @  ip<- r2 - 32
4768    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
4769    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4770    b       .LOP_SHL_LONG_finish
4771
4772/* ------------------------------ */
4773    .balign 64
4774.L_OP_SHR_LONG: /* 0xa4 */
4775/* File: armv5te/OP_SHR_LONG.S */
4776    /*
4777     * Long integer shift.  This is different from the generic 32/64-bit
4778     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4779     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4780     * 6 bits of the shift distance.
4781     */
4782    /* shr-long vAA, vBB, vCC */
4783    FETCH(r0, 1)                        @ r0<- CCBB
4784    mov     r9, rINST, lsr #8           @ r9<- AA
4785    and     r3, r0, #255                @ r3<- BB
4786    mov     r0, r0, lsr #8              @ r0<- CC
4787    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4788    GET_VREG(r2, r0)                    @ r2<- vCC
4789    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4790    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4791    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4792
4793    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4794    rsb     r3, r2, #32                 @  r3<- 32 - r2
4795    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4796    subs    ip, r2, #32                 @  ip<- r2 - 32
4797    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
4798    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4799    b       .LOP_SHR_LONG_finish
4800
4801/* ------------------------------ */
4802    .balign 64
4803.L_OP_USHR_LONG: /* 0xa5 */
4804/* File: armv5te/OP_USHR_LONG.S */
4805    /*
4806     * Long integer shift.  This is different from the generic 32/64-bit
4807     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4808     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4809     * 6 bits of the shift distance.
4810     */
4811    /* ushr-long vAA, vBB, vCC */
4812    FETCH(r0, 1)                        @ r0<- CCBB
4813    mov     r9, rINST, lsr #8           @ r9<- AA
4814    and     r3, r0, #255                @ r3<- BB
4815    mov     r0, r0, lsr #8              @ r0<- CC
4816    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4817    GET_VREG(r2, r0)                    @ r2<- vCC
4818    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4819    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4820    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4821
4822    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4823    rsb     r3, r2, #32                 @  r3<- 32 - r2
4824    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4825    subs    ip, r2, #32                 @  ip<- r2 - 32
4826    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
4827    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4828    b       .LOP_USHR_LONG_finish
4829
4830/* ------------------------------ */
4831    .balign 64
4832.L_OP_ADD_FLOAT: /* 0xa6 */
4833/* File: arm-vfp/OP_ADD_FLOAT.S */
4834/* File: arm-vfp/fbinop.S */
4835    /*
4836     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4837     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4838     * use the "softfp" ABI, this must be an instruction, not a function call.
4839     *
4840     * For: add-float, sub-float, mul-float, div-float
4841     */
4842    /* floatop vAA, vBB, vCC */
4843    FETCH(r0, 1)                        @ r0<- CCBB
4844    mov     r9, rINST, lsr #8           @ r9<- AA
4845    mov     r3, r0, lsr #8              @ r3<- CC
4846    and     r2, r0, #255                @ r2<- BB
4847    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4848    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4849    flds    s1, [r3]                    @ s1<- vCC
4850    flds    s0, [r2]                    @ s0<- vBB
4851
4852    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4853    fadds   s2, s0, s1                              @ s2<- op
4854    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4855    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4856    fsts    s2, [r9]                    @ vAA<- s2
4857    GOTO_OPCODE(ip)                     @ jump to next instruction
4858
4859
4860/* ------------------------------ */
4861    .balign 64
4862.L_OP_SUB_FLOAT: /* 0xa7 */
4863/* File: arm-vfp/OP_SUB_FLOAT.S */
4864/* File: arm-vfp/fbinop.S */
4865    /*
4866     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4867     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4868     * use the "softfp" ABI, this must be an instruction, not a function call.
4869     *
4870     * For: add-float, sub-float, mul-float, div-float
4871     */
4872    /* floatop vAA, vBB, vCC */
4873    FETCH(r0, 1)                        @ r0<- CCBB
4874    mov     r9, rINST, lsr #8           @ r9<- AA
4875    mov     r3, r0, lsr #8              @ r3<- CC
4876    and     r2, r0, #255                @ r2<- BB
4877    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4878    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4879    flds    s1, [r3]                    @ s1<- vCC
4880    flds    s0, [r2]                    @ s0<- vBB
4881
4882    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4883    fsubs   s2, s0, s1                              @ s2<- op
4884    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4885    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4886    fsts    s2, [r9]                    @ vAA<- s2
4887    GOTO_OPCODE(ip)                     @ jump to next instruction
4888
4889
4890/* ------------------------------ */
4891    .balign 64
4892.L_OP_MUL_FLOAT: /* 0xa8 */
4893/* File: arm-vfp/OP_MUL_FLOAT.S */
4894/* File: arm-vfp/fbinop.S */
4895    /*
4896     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4897     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4898     * use the "softfp" ABI, this must be an instruction, not a function call.
4899     *
4900     * For: add-float, sub-float, mul-float, div-float
4901     */
4902    /* floatop vAA, vBB, vCC */
4903    FETCH(r0, 1)                        @ r0<- CCBB
4904    mov     r9, rINST, lsr #8           @ r9<- AA
4905    mov     r3, r0, lsr #8              @ r3<- CC
4906    and     r2, r0, #255                @ r2<- BB
4907    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4908    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4909    flds    s1, [r3]                    @ s1<- vCC
4910    flds    s0, [r2]                    @ s0<- vBB
4911
4912    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4913    fmuls   s2, s0, s1                              @ s2<- op
4914    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4915    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4916    fsts    s2, [r9]                    @ vAA<- s2
4917    GOTO_OPCODE(ip)                     @ jump to next instruction
4918
4919
4920/* ------------------------------ */
4921    .balign 64
4922.L_OP_DIV_FLOAT: /* 0xa9 */
4923/* File: arm-vfp/OP_DIV_FLOAT.S */
4924/* File: arm-vfp/fbinop.S */
4925    /*
4926     * Generic 32-bit floating-point operation.  Provide an "instr" line that
4927     * specifies an instruction that performs "s2 = s0 op s1".  Because we
4928     * use the "softfp" ABI, this must be an instruction, not a function call.
4929     *
4930     * For: add-float, sub-float, mul-float, div-float
4931     */
4932    /* floatop vAA, vBB, vCC */
4933    FETCH(r0, 1)                        @ r0<- CCBB
4934    mov     r9, rINST, lsr #8           @ r9<- AA
4935    mov     r3, r0, lsr #8              @ r3<- CC
4936    and     r2, r0, #255                @ r2<- BB
4937    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
4938    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
4939    flds    s1, [r3]                    @ s1<- vCC
4940    flds    s0, [r2]                    @ s0<- vBB
4941
4942    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4943    fdivs   s2, s0, s1                              @ s2<- op
4944    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4945    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
4946    fsts    s2, [r9]                    @ vAA<- s2
4947    GOTO_OPCODE(ip)                     @ jump to next instruction
4948
4949
4950/* ------------------------------ */
4951    .balign 64
4952.L_OP_REM_FLOAT: /* 0xaa */
4953/* File: armv5te/OP_REM_FLOAT.S */
4954/* EABI doesn't define a float remainder function, but libm does */
4955/* File: armv5te/binop.S */
4956    /*
4957     * Generic 32-bit binary operation.  Provide an "instr" line that
4958     * specifies an instruction that performs "result = r0 op r1".
4959     * This could be an ARM instruction or a function call.  (If the result
4960     * comes back in a register other than r0, you can override "result".)
4961     *
4962     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4963     * vCC (r1).  Useful for integer division and modulus.  Note that we
4964     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4965     * handles it correctly.
4966     *
4967     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4968     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4969     *      mul-float, div-float, rem-float
4970     */
4971    /* binop vAA, vBB, vCC */
4972    FETCH(r0, 1)                        @ r0<- CCBB
4973    mov     r9, rINST, lsr #8           @ r9<- AA
4974    mov     r3, r0, lsr #8              @ r3<- CC
4975    and     r2, r0, #255                @ r2<- BB
4976    GET_VREG(r1, r3)                    @ r1<- vCC
4977    GET_VREG(r0, r2)                    @ r0<- vBB
4978    .if 0
4979    cmp     r1, #0                      @ is second operand zero?
4980    beq     common_errDivideByZero
4981    .endif
4982
4983    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4984                               @ optional op; may set condition codes
4985    bl      fmodf                              @ r0<- op, r0-r3 changed
4986    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4987    SET_VREG(r0, r9)               @ vAA<- r0
4988    GOTO_OPCODE(ip)                     @ jump to next instruction
4989    /* 11-14 instructions */
4990
4991
4992/* ------------------------------ */
4993    .balign 64
4994.L_OP_ADD_DOUBLE: /* 0xab */
4995/* File: arm-vfp/OP_ADD_DOUBLE.S */
4996/* File: arm-vfp/fbinopWide.S */
4997    /*
4998     * Generic 64-bit double-precision floating point binary operation.
4999     * Provide an "instr" line that specifies an instruction that performs
5000     * "d2 = d0 op d1".
5001     *
5002     * for: add-double, sub-double, mul-double, div-double
5003     */
5004    /* doubleop vAA, vBB, vCC */
5005    FETCH(r0, 1)                        @ r0<- CCBB
5006    mov     r9, rINST, lsr #8           @ r9<- AA
5007    mov     r3, r0, lsr #8              @ r3<- CC
5008    and     r2, r0, #255                @ r2<- BB
5009    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5010    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5011    fldd    d1, [r3]                    @ d1<- vCC
5012    fldd    d0, [r2]                    @ d0<- vBB
5013
5014    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5015    faddd   d2, d0, d1                              @ s2<- op
5016    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5017    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5018    fstd    d2, [r9]                    @ vAA<- d2
5019    GOTO_OPCODE(ip)                     @ jump to next instruction
5020
5021
5022/* ------------------------------ */
5023    .balign 64
5024.L_OP_SUB_DOUBLE: /* 0xac */
5025/* File: arm-vfp/OP_SUB_DOUBLE.S */
5026/* File: arm-vfp/fbinopWide.S */
5027    /*
5028     * Generic 64-bit double-precision floating point binary operation.
5029     * Provide an "instr" line that specifies an instruction that performs
5030     * "d2 = d0 op d1".
5031     *
5032     * for: add-double, sub-double, mul-double, div-double
5033     */
5034    /* doubleop vAA, vBB, vCC */
5035    FETCH(r0, 1)                        @ r0<- CCBB
5036    mov     r9, rINST, lsr #8           @ r9<- AA
5037    mov     r3, r0, lsr #8              @ r3<- CC
5038    and     r2, r0, #255                @ r2<- BB
5039    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5040    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5041    fldd    d1, [r3]                    @ d1<- vCC
5042    fldd    d0, [r2]                    @ d0<- vBB
5043
5044    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5045    fsubd   d2, d0, d1                              @ s2<- op
5046    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5047    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5048    fstd    d2, [r9]                    @ vAA<- d2
5049    GOTO_OPCODE(ip)                     @ jump to next instruction
5050
5051
5052/* ------------------------------ */
5053    .balign 64
5054.L_OP_MUL_DOUBLE: /* 0xad */
5055/* File: arm-vfp/OP_MUL_DOUBLE.S */
5056/* File: arm-vfp/fbinopWide.S */
5057    /*
5058     * Generic 64-bit double-precision floating point binary operation.
5059     * Provide an "instr" line that specifies an instruction that performs
5060     * "d2 = d0 op d1".
5061     *
5062     * for: add-double, sub-double, mul-double, div-double
5063     */
5064    /* doubleop vAA, vBB, vCC */
5065    FETCH(r0, 1)                        @ r0<- CCBB
5066    mov     r9, rINST, lsr #8           @ r9<- AA
5067    mov     r3, r0, lsr #8              @ r3<- CC
5068    and     r2, r0, #255                @ r2<- BB
5069    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5070    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5071    fldd    d1, [r3]                    @ d1<- vCC
5072    fldd    d0, [r2]                    @ d0<- vBB
5073
5074    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5075    fmuld   d2, d0, d1                              @ s2<- op
5076    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5077    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5078    fstd    d2, [r9]                    @ vAA<- d2
5079    GOTO_OPCODE(ip)                     @ jump to next instruction
5080
5081
5082/* ------------------------------ */
5083    .balign 64
5084.L_OP_DIV_DOUBLE: /* 0xae */
5085/* File: arm-vfp/OP_DIV_DOUBLE.S */
5086/* File: arm-vfp/fbinopWide.S */
5087    /*
5088     * Generic 64-bit double-precision floating point binary operation.
5089     * Provide an "instr" line that specifies an instruction that performs
5090     * "d2 = d0 op d1".
5091     *
5092     * for: add-double, sub-double, mul-double, div-double
5093     */
5094    /* doubleop vAA, vBB, vCC */
5095    FETCH(r0, 1)                        @ r0<- CCBB
5096    mov     r9, rINST, lsr #8           @ r9<- AA
5097    mov     r3, r0, lsr #8              @ r3<- CC
5098    and     r2, r0, #255                @ r2<- BB
5099    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vCC
5100    VREG_INDEX_TO_ADDR(r2, r2)          @ r2<- &vBB
5101    fldd    d1, [r3]                    @ d1<- vCC
5102    fldd    d0, [r2]                    @ d0<- vBB
5103
5104    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5105    fdivd   d2, d0, d1                              @ s2<- op
5106    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5107    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vAA
5108    fstd    d2, [r9]                    @ vAA<- d2
5109    GOTO_OPCODE(ip)                     @ jump to next instruction
5110
5111
5112/* ------------------------------ */
5113    .balign 64
5114.L_OP_REM_DOUBLE: /* 0xaf */
5115/* File: armv5te/OP_REM_DOUBLE.S */
5116/* EABI doesn't define a double remainder function, but libm does */
5117/* File: armv5te/binopWide.S */
5118    /*
5119     * Generic 64-bit binary operation.  Provide an "instr" line that
5120     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5121     * This could be an ARM instruction or a function call.  (If the result
5122     * comes back in a register other than r0, you can override "result".)
5123     *
5124     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5125     * vCC (r1).  Useful for integer division and modulus.
5126     *
5127     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5128     *      xor-long, add-double, sub-double, mul-double, div-double,
5129     *      rem-double
5130     *
5131     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5132     */
5133    /* binop vAA, vBB, vCC */
5134    FETCH(r0, 1)                        @ r0<- CCBB
5135    mov     r9, rINST, lsr #8           @ r9<- AA
5136    and     r2, r0, #255                @ r2<- BB
5137    mov     r3, r0, lsr #8              @ r3<- CC
5138    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5139    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5140    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5141    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5142    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5143    .if 0
5144    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5145    beq     common_errDivideByZero
5146    .endif
5147    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5148
5149                               @ optional op; may set condition codes
5150    bl      fmod                              @ result<- op, r0-r3 changed
5151    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5152    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5153    GOTO_OPCODE(ip)                     @ jump to next instruction
5154    /* 14-17 instructions */
5155
5156
5157/* ------------------------------ */
5158    .balign 64
5159.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5160/* File: armv5te/OP_ADD_INT_2ADDR.S */
5161/* File: armv5te/binop2addr.S */
5162    /*
5163     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5164     * that specifies an instruction that performs "result = r0 op r1".
5165     * This could be an ARM instruction or a function call.  (If the result
5166     * comes back in a register other than r0, you can override "result".)
5167     *
5168     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5169     * vCC (r1).  Useful for integer division and modulus.
5170     *
5171     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5172     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5173     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5174     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5175     */
5176    /* binop/2addr vA, vB */
5177    mov     r9, rINST, lsr #8           @ r9<- A+
5178    mov     r3, rINST, lsr #12          @ r3<- B
5179    and     r9, r9, #15
5180    GET_VREG(r1, r3)                    @ r1<- vB
5181    GET_VREG(r0, r9)                    @ r0<- vA
5182    .if 0
5183    cmp     r1, #0                      @ is second operand zero?
5184    beq     common_errDivideByZero
5185    .endif
5186    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5187
5188                               @ optional op; may set condition codes
5189    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5190    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5191    SET_VREG(r0, r9)               @ vAA<- r0
5192    GOTO_OPCODE(ip)                     @ jump to next instruction
5193    /* 10-13 instructions */
5194
5195
5196/* ------------------------------ */
5197    .balign 64
5198.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5199/* File: armv5te/OP_SUB_INT_2ADDR.S */
5200/* File: armv5te/binop2addr.S */
5201    /*
5202     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5203     * that specifies an instruction that performs "result = r0 op r1".
5204     * This could be an ARM instruction or a function call.  (If the result
5205     * comes back in a register other than r0, you can override "result".)
5206     *
5207     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5208     * vCC (r1).  Useful for integer division and modulus.
5209     *
5210     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5211     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5212     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5213     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5214     */
5215    /* binop/2addr vA, vB */
5216    mov     r9, rINST, lsr #8           @ r9<- A+
5217    mov     r3, rINST, lsr #12          @ r3<- B
5218    and     r9, r9, #15
5219    GET_VREG(r1, r3)                    @ r1<- vB
5220    GET_VREG(r0, r9)                    @ r0<- vA
5221    .if 0
5222    cmp     r1, #0                      @ is second operand zero?
5223    beq     common_errDivideByZero
5224    .endif
5225    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5226
5227                               @ optional op; may set condition codes
5228    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5229    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5230    SET_VREG(r0, r9)               @ vAA<- r0
5231    GOTO_OPCODE(ip)                     @ jump to next instruction
5232    /* 10-13 instructions */
5233
5234
5235/* ------------------------------ */
5236    .balign 64
5237.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5238/* File: armv5te/OP_MUL_INT_2ADDR.S */
5239/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5240/* File: armv5te/binop2addr.S */
5241    /*
5242     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5243     * that specifies an instruction that performs "result = r0 op r1".
5244     * This could be an ARM instruction or a function call.  (If the result
5245     * comes back in a register other than r0, you can override "result".)
5246     *
5247     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5248     * vCC (r1).  Useful for integer division and modulus.
5249     *
5250     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5251     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5252     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5253     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5254     */
5255    /* binop/2addr vA, vB */
5256    mov     r9, rINST, lsr #8           @ r9<- A+
5257    mov     r3, rINST, lsr #12          @ r3<- B
5258    and     r9, r9, #15
5259    GET_VREG(r1, r3)                    @ r1<- vB
5260    GET_VREG(r0, r9)                    @ r0<- vA
5261    .if 0
5262    cmp     r1, #0                      @ is second operand zero?
5263    beq     common_errDivideByZero
5264    .endif
5265    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5266
5267                               @ optional op; may set condition codes
5268    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5269    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5270    SET_VREG(r0, r9)               @ vAA<- r0
5271    GOTO_OPCODE(ip)                     @ jump to next instruction
5272    /* 10-13 instructions */
5273
5274
5275/* ------------------------------ */
5276    .balign 64
5277.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5278/* File: armv5te/OP_DIV_INT_2ADDR.S */
5279/* File: armv5te/binop2addr.S */
5280    /*
5281     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5282     * that specifies an instruction that performs "result = r0 op r1".
5283     * This could be an ARM instruction or a function call.  (If the result
5284     * comes back in a register other than r0, you can override "result".)
5285     *
5286     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5287     * vCC (r1).  Useful for integer division and modulus.
5288     *
5289     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5290     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5291     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5292     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5293     */
5294    /* binop/2addr vA, vB */
5295    mov     r9, rINST, lsr #8           @ r9<- A+
5296    mov     r3, rINST, lsr #12          @ r3<- B
5297    and     r9, r9, #15
5298    GET_VREG(r1, r3)                    @ r1<- vB
5299    GET_VREG(r0, r9)                    @ r0<- vA
5300    .if 1
5301    cmp     r1, #0                      @ is second operand zero?
5302    beq     common_errDivideByZero
5303    .endif
5304    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5305
5306                               @ optional op; may set condition codes
5307    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5308    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5309    SET_VREG(r0, r9)               @ vAA<- r0
5310    GOTO_OPCODE(ip)                     @ jump to next instruction
5311    /* 10-13 instructions */
5312
5313
5314/* ------------------------------ */
5315    .balign 64
5316.L_OP_REM_INT_2ADDR: /* 0xb4 */
5317/* File: armv5te/OP_REM_INT_2ADDR.S */
5318/* idivmod returns quotient in r0 and remainder in r1 */
5319/* File: armv5te/binop2addr.S */
5320    /*
5321     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5322     * that specifies an instruction that performs "result = r0 op r1".
5323     * This could be an ARM instruction or a function call.  (If the result
5324     * comes back in a register other than r0, you can override "result".)
5325     *
5326     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5327     * vCC (r1).  Useful for integer division and modulus.
5328     *
5329     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5330     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5331     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5332     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5333     */
5334    /* binop/2addr vA, vB */
5335    mov     r9, rINST, lsr #8           @ r9<- A+
5336    mov     r3, rINST, lsr #12          @ r3<- B
5337    and     r9, r9, #15
5338    GET_VREG(r1, r3)                    @ r1<- vB
5339    GET_VREG(r0, r9)                    @ r0<- vA
5340    .if 1
5341    cmp     r1, #0                      @ is second operand zero?
5342    beq     common_errDivideByZero
5343    .endif
5344    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5345
5346                               @ optional op; may set condition codes
5347    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5348    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5349    SET_VREG(r1, r9)               @ vAA<- r1
5350    GOTO_OPCODE(ip)                     @ jump to next instruction
5351    /* 10-13 instructions */
5352
5353
5354/* ------------------------------ */
5355    .balign 64
5356.L_OP_AND_INT_2ADDR: /* 0xb5 */
5357/* File: armv5te/OP_AND_INT_2ADDR.S */
5358/* File: armv5te/binop2addr.S */
5359    /*
5360     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5361     * that specifies an instruction that performs "result = r0 op r1".
5362     * This could be an ARM instruction or a function call.  (If the result
5363     * comes back in a register other than r0, you can override "result".)
5364     *
5365     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5366     * vCC (r1).  Useful for integer division and modulus.
5367     *
5368     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5369     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5370     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5371     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5372     */
5373    /* binop/2addr vA, vB */
5374    mov     r9, rINST, lsr #8           @ r9<- A+
5375    mov     r3, rINST, lsr #12          @ r3<- B
5376    and     r9, r9, #15
5377    GET_VREG(r1, r3)                    @ r1<- vB
5378    GET_VREG(r0, r9)                    @ r0<- vA
5379    .if 0
5380    cmp     r1, #0                      @ is second operand zero?
5381    beq     common_errDivideByZero
5382    .endif
5383    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5384
5385                               @ optional op; may set condition codes
5386    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5387    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5388    SET_VREG(r0, r9)               @ vAA<- r0
5389    GOTO_OPCODE(ip)                     @ jump to next instruction
5390    /* 10-13 instructions */
5391
5392
5393/* ------------------------------ */
5394    .balign 64
5395.L_OP_OR_INT_2ADDR: /* 0xb6 */
5396/* File: armv5te/OP_OR_INT_2ADDR.S */
5397/* File: armv5te/binop2addr.S */
5398    /*
5399     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5400     * that specifies an instruction that performs "result = r0 op r1".
5401     * This could be an ARM instruction or a function call.  (If the result
5402     * comes back in a register other than r0, you can override "result".)
5403     *
5404     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5405     * vCC (r1).  Useful for integer division and modulus.
5406     *
5407     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5408     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5409     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5410     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5411     */
5412    /* binop/2addr vA, vB */
5413    mov     r9, rINST, lsr #8           @ r9<- A+
5414    mov     r3, rINST, lsr #12          @ r3<- B
5415    and     r9, r9, #15
5416    GET_VREG(r1, r3)                    @ r1<- vB
5417    GET_VREG(r0, r9)                    @ r0<- vA
5418    .if 0
5419    cmp     r1, #0                      @ is second operand zero?
5420    beq     common_errDivideByZero
5421    .endif
5422    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5423
5424                               @ optional op; may set condition codes
5425    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5426    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5427    SET_VREG(r0, r9)               @ vAA<- r0
5428    GOTO_OPCODE(ip)                     @ jump to next instruction
5429    /* 10-13 instructions */
5430
5431
5432/* ------------------------------ */
5433    .balign 64
5434.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5435/* File: armv5te/OP_XOR_INT_2ADDR.S */
5436/* File: armv5te/binop2addr.S */
5437    /*
5438     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5439     * that specifies an instruction that performs "result = r0 op r1".
5440     * This could be an ARM instruction or a function call.  (If the result
5441     * comes back in a register other than r0, you can override "result".)
5442     *
5443     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5444     * vCC (r1).  Useful for integer division and modulus.
5445     *
5446     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5447     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5448     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5449     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5450     */
5451    /* binop/2addr vA, vB */
5452    mov     r9, rINST, lsr #8           @ r9<- A+
5453    mov     r3, rINST, lsr #12          @ r3<- B
5454    and     r9, r9, #15
5455    GET_VREG(r1, r3)                    @ r1<- vB
5456    GET_VREG(r0, r9)                    @ r0<- vA
5457    .if 0
5458    cmp     r1, #0                      @ is second operand zero?
5459    beq     common_errDivideByZero
5460    .endif
5461    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5462
5463                               @ optional op; may set condition codes
5464    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5465    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5466    SET_VREG(r0, r9)               @ vAA<- r0
5467    GOTO_OPCODE(ip)                     @ jump to next instruction
5468    /* 10-13 instructions */
5469
5470
5471/* ------------------------------ */
5472    .balign 64
5473.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5474/* File: armv5te/OP_SHL_INT_2ADDR.S */
5475/* File: armv5te/binop2addr.S */
5476    /*
5477     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5478     * that specifies an instruction that performs "result = r0 op r1".
5479     * This could be an ARM instruction or a function call.  (If the result
5480     * comes back in a register other than r0, you can override "result".)
5481     *
5482     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5483     * vCC (r1).  Useful for integer division and modulus.
5484     *
5485     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5486     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5487     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5488     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5489     */
5490    /* binop/2addr vA, vB */
5491    mov     r9, rINST, lsr #8           @ r9<- A+
5492    mov     r3, rINST, lsr #12          @ r3<- B
5493    and     r9, r9, #15
5494    GET_VREG(r1, r3)                    @ r1<- vB
5495    GET_VREG(r0, r9)                    @ r0<- vA
5496    .if 0
5497    cmp     r1, #0                      @ is second operand zero?
5498    beq     common_errDivideByZero
5499    .endif
5500    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5501
5502    and     r1, r1, #31                           @ optional op; may set condition codes
5503    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5504    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5505    SET_VREG(r0, r9)               @ vAA<- r0
5506    GOTO_OPCODE(ip)                     @ jump to next instruction
5507    /* 10-13 instructions */
5508
5509
5510/* ------------------------------ */
5511    .balign 64
5512.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5513/* File: armv5te/OP_SHR_INT_2ADDR.S */
5514/* File: armv5te/binop2addr.S */
5515    /*
5516     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5517     * that specifies an instruction that performs "result = r0 op r1".
5518     * This could be an ARM instruction or a function call.  (If the result
5519     * comes back in a register other than r0, you can override "result".)
5520     *
5521     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5522     * vCC (r1).  Useful for integer division and modulus.
5523     *
5524     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5525     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5526     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5527     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5528     */
5529    /* binop/2addr vA, vB */
5530    mov     r9, rINST, lsr #8           @ r9<- A+
5531    mov     r3, rINST, lsr #12          @ r3<- B
5532    and     r9, r9, #15
5533    GET_VREG(r1, r3)                    @ r1<- vB
5534    GET_VREG(r0, r9)                    @ r0<- vA
5535    .if 0
5536    cmp     r1, #0                      @ is second operand zero?
5537    beq     common_errDivideByZero
5538    .endif
5539    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5540
5541    and     r1, r1, #31                           @ optional op; may set condition codes
5542    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5543    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5544    SET_VREG(r0, r9)               @ vAA<- r0
5545    GOTO_OPCODE(ip)                     @ jump to next instruction
5546    /* 10-13 instructions */
5547
5548
5549/* ------------------------------ */
5550    .balign 64
5551.L_OP_USHR_INT_2ADDR: /* 0xba */
5552/* File: armv5te/OP_USHR_INT_2ADDR.S */
5553/* File: armv5te/binop2addr.S */
5554    /*
5555     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5556     * that specifies an instruction that performs "result = r0 op r1".
5557     * This could be an ARM instruction or a function call.  (If the result
5558     * comes back in a register other than r0, you can override "result".)
5559     *
5560     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5561     * vCC (r1).  Useful for integer division and modulus.
5562     *
5563     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5564     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5565     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5566     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5567     */
5568    /* binop/2addr vA, vB */
5569    mov     r9, rINST, lsr #8           @ r9<- A+
5570    mov     r3, rINST, lsr #12          @ r3<- B
5571    and     r9, r9, #15
5572    GET_VREG(r1, r3)                    @ r1<- vB
5573    GET_VREG(r0, r9)                    @ r0<- vA
5574    .if 0
5575    cmp     r1, #0                      @ is second operand zero?
5576    beq     common_errDivideByZero
5577    .endif
5578    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5579
5580    and     r1, r1, #31                           @ optional op; may set condition codes
5581    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5582    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5583    SET_VREG(r0, r9)               @ vAA<- r0
5584    GOTO_OPCODE(ip)                     @ jump to next instruction
5585    /* 10-13 instructions */
5586
5587
5588/* ------------------------------ */
5589    .balign 64
5590.L_OP_ADD_LONG_2ADDR: /* 0xbb */
5591/* File: armv5te/OP_ADD_LONG_2ADDR.S */
5592/* File: armv5te/binopWide2addr.S */
5593    /*
5594     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5595     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5596     * This could be an ARM instruction or a function call.  (If the result
5597     * comes back in a register other than r0, you can override "result".)
5598     *
5599     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5600     * vCC (r1).  Useful for integer division and modulus.
5601     *
5602     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5603     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5604     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5605     *      rem-double/2addr
5606     */
5607    /* binop/2addr vA, vB */
5608    mov     r9, rINST, lsr #8           @ r9<- A+
5609    mov     r1, rINST, lsr #12          @ r1<- B
5610    and     r9, r9, #15
5611    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5612    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5613    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5614    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5615    .if 0
5616    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5617    beq     common_errDivideByZero
5618    .endif
5619    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5620
5621    adds    r0, r0, r2                           @ optional op; may set condition codes
5622    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5623    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5624    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5625    GOTO_OPCODE(ip)                     @ jump to next instruction
5626    /* 12-15 instructions */
5627
5628
5629/* ------------------------------ */
5630    .balign 64
5631.L_OP_SUB_LONG_2ADDR: /* 0xbc */
5632/* File: armv5te/OP_SUB_LONG_2ADDR.S */
5633/* File: armv5te/binopWide2addr.S */
5634    /*
5635     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5636     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5637     * This could be an ARM instruction or a function call.  (If the result
5638     * comes back in a register other than r0, you can override "result".)
5639     *
5640     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5641     * vCC (r1).  Useful for integer division and modulus.
5642     *
5643     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5644     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5645     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5646     *      rem-double/2addr
5647     */
5648    /* binop/2addr vA, vB */
5649    mov     r9, rINST, lsr #8           @ r9<- A+
5650    mov     r1, rINST, lsr #12          @ r1<- B
5651    and     r9, r9, #15
5652    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5653    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5654    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5655    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5656    .if 0
5657    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5658    beq     common_errDivideByZero
5659    .endif
5660    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5661
5662    subs    r0, r0, r2                           @ optional op; may set condition codes
5663    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5664    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5665    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5666    GOTO_OPCODE(ip)                     @ jump to next instruction
5667    /* 12-15 instructions */
5668
5669
5670/* ------------------------------ */
5671    .balign 64
5672.L_OP_MUL_LONG_2ADDR: /* 0xbd */
5673/* File: armv5te/OP_MUL_LONG_2ADDR.S */
5674    /*
5675     * Signed 64-bit integer multiply, "/2addr" version.
5676     *
5677     * See OP_MUL_LONG for an explanation.
5678     *
5679     * We get a little tight on registers, so to avoid looking up &fp[A]
5680     * again we stuff it into rINST.
5681     */
5682    /* mul-long/2addr vA, vB */
5683    mov     r9, rINST, lsr #8           @ r9<- A+
5684    mov     r1, rINST, lsr #12          @ r1<- B
5685    and     r9, r9, #15
5686    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5687    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
5688    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5689    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
5690    mul     ip, r2, r1                  @  ip<- ZxW
5691    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
5692    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
5693    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
5694    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5695    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
5696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5697    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
5698    GOTO_OPCODE(ip)                     @ jump to next instruction
5699
5700/* ------------------------------ */
5701    .balign 64
5702.L_OP_DIV_LONG_2ADDR: /* 0xbe */
5703/* File: armv5te/OP_DIV_LONG_2ADDR.S */
5704/* File: armv5te/binopWide2addr.S */
5705    /*
5706     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5707     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5708     * This could be an ARM instruction or a function call.  (If the result
5709     * comes back in a register other than r0, you can override "result".)
5710     *
5711     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5712     * vCC (r1).  Useful for integer division and modulus.
5713     *
5714     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5715     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5716     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5717     *      rem-double/2addr
5718     */
5719    /* binop/2addr vA, vB */
5720    mov     r9, rINST, lsr #8           @ r9<- A+
5721    mov     r1, rINST, lsr #12          @ r1<- B
5722    and     r9, r9, #15
5723    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5724    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5725    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5726    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5727    .if 1
5728    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5729    beq     common_errDivideByZero
5730    .endif
5731    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5732
5733                               @ optional op; may set condition codes
5734    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5735    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5736    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5737    GOTO_OPCODE(ip)                     @ jump to next instruction
5738    /* 12-15 instructions */
5739
5740
5741/* ------------------------------ */
5742    .balign 64
5743.L_OP_REM_LONG_2ADDR: /* 0xbf */
5744/* File: armv5te/OP_REM_LONG_2ADDR.S */
5745/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5746/* File: armv5te/binopWide2addr.S */
5747    /*
5748     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5749     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5750     * This could be an ARM instruction or a function call.  (If the result
5751     * comes back in a register other than r0, you can override "result".)
5752     *
5753     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5754     * vCC (r1).  Useful for integer division and modulus.
5755     *
5756     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5757     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5758     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5759     *      rem-double/2addr
5760     */
5761    /* binop/2addr vA, vB */
5762    mov     r9, rINST, lsr #8           @ r9<- A+
5763    mov     r1, rINST, lsr #12          @ r1<- B
5764    and     r9, r9, #15
5765    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5766    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5767    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5768    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5769    .if 1
5770    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5771    beq     common_errDivideByZero
5772    .endif
5773    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5774
5775                               @ optional op; may set condition codes
5776    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5777    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5778    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
5779    GOTO_OPCODE(ip)                     @ jump to next instruction
5780    /* 12-15 instructions */
5781
5782
5783/* ------------------------------ */
5784    .balign 64
5785.L_OP_AND_LONG_2ADDR: /* 0xc0 */
5786/* File: armv5te/OP_AND_LONG_2ADDR.S */
5787/* File: armv5te/binopWide2addr.S */
5788    /*
5789     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5790     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5791     * This could be an ARM instruction or a function call.  (If the result
5792     * comes back in a register other than r0, you can override "result".)
5793     *
5794     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5795     * vCC (r1).  Useful for integer division and modulus.
5796     *
5797     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5798     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5799     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5800     *      rem-double/2addr
5801     */
5802    /* binop/2addr vA, vB */
5803    mov     r9, rINST, lsr #8           @ r9<- A+
5804    mov     r1, rINST, lsr #12          @ r1<- B
5805    and     r9, r9, #15
5806    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5807    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5808    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5809    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5810    .if 0
5811    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5812    beq     common_errDivideByZero
5813    .endif
5814    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5815
5816    and     r0, r0, r2                           @ optional op; may set condition codes
5817    and     r1, r1, r3                              @ result<- op, r0-r3 changed
5818    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5819    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5820    GOTO_OPCODE(ip)                     @ jump to next instruction
5821    /* 12-15 instructions */
5822
5823
5824/* ------------------------------ */
5825    .balign 64
5826.L_OP_OR_LONG_2ADDR: /* 0xc1 */
5827/* File: armv5te/OP_OR_LONG_2ADDR.S */
5828/* File: armv5te/binopWide2addr.S */
5829    /*
5830     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5831     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5832     * This could be an ARM instruction or a function call.  (If the result
5833     * comes back in a register other than r0, you can override "result".)
5834     *
5835     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5836     * vCC (r1).  Useful for integer division and modulus.
5837     *
5838     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5839     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5840     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5841     *      rem-double/2addr
5842     */
5843    /* binop/2addr vA, vB */
5844    mov     r9, rINST, lsr #8           @ r9<- A+
5845    mov     r1, rINST, lsr #12          @ r1<- B
5846    and     r9, r9, #15
5847    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5848    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5849    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5850    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5851    .if 0
5852    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5853    beq     common_errDivideByZero
5854    .endif
5855    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5856
5857    orr     r0, r0, r2                           @ optional op; may set condition codes
5858    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
5859    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5860    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5861    GOTO_OPCODE(ip)                     @ jump to next instruction
5862    /* 12-15 instructions */
5863
5864
5865/* ------------------------------ */
5866    .balign 64
5867.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
5868/* File: armv5te/OP_XOR_LONG_2ADDR.S */
5869/* File: armv5te/binopWide2addr.S */
5870    /*
5871     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5872     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5873     * This could be an ARM instruction or a function call.  (If the result
5874     * comes back in a register other than r0, you can override "result".)
5875     *
5876     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5877     * vCC (r1).  Useful for integer division and modulus.
5878     *
5879     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5880     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5881     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5882     *      rem-double/2addr
5883     */
5884    /* binop/2addr vA, vB */
5885    mov     r9, rINST, lsr #8           @ r9<- A+
5886    mov     r1, rINST, lsr #12          @ r1<- B
5887    and     r9, r9, #15
5888    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5889    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5890    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5891    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5892    .if 0
5893    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5894    beq     common_errDivideByZero
5895    .endif
5896    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5897
5898    eor     r0, r0, r2                           @ optional op; may set condition codes
5899    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
5900    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5901    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5902    GOTO_OPCODE(ip)                     @ jump to next instruction
5903    /* 12-15 instructions */
5904
5905
5906/* ------------------------------ */
5907    .balign 64
5908.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
5909/* File: armv5te/OP_SHL_LONG_2ADDR.S */
5910    /*
5911     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5912     * 32-bit shift distance.
5913     */
5914    /* shl-long/2addr vA, vB */
5915    mov     r9, rINST, lsr #8           @ r9<- A+
5916    mov     r3, rINST, lsr #12          @ r3<- B
5917    and     r9, r9, #15
5918    GET_VREG(r2, r3)                    @ r2<- vB
5919    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5920    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5921    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5922
5923    mov     r1, r1, asl r2              @  r1<- r1 << r2
5924    rsb     r3, r2, #32                 @  r3<- 32 - r2
5925    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
5926    subs    ip, r2, #32                 @  ip<- r2 - 32
5927    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5928    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
5929    mov     r0, r0, asl r2              @  r0<- r0 << r2
5930    b       .LOP_SHL_LONG_2ADDR_finish
5931
5932/* ------------------------------ */
5933    .balign 64
5934.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
5935/* File: armv5te/OP_SHR_LONG_2ADDR.S */
5936    /*
5937     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5938     * 32-bit shift distance.
5939     */
5940    /* shr-long/2addr vA, vB */
5941    mov     r9, rINST, lsr #8           @ r9<- A+
5942    mov     r3, rINST, lsr #12          @ r3<- B
5943    and     r9, r9, #15
5944    GET_VREG(r2, r3)                    @ r2<- vB
5945    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5946    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5947    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5948
5949    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5950    rsb     r3, r2, #32                 @  r3<- 32 - r2
5951    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5952    subs    ip, r2, #32                 @  ip<- r2 - 32
5953    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5954    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
5955    mov     r1, r1, asr r2              @  r1<- r1 >> r2
5956    b       .LOP_SHR_LONG_2ADDR_finish
5957
5958/* ------------------------------ */
5959    .balign 64
5960.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
5961/* File: armv5te/OP_USHR_LONG_2ADDR.S */
5962    /*
5963     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
5964     * 32-bit shift distance.
5965     */
5966    /* ushr-long/2addr vA, vB */
5967    mov     r9, rINST, lsr #8           @ r9<- A+
5968    mov     r3, rINST, lsr #12          @ r3<- B
5969    and     r9, r9, #15
5970    GET_VREG(r2, r3)                    @ r2<- vB
5971    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5972    and     r2, r2, #63                 @ r2<- r2 & 0x3f
5973    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5974
5975    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
5976    rsb     r3, r2, #32                 @  r3<- 32 - r2
5977    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
5978    subs    ip, r2, #32                 @  ip<- r2 - 32
5979    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5980    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
5981    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
5982    b       .LOP_USHR_LONG_2ADDR_finish
5983
5984/* ------------------------------ */
5985    .balign 64
5986.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
5987/* File: arm-vfp/OP_ADD_FLOAT_2ADDR.S */
5988/* File: arm-vfp/fbinop2addr.S */
5989    /*
5990     * Generic 32-bit floating point "/2addr" binary operation.  Provide
5991     * an "instr" line that specifies an instruction that performs
5992     * "s2 = s0 op s1".
5993     *
5994     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
5995     */
5996    /* binop/2addr vA, vB */
5997    mov     r3, rINST, lsr #12          @ r3<- B
5998    mov     r9, rINST, lsr #8           @ r9<- A+
5999    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6000    and     r9, r9, #15                 @ r9<- A
6001    flds    s1, [r3]                    @ s1<- vB
6002    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6003    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6004    flds    s0, [r9]                    @ s0<- vA
6005
6006    fadds   s2, s0, s1                              @ s2<- op
6007    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6008    fsts    s2, [r9]                    @ vAA<- s2
6009    GOTO_OPCODE(ip)                     @ jump to next instruction
6010
6011
6012/* ------------------------------ */
6013    .balign 64
6014.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6015/* File: arm-vfp/OP_SUB_FLOAT_2ADDR.S */
6016/* File: arm-vfp/fbinop2addr.S */
6017    /*
6018     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6019     * an "instr" line that specifies an instruction that performs
6020     * "s2 = s0 op s1".
6021     *
6022     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6023     */
6024    /* binop/2addr vA, vB */
6025    mov     r3, rINST, lsr #12          @ r3<- B
6026    mov     r9, rINST, lsr #8           @ r9<- A+
6027    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6028    and     r9, r9, #15                 @ r9<- A
6029    flds    s1, [r3]                    @ s1<- vB
6030    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6031    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6032    flds    s0, [r9]                    @ s0<- vA
6033
6034    fsubs   s2, s0, s1                              @ s2<- op
6035    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6036    fsts    s2, [r9]                    @ vAA<- s2
6037    GOTO_OPCODE(ip)                     @ jump to next instruction
6038
6039
6040/* ------------------------------ */
6041    .balign 64
6042.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6043/* File: arm-vfp/OP_MUL_FLOAT_2ADDR.S */
6044/* File: arm-vfp/fbinop2addr.S */
6045    /*
6046     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6047     * an "instr" line that specifies an instruction that performs
6048     * "s2 = s0 op s1".
6049     *
6050     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6051     */
6052    /* binop/2addr vA, vB */
6053    mov     r3, rINST, lsr #12          @ r3<- B
6054    mov     r9, rINST, lsr #8           @ r9<- A+
6055    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6056    and     r9, r9, #15                 @ r9<- A
6057    flds    s1, [r3]                    @ s1<- vB
6058    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6059    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6060    flds    s0, [r9]                    @ s0<- vA
6061
6062    fmuls   s2, s0, s1                              @ s2<- op
6063    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6064    fsts    s2, [r9]                    @ vAA<- s2
6065    GOTO_OPCODE(ip)                     @ jump to next instruction
6066
6067
6068/* ------------------------------ */
6069    .balign 64
6070.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6071/* File: arm-vfp/OP_DIV_FLOAT_2ADDR.S */
6072/* File: arm-vfp/fbinop2addr.S */
6073    /*
6074     * Generic 32-bit floating point "/2addr" binary operation.  Provide
6075     * an "instr" line that specifies an instruction that performs
6076     * "s2 = s0 op s1".
6077     *
6078     * For: add-float/2addr, sub-float/2addr, mul-float/2addr, div-float/2addr
6079     */
6080    /* binop/2addr vA, vB */
6081    mov     r3, rINST, lsr #12          @ r3<- B
6082    mov     r9, rINST, lsr #8           @ r9<- A+
6083    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6084    and     r9, r9, #15                 @ r9<- A
6085    flds    s1, [r3]                    @ s1<- vB
6086    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6087    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6088    flds    s0, [r9]                    @ s0<- vA
6089
6090    fdivs   s2, s0, s1                              @ s2<- op
6091    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6092    fsts    s2, [r9]                    @ vAA<- s2
6093    GOTO_OPCODE(ip)                     @ jump to next instruction
6094
6095
6096/* ------------------------------ */
6097    .balign 64
6098.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6099/* File: armv5te/OP_REM_FLOAT_2ADDR.S */
6100/* EABI doesn't define a float remainder function, but libm does */
6101/* File: armv5te/binop2addr.S */
6102    /*
6103     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6104     * that specifies an instruction that performs "result = r0 op r1".
6105     * This could be an ARM instruction or a function call.  (If the result
6106     * comes back in a register other than r0, you can override "result".)
6107     *
6108     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6109     * vCC (r1).  Useful for integer division and modulus.
6110     *
6111     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6112     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6113     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6114     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6115     */
6116    /* binop/2addr vA, vB */
6117    mov     r9, rINST, lsr #8           @ r9<- A+
6118    mov     r3, rINST, lsr #12          @ r3<- B
6119    and     r9, r9, #15
6120    GET_VREG(r1, r3)                    @ r1<- vB
6121    GET_VREG(r0, r9)                    @ r0<- vA
6122    .if 0
6123    cmp     r1, #0                      @ is second operand zero?
6124    beq     common_errDivideByZero
6125    .endif
6126    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6127
6128                               @ optional op; may set condition codes
6129    bl      fmodf                              @ r0<- op, r0-r3 changed
6130    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6131    SET_VREG(r0, r9)               @ vAA<- r0
6132    GOTO_OPCODE(ip)                     @ jump to next instruction
6133    /* 10-13 instructions */
6134
6135
6136/* ------------------------------ */
6137    .balign 64
6138.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6139/* File: arm-vfp/OP_ADD_DOUBLE_2ADDR.S */
6140/* File: arm-vfp/fbinopWide2addr.S */
6141    /*
6142     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6143     * an "instr" line that specifies an instruction that performs
6144     * "d2 = d0 op d1".
6145     *
6146     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6147     *      div-double/2addr
6148     */
6149    /* binop/2addr vA, vB */
6150    mov     r3, rINST, lsr #12          @ r3<- B
6151    mov     r9, rINST, lsr #8           @ r9<- A+
6152    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6153    and     r9, r9, #15                 @ r9<- A
6154    fldd    d1, [r3]                    @ d1<- vB
6155    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6156    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6157    fldd    d0, [r9]                    @ d0<- vA
6158
6159    faddd   d2, d0, d1                              @ d2<- op
6160    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6161    fstd    d2, [r9]                    @ vAA<- d2
6162    GOTO_OPCODE(ip)                     @ jump to next instruction
6163
6164
6165/* ------------------------------ */
6166    .balign 64
6167.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6168/* File: arm-vfp/OP_SUB_DOUBLE_2ADDR.S */
6169/* File: arm-vfp/fbinopWide2addr.S */
6170    /*
6171     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6172     * an "instr" line that specifies an instruction that performs
6173     * "d2 = d0 op d1".
6174     *
6175     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6176     *      div-double/2addr
6177     */
6178    /* binop/2addr vA, vB */
6179    mov     r3, rINST, lsr #12          @ r3<- B
6180    mov     r9, rINST, lsr #8           @ r9<- A+
6181    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6182    and     r9, r9, #15                 @ r9<- A
6183    fldd    d1, [r3]                    @ d1<- vB
6184    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6185    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6186    fldd    d0, [r9]                    @ d0<- vA
6187
6188    fsubd   d2, d0, d1                              @ d2<- op
6189    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6190    fstd    d2, [r9]                    @ vAA<- d2
6191    GOTO_OPCODE(ip)                     @ jump to next instruction
6192
6193
6194/* ------------------------------ */
6195    .balign 64
6196.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6197/* File: arm-vfp/OP_MUL_DOUBLE_2ADDR.S */
6198/* File: arm-vfp/fbinopWide2addr.S */
6199    /*
6200     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6201     * an "instr" line that specifies an instruction that performs
6202     * "d2 = d0 op d1".
6203     *
6204     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6205     *      div-double/2addr
6206     */
6207    /* binop/2addr vA, vB */
6208    mov     r3, rINST, lsr #12          @ r3<- B
6209    mov     r9, rINST, lsr #8           @ r9<- A+
6210    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6211    and     r9, r9, #15                 @ r9<- A
6212    fldd    d1, [r3]                    @ d1<- vB
6213    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6214    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6215    fldd    d0, [r9]                    @ d0<- vA
6216
6217    fmuld   d2, d0, d1                              @ d2<- op
6218    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6219    fstd    d2, [r9]                    @ vAA<- d2
6220    GOTO_OPCODE(ip)                     @ jump to next instruction
6221
6222
6223/* ------------------------------ */
6224    .balign 64
6225.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6226/* File: arm-vfp/OP_DIV_DOUBLE_2ADDR.S */
6227/* File: arm-vfp/fbinopWide2addr.S */
6228    /*
6229     * Generic 64-bit floating point "/2addr" binary operation.  Provide
6230     * an "instr" line that specifies an instruction that performs
6231     * "d2 = d0 op d1".
6232     *
6233     * For: add-double/2addr, sub-double/2addr, mul-double/2addr,
6234     *      div-double/2addr
6235     */
6236    /* binop/2addr vA, vB */
6237    mov     r3, rINST, lsr #12          @ r3<- B
6238    mov     r9, rINST, lsr #8           @ r9<- A+
6239    VREG_INDEX_TO_ADDR(r3, r3)          @ r3<- &vB
6240    and     r9, r9, #15                 @ r9<- A
6241    fldd    d1, [r3]                    @ d1<- vB
6242    VREG_INDEX_TO_ADDR(r9, r9)          @ r9<- &vA
6243    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6244    fldd    d0, [r9]                    @ d0<- vA
6245
6246    fdivd   d2, d0, d1                              @ d2<- op
6247    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6248    fstd    d2, [r9]                    @ vAA<- d2
6249    GOTO_OPCODE(ip)                     @ jump to next instruction
6250
6251
6252/* ------------------------------ */
6253    .balign 64
6254.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6255/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */
6256/* EABI doesn't define a double remainder function, but libm does */
6257/* File: armv5te/binopWide2addr.S */
6258    /*
6259     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6260     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6261     * This could be an ARM instruction or a function call.  (If the result
6262     * comes back in a register other than r0, you can override "result".)
6263     *
6264     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6265     * vCC (r1).  Useful for integer division and modulus.
6266     *
6267     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6268     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6269     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6270     *      rem-double/2addr
6271     */
6272    /* binop/2addr vA, vB */
6273    mov     r9, rINST, lsr #8           @ r9<- A+
6274    mov     r1, rINST, lsr #12          @ r1<- B
6275    and     r9, r9, #15
6276    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6277    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6278    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6279    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6280    .if 0
6281    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6282    beq     common_errDivideByZero
6283    .endif
6284    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6285
6286                               @ optional op; may set condition codes
6287    bl      fmod                              @ result<- op, r0-r3 changed
6288    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6289    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6290    GOTO_OPCODE(ip)                     @ jump to next instruction
6291    /* 12-15 instructions */
6292
6293
6294/* ------------------------------ */
6295    .balign 64
6296.L_OP_ADD_INT_LIT16: /* 0xd0 */
6297/* File: armv5te/OP_ADD_INT_LIT16.S */
6298/* File: armv5te/binopLit16.S */
6299    /*
6300     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6301     * that specifies an instruction that performs "result = r0 op r1".
6302     * This could be an ARM instruction or a function call.  (If the result
6303     * comes back in a register other than r0, you can override "result".)
6304     *
6305     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6306     * vCC (r1).  Useful for integer division and modulus.
6307     *
6308     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6309     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6310     */
6311    /* binop/lit16 vA, vB, #+CCCC */
6312    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6313    mov     r2, rINST, lsr #12          @ r2<- B
6314    mov     r9, rINST, lsr #8           @ r9<- A+
6315    GET_VREG(r0, r2)                    @ r0<- vB
6316    and     r9, r9, #15
6317    .if 0
6318    cmp     r1, #0                      @ is second operand zero?
6319    beq     common_errDivideByZero
6320    .endif
6321    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6322
6323    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6324    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6325    SET_VREG(r0, r9)               @ vAA<- r0
6326    GOTO_OPCODE(ip)                     @ jump to next instruction
6327    /* 10-13 instructions */
6328
6329
6330/* ------------------------------ */
6331    .balign 64
6332.L_OP_RSUB_INT: /* 0xd1 */
6333/* File: armv5te/OP_RSUB_INT.S */
6334/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6335/* File: armv5te/binopLit16.S */
6336    /*
6337     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6338     * that specifies an instruction that performs "result = r0 op r1".
6339     * This could be an ARM instruction or a function call.  (If the result
6340     * comes back in a register other than r0, you can override "result".)
6341     *
6342     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6343     * vCC (r1).  Useful for integer division and modulus.
6344     *
6345     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6346     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6347     */
6348    /* binop/lit16 vA, vB, #+CCCC */
6349    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6350    mov     r2, rINST, lsr #12          @ r2<- B
6351    mov     r9, rINST, lsr #8           @ r9<- A+
6352    GET_VREG(r0, r2)                    @ r0<- vB
6353    and     r9, r9, #15
6354    .if 0
6355    cmp     r1, #0                      @ is second operand zero?
6356    beq     common_errDivideByZero
6357    .endif
6358    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6359
6360    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6361    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6362    SET_VREG(r0, r9)               @ vAA<- r0
6363    GOTO_OPCODE(ip)                     @ jump to next instruction
6364    /* 10-13 instructions */
6365
6366
6367/* ------------------------------ */
6368    .balign 64
6369.L_OP_MUL_INT_LIT16: /* 0xd2 */
6370/* File: armv5te/OP_MUL_INT_LIT16.S */
6371/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6372/* File: armv5te/binopLit16.S */
6373    /*
6374     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6375     * that specifies an instruction that performs "result = r0 op r1".
6376     * This could be an ARM instruction or a function call.  (If the result
6377     * comes back in a register other than r0, you can override "result".)
6378     *
6379     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6380     * vCC (r1).  Useful for integer division and modulus.
6381     *
6382     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6383     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6384     */
6385    /* binop/lit16 vA, vB, #+CCCC */
6386    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6387    mov     r2, rINST, lsr #12          @ r2<- B
6388    mov     r9, rINST, lsr #8           @ r9<- A+
6389    GET_VREG(r0, r2)                    @ r0<- vB
6390    and     r9, r9, #15
6391    .if 0
6392    cmp     r1, #0                      @ is second operand zero?
6393    beq     common_errDivideByZero
6394    .endif
6395    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6396
6397    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6398    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6399    SET_VREG(r0, r9)               @ vAA<- r0
6400    GOTO_OPCODE(ip)                     @ jump to next instruction
6401    /* 10-13 instructions */
6402
6403
6404/* ------------------------------ */
6405    .balign 64
6406.L_OP_DIV_INT_LIT16: /* 0xd3 */
6407/* File: armv5te/OP_DIV_INT_LIT16.S */
6408/* File: armv5te/binopLit16.S */
6409    /*
6410     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6411     * that specifies an instruction that performs "result = r0 op r1".
6412     * This could be an ARM instruction or a function call.  (If the result
6413     * comes back in a register other than r0, you can override "result".)
6414     *
6415     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6416     * vCC (r1).  Useful for integer division and modulus.
6417     *
6418     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6419     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6420     */
6421    /* binop/lit16 vA, vB, #+CCCC */
6422    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6423    mov     r2, rINST, lsr #12          @ r2<- B
6424    mov     r9, rINST, lsr #8           @ r9<- A+
6425    GET_VREG(r0, r2)                    @ r0<- vB
6426    and     r9, r9, #15
6427    .if 1
6428    cmp     r1, #0                      @ is second operand zero?
6429    beq     common_errDivideByZero
6430    .endif
6431    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6432
6433    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6434    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6435    SET_VREG(r0, r9)               @ vAA<- r0
6436    GOTO_OPCODE(ip)                     @ jump to next instruction
6437    /* 10-13 instructions */
6438
6439
6440/* ------------------------------ */
6441    .balign 64
6442.L_OP_REM_INT_LIT16: /* 0xd4 */
6443/* File: armv5te/OP_REM_INT_LIT16.S */
6444/* idivmod returns quotient in r0 and remainder in r1 */
6445/* File: armv5te/binopLit16.S */
6446    /*
6447     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6448     * that specifies an instruction that performs "result = r0 op r1".
6449     * This could be an ARM instruction or a function call.  (If the result
6450     * comes back in a register other than r0, you can override "result".)
6451     *
6452     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6453     * vCC (r1).  Useful for integer division and modulus.
6454     *
6455     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6456     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6457     */
6458    /* binop/lit16 vA, vB, #+CCCC */
6459    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6460    mov     r2, rINST, lsr #12          @ r2<- B
6461    mov     r9, rINST, lsr #8           @ r9<- A+
6462    GET_VREG(r0, r2)                    @ r0<- vB
6463    and     r9, r9, #15
6464    .if 1
6465    cmp     r1, #0                      @ is second operand zero?
6466    beq     common_errDivideByZero
6467    .endif
6468    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6469
6470    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6471    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6472    SET_VREG(r1, r9)               @ vAA<- r1
6473    GOTO_OPCODE(ip)                     @ jump to next instruction
6474    /* 10-13 instructions */
6475
6476
6477/* ------------------------------ */
6478    .balign 64
6479.L_OP_AND_INT_LIT16: /* 0xd5 */
6480/* File: armv5te/OP_AND_INT_LIT16.S */
6481/* File: armv5te/binopLit16.S */
6482    /*
6483     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6484     * that specifies an instruction that performs "result = r0 op r1".
6485     * This could be an ARM instruction or a function call.  (If the result
6486     * comes back in a register other than r0, you can override "result".)
6487     *
6488     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6489     * vCC (r1).  Useful for integer division and modulus.
6490     *
6491     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6492     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6493     */
6494    /* binop/lit16 vA, vB, #+CCCC */
6495    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6496    mov     r2, rINST, lsr #12          @ r2<- B
6497    mov     r9, rINST, lsr #8           @ r9<- A+
6498    GET_VREG(r0, r2)                    @ r0<- vB
6499    and     r9, r9, #15
6500    .if 0
6501    cmp     r1, #0                      @ is second operand zero?
6502    beq     common_errDivideByZero
6503    .endif
6504    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6505
6506    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6507    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6508    SET_VREG(r0, r9)               @ vAA<- r0
6509    GOTO_OPCODE(ip)                     @ jump to next instruction
6510    /* 10-13 instructions */
6511
6512
6513/* ------------------------------ */
6514    .balign 64
6515.L_OP_OR_INT_LIT16: /* 0xd6 */
6516/* File: armv5te/OP_OR_INT_LIT16.S */
6517/* File: armv5te/binopLit16.S */
6518    /*
6519     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6520     * that specifies an instruction that performs "result = r0 op r1".
6521     * This could be an ARM instruction or a function call.  (If the result
6522     * comes back in a register other than r0, you can override "result".)
6523     *
6524     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6525     * vCC (r1).  Useful for integer division and modulus.
6526     *
6527     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6528     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6529     */
6530    /* binop/lit16 vA, vB, #+CCCC */
6531    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6532    mov     r2, rINST, lsr #12          @ r2<- B
6533    mov     r9, rINST, lsr #8           @ r9<- A+
6534    GET_VREG(r0, r2)                    @ r0<- vB
6535    and     r9, r9, #15
6536    .if 0
6537    cmp     r1, #0                      @ is second operand zero?
6538    beq     common_errDivideByZero
6539    .endif
6540    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6541
6542    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6543    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6544    SET_VREG(r0, r9)               @ vAA<- r0
6545    GOTO_OPCODE(ip)                     @ jump to next instruction
6546    /* 10-13 instructions */
6547
6548
6549/* ------------------------------ */
6550    .balign 64
6551.L_OP_XOR_INT_LIT16: /* 0xd7 */
6552/* File: armv5te/OP_XOR_INT_LIT16.S */
6553/* File: armv5te/binopLit16.S */
6554    /*
6555     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6556     * that specifies an instruction that performs "result = r0 op r1".
6557     * This could be an ARM instruction or a function call.  (If the result
6558     * comes back in a register other than r0, you can override "result".)
6559     *
6560     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6561     * vCC (r1).  Useful for integer division and modulus.
6562     *
6563     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6564     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6565     */
6566    /* binop/lit16 vA, vB, #+CCCC */
6567    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6568    mov     r2, rINST, lsr #12          @ r2<- B
6569    mov     r9, rINST, lsr #8           @ r9<- A+
6570    GET_VREG(r0, r2)                    @ r0<- vB
6571    and     r9, r9, #15
6572    .if 0
6573    cmp     r1, #0                      @ is second operand zero?
6574    beq     common_errDivideByZero
6575    .endif
6576    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6577
6578    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6579    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6580    SET_VREG(r0, r9)               @ vAA<- r0
6581    GOTO_OPCODE(ip)                     @ jump to next instruction
6582    /* 10-13 instructions */
6583
6584
6585/* ------------------------------ */
6586    .balign 64
6587.L_OP_ADD_INT_LIT8: /* 0xd8 */
6588/* File: armv5te/OP_ADD_INT_LIT8.S */
6589/* File: armv5te/binopLit8.S */
6590    /*
6591     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6592     * that specifies an instruction that performs "result = r0 op r1".
6593     * This could be an ARM instruction or a function call.  (If the result
6594     * comes back in a register other than r0, you can override "result".)
6595     *
6596     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6597     * vCC (r1).  Useful for integer division and modulus.
6598     *
6599     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6600     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6601     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6602     */
6603    /* binop/lit8 vAA, vBB, #+CC */
6604    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6605    mov     r9, rINST, lsr #8           @ r9<- AA
6606    and     r2, r3, #255                @ r2<- BB
6607    GET_VREG(r0, r2)                    @ r0<- vBB
6608    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6609    .if 0
6610    @cmp     r1, #0                      @ is second operand zero?
6611    beq     common_errDivideByZero
6612    .endif
6613    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6614
6615                               @ optional op; may set condition codes
6616    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6617    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6618    SET_VREG(r0, r9)               @ vAA<- r0
6619    GOTO_OPCODE(ip)                     @ jump to next instruction
6620    /* 10-12 instructions */
6621
6622
6623/* ------------------------------ */
6624    .balign 64
6625.L_OP_RSUB_INT_LIT8: /* 0xd9 */
6626/* File: armv5te/OP_RSUB_INT_LIT8.S */
6627/* File: armv5te/binopLit8.S */
6628    /*
6629     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6630     * that specifies an instruction that performs "result = r0 op r1".
6631     * This could be an ARM instruction or a function call.  (If the result
6632     * comes back in a register other than r0, you can override "result".)
6633     *
6634     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6635     * vCC (r1).  Useful for integer division and modulus.
6636     *
6637     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6638     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6639     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6640     */
6641    /* binop/lit8 vAA, vBB, #+CC */
6642    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6643    mov     r9, rINST, lsr #8           @ r9<- AA
6644    and     r2, r3, #255                @ r2<- BB
6645    GET_VREG(r0, r2)                    @ r0<- vBB
6646    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6647    .if 0
6648    @cmp     r1, #0                      @ is second operand zero?
6649    beq     common_errDivideByZero
6650    .endif
6651    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6652
6653                               @ optional op; may set condition codes
6654    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6655    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6656    SET_VREG(r0, r9)               @ vAA<- r0
6657    GOTO_OPCODE(ip)                     @ jump to next instruction
6658    /* 10-12 instructions */
6659
6660
6661/* ------------------------------ */
6662    .balign 64
6663.L_OP_MUL_INT_LIT8: /* 0xda */
6664/* File: armv5te/OP_MUL_INT_LIT8.S */
6665/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6666/* File: armv5te/binopLit8.S */
6667    /*
6668     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6669     * that specifies an instruction that performs "result = r0 op r1".
6670     * This could be an ARM instruction or a function call.  (If the result
6671     * comes back in a register other than r0, you can override "result".)
6672     *
6673     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6674     * vCC (r1).  Useful for integer division and modulus.
6675     *
6676     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6677     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6678     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6679     */
6680    /* binop/lit8 vAA, vBB, #+CC */
6681    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6682    mov     r9, rINST, lsr #8           @ r9<- AA
6683    and     r2, r3, #255                @ r2<- BB
6684    GET_VREG(r0, r2)                    @ r0<- vBB
6685    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6686    .if 0
6687    @cmp     r1, #0                      @ is second operand zero?
6688    beq     common_errDivideByZero
6689    .endif
6690    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6691
6692                               @ optional op; may set condition codes
6693    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6694    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6695    SET_VREG(r0, r9)               @ vAA<- r0
6696    GOTO_OPCODE(ip)                     @ jump to next instruction
6697    /* 10-12 instructions */
6698
6699
6700/* ------------------------------ */
6701    .balign 64
6702.L_OP_DIV_INT_LIT8: /* 0xdb */
6703/* File: armv5te/OP_DIV_INT_LIT8.S */
6704/* File: armv5te/binopLit8.S */
6705    /*
6706     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6707     * that specifies an instruction that performs "result = r0 op r1".
6708     * This could be an ARM instruction or a function call.  (If the result
6709     * comes back in a register other than r0, you can override "result".)
6710     *
6711     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6712     * vCC (r1).  Useful for integer division and modulus.
6713     *
6714     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6715     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6716     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6717     */
6718    /* binop/lit8 vAA, vBB, #+CC */
6719    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6720    mov     r9, rINST, lsr #8           @ r9<- AA
6721    and     r2, r3, #255                @ r2<- BB
6722    GET_VREG(r0, r2)                    @ r0<- vBB
6723    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6724    .if 1
6725    @cmp     r1, #0                      @ is second operand zero?
6726    beq     common_errDivideByZero
6727    .endif
6728    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6729
6730                               @ optional op; may set condition codes
6731    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6732    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6733    SET_VREG(r0, r9)               @ vAA<- r0
6734    GOTO_OPCODE(ip)                     @ jump to next instruction
6735    /* 10-12 instructions */
6736
6737
6738/* ------------------------------ */
6739    .balign 64
6740.L_OP_REM_INT_LIT8: /* 0xdc */
6741/* File: armv5te/OP_REM_INT_LIT8.S */
6742/* idivmod returns quotient in r0 and remainder in r1 */
6743/* File: armv5te/binopLit8.S */
6744    /*
6745     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6746     * that specifies an instruction that performs "result = r0 op r1".
6747     * This could be an ARM instruction or a function call.  (If the result
6748     * comes back in a register other than r0, you can override "result".)
6749     *
6750     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6751     * vCC (r1).  Useful for integer division and modulus.
6752     *
6753     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6754     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6755     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6756     */
6757    /* binop/lit8 vAA, vBB, #+CC */
6758    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6759    mov     r9, rINST, lsr #8           @ r9<- AA
6760    and     r2, r3, #255                @ r2<- BB
6761    GET_VREG(r0, r2)                    @ r0<- vBB
6762    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6763    .if 1
6764    @cmp     r1, #0                      @ is second operand zero?
6765    beq     common_errDivideByZero
6766    .endif
6767    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6768
6769                               @ optional op; may set condition codes
6770    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6771    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6772    SET_VREG(r1, r9)               @ vAA<- r1
6773    GOTO_OPCODE(ip)                     @ jump to next instruction
6774    /* 10-12 instructions */
6775
6776
6777/* ------------------------------ */
6778    .balign 64
6779.L_OP_AND_INT_LIT8: /* 0xdd */
6780/* File: armv5te/OP_AND_INT_LIT8.S */
6781/* File: armv5te/binopLit8.S */
6782    /*
6783     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6784     * that specifies an instruction that performs "result = r0 op r1".
6785     * This could be an ARM instruction or a function call.  (If the result
6786     * comes back in a register other than r0, you can override "result".)
6787     *
6788     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6789     * vCC (r1).  Useful for integer division and modulus.
6790     *
6791     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6792     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6793     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6794     */
6795    /* binop/lit8 vAA, vBB, #+CC */
6796    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6797    mov     r9, rINST, lsr #8           @ r9<- AA
6798    and     r2, r3, #255                @ r2<- BB
6799    GET_VREG(r0, r2)                    @ r0<- vBB
6800    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6801    .if 0
6802    @cmp     r1, #0                      @ is second operand zero?
6803    beq     common_errDivideByZero
6804    .endif
6805    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6806
6807                               @ optional op; may set condition codes
6808    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6809    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6810    SET_VREG(r0, r9)               @ vAA<- r0
6811    GOTO_OPCODE(ip)                     @ jump to next instruction
6812    /* 10-12 instructions */
6813
6814
6815/* ------------------------------ */
6816    .balign 64
6817.L_OP_OR_INT_LIT8: /* 0xde */
6818/* File: armv5te/OP_OR_INT_LIT8.S */
6819/* File: armv5te/binopLit8.S */
6820    /*
6821     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6822     * that specifies an instruction that performs "result = r0 op r1".
6823     * This could be an ARM instruction or a function call.  (If the result
6824     * comes back in a register other than r0, you can override "result".)
6825     *
6826     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6827     * vCC (r1).  Useful for integer division and modulus.
6828     *
6829     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6830     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6831     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6832     */
6833    /* binop/lit8 vAA, vBB, #+CC */
6834    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6835    mov     r9, rINST, lsr #8           @ r9<- AA
6836    and     r2, r3, #255                @ r2<- BB
6837    GET_VREG(r0, r2)                    @ r0<- vBB
6838    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6839    .if 0
6840    @cmp     r1, #0                      @ is second operand zero?
6841    beq     common_errDivideByZero
6842    .endif
6843    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6844
6845                               @ optional op; may set condition codes
6846    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6847    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6848    SET_VREG(r0, r9)               @ vAA<- r0
6849    GOTO_OPCODE(ip)                     @ jump to next instruction
6850    /* 10-12 instructions */
6851
6852
6853/* ------------------------------ */
6854    .balign 64
6855.L_OP_XOR_INT_LIT8: /* 0xdf */
6856/* File: armv5te/OP_XOR_INT_LIT8.S */
6857/* File: armv5te/binopLit8.S */
6858    /*
6859     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6860     * that specifies an instruction that performs "result = r0 op r1".
6861     * This could be an ARM instruction or a function call.  (If the result
6862     * comes back in a register other than r0, you can override "result".)
6863     *
6864     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6865     * vCC (r1).  Useful for integer division and modulus.
6866     *
6867     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6868     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6869     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6870     */
6871    /* binop/lit8 vAA, vBB, #+CC */
6872    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6873    mov     r9, rINST, lsr #8           @ r9<- AA
6874    and     r2, r3, #255                @ r2<- BB
6875    GET_VREG(r0, r2)                    @ r0<- vBB
6876    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6877    .if 0
6878    @cmp     r1, #0                      @ is second operand zero?
6879    beq     common_errDivideByZero
6880    .endif
6881    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6882
6883                               @ optional op; may set condition codes
6884    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6885    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6886    SET_VREG(r0, r9)               @ vAA<- r0
6887    GOTO_OPCODE(ip)                     @ jump to next instruction
6888    /* 10-12 instructions */
6889
6890
6891/* ------------------------------ */
6892    .balign 64
6893.L_OP_SHL_INT_LIT8: /* 0xe0 */
6894/* File: armv5te/OP_SHL_INT_LIT8.S */
6895/* File: armv5te/binopLit8.S */
6896    /*
6897     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6898     * that specifies an instruction that performs "result = r0 op r1".
6899     * This could be an ARM instruction or a function call.  (If the result
6900     * comes back in a register other than r0, you can override "result".)
6901     *
6902     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6903     * vCC (r1).  Useful for integer division and modulus.
6904     *
6905     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6906     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6907     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6908     */
6909    /* binop/lit8 vAA, vBB, #+CC */
6910    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6911    mov     r9, rINST, lsr #8           @ r9<- AA
6912    and     r2, r3, #255                @ r2<- BB
6913    GET_VREG(r0, r2)                    @ r0<- vBB
6914    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6915    .if 0
6916    @cmp     r1, #0                      @ is second operand zero?
6917    beq     common_errDivideByZero
6918    .endif
6919    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6920
6921    and     r1, r1, #31                           @ optional op; may set condition codes
6922    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
6923    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6924    SET_VREG(r0, r9)               @ vAA<- r0
6925    GOTO_OPCODE(ip)                     @ jump to next instruction
6926    /* 10-12 instructions */
6927
6928
6929/* ------------------------------ */
6930    .balign 64
6931.L_OP_SHR_INT_LIT8: /* 0xe1 */
6932/* File: armv5te/OP_SHR_INT_LIT8.S */
6933/* File: armv5te/binopLit8.S */
6934    /*
6935     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6936     * that specifies an instruction that performs "result = r0 op r1".
6937     * This could be an ARM instruction or a function call.  (If the result
6938     * comes back in a register other than r0, you can override "result".)
6939     *
6940     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6941     * vCC (r1).  Useful for integer division and modulus.
6942     *
6943     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6944     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6945     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6946     */
6947    /* binop/lit8 vAA, vBB, #+CC */
6948    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6949    mov     r9, rINST, lsr #8           @ r9<- AA
6950    and     r2, r3, #255                @ r2<- BB
6951    GET_VREG(r0, r2)                    @ r0<- vBB
6952    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6953    .if 0
6954    @cmp     r1, #0                      @ is second operand zero?
6955    beq     common_errDivideByZero
6956    .endif
6957    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6958
6959    and     r1, r1, #31                           @ optional op; may set condition codes
6960    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
6961    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6962    SET_VREG(r0, r9)               @ vAA<- r0
6963    GOTO_OPCODE(ip)                     @ jump to next instruction
6964    /* 10-12 instructions */
6965
6966
6967/* ------------------------------ */
6968    .balign 64
6969.L_OP_USHR_INT_LIT8: /* 0xe2 */
6970/* File: armv5te/OP_USHR_INT_LIT8.S */
6971/* File: armv5te/binopLit8.S */
6972    /*
6973     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6974     * that specifies an instruction that performs "result = r0 op r1".
6975     * This could be an ARM instruction or a function call.  (If the result
6976     * comes back in a register other than r0, you can override "result".)
6977     *
6978     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6979     * vCC (r1).  Useful for integer division and modulus.
6980     *
6981     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6982     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6983     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6984     */
6985    /* binop/lit8 vAA, vBB, #+CC */
6986    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6987    mov     r9, rINST, lsr #8           @ r9<- AA
6988    and     r2, r3, #255                @ r2<- BB
6989    GET_VREG(r0, r2)                    @ r0<- vBB
6990    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6991    .if 0
6992    @cmp     r1, #0                      @ is second operand zero?
6993    beq     common_errDivideByZero
6994    .endif
6995    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6996
6997    and     r1, r1, #31                           @ optional op; may set condition codes
6998    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
6999    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7000    SET_VREG(r0, r9)               @ vAA<- r0
7001    GOTO_OPCODE(ip)                     @ jump to next instruction
7002    /* 10-12 instructions */
7003
7004
7005/* ------------------------------ */
7006    .balign 64
7007.L_OP_IGET_VOLATILE: /* 0xe3 */
7008/* File: armv5te/OP_IGET_VOLATILE.S */
7009/* File: armv5te/OP_IGET.S */
7010    /*
7011     * General 32-bit instance field get.
7012     *
7013     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7014     */
7015    /* op vA, vB, field@CCCC */
7016    mov     r0, rINST, lsr #12          @ r0<- B
7017    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7018    FETCH(r1, 1)                        @ r1<- field ref CCCC
7019    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7020    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7021    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7022    cmp     r0, #0                      @ is resolved entry null?
7023    bne     .LOP_IGET_VOLATILE_finish          @ no, already resolved
70248:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7025    EXPORT_PC()                         @ resolve() could throw
7026    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7027    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7028    cmp     r0, #0
7029    bne     .LOP_IGET_VOLATILE_finish
7030    b       common_exceptionThrown
7031
7032
7033/* ------------------------------ */
7034    .balign 64
7035.L_OP_IPUT_VOLATILE: /* 0xe4 */
7036/* File: armv5te/OP_IPUT_VOLATILE.S */
7037/* File: armv5te/OP_IPUT.S */
7038    /*
7039     * General 32-bit instance field put.
7040     *
7041     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
7042     */
7043    /* op vA, vB, field@CCCC */
7044    mov     r0, rINST, lsr #12          @ r0<- B
7045    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7046    FETCH(r1, 1)                        @ r1<- field ref CCCC
7047    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7048    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7049    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7050    cmp     r0, #0                      @ is resolved entry null?
7051    bne     .LOP_IPUT_VOLATILE_finish          @ no, already resolved
70528:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7053    EXPORT_PC()                         @ resolve() could throw
7054    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7055    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7056    cmp     r0, #0                      @ success?
7057    bne     .LOP_IPUT_VOLATILE_finish          @ yes, finish up
7058    b       common_exceptionThrown
7059
7060
7061/* ------------------------------ */
7062    .balign 64
7063.L_OP_SGET_VOLATILE: /* 0xe5 */
7064/* File: armv5te/OP_SGET_VOLATILE.S */
7065/* File: armv5te/OP_SGET.S */
7066    /*
7067     * General 32-bit SGET handler.
7068     *
7069     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7070     */
7071    /* op vAA, field@BBBB */
7072    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7073    FETCH(r1, 1)                        @ r1<- field ref BBBB
7074    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7075    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7076    cmp     r0, #0                      @ is resolved entry null?
7077    beq     .LOP_SGET_VOLATILE_resolve         @ yes, do resolve
7078.LOP_SGET_VOLATILE_finish: @ field ptr in r0
7079    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7080    SMP_DMB                            @ acquiring load
7081    mov     r2, rINST, lsr #8           @ r2<- AA
7082    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7083    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7084    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7085    GOTO_OPCODE(ip)                     @ jump to next instruction
7086
7087
7088/* ------------------------------ */
7089    .balign 64
7090.L_OP_SPUT_VOLATILE: /* 0xe6 */
7091/* File: armv5te/OP_SPUT_VOLATILE.S */
7092/* File: armv5te/OP_SPUT.S */
7093    /*
7094     * General 32-bit SPUT handler.
7095     *
7096     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
7097     */
7098    /* op vAA, field@BBBB */
7099    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7100    FETCH(r1, 1)                        @ r1<- field ref BBBB
7101    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7102    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7103    cmp     r0, #0                      @ is resolved entry null?
7104    beq     .LOP_SPUT_VOLATILE_resolve         @ yes, do resolve
7105.LOP_SPUT_VOLATILE_finish:   @ field ptr in r0
7106    mov     r2, rINST, lsr #8           @ r2<- AA
7107    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7108    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7109    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7110    SMP_DMB_ST                        @ releasing store
7111    str     r1, [r0, #offStaticField_value] @ field<- vAA
7112    SMP_DMB
7113    GOTO_OPCODE(ip)                     @ jump to next instruction
7114
7115
7116/* ------------------------------ */
7117    .balign 64
7118.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
7119/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */
7120/* File: armv5te/OP_IGET.S */
7121    /*
7122     * General 32-bit instance field get.
7123     *
7124     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7125     */
7126    /* op vA, vB, field@CCCC */
7127    mov     r0, rINST, lsr #12          @ r0<- B
7128    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7129    FETCH(r1, 1)                        @ r1<- field ref CCCC
7130    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7131    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7132    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7133    cmp     r0, #0                      @ is resolved entry null?
7134    bne     .LOP_IGET_OBJECT_VOLATILE_finish          @ no, already resolved
71358:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7136    EXPORT_PC()                         @ resolve() could throw
7137    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7138    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7139    cmp     r0, #0
7140    bne     .LOP_IGET_OBJECT_VOLATILE_finish
7141    b       common_exceptionThrown
7142
7143
7144/* ------------------------------ */
7145    .balign 64
7146.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
7147/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */
7148/* File: armv5te/OP_IGET_WIDE.S */
7149    /*
7150     * Wide 32-bit instance field get.
7151     */
7152    /* iget-wide vA, vB, field@CCCC */
7153    mov     r0, rINST, lsr #12          @ r0<- B
7154    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7155    FETCH(r1, 1)                        @ r1<- field ref CCCC
7156    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7157    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7158    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7159    cmp     r0, #0                      @ is resolved entry null?
7160    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
71618:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7162    EXPORT_PC()                         @ resolve() could throw
7163    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7164    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7165    cmp     r0, #0
7166    bne     .LOP_IGET_WIDE_VOLATILE_finish
7167    b       common_exceptionThrown
7168
7169
7170/* ------------------------------ */
7171    .balign 64
7172.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
7173/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */
7174/* File: armv5te/OP_IPUT_WIDE.S */
7175    /* iput-wide vA, vB, field@CCCC */
7176    mov     r0, rINST, lsr #12          @ r0<- B
7177    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7178    FETCH(r1, 1)                        @ r1<- field ref CCCC
7179    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7180    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7181    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7182    cmp     r0, #0                      @ is resolved entry null?
7183    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
71848:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7185    EXPORT_PC()                         @ resolve() could throw
7186    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7187    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7188    cmp     r0, #0                      @ success?
7189    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
7190    b       common_exceptionThrown
7191
7192
7193/* ------------------------------ */
7194    .balign 64
7195.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
7196/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */
7197/* File: armv5te/OP_SGET_WIDE.S */
7198    /*
7199     * 64-bit SGET handler.
7200     */
7201    /* sget-wide vAA, field@BBBB */
7202    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7203    FETCH(r1, 1)                        @ r1<- field ref BBBB
7204    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7205    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7206    cmp     r0, #0                      @ is resolved entry null?
7207    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
7208.LOP_SGET_WIDE_VOLATILE_finish:
7209    mov     r9, rINST, lsr #8           @ r9<- AA
7210    .if 1
7211    add     r0, r0, #offStaticField_value @ r0<- pointer to data
7212    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
7213    .else
7214    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
7215    .endif
7216    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7217    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7218    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
7219    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7220    GOTO_OPCODE(ip)                     @ jump to next instruction
7221
7222
7223/* ------------------------------ */
7224    .balign 64
7225.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
7226/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */
7227/* File: armv5te/OP_SPUT_WIDE.S */
7228    /*
7229     * 64-bit SPUT handler.
7230     */
7231    /* sput-wide vAA, field@BBBB */
7232    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
7233    FETCH(r1, 1)                        @ r1<- field ref BBBB
7234    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7235    mov     r9, rINST, lsr #8           @ r9<- AA
7236    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
7237    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7238    cmp     r2, #0                      @ is resolved entry null?
7239    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7240.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
7241    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7242    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7243    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7244    .if 1
7245    add     r2, r2, #offStaticField_value @ r2<- pointer to data
7246    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
7247    .else
7248    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
7249    .endif
7250    GOTO_OPCODE(r10)                    @ jump to next instruction
7251
7252
7253/* ------------------------------ */
7254    .balign 64
7255.L_OP_BREAKPOINT: /* 0xec */
7256/* File: armv5te/OP_BREAKPOINT.S */
7257    /*
7258     * Breakpoint handler.
7259     *
7260     * Restart this instruction with the original opcode.  By
7261     * the time we get here, the breakpoint will have already been
7262     * handled.
7263     */
7264    mov     r0, rPC
7265    bl      dvmGetOriginalOpcode        @ (rPC)
7266    FETCH(rINST, 0)                     @ reload OP_BREAKPOINT + rest of inst
7267    ldr     r1, [rSELF, #offThread_mainHandlerTable]
7268    and     rINST, #0xff00
7269    orr     rINST, rINST, r0
7270    GOTO_OPCODE_BASE(r1, r0)
7271
7272/* ------------------------------ */
7273    .balign 64
7274.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
7275/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
7276    /*
7277     * Handle a throw-verification-error instruction.  This throws an
7278     * exception for an error discovered during verification.  The
7279     * exception is indicated by AA, with some detail provided by BBBB.
7280     */
7281    /* op AA, ref@BBBB */
7282    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
7283    FETCH(r2, 1)                        @ r2<- BBBB
7284    EXPORT_PC()                         @ export the PC
7285    mov     r1, rINST, lsr #8           @ r1<- AA
7286    bl      dvmThrowVerificationError   @ always throws
7287    b       common_exceptionThrown      @ handle exception
7288
7289/* ------------------------------ */
7290    .balign 64
7291.L_OP_EXECUTE_INLINE: /* 0xee */
7292/* File: armv5te/OP_EXECUTE_INLINE.S */
7293    /*
7294     * Execute a "native inline" instruction.
7295     *
7296     * We need to call an InlineOp4Func:
7297     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7298     *
7299     * The first four args are in r0-r3, pointer to return value storage
7300     * is on the stack.  The function's return value is a flag that tells
7301     * us if an exception was thrown.
7302     *
7303     * TUNING: could maintain two tables, pointer in Thread and
7304     * swap if profiler/debuggger active.
7305     */
7306    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7307    ldrh    r2, [rSELF, #offThread_subMode]
7308    FETCH(r10, 1)                       @ r10<- BBBB
7309    EXPORT_PC()                         @ can throw
7310    ands    r2, #kSubModeDebugProfile   @ Any going on?
7311    bne     .LOP_EXECUTE_INLINE_debugmode       @ yes - take slow path
7312.LOP_EXECUTE_INLINE_resume:
7313    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7314    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7315    mov     r0, rINST, lsr #12          @ r0<- B
7316    str     r1, [sp]                    @ push &self->retval
7317    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7318    add     sp, sp, #8                  @ pop stack
7319    cmp     r0, #0                      @ test boolean result of inline
7320    beq     common_exceptionThrown      @ returned false, handle exception
7321    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7322    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7323    GOTO_OPCODE(ip)                     @ jump to next instruction
7324
7325/* ------------------------------ */
7326    .balign 64
7327.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7328/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7329    /*
7330     * Execute a "native inline" instruction, using "/range" semantics.
7331     * Same idea as execute-inline, but we get the args differently.
7332     *
7333     * We need to call an InlineOp4Func:
7334     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7335     *
7336     * The first four args are in r0-r3, pointer to return value storage
7337     * is on the stack.  The function's return value is a flag that tells
7338     * us if an exception was thrown.
7339     */
7340    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7341    ldrh    r2, [rSELF, #offThread_subMode]
7342    FETCH(r10, 1)                       @ r10<- BBBB
7343    EXPORT_PC()                         @ can throw
7344    ands    r2, #kSubModeDebugProfile   @ Any going on?
7345    bne     .LOP_EXECUTE_INLINE_RANGE_debugmode       @ yes - take slow path
7346.LOP_EXECUTE_INLINE_RANGE_resume:
7347    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7348    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7349    mov     r0, rINST, lsr #8           @ r0<- AA
7350    str     r1, [sp]                    @ push &self->retval
7351    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7352    add     sp, sp, #8                  @ pop stack
7353    cmp     r0, #0                      @ test boolean result of inline
7354    beq     common_exceptionThrown      @ returned false, handle exception
7355    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7356    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7357    GOTO_OPCODE(ip)                     @ jump to next instruction
7358
7359/* ------------------------------ */
7360    .balign 64
7361.L_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
7362/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
7363    /*
7364     * Invoke Object.<init> on an object.  In practice we know that
7365     * Object's nullary constructor doesn't do anything, so we just
7366     * skip it unless a debugger is active.
7367     */
7368    FETCH(r1, 2)                  @ r1<- CCCC
7369    GET_VREG(r0, r1)                    @ r0<- "this" ptr
7370    cmp     r0, #0                      @ check for NULL
7371    beq     common_errNullObject        @ export PC and throw NPE
7372    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
7373    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
7374    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
7375    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_setFinal        @ yes, go
7376.LOP_INVOKE_OBJECT_INIT_RANGE_finish:
7377    ldrh    r1, [rSELF, #offThread_subMode]
7378    ands    r1, #kSubModeDebuggerActive @ debugger active?
7379    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_debugger        @ Yes - skip optimization
7380    FETCH_ADVANCE_INST(2+1)       @ advance to next instr, load rINST
7381    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7382    GOTO_OPCODE(ip)                     @ execute it
7383
7384/* ------------------------------ */
7385    .balign 64
7386.L_OP_RETURN_VOID_BARRIER: /* 0xf1 */
7387/* File: armv5te/OP_RETURN_VOID_BARRIER.S */
7388    SMP_DMB_ST
7389    b       common_returnFromMethod
7390
7391/* ------------------------------ */
7392    .balign 64
7393.L_OP_IGET_QUICK: /* 0xf2 */
7394/* File: armv5te/OP_IGET_QUICK.S */
7395    /* For: iget-quick, iget-object-quick */
7396    /* op vA, vB, offset@CCCC */
7397    mov     r2, rINST, lsr #12          @ r2<- B
7398    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7399    FETCH(r1, 1)                        @ r1<- field byte offset
7400    cmp     r3, #0                      @ check object for null
7401    mov     r2, rINST, lsr #8           @ r2<- A(+)
7402    beq     common_errNullObject        @ object was null
7403    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7404    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7405    and     r2, r2, #15
7406    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7407    SET_VREG(r0, r2)                    @ fp[A]<- r0
7408    GOTO_OPCODE(ip)                     @ jump to next instruction
7409
7410/* ------------------------------ */
7411    .balign 64
7412.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7413/* File: armv5te/OP_IGET_WIDE_QUICK.S */
7414    /* iget-wide-quick vA, vB, offset@CCCC */
7415    mov     r2, rINST, lsr #12          @ r2<- B
7416    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7417    FETCH(ip, 1)                        @ ip<- field byte offset
7418    cmp     r3, #0                      @ check object for null
7419    mov     r2, rINST, lsr #8           @ r2<- A(+)
7420    beq     common_errNullObject        @ object was null
7421    ldrd    r0, [r3, ip]                @ r0<- obj.field (64 bits, aligned)
7422    and     r2, r2, #15
7423    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7424    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7425    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7426    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7427    GOTO_OPCODE(ip)                     @ jump to next instruction
7428
7429/* ------------------------------ */
7430    .balign 64
7431.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7432/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7433/* File: armv5te/OP_IGET_QUICK.S */
7434    /* For: iget-quick, iget-object-quick */
7435    /* op vA, vB, offset@CCCC */
7436    mov     r2, rINST, lsr #12          @ r2<- B
7437    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7438    FETCH(r1, 1)                        @ r1<- field byte offset
7439    cmp     r3, #0                      @ check object for null
7440    mov     r2, rINST, lsr #8           @ r2<- A(+)
7441    beq     common_errNullObject        @ object was null
7442    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7443    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7444    and     r2, r2, #15
7445    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7446    SET_VREG(r0, r2)                    @ fp[A]<- r0
7447    GOTO_OPCODE(ip)                     @ jump to next instruction
7448
7449
7450/* ------------------------------ */
7451    .balign 64
7452.L_OP_IPUT_QUICK: /* 0xf5 */
7453/* File: armv5te/OP_IPUT_QUICK.S */
7454    /* For: iput-quick */
7455    /* op vA, vB, offset@CCCC */
7456    mov     r2, rINST, lsr #12          @ r2<- B
7457    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7458    FETCH(r1, 1)                        @ r1<- field byte offset
7459    cmp     r3, #0                      @ check object for null
7460    mov     r2, rINST, lsr #8           @ r2<- A(+)
7461    beq     common_errNullObject        @ object was null
7462    and     r2, r2, #15
7463    GET_VREG(r0, r2)                    @ r0<- fp[A]
7464    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7465    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7466    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7467    GOTO_OPCODE(ip)                     @ jump to next instruction
7468
7469/* ------------------------------ */
7470    .balign 64
7471.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7472/* File: armv5te/OP_IPUT_WIDE_QUICK.S */
7473    /* iput-wide-quick vA, vB, offset@CCCC */
7474    mov     r0, rINST, lsr #8           @ r0<- A(+)
7475    mov     r1, rINST, lsr #12          @ r1<- B
7476    and     r0, r0, #15
7477    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7478    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7479    cmp     r2, #0                      @ check object for null
7480    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7481    beq     common_errNullObject        @ object was null
7482    FETCH(r3, 1)                        @ r3<- field byte offset
7483    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7484    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7485    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7486    GOTO_OPCODE(ip)                     @ jump to next instruction
7487
7488/* ------------------------------ */
7489    .balign 64
7490.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7491/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7492    /* For: iput-object-quick */
7493    /* op vA, vB, offset@CCCC */
7494    mov     r2, rINST, lsr #12          @ r2<- B
7495    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7496    FETCH(r1, 1)                        @ r1<- field byte offset
7497    cmp     r3, #0                      @ check object for null
7498    mov     r2, rINST, lsr #8           @ r2<- A(+)
7499    beq     common_errNullObject        @ object was null
7500    and     r2, r2, #15
7501    GET_VREG(r0, r2)                    @ r0<- fp[A]
7502    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7503    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7504    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7505    cmp     r0, #0
7506    strneb  r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
7507    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7508    GOTO_OPCODE(ip)                     @ jump to next instruction
7509
7510/* ------------------------------ */
7511    .balign 64
7512.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7513/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7514    /*
7515     * Handle an optimized virtual method call.
7516     *
7517     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7518     */
7519    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7520    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7521    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7522    FETCH(r1, 1)                        @ r1<- BBBB
7523    .if     (!0)
7524    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7525    .endif
7526    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7527    cmp     r9, #0                      @ is "this" null?
7528    beq     common_errNullObject        @ null "this", throw exception
7529    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7530    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7531    EXPORT_PC()                         @ invoke must export
7532    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7533    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7534
7535/* ------------------------------ */
7536    .balign 64
7537.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7538/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7539/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7540    /*
7541     * Handle an optimized virtual method call.
7542     *
7543     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7544     */
7545    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7546    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7547    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7548    FETCH(r1, 1)                        @ r1<- BBBB
7549    .if     (!1)
7550    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7551    .endif
7552    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
7553    cmp     r9, #0                      @ is "this" null?
7554    beq     common_errNullObject        @ null "this", throw exception
7555    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7556    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7557    EXPORT_PC()                         @ invoke must export
7558    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
7559    bl      common_invokeMethodRange @ (r0=method, r9="this")
7560
7561
7562/* ------------------------------ */
7563    .balign 64
7564.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7565/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7566    /*
7567     * Handle an optimized "super" method call.
7568     *
7569     * for: [opt] invoke-super-quick, invoke-super-quick/range
7570     */
7571    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7572    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7573    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7574    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7575    .if     (!0)
7576    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7577    .endif
7578    FETCH(r1, 1)                        @ r1<- BBBB
7579    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7580    EXPORT_PC()                         @ must export for invoke
7581    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7582    GET_VREG(r9, r10)                   @ r9<- "this"
7583    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7584    cmp     r9, #0                      @ null "this" ref?
7585    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7586    beq     common_errNullObject        @ "this" is null, throw exception
7587    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7588
7589/* ------------------------------ */
7590    .balign 64
7591.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7592/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
7593/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7594    /*
7595     * Handle an optimized "super" method call.
7596     *
7597     * for: [opt] invoke-super-quick, invoke-super-quick/range
7598     */
7599    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7600    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7601    FETCH(r10, 2)                       @ r10<- GFED or CCCC
7602    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7603    .if     (!1)
7604    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7605    .endif
7606    FETCH(r1, 1)                        @ r1<- BBBB
7607    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7608    EXPORT_PC()                         @ must export for invoke
7609    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
7610    GET_VREG(r9, r10)                   @ r9<- "this"
7611    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
7612    cmp     r9, #0                      @ null "this" ref?
7613    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7614    beq     common_errNullObject        @ "this" is null, throw exception
7615    bl      common_invokeMethodRange @ (r0=method, r9="this")
7616
7617
7618/* ------------------------------ */
7619    .balign 64
7620.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
7621/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */
7622/* File: armv5te/OP_IPUT_OBJECT.S */
7623    /*
7624     * 32-bit instance field put.
7625     *
7626     * for: iput-object, iput-object-volatile
7627     */
7628    /* op vA, vB, field@CCCC */
7629    mov     r0, rINST, lsr #12          @ r0<- B
7630    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7631    FETCH(r1, 1)                        @ r1<- field ref CCCC
7632    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7633    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7634    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7635    cmp     r0, #0                      @ is resolved entry null?
7636    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ no, already resolved
76378:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7638    EXPORT_PC()                         @ resolve() could throw
7639    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7640    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7641    cmp     r0, #0                      @ success?
7642    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ yes, finish up
7643    b       common_exceptionThrown
7644
7645
7646/* ------------------------------ */
7647    .balign 64
7648.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
7649/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */
7650/* File: armv5te/OP_SGET.S */
7651    /*
7652     * General 32-bit SGET handler.
7653     *
7654     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7655     */
7656    /* op vAA, field@BBBB */
7657    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7658    FETCH(r1, 1)                        @ r1<- field ref BBBB
7659    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7660    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7661    cmp     r0, #0                      @ is resolved entry null?
7662    beq     .LOP_SGET_OBJECT_VOLATILE_resolve         @ yes, do resolve
7663.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0
7664    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
7665    SMP_DMB                            @ acquiring load
7666    mov     r2, rINST, lsr #8           @ r2<- AA
7667    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7668    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7669    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7670    GOTO_OPCODE(ip)                     @ jump to next instruction
7671
7672
7673/* ------------------------------ */
7674    .balign 64
7675.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
7676/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */
7677/* File: armv5te/OP_SPUT_OBJECT.S */
7678    /*
7679     * 32-bit SPUT handler for objects
7680     *
7681     * for: sput-object, sput-object-volatile
7682     */
7683    /* op vAA, field@BBBB */
7684    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7685    FETCH(r1, 1)                        @ r1<- field ref BBBB
7686    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
7687    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7688    cmp     r0, #0                      @ is resolved entry null?
7689    beq     .LOP_SPUT_OBJECT_VOLATILE_resolve         @ yes, do resolve
7690.LOP_SPUT_OBJECT_VOLATILE_finish:   @ field ptr in r0
7691    mov     r2, rINST, lsr #8           @ r2<- AA
7692    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7693    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7694    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7695    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
7696    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7697    SMP_DMB_ST                        @ releasing store
7698    b       .LOP_SPUT_OBJECT_VOLATILE_end
7699
7700
7701/* ------------------------------ */
7702    .balign 64
7703.L_OP_DISPATCH_FF: /* 0xff */
7704/* File: armv5te/OP_DISPATCH_FF.S */
7705    mov     ip, rINST, lsr #8           @ ip<- extended opcode
7706    add     ip, ip, #256                @ add offset for extended opcodes
7707    GOTO_OPCODE(ip)                     @ go to proper extended handler
7708
7709
7710/* ------------------------------ */
7711    .balign 64
7712.L_OP_CONST_CLASS_JUMBO: /* 0x100 */
7713/* File: armv5te/OP_CONST_CLASS_JUMBO.S */
7714    /* const-class/jumbo vBBBB, Class@AAAAAAAA */
7715    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7716    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<-self>methodClassDex
7717    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7718    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
7719    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7720    FETCH(r9, 3)                        @ r9<- BBBB
7721    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[AAAAaaaa]
7722    cmp     r0, #0                      @ not yet resolved?
7723    beq     .LOP_CONST_CLASS_JUMBO_resolve
7724    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
7725    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7726    SET_VREG(r0, r9)                    @ vBBBB<- r0
7727    GOTO_OPCODE(ip)                     @ jump to next instruction
7728
7729/* ------------------------------ */
7730    .balign 64
7731.L_OP_CHECK_CAST_JUMBO: /* 0x101 */
7732/* File: armv5te/OP_CHECK_CAST_JUMBO.S */
7733    /*
7734     * Check to see if a cast from one class to another is allowed.
7735     */
7736    /* check-cast/jumbo vBBBB, class@AAAAAAAA */
7737    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7738    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7739    FETCH(r3, 3)                        @ r3<- BBBB
7740    orr     r2, r0, r2, lsl #16         @ r2<- AAAAaaaa
7741    GET_VREG(r9, r3)                    @ r9<- object
7742    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
7743    cmp     r9, #0                      @ is object null?
7744    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
7745    beq     .LOP_CHECK_CAST_JUMBO_okay            @ null obj, cast always succeeds
7746    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
7747    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
7748    cmp     r1, #0                      @ have we resolved this before?
7749    beq     .LOP_CHECK_CAST_JUMBO_resolve         @ not resolved, do it now
7750.LOP_CHECK_CAST_JUMBO_resolved:
7751    cmp     r0, r1                      @ same class (trivial success)?
7752    bne     .LOP_CHECK_CAST_JUMBO_fullcheck       @ no, do full check
7753    b       .LOP_CHECK_CAST_JUMBO_okay            @ yes, finish up
7754
7755/* ------------------------------ */
7756    .balign 64
7757.L_OP_INSTANCE_OF_JUMBO: /* 0x102 */
7758/* File: armv5te/OP_INSTANCE_OF_JUMBO.S */
7759    /*
7760     * Check to see if an object reference is an instance of a class.
7761     *
7762     * Most common situation is a non-null object, being compared against
7763     * an already-resolved class.
7764     *
7765     * TODO: convert most of this into a common subroutine, shared with
7766     *       OP_INSTANCE_OF.S.
7767     */
7768    /* instance-of/jumbo vBBBB, vCCCC, class@AAAAAAAA */
7769    FETCH(r3, 4)                        @ r3<- vCCCC
7770    FETCH(r9, 3)                        @ r9<- vBBBB
7771    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
7772    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
7773    cmp     r0, #0                      @ is object null?
7774    beq     .LOP_INSTANCE_OF_JUMBO_store           @ null obj, not an instance, store r0
7775    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7776    FETCH(r3, 2)                        @ r3<- AAAA (hi)
7777    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
7778    orr     r3, r1, r3, lsl #16         @ r3<- AAAAaaaa
7779    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
7780    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
7781    cmp     r1, #0                      @ have we resolved this before?
7782    beq     .LOP_INSTANCE_OF_JUMBO_resolve         @ not resolved, do it now
7783    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ resolved, continue
7784
7785/* ------------------------------ */
7786    .balign 64
7787.L_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
7788/* File: armv5te/OP_NEW_INSTANCE_JUMBO.S */
7789    /*
7790     * Create a new instance of a class.
7791     */
7792    /* new-instance/jumbo vBBBB, class@AAAAAAAA */
7793    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7794    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7795    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7796    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7797    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7798    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
7799#if defined(WITH_JIT)
7800    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
7801#endif
7802    EXPORT_PC()                         @ req'd for init, resolve, alloc
7803    cmp     r0, #0                      @ already resolved?
7804    beq     .LOP_NEW_INSTANCE_JUMBO_resolve         @ no, resolve it now
7805.LOP_NEW_INSTANCE_JUMBO_resolved:   @ r0=class
7806    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
7807    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
7808    bne     .LOP_NEW_INSTANCE_JUMBO_needinit        @ no, init class now
7809.LOP_NEW_INSTANCE_JUMBO_initialized: @ r0=class
7810    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
7811    bl      dvmAllocObject              @ r0<- new object
7812    b       .LOP_NEW_INSTANCE_JUMBO_finish          @ continue
7813
7814/* ------------------------------ */
7815    .balign 64
7816.L_OP_NEW_ARRAY_JUMBO: /* 0x104 */
7817/* File: armv5te/OP_NEW_ARRAY_JUMBO.S */
7818    /*
7819     * Allocate an array of objects, specified with the array class
7820     * and a count.
7821     *
7822     * The verifier guarantees that this is an array class, so we don't
7823     * check for it here.
7824     */
7825    /* new-array/jumbo vBBBB, vCCCC, class@AAAAAAAA */
7826    FETCH(r2, 1)                        @ r2<- aaaa (lo)
7827    FETCH(r3, 2)                        @ r3<- AAAA (hi)
7828    FETCH(r0, 4)                        @ r0<- vCCCC
7829    orr     r2, r2, r3, lsl #16         @ r2<- AAAAaaaa
7830    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7831    GET_VREG(r1, r0)                    @ r1<- vCCCC (array length)
7832    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7833    cmp     r1, #0                      @ check length
7834    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
7835    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
7836    cmp     r0, #0                      @ already resolved?
7837    EXPORT_PC()                         @ req'd for resolve, alloc
7838    bne     .LOP_NEW_ARRAY_JUMBO_finish          @ resolved, continue
7839    b       .LOP_NEW_ARRAY_JUMBO_resolve         @ do resolve now
7840
7841/* ------------------------------ */
7842    .balign 64
7843.L_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
7844/* File: armv5te/OP_FILLED_NEW_ARRAY_JUMBO.S */
7845    /*
7846     * Create a new array with elements filled from registers.
7847     *
7848     * TODO: convert most of this into a common subroutine, shared with
7849     *       OP_FILLED_NEW_ARRAY.S.
7850     */
7851    /* filled-new-array/jumbo {vCCCC..v(CCCC+BBBB-1)}, type@AAAAAAAA */
7852    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
7853    FETCH(r0, 1)                        @ r0<- aaaa (lo)
7854    FETCH(r1, 2)                        @ r1<- AAAA (hi)
7855    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
7856    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
7857    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
7858    EXPORT_PC()                         @ need for resolve and alloc
7859    cmp     r0, #0                      @ already resolved?
7860    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_continue        @ yes, continue on
78618:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
7862    mov     r2, #0                      @ r2<- false
7863    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
7864    bl      dvmResolveClass             @ r0<- call(clazz, ref)
7865    cmp     r0, #0                      @ got null?
7866    beq     common_exceptionThrown      @ yes, handle exception
7867    b       .LOP_FILLED_NEW_ARRAY_JUMBO_continue
7868
7869/* ------------------------------ */
7870    .balign 64
7871.L_OP_IGET_JUMBO: /* 0x106 */
7872/* File: armv5te/OP_IGET_JUMBO.S */
7873    /*
7874     * Jumbo 32-bit instance field get.
7875     *
7876     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7877     *      iget-char/jumbo, iget-short/jumbo
7878     */
7879    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7880    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7881    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7882    FETCH(r0, 4)                        @ r0<- CCCC
7883    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7884    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7885    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7886    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7887    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7888    cmp     r0, #0                      @ is resolved entry null?
7889    bne     .LOP_IGET_JUMBO_finish          @ no, already resolved
78908:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7891    EXPORT_PC()                         @ resolve() could throw
7892    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7893    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7894    b       .LOP_IGET_JUMBO_resolved        @ resolved, continue
7895
7896/* ------------------------------ */
7897    .balign 64
7898.L_OP_IGET_WIDE_JUMBO: /* 0x107 */
7899/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
7900    /*
7901     * Jumbo 64-bit instance field get.
7902     */
7903    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
7904    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7905    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7906    FETCH(r0, 4)                        @ r0<- CCCC
7907    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7908    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7909    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
7910    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7911    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7912    cmp     r0, #0                      @ is resolved entry null?
7913    bne     .LOP_IGET_WIDE_JUMBO_finish          @ no, already resolved
7914    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
7915    EXPORT_PC()                         @ resolve() could throw
7916    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7917    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7918    b       .LOP_IGET_WIDE_JUMBO_resolved        @ resolved, continue
7919
7920/* ------------------------------ */
7921    .balign 64
7922.L_OP_IGET_OBJECT_JUMBO: /* 0x108 */
7923/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
7924/* File: armv5te/OP_IGET_JUMBO.S */
7925    /*
7926     * Jumbo 32-bit instance field get.
7927     *
7928     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7929     *      iget-char/jumbo, iget-short/jumbo
7930     */
7931    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7932    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7933    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7934    FETCH(r0, 4)                        @ r0<- CCCC
7935    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7936    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7937    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7938    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7939    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7940    cmp     r0, #0                      @ is resolved entry null?
7941    bne     .LOP_IGET_OBJECT_JUMBO_finish          @ no, already resolved
79428:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7943    EXPORT_PC()                         @ resolve() could throw
7944    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7945    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7946    b       .LOP_IGET_OBJECT_JUMBO_resolved        @ resolved, continue
7947
7948
7949/* ------------------------------ */
7950    .balign 64
7951.L_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
7952/* File: armv5te/OP_IGET_BOOLEAN_JUMBO.S */
7953@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrb", "sqnum":"1" }
7954/* File: armv5te/OP_IGET_JUMBO.S */
7955    /*
7956     * Jumbo 32-bit instance field get.
7957     *
7958     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7959     *      iget-char/jumbo, iget-short/jumbo
7960     */
7961    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7962    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7963    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7964    FETCH(r0, 4)                        @ r0<- CCCC
7965    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7966    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7967    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7968    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7969    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7970    cmp     r0, #0                      @ is resolved entry null?
7971    bne     .LOP_IGET_BOOLEAN_JUMBO_finish          @ no, already resolved
79728:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7973    EXPORT_PC()                         @ resolve() could throw
7974    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7975    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7976    b       .LOP_IGET_BOOLEAN_JUMBO_resolved        @ resolved, continue
7977
7978
7979/* ------------------------------ */
7980    .balign 64
7981.L_OP_IGET_BYTE_JUMBO: /* 0x10a */
7982/* File: armv5te/OP_IGET_BYTE_JUMBO.S */
7983@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsb", "sqnum":"2" }
7984/* File: armv5te/OP_IGET_JUMBO.S */
7985    /*
7986     * Jumbo 32-bit instance field get.
7987     *
7988     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
7989     *      iget-char/jumbo, iget-short/jumbo
7990     */
7991    /* exop vBBBB, vCCCC, field@AAAAAAAA */
7992    FETCH(r1, 1)                        @ r1<- aaaa (lo)
7993    FETCH(r2, 2)                        @ r2<- AAAA (hi)
7994    FETCH(r0, 4)                        @ r0<- CCCC
7995    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7996    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
7997    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7998    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
7999    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8000    cmp     r0, #0                      @ is resolved entry null?
8001    bne     .LOP_IGET_BYTE_JUMBO_finish          @ no, already resolved
80028:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8003    EXPORT_PC()                         @ resolve() could throw
8004    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8005    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8006    b       .LOP_IGET_BYTE_JUMBO_resolved        @ resolved, continue
8007
8008
8009/* ------------------------------ */
8010    .balign 64
8011.L_OP_IGET_CHAR_JUMBO: /* 0x10b */
8012/* File: armv5te/OP_IGET_CHAR_JUMBO.S */
8013@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrh", "sqnum":"3" }
8014/* File: armv5te/OP_IGET_JUMBO.S */
8015    /*
8016     * Jumbo 32-bit instance field get.
8017     *
8018     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8019     *      iget-char/jumbo, iget-short/jumbo
8020     */
8021    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8022    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8023    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8024    FETCH(r0, 4)                        @ r0<- CCCC
8025    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8026    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8027    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8028    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8029    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8030    cmp     r0, #0                      @ is resolved entry null?
8031    bne     .LOP_IGET_CHAR_JUMBO_finish          @ no, already resolved
80328:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8033    EXPORT_PC()                         @ resolve() could throw
8034    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8035    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8036    b       .LOP_IGET_CHAR_JUMBO_resolved        @ resolved, continue
8037
8038
8039/* ------------------------------ */
8040    .balign 64
8041.L_OP_IGET_SHORT_JUMBO: /* 0x10c */
8042/* File: armv5te/OP_IGET_SHORT_JUMBO.S */
8043@include "armv5te/OP_IGET_JUMBO.S" { "load":"ldrsh", "sqnum":"4" }
8044/* File: armv5te/OP_IGET_JUMBO.S */
8045    /*
8046     * Jumbo 32-bit instance field get.
8047     *
8048     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
8049     *      iget-char/jumbo, iget-short/jumbo
8050     */
8051    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8052    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8053    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8054    FETCH(r0, 4)                        @ r0<- CCCC
8055    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8056    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8057    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8058    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8059    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8060    cmp     r0, #0                      @ is resolved entry null?
8061    bne     .LOP_IGET_SHORT_JUMBO_finish          @ no, already resolved
80628:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8063    EXPORT_PC()                         @ resolve() could throw
8064    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8065    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8066    b       .LOP_IGET_SHORT_JUMBO_resolved        @ resolved, continue
8067
8068
8069/* ------------------------------ */
8070    .balign 64
8071.L_OP_IPUT_JUMBO: /* 0x10d */
8072/* File: armv5te/OP_IPUT_JUMBO.S */
8073    /*
8074     * Jumbo 32-bit instance field put.
8075     *
8076     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8077     *      iput-short/jumbo
8078     */
8079    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8080    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8081    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8082    FETCH(r0, 4)                        @ r0<- CCCC
8083    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8084    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8085    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8086    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8087    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8088    cmp     r0, #0                      @ is resolved entry null?
8089    bne     .LOP_IPUT_JUMBO_finish          @ no, already resolved
80908:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8091    EXPORT_PC()                         @ resolve() could throw
8092    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8093    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8094    b       .LOP_IPUT_JUMBO_resolved        @ resolved, continue
8095
8096/* ------------------------------ */
8097    .balign 64
8098.L_OP_IPUT_WIDE_JUMBO: /* 0x10e */
8099/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
8100    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8101    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8102    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8103    FETCH(r0, 4)                        @ r0<- CCCC
8104    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8105    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8106    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
8107    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
8108    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8109    cmp     r0, #0                      @ is resolved entry null?
8110    bne     .LOP_IPUT_WIDE_JUMBO_finish          @ no, already resolved
81118:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
8112    EXPORT_PC()                         @ resolve() could throw
8113    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8114    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8115    b       .LOP_IPUT_WIDE_JUMBO_resolved        @ resolved, continue
8116
8117/* ------------------------------ */
8118    .balign 64
8119.L_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
8120/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
8121    /*
8122     * Jumbo 32-bit instance field put.
8123     */
8124    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
8125    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8126    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8127    FETCH(r0, 4)                        @ r0<- CCCC
8128    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8129    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8130    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8131    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8132    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8133    cmp     r0, #0                      @ is resolved entry null?
8134    bne     .LOP_IPUT_OBJECT_JUMBO_finish          @ no, already resolved
81358:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8136    EXPORT_PC()                         @ resolve() could throw
8137    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8138    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8139    b       .LOP_IPUT_OBJECT_JUMBO_resolved        @ resolved, continue
8140
8141/* ------------------------------ */
8142    .balign 64
8143.L_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
8144/* File: armv5te/OP_IPUT_BOOLEAN_JUMBO.S */
8145@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"1" }
8146/* File: armv5te/OP_IPUT_JUMBO.S */
8147    /*
8148     * Jumbo 32-bit instance field put.
8149     *
8150     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8151     *      iput-short/jumbo
8152     */
8153    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8154    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8155    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8156    FETCH(r0, 4)                        @ r0<- CCCC
8157    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8158    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8159    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8160    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8161    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8162    cmp     r0, #0                      @ is resolved entry null?
8163    bne     .LOP_IPUT_BOOLEAN_JUMBO_finish          @ no, already resolved
81648:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8165    EXPORT_PC()                         @ resolve() could throw
8166    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8167    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8168    b       .LOP_IPUT_BOOLEAN_JUMBO_resolved        @ resolved, continue
8169
8170
8171/* ------------------------------ */
8172    .balign 64
8173.L_OP_IPUT_BYTE_JUMBO: /* 0x111 */
8174/* File: armv5te/OP_IPUT_BYTE_JUMBO.S */
8175@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strb", "sqnum":"2" }
8176/* File: armv5te/OP_IPUT_JUMBO.S */
8177    /*
8178     * Jumbo 32-bit instance field put.
8179     *
8180     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8181     *      iput-short/jumbo
8182     */
8183    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8184    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8185    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8186    FETCH(r0, 4)                        @ r0<- CCCC
8187    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8188    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8189    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8190    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8191    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8192    cmp     r0, #0                      @ is resolved entry null?
8193    bne     .LOP_IPUT_BYTE_JUMBO_finish          @ no, already resolved
81948:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8195    EXPORT_PC()                         @ resolve() could throw
8196    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8197    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8198    b       .LOP_IPUT_BYTE_JUMBO_resolved        @ resolved, continue
8199
8200
8201/* ------------------------------ */
8202    .balign 64
8203.L_OP_IPUT_CHAR_JUMBO: /* 0x112 */
8204/* File: armv5te/OP_IPUT_CHAR_JUMBO.S */
8205@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"3" }
8206/* File: armv5te/OP_IPUT_JUMBO.S */
8207    /*
8208     * Jumbo 32-bit instance field put.
8209     *
8210     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8211     *      iput-short/jumbo
8212     */
8213    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8214    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8215    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8216    FETCH(r0, 4)                        @ r0<- CCCC
8217    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8218    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8219    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8220    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8221    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8222    cmp     r0, #0                      @ is resolved entry null?
8223    bne     .LOP_IPUT_CHAR_JUMBO_finish          @ no, already resolved
82248:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8225    EXPORT_PC()                         @ resolve() could throw
8226    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8227    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8228    b       .LOP_IPUT_CHAR_JUMBO_resolved        @ resolved, continue
8229
8230
8231/* ------------------------------ */
8232    .balign 64
8233.L_OP_IPUT_SHORT_JUMBO: /* 0x113 */
8234/* File: armv5te/OP_IPUT_SHORT_JUMBO.S */
8235@include "armv5te/OP_IPUT_JUMBO.S" { "store":"strh", "sqnum":"4" }
8236/* File: armv5te/OP_IPUT_JUMBO.S */
8237    /*
8238     * Jumbo 32-bit instance field put.
8239     *
8240     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
8241     *      iput-short/jumbo
8242     */
8243    /* exop vBBBB, vCCCC, field@AAAAAAAA */
8244    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8245    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8246    FETCH(r0, 4)                        @ r0<- CCCC
8247    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
8248    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8249    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
8250    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
8251    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
8252    cmp     r0, #0                      @ is resolved entry null?
8253    bne     .LOP_IPUT_SHORT_JUMBO_finish          @ no, already resolved
82548:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
8255    EXPORT_PC()                         @ resolve() could throw
8256    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
8257    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
8258    b       .LOP_IPUT_SHORT_JUMBO_resolved        @ resolved, continue
8259
8260
8261/* ------------------------------ */
8262    .balign 64
8263.L_OP_SGET_JUMBO: /* 0x114 */
8264/* File: armv5te/OP_SGET_JUMBO.S */
8265    /*
8266     * Jumbo 32-bit SGET handler.
8267     *
8268     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8269     *      sget-char/jumbo, sget-short/jumbo
8270     */
8271    /* exop vBBBB, field@AAAAAAAA */
8272    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8273    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8274    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8275    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8276    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8277    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8278    cmp     r0, #0                      @ is resolved entry null?
8279    beq     .LOP_SGET_JUMBO_resolve         @ yes, do resolve
8280.LOP_SGET_JUMBO_finish: @ field ptr in r0
8281    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8282    @ no-op                             @ acquiring load
8283    FETCH(r2, 3)                        @ r2<- BBBB
8284    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8285    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8286    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8287    GOTO_OPCODE(ip)                     @ jump to next instruction
8288
8289/* ------------------------------ */
8290    .balign 64
8291.L_OP_SGET_WIDE_JUMBO: /* 0x115 */
8292/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
8293    /*
8294     * Jumbo 64-bit SGET handler.
8295     */
8296    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
8297    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8298    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8299    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8300    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
8301    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8302    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
8303    cmp     r0, #0                      @ is resolved entry null?
8304    beq     .LOP_SGET_WIDE_JUMBO_resolve         @ yes, do resolve
8305.LOP_SGET_WIDE_JUMBO_finish:
8306    FETCH(r9, 3)                        @ r9<- BBBB
8307    .if 0
8308    add     r0, r0, #offStaticField_value @ r0<- pointer to data
8309    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
8310    .else
8311    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
8312    .endif
8313    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8314    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8315    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
8316    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8317    GOTO_OPCODE(ip)                     @ jump to next instruction
8318
8319/* ------------------------------ */
8320    .balign 64
8321.L_OP_SGET_OBJECT_JUMBO: /* 0x116 */
8322/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
8323/* File: armv5te/OP_SGET_JUMBO.S */
8324    /*
8325     * Jumbo 32-bit SGET handler.
8326     *
8327     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8328     *      sget-char/jumbo, sget-short/jumbo
8329     */
8330    /* exop vBBBB, field@AAAAAAAA */
8331    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8332    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8333    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8334    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8335    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8336    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8337    cmp     r0, #0                      @ is resolved entry null?
8338    beq     .LOP_SGET_OBJECT_JUMBO_resolve         @ yes, do resolve
8339.LOP_SGET_OBJECT_JUMBO_finish: @ field ptr in r0
8340    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8341    @ no-op                             @ acquiring load
8342    FETCH(r2, 3)                        @ r2<- BBBB
8343    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8344    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8345    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8346    GOTO_OPCODE(ip)                     @ jump to next instruction
8347
8348
8349/* ------------------------------ */
8350    .balign 64
8351.L_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
8352/* File: armv5te/OP_SGET_BOOLEAN_JUMBO.S */
8353/* File: armv5te/OP_SGET_JUMBO.S */
8354    /*
8355     * Jumbo 32-bit SGET handler.
8356     *
8357     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8358     *      sget-char/jumbo, sget-short/jumbo
8359     */
8360    /* exop vBBBB, field@AAAAAAAA */
8361    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8362    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8363    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8364    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8365    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8366    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8367    cmp     r0, #0                      @ is resolved entry null?
8368    beq     .LOP_SGET_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8369.LOP_SGET_BOOLEAN_JUMBO_finish: @ field ptr in r0
8370    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8371    @ no-op                             @ acquiring load
8372    FETCH(r2, 3)                        @ r2<- BBBB
8373    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8374    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8375    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8376    GOTO_OPCODE(ip)                     @ jump to next instruction
8377
8378
8379/* ------------------------------ */
8380    .balign 64
8381.L_OP_SGET_BYTE_JUMBO: /* 0x118 */
8382/* File: armv5te/OP_SGET_BYTE_JUMBO.S */
8383/* File: armv5te/OP_SGET_JUMBO.S */
8384    /*
8385     * Jumbo 32-bit SGET handler.
8386     *
8387     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8388     *      sget-char/jumbo, sget-short/jumbo
8389     */
8390    /* exop vBBBB, field@AAAAAAAA */
8391    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8392    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8393    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8394    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8395    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8396    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8397    cmp     r0, #0                      @ is resolved entry null?
8398    beq     .LOP_SGET_BYTE_JUMBO_resolve         @ yes, do resolve
8399.LOP_SGET_BYTE_JUMBO_finish: @ field ptr in r0
8400    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8401    @ no-op                             @ acquiring load
8402    FETCH(r2, 3)                        @ r2<- BBBB
8403    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8404    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8405    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8406    GOTO_OPCODE(ip)                     @ jump to next instruction
8407
8408
8409/* ------------------------------ */
8410    .balign 64
8411.L_OP_SGET_CHAR_JUMBO: /* 0x119 */
8412/* File: armv5te/OP_SGET_CHAR_JUMBO.S */
8413/* File: armv5te/OP_SGET_JUMBO.S */
8414    /*
8415     * Jumbo 32-bit SGET handler.
8416     *
8417     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8418     *      sget-char/jumbo, sget-short/jumbo
8419     */
8420    /* exop vBBBB, field@AAAAAAAA */
8421    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8422    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8423    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8424    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8425    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8426    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8427    cmp     r0, #0                      @ is resolved entry null?
8428    beq     .LOP_SGET_CHAR_JUMBO_resolve         @ yes, do resolve
8429.LOP_SGET_CHAR_JUMBO_finish: @ field ptr in r0
8430    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8431    @ no-op                             @ acquiring load
8432    FETCH(r2, 3)                        @ r2<- BBBB
8433    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8434    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8435    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8436    GOTO_OPCODE(ip)                     @ jump to next instruction
8437
8438
8439/* ------------------------------ */
8440    .balign 64
8441.L_OP_SGET_SHORT_JUMBO: /* 0x11a */
8442/* File: armv5te/OP_SGET_SHORT_JUMBO.S */
8443/* File: armv5te/OP_SGET_JUMBO.S */
8444    /*
8445     * Jumbo 32-bit SGET handler.
8446     *
8447     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
8448     *      sget-char/jumbo, sget-short/jumbo
8449     */
8450    /* exop vBBBB, field@AAAAAAAA */
8451    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8452    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8453    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8454    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8455    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8456    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8457    cmp     r0, #0                      @ is resolved entry null?
8458    beq     .LOP_SGET_SHORT_JUMBO_resolve         @ yes, do resolve
8459.LOP_SGET_SHORT_JUMBO_finish: @ field ptr in r0
8460    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
8461    @ no-op                             @ acquiring load
8462    FETCH(r2, 3)                        @ r2<- BBBB
8463    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8464    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
8465    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8466    GOTO_OPCODE(ip)                     @ jump to next instruction
8467
8468
8469/* ------------------------------ */
8470    .balign 64
8471.L_OP_SPUT_JUMBO: /* 0x11b */
8472/* File: armv5te/OP_SPUT_JUMBO.S */
8473    /*
8474     * Jumbo 32-bit SPUT handler.
8475     *
8476     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8477     *      sput-short/jumbo
8478     */
8479    /* exop vBBBB, field@AAAAAAAA */
8480    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8481    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8482    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8483    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8484    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8485    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8486    cmp     r0, #0                      @ is resolved entry null?
8487    beq     .LOP_SPUT_JUMBO_resolve         @ yes, do resolve
8488.LOP_SPUT_JUMBO_finish:   @ field ptr in r0
8489    FETCH(r2, 3)                        @ r2<- BBBB
8490    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8491    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8492    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8493    @ no-op                        @ releasing store
8494    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8495    @ no-op
8496    GOTO_OPCODE(ip)                     @ jump to next instruction
8497
8498/* ------------------------------ */
8499    .balign 64
8500.L_OP_SPUT_WIDE_JUMBO: /* 0x11c */
8501/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
8502    /*
8503     * Jumbo 64-bit SPUT handler.
8504     */
8505    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
8506    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
8507    FETCH(r1, 1)                        @ r1<- aaaa (lo)
8508    FETCH(r2, 2)                        @ r2<- AAAA (hi)
8509    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8510    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
8511    FETCH(r9, 3)                        @ r9<- BBBB
8512    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
8513    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
8514    cmp     r2, #0                      @ is resolved entry null?
8515    beq     .LOP_SPUT_WIDE_JUMBO_resolve         @ yes, do resolve
8516.LOP_SPUT_WIDE_JUMBO_finish: @ field ptr in r2, BBBB in r9
8517    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8518    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
8519    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8520    .if 0
8521    add     r2, r2, #offStaticField_value @ r2<- pointer to data
8522    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
8523    .else
8524    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
8525    .endif
8526    GOTO_OPCODE(r10)                    @ jump to next instruction
8527
8528/* ------------------------------ */
8529    .balign 64
8530.L_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
8531/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
8532    /*
8533     * Jumbo 32-bit SPUT handler for objects
8534     */
8535    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
8536    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8537    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8538    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8539    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8540    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8541    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
8542    cmp     r0, #0                      @ is resolved entry null?
8543    beq     .LOP_SPUT_OBJECT_JUMBO_resolve         @ yes, do resolve
8544.LOP_SPUT_OBJECT_JUMBO_finish:   @ field ptr in r0
8545    FETCH(r2, 3)                        @ r2<- BBBB
8546    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8547    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8548    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8549    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
8550    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8551    @ no-op                         @ releasing store
8552    b       .LOP_SPUT_OBJECT_JUMBO_end
8553
8554/* ------------------------------ */
8555    .balign 64
8556.L_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
8557/* File: armv5te/OP_SPUT_BOOLEAN_JUMBO.S */
8558/* File: armv5te/OP_SPUT_JUMBO.S */
8559    /*
8560     * Jumbo 32-bit SPUT handler.
8561     *
8562     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8563     *      sput-short/jumbo
8564     */
8565    /* exop vBBBB, field@AAAAAAAA */
8566    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8567    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8568    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8569    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8570    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8571    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8572    cmp     r0, #0                      @ is resolved entry null?
8573    beq     .LOP_SPUT_BOOLEAN_JUMBO_resolve         @ yes, do resolve
8574.LOP_SPUT_BOOLEAN_JUMBO_finish:   @ field ptr in r0
8575    FETCH(r2, 3)                        @ r2<- BBBB
8576    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8577    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8578    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8579    @ no-op                        @ releasing store
8580    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8581    @ no-op
8582    GOTO_OPCODE(ip)                     @ jump to next instruction
8583
8584
8585/* ------------------------------ */
8586    .balign 64
8587.L_OP_SPUT_BYTE_JUMBO: /* 0x11f */
8588/* File: armv5te/OP_SPUT_BYTE_JUMBO.S */
8589/* File: armv5te/OP_SPUT_JUMBO.S */
8590    /*
8591     * Jumbo 32-bit SPUT handler.
8592     *
8593     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8594     *      sput-short/jumbo
8595     */
8596    /* exop vBBBB, field@AAAAAAAA */
8597    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8598    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8599    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8600    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8601    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8602    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8603    cmp     r0, #0                      @ is resolved entry null?
8604    beq     .LOP_SPUT_BYTE_JUMBO_resolve         @ yes, do resolve
8605.LOP_SPUT_BYTE_JUMBO_finish:   @ field ptr in r0
8606    FETCH(r2, 3)                        @ r2<- BBBB
8607    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8608    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8609    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8610    @ no-op                        @ releasing store
8611    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8612    @ no-op
8613    GOTO_OPCODE(ip)                     @ jump to next instruction
8614
8615
8616/* ------------------------------ */
8617    .balign 64
8618.L_OP_SPUT_CHAR_JUMBO: /* 0x120 */
8619/* File: armv5te/OP_SPUT_CHAR_JUMBO.S */
8620/* File: armv5te/OP_SPUT_JUMBO.S */
8621    /*
8622     * Jumbo 32-bit SPUT handler.
8623     *
8624     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8625     *      sput-short/jumbo
8626     */
8627    /* exop vBBBB, field@AAAAAAAA */
8628    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8629    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8630    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8631    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8632    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8633    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8634    cmp     r0, #0                      @ is resolved entry null?
8635    beq     .LOP_SPUT_CHAR_JUMBO_resolve         @ yes, do resolve
8636.LOP_SPUT_CHAR_JUMBO_finish:   @ field ptr in r0
8637    FETCH(r2, 3)                        @ r2<- BBBB
8638    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8639    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8640    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8641    @ no-op                        @ releasing store
8642    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8643    @ no-op
8644    GOTO_OPCODE(ip)                     @ jump to next instruction
8645
8646
8647/* ------------------------------ */
8648    .balign 64
8649.L_OP_SPUT_SHORT_JUMBO: /* 0x121 */
8650/* File: armv5te/OP_SPUT_SHORT_JUMBO.S */
8651/* File: armv5te/OP_SPUT_JUMBO.S */
8652    /*
8653     * Jumbo 32-bit SPUT handler.
8654     *
8655     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
8656     *      sput-short/jumbo
8657     */
8658    /* exop vBBBB, field@AAAAAAAA */
8659    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8660    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8661    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8662    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
8663    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8664    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8665    cmp     r0, #0                      @ is resolved entry null?
8666    beq     .LOP_SPUT_SHORT_JUMBO_resolve         @ yes, do resolve
8667.LOP_SPUT_SHORT_JUMBO_finish:   @ field ptr in r0
8668    FETCH(r2, 3)                        @ r2<- BBBB
8669    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
8670    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
8671    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8672    @ no-op                        @ releasing store
8673    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
8674    @ no-op
8675    GOTO_OPCODE(ip)                     @ jump to next instruction
8676
8677
8678/* ------------------------------ */
8679    .balign 64
8680.L_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
8681/* File: armv5te/OP_INVOKE_VIRTUAL_JUMBO.S */
8682    /*
8683     * Handle a virtual method call.
8684     */
8685    /* invoke-virtual/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8686    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8687    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8688    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8689    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8690    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8691    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
8692    cmp     r0, #0                      @ already resolved?
8693    EXPORT_PC()                         @ must export for invoke
8694    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ yes, continue on
8695    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
8696    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8697    mov     r2, #METHOD_VIRTUAL         @ resolver method type
8698    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
8699    cmp     r0, #0                      @ got null?
8700    bne     .LOP_INVOKE_VIRTUAL_JUMBO_continue        @ no, continue
8701    b       common_exceptionThrown      @ yes, handle exception
8702
8703/* ------------------------------ */
8704    .balign 64
8705.L_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
8706/* File: armv5te/OP_INVOKE_SUPER_JUMBO.S */
8707    /*
8708     * Handle a "super" method call.
8709     */
8710    /* invoke-super/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8711    FETCH(r10, 4)                       @ r10<- CCCC
8712    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8713    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8714    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8715    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8716    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8717    GET_VREG(r9, r10)                   @ r9<- "this" ptr
8718    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
8719    cmp     r9, #0                      @ null "this"?
8720    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
8721    beq     common_errNullObject        @ null "this", throw exception
8722    cmp     r0, #0                      @ already resolved?
8723    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
8724    EXPORT_PC()                         @ must export for invoke
8725    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ resolved, continue on
8726    b       .LOP_INVOKE_SUPER_JUMBO_resolve         @ do resolve now
8727
8728/* ------------------------------ */
8729    .balign 64
8730.L_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
8731/* File: armv5te/OP_INVOKE_DIRECT_JUMBO.S */
8732    /*
8733     * Handle a direct method call.
8734     *
8735     * (We could defer the "is 'this' pointer null" test to the common
8736     * method invocation code, and use a flag to indicate that static
8737     * calls don't count.  If we do this as part of copying the arguments
8738     * out we could avoiding loading the first arg twice.)
8739     *
8740     */
8741    /* invoke-direct/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8742    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8743    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8744    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8745    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8746    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8747    FETCH(r10, 4)                       @ r10<- CCCC
8748    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
8749    cmp     r0, #0                      @ already resolved?
8750    EXPORT_PC()                         @ must export for invoke
8751    GET_VREG(r9, r10)                   @ r9<- "this" ptr
8752    beq     .LOP_INVOKE_DIRECT_JUMBO_resolve         @ not resolved, do it now
8753.LOP_INVOKE_DIRECT_JUMBO_finish:
8754    cmp     r9, #0                      @ null "this" ref?
8755    bne     common_invokeMethodJumbo    @ (r0=method, r9="this")
8756    b       common_errNullObject        @ yes, throw exception
8757
8758/* ------------------------------ */
8759    .balign 64
8760.L_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
8761/* File: armv5te/OP_INVOKE_STATIC_JUMBO.S */
8762    /*
8763     * Handle a static method call.
8764     */
8765    /* invoke-static/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8766    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
8767    FETCH(r0, 1)                        @ r1<- aaaa (lo)
8768    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8769    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
8770    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8771    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
8772#if defined(WITH_JIT)
8773    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
8774#endif
8775    cmp     r0, #0                      @ already resolved?
8776    EXPORT_PC()                         @ must export for invoke
8777    bne     common_invokeMethodJumboNoThis   @ (r0=method)
8778    b       .LOP_INVOKE_STATIC_JUMBO_resolve
8779
8780/* ------------------------------ */
8781    .balign 64
8782.L_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
8783/* File: armv5te/OP_INVOKE_INTERFACE_JUMBO.S */
8784    /*
8785     * Handle an interface method call.
8786     */
8787    /* invoke-interface/jumbo {vCCCC..v(CCCC+BBBB-1)}, meth@AAAAAAAA */
8788    FETCH(r2, 4)                        @ r2<- CCCC
8789    FETCH(r0, 1)                        @ r0<- aaaa (lo)
8790    FETCH(r1, 2)                        @ r1<- AAAA (hi)
8791    EXPORT_PC()                         @ must export for invoke
8792    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
8793    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
8794    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
8795    cmp     r9, #0                      @ null obj?
8796    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
8797    beq     common_errNullObject        @ yes, fail
8798    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
8799    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
8800    cmp     r0, #0                      @ failed?
8801    beq     common_exceptionThrown      @ yes, handle exception
8802    b       common_invokeMethodJumbo    @ (r0=method, r9="this")
8803
8804/* ------------------------------ */
8805    .balign 64
8806.L_OP_UNUSED_27FF: /* 0x127 */
8807/* File: armv5te/OP_UNUSED_27FF.S */
8808/* File: armv5te/unused.S */
8809    bl      common_abort
8810
8811
8812/* ------------------------------ */
8813    .balign 64
8814.L_OP_UNUSED_28FF: /* 0x128 */
8815/* File: armv5te/OP_UNUSED_28FF.S */
8816/* File: armv5te/unused.S */
8817    bl      common_abort
8818
8819
8820/* ------------------------------ */
8821    .balign 64
8822.L_OP_UNUSED_29FF: /* 0x129 */
8823/* File: armv5te/OP_UNUSED_29FF.S */
8824/* File: armv5te/unused.S */
8825    bl      common_abort
8826
8827
8828/* ------------------------------ */
8829    .balign 64
8830.L_OP_UNUSED_2AFF: /* 0x12a */
8831/* File: armv5te/OP_UNUSED_2AFF.S */
8832/* File: armv5te/unused.S */
8833    bl      common_abort
8834
8835
8836/* ------------------------------ */
8837    .balign 64
8838.L_OP_UNUSED_2BFF: /* 0x12b */
8839/* File: armv5te/OP_UNUSED_2BFF.S */
8840/* File: armv5te/unused.S */
8841    bl      common_abort
8842
8843
8844/* ------------------------------ */
8845    .balign 64
8846.L_OP_UNUSED_2CFF: /* 0x12c */
8847/* File: armv5te/OP_UNUSED_2CFF.S */
8848/* File: armv5te/unused.S */
8849    bl      common_abort
8850
8851
8852/* ------------------------------ */
8853    .balign 64
8854.L_OP_UNUSED_2DFF: /* 0x12d */
8855/* File: armv5te/OP_UNUSED_2DFF.S */
8856/* File: armv5te/unused.S */
8857    bl      common_abort
8858
8859
8860/* ------------------------------ */
8861    .balign 64
8862.L_OP_UNUSED_2EFF: /* 0x12e */
8863/* File: armv5te/OP_UNUSED_2EFF.S */
8864/* File: armv5te/unused.S */
8865    bl      common_abort
8866
8867
8868/* ------------------------------ */
8869    .balign 64
8870.L_OP_UNUSED_2FFF: /* 0x12f */
8871/* File: armv5te/OP_UNUSED_2FFF.S */
8872/* File: armv5te/unused.S */
8873    bl      common_abort
8874
8875
8876/* ------------------------------ */
8877    .balign 64
8878.L_OP_UNUSED_30FF: /* 0x130 */
8879/* File: armv5te/OP_UNUSED_30FF.S */
8880/* File: armv5te/unused.S */
8881    bl      common_abort
8882
8883
8884/* ------------------------------ */
8885    .balign 64
8886.L_OP_UNUSED_31FF: /* 0x131 */
8887/* File: armv5te/OP_UNUSED_31FF.S */
8888/* File: armv5te/unused.S */
8889    bl      common_abort
8890
8891
8892/* ------------------------------ */
8893    .balign 64
8894.L_OP_UNUSED_32FF: /* 0x132 */
8895/* File: armv5te/OP_UNUSED_32FF.S */
8896/* File: armv5te/unused.S */
8897    bl      common_abort
8898
8899
8900/* ------------------------------ */
8901    .balign 64
8902.L_OP_UNUSED_33FF: /* 0x133 */
8903/* File: armv5te/OP_UNUSED_33FF.S */
8904/* File: armv5te/unused.S */
8905    bl      common_abort
8906
8907
8908/* ------------------------------ */
8909    .balign 64
8910.L_OP_UNUSED_34FF: /* 0x134 */
8911/* File: armv5te/OP_UNUSED_34FF.S */
8912/* File: armv5te/unused.S */
8913    bl      common_abort
8914
8915
8916/* ------------------------------ */
8917    .balign 64
8918.L_OP_UNUSED_35FF: /* 0x135 */
8919/* File: armv5te/OP_UNUSED_35FF.S */
8920/* File: armv5te/unused.S */
8921    bl      common_abort
8922
8923
8924/* ------------------------------ */
8925    .balign 64
8926.L_OP_UNUSED_36FF: /* 0x136 */
8927/* File: armv5te/OP_UNUSED_36FF.S */
8928/* File: armv5te/unused.S */
8929    bl      common_abort
8930
8931
8932/* ------------------------------ */
8933    .balign 64
8934.L_OP_UNUSED_37FF: /* 0x137 */
8935/* File: armv5te/OP_UNUSED_37FF.S */
8936/* File: armv5te/unused.S */
8937    bl      common_abort
8938
8939
8940/* ------------------------------ */
8941    .balign 64
8942.L_OP_UNUSED_38FF: /* 0x138 */
8943/* File: armv5te/OP_UNUSED_38FF.S */
8944/* File: armv5te/unused.S */
8945    bl      common_abort
8946
8947
8948/* ------------------------------ */
8949    .balign 64
8950.L_OP_UNUSED_39FF: /* 0x139 */
8951/* File: armv5te/OP_UNUSED_39FF.S */
8952/* File: armv5te/unused.S */
8953    bl      common_abort
8954
8955
8956/* ------------------------------ */
8957    .balign 64
8958.L_OP_UNUSED_3AFF: /* 0x13a */
8959/* File: armv5te/OP_UNUSED_3AFF.S */
8960/* File: armv5te/unused.S */
8961    bl      common_abort
8962
8963
8964/* ------------------------------ */
8965    .balign 64
8966.L_OP_UNUSED_3BFF: /* 0x13b */
8967/* File: armv5te/OP_UNUSED_3BFF.S */
8968/* File: armv5te/unused.S */
8969    bl      common_abort
8970
8971
8972/* ------------------------------ */
8973    .balign 64
8974.L_OP_UNUSED_3CFF: /* 0x13c */
8975/* File: armv5te/OP_UNUSED_3CFF.S */
8976/* File: armv5te/unused.S */
8977    bl      common_abort
8978
8979
8980/* ------------------------------ */
8981    .balign 64
8982.L_OP_UNUSED_3DFF: /* 0x13d */
8983/* File: armv5te/OP_UNUSED_3DFF.S */
8984/* File: armv5te/unused.S */
8985    bl      common_abort
8986
8987
8988/* ------------------------------ */
8989    .balign 64
8990.L_OP_UNUSED_3EFF: /* 0x13e */
8991/* File: armv5te/OP_UNUSED_3EFF.S */
8992/* File: armv5te/unused.S */
8993    bl      common_abort
8994
8995
8996/* ------------------------------ */
8997    .balign 64
8998.L_OP_UNUSED_3FFF: /* 0x13f */
8999/* File: armv5te/OP_UNUSED_3FFF.S */
9000/* File: armv5te/unused.S */
9001    bl      common_abort
9002
9003
9004/* ------------------------------ */
9005    .balign 64
9006.L_OP_UNUSED_40FF: /* 0x140 */
9007/* File: armv5te/OP_UNUSED_40FF.S */
9008/* File: armv5te/unused.S */
9009    bl      common_abort
9010
9011
9012/* ------------------------------ */
9013    .balign 64
9014.L_OP_UNUSED_41FF: /* 0x141 */
9015/* File: armv5te/OP_UNUSED_41FF.S */
9016/* File: armv5te/unused.S */
9017    bl      common_abort
9018
9019
9020/* ------------------------------ */
9021    .balign 64
9022.L_OP_UNUSED_42FF: /* 0x142 */
9023/* File: armv5te/OP_UNUSED_42FF.S */
9024/* File: armv5te/unused.S */
9025    bl      common_abort
9026
9027
9028/* ------------------------------ */
9029    .balign 64
9030.L_OP_UNUSED_43FF: /* 0x143 */
9031/* File: armv5te/OP_UNUSED_43FF.S */
9032/* File: armv5te/unused.S */
9033    bl      common_abort
9034
9035
9036/* ------------------------------ */
9037    .balign 64
9038.L_OP_UNUSED_44FF: /* 0x144 */
9039/* File: armv5te/OP_UNUSED_44FF.S */
9040/* File: armv5te/unused.S */
9041    bl      common_abort
9042
9043
9044/* ------------------------------ */
9045    .balign 64
9046.L_OP_UNUSED_45FF: /* 0x145 */
9047/* File: armv5te/OP_UNUSED_45FF.S */
9048/* File: armv5te/unused.S */
9049    bl      common_abort
9050
9051
9052/* ------------------------------ */
9053    .balign 64
9054.L_OP_UNUSED_46FF: /* 0x146 */
9055/* File: armv5te/OP_UNUSED_46FF.S */
9056/* File: armv5te/unused.S */
9057    bl      common_abort
9058
9059
9060/* ------------------------------ */
9061    .balign 64
9062.L_OP_UNUSED_47FF: /* 0x147 */
9063/* File: armv5te/OP_UNUSED_47FF.S */
9064/* File: armv5te/unused.S */
9065    bl      common_abort
9066
9067
9068/* ------------------------------ */
9069    .balign 64
9070.L_OP_UNUSED_48FF: /* 0x148 */
9071/* File: armv5te/OP_UNUSED_48FF.S */
9072/* File: armv5te/unused.S */
9073    bl      common_abort
9074
9075
9076/* ------------------------------ */
9077    .balign 64
9078.L_OP_UNUSED_49FF: /* 0x149 */
9079/* File: armv5te/OP_UNUSED_49FF.S */
9080/* File: armv5te/unused.S */
9081    bl      common_abort
9082
9083
9084/* ------------------------------ */
9085    .balign 64
9086.L_OP_UNUSED_4AFF: /* 0x14a */
9087/* File: armv5te/OP_UNUSED_4AFF.S */
9088/* File: armv5te/unused.S */
9089    bl      common_abort
9090
9091
9092/* ------------------------------ */
9093    .balign 64
9094.L_OP_UNUSED_4BFF: /* 0x14b */
9095/* File: armv5te/OP_UNUSED_4BFF.S */
9096/* File: armv5te/unused.S */
9097    bl      common_abort
9098
9099
9100/* ------------------------------ */
9101    .balign 64
9102.L_OP_UNUSED_4CFF: /* 0x14c */
9103/* File: armv5te/OP_UNUSED_4CFF.S */
9104/* File: armv5te/unused.S */
9105    bl      common_abort
9106
9107
9108/* ------------------------------ */
9109    .balign 64
9110.L_OP_UNUSED_4DFF: /* 0x14d */
9111/* File: armv5te/OP_UNUSED_4DFF.S */
9112/* File: armv5te/unused.S */
9113    bl      common_abort
9114
9115
9116/* ------------------------------ */
9117    .balign 64
9118.L_OP_UNUSED_4EFF: /* 0x14e */
9119/* File: armv5te/OP_UNUSED_4EFF.S */
9120/* File: armv5te/unused.S */
9121    bl      common_abort
9122
9123
9124/* ------------------------------ */
9125    .balign 64
9126.L_OP_UNUSED_4FFF: /* 0x14f */
9127/* File: armv5te/OP_UNUSED_4FFF.S */
9128/* File: armv5te/unused.S */
9129    bl      common_abort
9130
9131
9132/* ------------------------------ */
9133    .balign 64
9134.L_OP_UNUSED_50FF: /* 0x150 */
9135/* File: armv5te/OP_UNUSED_50FF.S */
9136/* File: armv5te/unused.S */
9137    bl      common_abort
9138
9139
9140/* ------------------------------ */
9141    .balign 64
9142.L_OP_UNUSED_51FF: /* 0x151 */
9143/* File: armv5te/OP_UNUSED_51FF.S */
9144/* File: armv5te/unused.S */
9145    bl      common_abort
9146
9147
9148/* ------------------------------ */
9149    .balign 64
9150.L_OP_UNUSED_52FF: /* 0x152 */
9151/* File: armv5te/OP_UNUSED_52FF.S */
9152/* File: armv5te/unused.S */
9153    bl      common_abort
9154
9155
9156/* ------------------------------ */
9157    .balign 64
9158.L_OP_UNUSED_53FF: /* 0x153 */
9159/* File: armv5te/OP_UNUSED_53FF.S */
9160/* File: armv5te/unused.S */
9161    bl      common_abort
9162
9163
9164/* ------------------------------ */
9165    .balign 64
9166.L_OP_UNUSED_54FF: /* 0x154 */
9167/* File: armv5te/OP_UNUSED_54FF.S */
9168/* File: armv5te/unused.S */
9169    bl      common_abort
9170
9171
9172/* ------------------------------ */
9173    .balign 64
9174.L_OP_UNUSED_55FF: /* 0x155 */
9175/* File: armv5te/OP_UNUSED_55FF.S */
9176/* File: armv5te/unused.S */
9177    bl      common_abort
9178
9179
9180/* ------------------------------ */
9181    .balign 64
9182.L_OP_UNUSED_56FF: /* 0x156 */
9183/* File: armv5te/OP_UNUSED_56FF.S */
9184/* File: armv5te/unused.S */
9185    bl      common_abort
9186
9187
9188/* ------------------------------ */
9189    .balign 64
9190.L_OP_UNUSED_57FF: /* 0x157 */
9191/* File: armv5te/OP_UNUSED_57FF.S */
9192/* File: armv5te/unused.S */
9193    bl      common_abort
9194
9195
9196/* ------------------------------ */
9197    .balign 64
9198.L_OP_UNUSED_58FF: /* 0x158 */
9199/* File: armv5te/OP_UNUSED_58FF.S */
9200/* File: armv5te/unused.S */
9201    bl      common_abort
9202
9203
9204/* ------------------------------ */
9205    .balign 64
9206.L_OP_UNUSED_59FF: /* 0x159 */
9207/* File: armv5te/OP_UNUSED_59FF.S */
9208/* File: armv5te/unused.S */
9209    bl      common_abort
9210
9211
9212/* ------------------------------ */
9213    .balign 64
9214.L_OP_UNUSED_5AFF: /* 0x15a */
9215/* File: armv5te/OP_UNUSED_5AFF.S */
9216/* File: armv5te/unused.S */
9217    bl      common_abort
9218
9219
9220/* ------------------------------ */
9221    .balign 64
9222.L_OP_UNUSED_5BFF: /* 0x15b */
9223/* File: armv5te/OP_UNUSED_5BFF.S */
9224/* File: armv5te/unused.S */
9225    bl      common_abort
9226
9227
9228/* ------------------------------ */
9229    .balign 64
9230.L_OP_UNUSED_5CFF: /* 0x15c */
9231/* File: armv5te/OP_UNUSED_5CFF.S */
9232/* File: armv5te/unused.S */
9233    bl      common_abort
9234
9235
9236/* ------------------------------ */
9237    .balign 64
9238.L_OP_UNUSED_5DFF: /* 0x15d */
9239/* File: armv5te/OP_UNUSED_5DFF.S */
9240/* File: armv5te/unused.S */
9241    bl      common_abort
9242
9243
9244/* ------------------------------ */
9245    .balign 64
9246.L_OP_UNUSED_5EFF: /* 0x15e */
9247/* File: armv5te/OP_UNUSED_5EFF.S */
9248/* File: armv5te/unused.S */
9249    bl      common_abort
9250
9251
9252/* ------------------------------ */
9253    .balign 64
9254.L_OP_UNUSED_5FFF: /* 0x15f */
9255/* File: armv5te/OP_UNUSED_5FFF.S */
9256/* File: armv5te/unused.S */
9257    bl      common_abort
9258
9259
9260/* ------------------------------ */
9261    .balign 64
9262.L_OP_UNUSED_60FF: /* 0x160 */
9263/* File: armv5te/OP_UNUSED_60FF.S */
9264/* File: armv5te/unused.S */
9265    bl      common_abort
9266
9267
9268/* ------------------------------ */
9269    .balign 64
9270.L_OP_UNUSED_61FF: /* 0x161 */
9271/* File: armv5te/OP_UNUSED_61FF.S */
9272/* File: armv5te/unused.S */
9273    bl      common_abort
9274
9275
9276/* ------------------------------ */
9277    .balign 64
9278.L_OP_UNUSED_62FF: /* 0x162 */
9279/* File: armv5te/OP_UNUSED_62FF.S */
9280/* File: armv5te/unused.S */
9281    bl      common_abort
9282
9283
9284/* ------------------------------ */
9285    .balign 64
9286.L_OP_UNUSED_63FF: /* 0x163 */
9287/* File: armv5te/OP_UNUSED_63FF.S */
9288/* File: armv5te/unused.S */
9289    bl      common_abort
9290
9291
9292/* ------------------------------ */
9293    .balign 64
9294.L_OP_UNUSED_64FF: /* 0x164 */
9295/* File: armv5te/OP_UNUSED_64FF.S */
9296/* File: armv5te/unused.S */
9297    bl      common_abort
9298
9299
9300/* ------------------------------ */
9301    .balign 64
9302.L_OP_UNUSED_65FF: /* 0x165 */
9303/* File: armv5te/OP_UNUSED_65FF.S */
9304/* File: armv5te/unused.S */
9305    bl      common_abort
9306
9307
9308/* ------------------------------ */
9309    .balign 64
9310.L_OP_UNUSED_66FF: /* 0x166 */
9311/* File: armv5te/OP_UNUSED_66FF.S */
9312/* File: armv5te/unused.S */
9313    bl      common_abort
9314
9315
9316/* ------------------------------ */
9317    .balign 64
9318.L_OP_UNUSED_67FF: /* 0x167 */
9319/* File: armv5te/OP_UNUSED_67FF.S */
9320/* File: armv5te/unused.S */
9321    bl      common_abort
9322
9323
9324/* ------------------------------ */
9325    .balign 64
9326.L_OP_UNUSED_68FF: /* 0x168 */
9327/* File: armv5te/OP_UNUSED_68FF.S */
9328/* File: armv5te/unused.S */
9329    bl      common_abort
9330
9331
9332/* ------------------------------ */
9333    .balign 64
9334.L_OP_UNUSED_69FF: /* 0x169 */
9335/* File: armv5te/OP_UNUSED_69FF.S */
9336/* File: armv5te/unused.S */
9337    bl      common_abort
9338
9339
9340/* ------------------------------ */
9341    .balign 64
9342.L_OP_UNUSED_6AFF: /* 0x16a */
9343/* File: armv5te/OP_UNUSED_6AFF.S */
9344/* File: armv5te/unused.S */
9345    bl      common_abort
9346
9347
9348/* ------------------------------ */
9349    .balign 64
9350.L_OP_UNUSED_6BFF: /* 0x16b */
9351/* File: armv5te/OP_UNUSED_6BFF.S */
9352/* File: armv5te/unused.S */
9353    bl      common_abort
9354
9355
9356/* ------------------------------ */
9357    .balign 64
9358.L_OP_UNUSED_6CFF: /* 0x16c */
9359/* File: armv5te/OP_UNUSED_6CFF.S */
9360/* File: armv5te/unused.S */
9361    bl      common_abort
9362
9363
9364/* ------------------------------ */
9365    .balign 64
9366.L_OP_UNUSED_6DFF: /* 0x16d */
9367/* File: armv5te/OP_UNUSED_6DFF.S */
9368/* File: armv5te/unused.S */
9369    bl      common_abort
9370
9371
9372/* ------------------------------ */
9373    .balign 64
9374.L_OP_UNUSED_6EFF: /* 0x16e */
9375/* File: armv5te/OP_UNUSED_6EFF.S */
9376/* File: armv5te/unused.S */
9377    bl      common_abort
9378
9379
9380/* ------------------------------ */
9381    .balign 64
9382.L_OP_UNUSED_6FFF: /* 0x16f */
9383/* File: armv5te/OP_UNUSED_6FFF.S */
9384/* File: armv5te/unused.S */
9385    bl      common_abort
9386
9387
9388/* ------------------------------ */
9389    .balign 64
9390.L_OP_UNUSED_70FF: /* 0x170 */
9391/* File: armv5te/OP_UNUSED_70FF.S */
9392/* File: armv5te/unused.S */
9393    bl      common_abort
9394
9395
9396/* ------------------------------ */
9397    .balign 64
9398.L_OP_UNUSED_71FF: /* 0x171 */
9399/* File: armv5te/OP_UNUSED_71FF.S */
9400/* File: armv5te/unused.S */
9401    bl      common_abort
9402
9403
9404/* ------------------------------ */
9405    .balign 64
9406.L_OP_UNUSED_72FF: /* 0x172 */
9407/* File: armv5te/OP_UNUSED_72FF.S */
9408/* File: armv5te/unused.S */
9409    bl      common_abort
9410
9411
9412/* ------------------------------ */
9413    .balign 64
9414.L_OP_UNUSED_73FF: /* 0x173 */
9415/* File: armv5te/OP_UNUSED_73FF.S */
9416/* File: armv5te/unused.S */
9417    bl      common_abort
9418
9419
9420/* ------------------------------ */
9421    .balign 64
9422.L_OP_UNUSED_74FF: /* 0x174 */
9423/* File: armv5te/OP_UNUSED_74FF.S */
9424/* File: armv5te/unused.S */
9425    bl      common_abort
9426
9427
9428/* ------------------------------ */
9429    .balign 64
9430.L_OP_UNUSED_75FF: /* 0x175 */
9431/* File: armv5te/OP_UNUSED_75FF.S */
9432/* File: armv5te/unused.S */
9433    bl      common_abort
9434
9435
9436/* ------------------------------ */
9437    .balign 64
9438.L_OP_UNUSED_76FF: /* 0x176 */
9439/* File: armv5te/OP_UNUSED_76FF.S */
9440/* File: armv5te/unused.S */
9441    bl      common_abort
9442
9443
9444/* ------------------------------ */
9445    .balign 64
9446.L_OP_UNUSED_77FF: /* 0x177 */
9447/* File: armv5te/OP_UNUSED_77FF.S */
9448/* File: armv5te/unused.S */
9449    bl      common_abort
9450
9451
9452/* ------------------------------ */
9453    .balign 64
9454.L_OP_UNUSED_78FF: /* 0x178 */
9455/* File: armv5te/OP_UNUSED_78FF.S */
9456/* File: armv5te/unused.S */
9457    bl      common_abort
9458
9459
9460/* ------------------------------ */
9461    .balign 64
9462.L_OP_UNUSED_79FF: /* 0x179 */
9463/* File: armv5te/OP_UNUSED_79FF.S */
9464/* File: armv5te/unused.S */
9465    bl      common_abort
9466
9467
9468/* ------------------------------ */
9469    .balign 64
9470.L_OP_UNUSED_7AFF: /* 0x17a */
9471/* File: armv5te/OP_UNUSED_7AFF.S */
9472/* File: armv5te/unused.S */
9473    bl      common_abort
9474
9475
9476/* ------------------------------ */
9477    .balign 64
9478.L_OP_UNUSED_7BFF: /* 0x17b */
9479/* File: armv5te/OP_UNUSED_7BFF.S */
9480/* File: armv5te/unused.S */
9481    bl      common_abort
9482
9483
9484/* ------------------------------ */
9485    .balign 64
9486.L_OP_UNUSED_7CFF: /* 0x17c */
9487/* File: armv5te/OP_UNUSED_7CFF.S */
9488/* File: armv5te/unused.S */
9489    bl      common_abort
9490
9491
9492/* ------------------------------ */
9493    .balign 64
9494.L_OP_UNUSED_7DFF: /* 0x17d */
9495/* File: armv5te/OP_UNUSED_7DFF.S */
9496/* File: armv5te/unused.S */
9497    bl      common_abort
9498
9499
9500/* ------------------------------ */
9501    .balign 64
9502.L_OP_UNUSED_7EFF: /* 0x17e */
9503/* File: armv5te/OP_UNUSED_7EFF.S */
9504/* File: armv5te/unused.S */
9505    bl      common_abort
9506
9507
9508/* ------------------------------ */
9509    .balign 64
9510.L_OP_UNUSED_7FFF: /* 0x17f */
9511/* File: armv5te/OP_UNUSED_7FFF.S */
9512/* File: armv5te/unused.S */
9513    bl      common_abort
9514
9515
9516/* ------------------------------ */
9517    .balign 64
9518.L_OP_UNUSED_80FF: /* 0x180 */
9519/* File: armv5te/OP_UNUSED_80FF.S */
9520/* File: armv5te/unused.S */
9521    bl      common_abort
9522
9523
9524/* ------------------------------ */
9525    .balign 64
9526.L_OP_UNUSED_81FF: /* 0x181 */
9527/* File: armv5te/OP_UNUSED_81FF.S */
9528/* File: armv5te/unused.S */
9529    bl      common_abort
9530
9531
9532/* ------------------------------ */
9533    .balign 64
9534.L_OP_UNUSED_82FF: /* 0x182 */
9535/* File: armv5te/OP_UNUSED_82FF.S */
9536/* File: armv5te/unused.S */
9537    bl      common_abort
9538
9539
9540/* ------------------------------ */
9541    .balign 64
9542.L_OP_UNUSED_83FF: /* 0x183 */
9543/* File: armv5te/OP_UNUSED_83FF.S */
9544/* File: armv5te/unused.S */
9545    bl      common_abort
9546
9547
9548/* ------------------------------ */
9549    .balign 64
9550.L_OP_UNUSED_84FF: /* 0x184 */
9551/* File: armv5te/OP_UNUSED_84FF.S */
9552/* File: armv5te/unused.S */
9553    bl      common_abort
9554
9555
9556/* ------------------------------ */
9557    .balign 64
9558.L_OP_UNUSED_85FF: /* 0x185 */
9559/* File: armv5te/OP_UNUSED_85FF.S */
9560/* File: armv5te/unused.S */
9561    bl      common_abort
9562
9563
9564/* ------------------------------ */
9565    .balign 64
9566.L_OP_UNUSED_86FF: /* 0x186 */
9567/* File: armv5te/OP_UNUSED_86FF.S */
9568/* File: armv5te/unused.S */
9569    bl      common_abort
9570
9571
9572/* ------------------------------ */
9573    .balign 64
9574.L_OP_UNUSED_87FF: /* 0x187 */
9575/* File: armv5te/OP_UNUSED_87FF.S */
9576/* File: armv5te/unused.S */
9577    bl      common_abort
9578
9579
9580/* ------------------------------ */
9581    .balign 64
9582.L_OP_UNUSED_88FF: /* 0x188 */
9583/* File: armv5te/OP_UNUSED_88FF.S */
9584/* File: armv5te/unused.S */
9585    bl      common_abort
9586
9587
9588/* ------------------------------ */
9589    .balign 64
9590.L_OP_UNUSED_89FF: /* 0x189 */
9591/* File: armv5te/OP_UNUSED_89FF.S */
9592/* File: armv5te/unused.S */
9593    bl      common_abort
9594
9595
9596/* ------------------------------ */
9597    .balign 64
9598.L_OP_UNUSED_8AFF: /* 0x18a */
9599/* File: armv5te/OP_UNUSED_8AFF.S */
9600/* File: armv5te/unused.S */
9601    bl      common_abort
9602
9603
9604/* ------------------------------ */
9605    .balign 64
9606.L_OP_UNUSED_8BFF: /* 0x18b */
9607/* File: armv5te/OP_UNUSED_8BFF.S */
9608/* File: armv5te/unused.S */
9609    bl      common_abort
9610
9611
9612/* ------------------------------ */
9613    .balign 64
9614.L_OP_UNUSED_8CFF: /* 0x18c */
9615/* File: armv5te/OP_UNUSED_8CFF.S */
9616/* File: armv5te/unused.S */
9617    bl      common_abort
9618
9619
9620/* ------------------------------ */
9621    .balign 64
9622.L_OP_UNUSED_8DFF: /* 0x18d */
9623/* File: armv5te/OP_UNUSED_8DFF.S */
9624/* File: armv5te/unused.S */
9625    bl      common_abort
9626
9627
9628/* ------------------------------ */
9629    .balign 64
9630.L_OP_UNUSED_8EFF: /* 0x18e */
9631/* File: armv5te/OP_UNUSED_8EFF.S */
9632/* File: armv5te/unused.S */
9633    bl      common_abort
9634
9635
9636/* ------------------------------ */
9637    .balign 64
9638.L_OP_UNUSED_8FFF: /* 0x18f */
9639/* File: armv5te/OP_UNUSED_8FFF.S */
9640/* File: armv5te/unused.S */
9641    bl      common_abort
9642
9643
9644/* ------------------------------ */
9645    .balign 64
9646.L_OP_UNUSED_90FF: /* 0x190 */
9647/* File: armv5te/OP_UNUSED_90FF.S */
9648/* File: armv5te/unused.S */
9649    bl      common_abort
9650
9651
9652/* ------------------------------ */
9653    .balign 64
9654.L_OP_UNUSED_91FF: /* 0x191 */
9655/* File: armv5te/OP_UNUSED_91FF.S */
9656/* File: armv5te/unused.S */
9657    bl      common_abort
9658
9659
9660/* ------------------------------ */
9661    .balign 64
9662.L_OP_UNUSED_92FF: /* 0x192 */
9663/* File: armv5te/OP_UNUSED_92FF.S */
9664/* File: armv5te/unused.S */
9665    bl      common_abort
9666
9667
9668/* ------------------------------ */
9669    .balign 64
9670.L_OP_UNUSED_93FF: /* 0x193 */
9671/* File: armv5te/OP_UNUSED_93FF.S */
9672/* File: armv5te/unused.S */
9673    bl      common_abort
9674
9675
9676/* ------------------------------ */
9677    .balign 64
9678.L_OP_UNUSED_94FF: /* 0x194 */
9679/* File: armv5te/OP_UNUSED_94FF.S */
9680/* File: armv5te/unused.S */
9681    bl      common_abort
9682
9683
9684/* ------------------------------ */
9685    .balign 64
9686.L_OP_UNUSED_95FF: /* 0x195 */
9687/* File: armv5te/OP_UNUSED_95FF.S */
9688/* File: armv5te/unused.S */
9689    bl      common_abort
9690
9691
9692/* ------------------------------ */
9693    .balign 64
9694.L_OP_UNUSED_96FF: /* 0x196 */
9695/* File: armv5te/OP_UNUSED_96FF.S */
9696/* File: armv5te/unused.S */
9697    bl      common_abort
9698
9699
9700/* ------------------------------ */
9701    .balign 64
9702.L_OP_UNUSED_97FF: /* 0x197 */
9703/* File: armv5te/OP_UNUSED_97FF.S */
9704/* File: armv5te/unused.S */
9705    bl      common_abort
9706
9707
9708/* ------------------------------ */
9709    .balign 64
9710.L_OP_UNUSED_98FF: /* 0x198 */
9711/* File: armv5te/OP_UNUSED_98FF.S */
9712/* File: armv5te/unused.S */
9713    bl      common_abort
9714
9715
9716/* ------------------------------ */
9717    .balign 64
9718.L_OP_UNUSED_99FF: /* 0x199 */
9719/* File: armv5te/OP_UNUSED_99FF.S */
9720/* File: armv5te/unused.S */
9721    bl      common_abort
9722
9723
9724/* ------------------------------ */
9725    .balign 64
9726.L_OP_UNUSED_9AFF: /* 0x19a */
9727/* File: armv5te/OP_UNUSED_9AFF.S */
9728/* File: armv5te/unused.S */
9729    bl      common_abort
9730
9731
9732/* ------------------------------ */
9733    .balign 64
9734.L_OP_UNUSED_9BFF: /* 0x19b */
9735/* File: armv5te/OP_UNUSED_9BFF.S */
9736/* File: armv5te/unused.S */
9737    bl      common_abort
9738
9739
9740/* ------------------------------ */
9741    .balign 64
9742.L_OP_UNUSED_9CFF: /* 0x19c */
9743/* File: armv5te/OP_UNUSED_9CFF.S */
9744/* File: armv5te/unused.S */
9745    bl      common_abort
9746
9747
9748/* ------------------------------ */
9749    .balign 64
9750.L_OP_UNUSED_9DFF: /* 0x19d */
9751/* File: armv5te/OP_UNUSED_9DFF.S */
9752/* File: armv5te/unused.S */
9753    bl      common_abort
9754
9755
9756/* ------------------------------ */
9757    .balign 64
9758.L_OP_UNUSED_9EFF: /* 0x19e */
9759/* File: armv5te/OP_UNUSED_9EFF.S */
9760/* File: armv5te/unused.S */
9761    bl      common_abort
9762
9763
9764/* ------------------------------ */
9765    .balign 64
9766.L_OP_UNUSED_9FFF: /* 0x19f */
9767/* File: armv5te/OP_UNUSED_9FFF.S */
9768/* File: armv5te/unused.S */
9769    bl      common_abort
9770
9771
9772/* ------------------------------ */
9773    .balign 64
9774.L_OP_UNUSED_A0FF: /* 0x1a0 */
9775/* File: armv5te/OP_UNUSED_A0FF.S */
9776/* File: armv5te/unused.S */
9777    bl      common_abort
9778
9779
9780/* ------------------------------ */
9781    .balign 64
9782.L_OP_UNUSED_A1FF: /* 0x1a1 */
9783/* File: armv5te/OP_UNUSED_A1FF.S */
9784/* File: armv5te/unused.S */
9785    bl      common_abort
9786
9787
9788/* ------------------------------ */
9789    .balign 64
9790.L_OP_UNUSED_A2FF: /* 0x1a2 */
9791/* File: armv5te/OP_UNUSED_A2FF.S */
9792/* File: armv5te/unused.S */
9793    bl      common_abort
9794
9795
9796/* ------------------------------ */
9797    .balign 64
9798.L_OP_UNUSED_A3FF: /* 0x1a3 */
9799/* File: armv5te/OP_UNUSED_A3FF.S */
9800/* File: armv5te/unused.S */
9801    bl      common_abort
9802
9803
9804/* ------------------------------ */
9805    .balign 64
9806.L_OP_UNUSED_A4FF: /* 0x1a4 */
9807/* File: armv5te/OP_UNUSED_A4FF.S */
9808/* File: armv5te/unused.S */
9809    bl      common_abort
9810
9811
9812/* ------------------------------ */
9813    .balign 64
9814.L_OP_UNUSED_A5FF: /* 0x1a5 */
9815/* File: armv5te/OP_UNUSED_A5FF.S */
9816/* File: armv5te/unused.S */
9817    bl      common_abort
9818
9819
9820/* ------------------------------ */
9821    .balign 64
9822.L_OP_UNUSED_A6FF: /* 0x1a6 */
9823/* File: armv5te/OP_UNUSED_A6FF.S */
9824/* File: armv5te/unused.S */
9825    bl      common_abort
9826
9827
9828/* ------------------------------ */
9829    .balign 64
9830.L_OP_UNUSED_A7FF: /* 0x1a7 */
9831/* File: armv5te/OP_UNUSED_A7FF.S */
9832/* File: armv5te/unused.S */
9833    bl      common_abort
9834
9835
9836/* ------------------------------ */
9837    .balign 64
9838.L_OP_UNUSED_A8FF: /* 0x1a8 */
9839/* File: armv5te/OP_UNUSED_A8FF.S */
9840/* File: armv5te/unused.S */
9841    bl      common_abort
9842
9843
9844/* ------------------------------ */
9845    .balign 64
9846.L_OP_UNUSED_A9FF: /* 0x1a9 */
9847/* File: armv5te/OP_UNUSED_A9FF.S */
9848/* File: armv5te/unused.S */
9849    bl      common_abort
9850
9851
9852/* ------------------------------ */
9853    .balign 64
9854.L_OP_UNUSED_AAFF: /* 0x1aa */
9855/* File: armv5te/OP_UNUSED_AAFF.S */
9856/* File: armv5te/unused.S */
9857    bl      common_abort
9858
9859
9860/* ------------------------------ */
9861    .balign 64
9862.L_OP_UNUSED_ABFF: /* 0x1ab */
9863/* File: armv5te/OP_UNUSED_ABFF.S */
9864/* File: armv5te/unused.S */
9865    bl      common_abort
9866
9867
9868/* ------------------------------ */
9869    .balign 64
9870.L_OP_UNUSED_ACFF: /* 0x1ac */
9871/* File: armv5te/OP_UNUSED_ACFF.S */
9872/* File: armv5te/unused.S */
9873    bl      common_abort
9874
9875
9876/* ------------------------------ */
9877    .balign 64
9878.L_OP_UNUSED_ADFF: /* 0x1ad */
9879/* File: armv5te/OP_UNUSED_ADFF.S */
9880/* File: armv5te/unused.S */
9881    bl      common_abort
9882
9883
9884/* ------------------------------ */
9885    .balign 64
9886.L_OP_UNUSED_AEFF: /* 0x1ae */
9887/* File: armv5te/OP_UNUSED_AEFF.S */
9888/* File: armv5te/unused.S */
9889    bl      common_abort
9890
9891
9892/* ------------------------------ */
9893    .balign 64
9894.L_OP_UNUSED_AFFF: /* 0x1af */
9895/* File: armv5te/OP_UNUSED_AFFF.S */
9896/* File: armv5te/unused.S */
9897    bl      common_abort
9898
9899
9900/* ------------------------------ */
9901    .balign 64
9902.L_OP_UNUSED_B0FF: /* 0x1b0 */
9903/* File: armv5te/OP_UNUSED_B0FF.S */
9904/* File: armv5te/unused.S */
9905    bl      common_abort
9906
9907
9908/* ------------------------------ */
9909    .balign 64
9910.L_OP_UNUSED_B1FF: /* 0x1b1 */
9911/* File: armv5te/OP_UNUSED_B1FF.S */
9912/* File: armv5te/unused.S */
9913    bl      common_abort
9914
9915
9916/* ------------------------------ */
9917    .balign 64
9918.L_OP_UNUSED_B2FF: /* 0x1b2 */
9919/* File: armv5te/OP_UNUSED_B2FF.S */
9920/* File: armv5te/unused.S */
9921    bl      common_abort
9922
9923
9924/* ------------------------------ */
9925    .balign 64
9926.L_OP_UNUSED_B3FF: /* 0x1b3 */
9927/* File: armv5te/OP_UNUSED_B3FF.S */
9928/* File: armv5te/unused.S */
9929    bl      common_abort
9930
9931
9932/* ------------------------------ */
9933    .balign 64
9934.L_OP_UNUSED_B4FF: /* 0x1b4 */
9935/* File: armv5te/OP_UNUSED_B4FF.S */
9936/* File: armv5te/unused.S */
9937    bl      common_abort
9938
9939
9940/* ------------------------------ */
9941    .balign 64
9942.L_OP_UNUSED_B5FF: /* 0x1b5 */
9943/* File: armv5te/OP_UNUSED_B5FF.S */
9944/* File: armv5te/unused.S */
9945    bl      common_abort
9946
9947
9948/* ------------------------------ */
9949    .balign 64
9950.L_OP_UNUSED_B6FF: /* 0x1b6 */
9951/* File: armv5te/OP_UNUSED_B6FF.S */
9952/* File: armv5te/unused.S */
9953    bl      common_abort
9954
9955
9956/* ------------------------------ */
9957    .balign 64
9958.L_OP_UNUSED_B7FF: /* 0x1b7 */
9959/* File: armv5te/OP_UNUSED_B7FF.S */
9960/* File: armv5te/unused.S */
9961    bl      common_abort
9962
9963
9964/* ------------------------------ */
9965    .balign 64
9966.L_OP_UNUSED_B8FF: /* 0x1b8 */
9967/* File: armv5te/OP_UNUSED_B8FF.S */
9968/* File: armv5te/unused.S */
9969    bl      common_abort
9970
9971
9972/* ------------------------------ */
9973    .balign 64
9974.L_OP_UNUSED_B9FF: /* 0x1b9 */
9975/* File: armv5te/OP_UNUSED_B9FF.S */
9976/* File: armv5te/unused.S */
9977    bl      common_abort
9978
9979
9980/* ------------------------------ */
9981    .balign 64
9982.L_OP_UNUSED_BAFF: /* 0x1ba */
9983/* File: armv5te/OP_UNUSED_BAFF.S */
9984/* File: armv5te/unused.S */
9985    bl      common_abort
9986
9987
9988/* ------------------------------ */
9989    .balign 64
9990.L_OP_UNUSED_BBFF: /* 0x1bb */
9991/* File: armv5te/OP_UNUSED_BBFF.S */
9992/* File: armv5te/unused.S */
9993    bl      common_abort
9994
9995
9996/* ------------------------------ */
9997    .balign 64
9998.L_OP_UNUSED_BCFF: /* 0x1bc */
9999/* File: armv5te/OP_UNUSED_BCFF.S */
10000/* File: armv5te/unused.S */
10001    bl      common_abort
10002
10003
10004/* ------------------------------ */
10005    .balign 64
10006.L_OP_UNUSED_BDFF: /* 0x1bd */
10007/* File: armv5te/OP_UNUSED_BDFF.S */
10008/* File: armv5te/unused.S */
10009    bl      common_abort
10010
10011
10012/* ------------------------------ */
10013    .balign 64
10014.L_OP_UNUSED_BEFF: /* 0x1be */
10015/* File: armv5te/OP_UNUSED_BEFF.S */
10016/* File: armv5te/unused.S */
10017    bl      common_abort
10018
10019
10020/* ------------------------------ */
10021    .balign 64
10022.L_OP_UNUSED_BFFF: /* 0x1bf */
10023/* File: armv5te/OP_UNUSED_BFFF.S */
10024/* File: armv5te/unused.S */
10025    bl      common_abort
10026
10027
10028/* ------------------------------ */
10029    .balign 64
10030.L_OP_UNUSED_C0FF: /* 0x1c0 */
10031/* File: armv5te/OP_UNUSED_C0FF.S */
10032/* File: armv5te/unused.S */
10033    bl      common_abort
10034
10035
10036/* ------------------------------ */
10037    .balign 64
10038.L_OP_UNUSED_C1FF: /* 0x1c1 */
10039/* File: armv5te/OP_UNUSED_C1FF.S */
10040/* File: armv5te/unused.S */
10041    bl      common_abort
10042
10043
10044/* ------------------------------ */
10045    .balign 64
10046.L_OP_UNUSED_C2FF: /* 0x1c2 */
10047/* File: armv5te/OP_UNUSED_C2FF.S */
10048/* File: armv5te/unused.S */
10049    bl      common_abort
10050
10051
10052/* ------------------------------ */
10053    .balign 64
10054.L_OP_UNUSED_C3FF: /* 0x1c3 */
10055/* File: armv5te/OP_UNUSED_C3FF.S */
10056/* File: armv5te/unused.S */
10057    bl      common_abort
10058
10059
10060/* ------------------------------ */
10061    .balign 64
10062.L_OP_UNUSED_C4FF: /* 0x1c4 */
10063/* File: armv5te/OP_UNUSED_C4FF.S */
10064/* File: armv5te/unused.S */
10065    bl      common_abort
10066
10067
10068/* ------------------------------ */
10069    .balign 64
10070.L_OP_UNUSED_C5FF: /* 0x1c5 */
10071/* File: armv5te/OP_UNUSED_C5FF.S */
10072/* File: armv5te/unused.S */
10073    bl      common_abort
10074
10075
10076/* ------------------------------ */
10077    .balign 64
10078.L_OP_UNUSED_C6FF: /* 0x1c6 */
10079/* File: armv5te/OP_UNUSED_C6FF.S */
10080/* File: armv5te/unused.S */
10081    bl      common_abort
10082
10083
10084/* ------------------------------ */
10085    .balign 64
10086.L_OP_UNUSED_C7FF: /* 0x1c7 */
10087/* File: armv5te/OP_UNUSED_C7FF.S */
10088/* File: armv5te/unused.S */
10089    bl      common_abort
10090
10091
10092/* ------------------------------ */
10093    .balign 64
10094.L_OP_UNUSED_C8FF: /* 0x1c8 */
10095/* File: armv5te/OP_UNUSED_C8FF.S */
10096/* File: armv5te/unused.S */
10097    bl      common_abort
10098
10099
10100/* ------------------------------ */
10101    .balign 64
10102.L_OP_UNUSED_C9FF: /* 0x1c9 */
10103/* File: armv5te/OP_UNUSED_C9FF.S */
10104/* File: armv5te/unused.S */
10105    bl      common_abort
10106
10107
10108/* ------------------------------ */
10109    .balign 64
10110.L_OP_UNUSED_CAFF: /* 0x1ca */
10111/* File: armv5te/OP_UNUSED_CAFF.S */
10112/* File: armv5te/unused.S */
10113    bl      common_abort
10114
10115
10116/* ------------------------------ */
10117    .balign 64
10118.L_OP_UNUSED_CBFF: /* 0x1cb */
10119/* File: armv5te/OP_UNUSED_CBFF.S */
10120/* File: armv5te/unused.S */
10121    bl      common_abort
10122
10123
10124/* ------------------------------ */
10125    .balign 64
10126.L_OP_UNUSED_CCFF: /* 0x1cc */
10127/* File: armv5te/OP_UNUSED_CCFF.S */
10128/* File: armv5te/unused.S */
10129    bl      common_abort
10130
10131
10132/* ------------------------------ */
10133    .balign 64
10134.L_OP_UNUSED_CDFF: /* 0x1cd */
10135/* File: armv5te/OP_UNUSED_CDFF.S */
10136/* File: armv5te/unused.S */
10137    bl      common_abort
10138
10139
10140/* ------------------------------ */
10141    .balign 64
10142.L_OP_UNUSED_CEFF: /* 0x1ce */
10143/* File: armv5te/OP_UNUSED_CEFF.S */
10144/* File: armv5te/unused.S */
10145    bl      common_abort
10146
10147
10148/* ------------------------------ */
10149    .balign 64
10150.L_OP_UNUSED_CFFF: /* 0x1cf */
10151/* File: armv5te/OP_UNUSED_CFFF.S */
10152/* File: armv5te/unused.S */
10153    bl      common_abort
10154
10155
10156/* ------------------------------ */
10157    .balign 64
10158.L_OP_UNUSED_D0FF: /* 0x1d0 */
10159/* File: armv5te/OP_UNUSED_D0FF.S */
10160/* File: armv5te/unused.S */
10161    bl      common_abort
10162
10163
10164/* ------------------------------ */
10165    .balign 64
10166.L_OP_UNUSED_D1FF: /* 0x1d1 */
10167/* File: armv5te/OP_UNUSED_D1FF.S */
10168/* File: armv5te/unused.S */
10169    bl      common_abort
10170
10171
10172/* ------------------------------ */
10173    .balign 64
10174.L_OP_UNUSED_D2FF: /* 0x1d2 */
10175/* File: armv5te/OP_UNUSED_D2FF.S */
10176/* File: armv5te/unused.S */
10177    bl      common_abort
10178
10179
10180/* ------------------------------ */
10181    .balign 64
10182.L_OP_UNUSED_D3FF: /* 0x1d3 */
10183/* File: armv5te/OP_UNUSED_D3FF.S */
10184/* File: armv5te/unused.S */
10185    bl      common_abort
10186
10187
10188/* ------------------------------ */
10189    .balign 64
10190.L_OP_UNUSED_D4FF: /* 0x1d4 */
10191/* File: armv5te/OP_UNUSED_D4FF.S */
10192/* File: armv5te/unused.S */
10193    bl      common_abort
10194
10195
10196/* ------------------------------ */
10197    .balign 64
10198.L_OP_UNUSED_D5FF: /* 0x1d5 */
10199/* File: armv5te/OP_UNUSED_D5FF.S */
10200/* File: armv5te/unused.S */
10201    bl      common_abort
10202
10203
10204/* ------------------------------ */
10205    .balign 64
10206.L_OP_UNUSED_D6FF: /* 0x1d6 */
10207/* File: armv5te/OP_UNUSED_D6FF.S */
10208/* File: armv5te/unused.S */
10209    bl      common_abort
10210
10211
10212/* ------------------------------ */
10213    .balign 64
10214.L_OP_UNUSED_D7FF: /* 0x1d7 */
10215/* File: armv5te/OP_UNUSED_D7FF.S */
10216/* File: armv5te/unused.S */
10217    bl      common_abort
10218
10219
10220/* ------------------------------ */
10221    .balign 64
10222.L_OP_UNUSED_D8FF: /* 0x1d8 */
10223/* File: armv5te/OP_UNUSED_D8FF.S */
10224/* File: armv5te/unused.S */
10225    bl      common_abort
10226
10227
10228/* ------------------------------ */
10229    .balign 64
10230.L_OP_UNUSED_D9FF: /* 0x1d9 */
10231/* File: armv5te/OP_UNUSED_D9FF.S */
10232/* File: armv5te/unused.S */
10233    bl      common_abort
10234
10235
10236/* ------------------------------ */
10237    .balign 64
10238.L_OP_UNUSED_DAFF: /* 0x1da */
10239/* File: armv5te/OP_UNUSED_DAFF.S */
10240/* File: armv5te/unused.S */
10241    bl      common_abort
10242
10243
10244/* ------------------------------ */
10245    .balign 64
10246.L_OP_UNUSED_DBFF: /* 0x1db */
10247/* File: armv5te/OP_UNUSED_DBFF.S */
10248/* File: armv5te/unused.S */
10249    bl      common_abort
10250
10251
10252/* ------------------------------ */
10253    .balign 64
10254.L_OP_UNUSED_DCFF: /* 0x1dc */
10255/* File: armv5te/OP_UNUSED_DCFF.S */
10256/* File: armv5te/unused.S */
10257    bl      common_abort
10258
10259
10260/* ------------------------------ */
10261    .balign 64
10262.L_OP_UNUSED_DDFF: /* 0x1dd */
10263/* File: armv5te/OP_UNUSED_DDFF.S */
10264/* File: armv5te/unused.S */
10265    bl      common_abort
10266
10267
10268/* ------------------------------ */
10269    .balign 64
10270.L_OP_UNUSED_DEFF: /* 0x1de */
10271/* File: armv5te/OP_UNUSED_DEFF.S */
10272/* File: armv5te/unused.S */
10273    bl      common_abort
10274
10275
10276/* ------------------------------ */
10277    .balign 64
10278.L_OP_UNUSED_DFFF: /* 0x1df */
10279/* File: armv5te/OP_UNUSED_DFFF.S */
10280/* File: armv5te/unused.S */
10281    bl      common_abort
10282
10283
10284/* ------------------------------ */
10285    .balign 64
10286.L_OP_UNUSED_E0FF: /* 0x1e0 */
10287/* File: armv5te/OP_UNUSED_E0FF.S */
10288/* File: armv5te/unused.S */
10289    bl      common_abort
10290
10291
10292/* ------------------------------ */
10293    .balign 64
10294.L_OP_UNUSED_E1FF: /* 0x1e1 */
10295/* File: armv5te/OP_UNUSED_E1FF.S */
10296/* File: armv5te/unused.S */
10297    bl      common_abort
10298
10299
10300/* ------------------------------ */
10301    .balign 64
10302.L_OP_UNUSED_E2FF: /* 0x1e2 */
10303/* File: armv5te/OP_UNUSED_E2FF.S */
10304/* File: armv5te/unused.S */
10305    bl      common_abort
10306
10307
10308/* ------------------------------ */
10309    .balign 64
10310.L_OP_UNUSED_E3FF: /* 0x1e3 */
10311/* File: armv5te/OP_UNUSED_E3FF.S */
10312/* File: armv5te/unused.S */
10313    bl      common_abort
10314
10315
10316/* ------------------------------ */
10317    .balign 64
10318.L_OP_UNUSED_E4FF: /* 0x1e4 */
10319/* File: armv5te/OP_UNUSED_E4FF.S */
10320/* File: armv5te/unused.S */
10321    bl      common_abort
10322
10323
10324/* ------------------------------ */
10325    .balign 64
10326.L_OP_UNUSED_E5FF: /* 0x1e5 */
10327/* File: armv5te/OP_UNUSED_E5FF.S */
10328/* File: armv5te/unused.S */
10329    bl      common_abort
10330
10331
10332/* ------------------------------ */
10333    .balign 64
10334.L_OP_UNUSED_E6FF: /* 0x1e6 */
10335/* File: armv5te/OP_UNUSED_E6FF.S */
10336/* File: armv5te/unused.S */
10337    bl      common_abort
10338
10339
10340/* ------------------------------ */
10341    .balign 64
10342.L_OP_UNUSED_E7FF: /* 0x1e7 */
10343/* File: armv5te/OP_UNUSED_E7FF.S */
10344/* File: armv5te/unused.S */
10345    bl      common_abort
10346
10347
10348/* ------------------------------ */
10349    .balign 64
10350.L_OP_UNUSED_E8FF: /* 0x1e8 */
10351/* File: armv5te/OP_UNUSED_E8FF.S */
10352/* File: armv5te/unused.S */
10353    bl      common_abort
10354
10355
10356/* ------------------------------ */
10357    .balign 64
10358.L_OP_UNUSED_E9FF: /* 0x1e9 */
10359/* File: armv5te/OP_UNUSED_E9FF.S */
10360/* File: armv5te/unused.S */
10361    bl      common_abort
10362
10363
10364/* ------------------------------ */
10365    .balign 64
10366.L_OP_UNUSED_EAFF: /* 0x1ea */
10367/* File: armv5te/OP_UNUSED_EAFF.S */
10368/* File: armv5te/unused.S */
10369    bl      common_abort
10370
10371
10372/* ------------------------------ */
10373    .balign 64
10374.L_OP_UNUSED_EBFF: /* 0x1eb */
10375/* File: armv5te/OP_UNUSED_EBFF.S */
10376/* File: armv5te/unused.S */
10377    bl      common_abort
10378
10379
10380/* ------------------------------ */
10381    .balign 64
10382.L_OP_UNUSED_ECFF: /* 0x1ec */
10383/* File: armv5te/OP_UNUSED_ECFF.S */
10384/* File: armv5te/unused.S */
10385    bl      common_abort
10386
10387
10388/* ------------------------------ */
10389    .balign 64
10390.L_OP_UNUSED_EDFF: /* 0x1ed */
10391/* File: armv5te/OP_UNUSED_EDFF.S */
10392/* File: armv5te/unused.S */
10393    bl      common_abort
10394
10395
10396/* ------------------------------ */
10397    .balign 64
10398.L_OP_UNUSED_EEFF: /* 0x1ee */
10399/* File: armv5te/OP_UNUSED_EEFF.S */
10400/* File: armv5te/unused.S */
10401    bl      common_abort
10402
10403
10404/* ------------------------------ */
10405    .balign 64
10406.L_OP_UNUSED_EFFF: /* 0x1ef */
10407/* File: armv5te/OP_UNUSED_EFFF.S */
10408/* File: armv5te/unused.S */
10409    bl      common_abort
10410
10411
10412/* ------------------------------ */
10413    .balign 64
10414.L_OP_UNUSED_F0FF: /* 0x1f0 */
10415/* File: armv5te/OP_UNUSED_F0FF.S */
10416/* File: armv5te/unused.S */
10417    bl      common_abort
10418
10419
10420/* ------------------------------ */
10421    .balign 64
10422.L_OP_UNUSED_F1FF: /* 0x1f1 */
10423/* File: armv5te/OP_UNUSED_F1FF.S */
10424/* File: armv5te/unused.S */
10425    bl      common_abort
10426
10427
10428/* ------------------------------ */
10429    .balign 64
10430.L_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
10431/* File: armv5te/OP_INVOKE_OBJECT_INIT_JUMBO.S */
10432/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
10433    /*
10434     * Invoke Object.<init> on an object.  In practice we know that
10435     * Object's nullary constructor doesn't do anything, so we just
10436     * skip it unless a debugger is active.
10437     */
10438    FETCH(r1, 4)                  @ r1<- CCCC
10439    GET_VREG(r0, r1)                    @ r0<- "this" ptr
10440    cmp     r0, #0                      @ check for NULL
10441    beq     common_errNullObject        @ export PC and throw NPE
10442    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
10443    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
10444    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
10445    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal        @ yes, go
10446.LOP_INVOKE_OBJECT_INIT_JUMBO_finish:
10447    ldrh    r1, [rSELF, #offThread_subMode]
10448    ands    r1, #kSubModeDebuggerActive @ debugger active?
10449    bne     .LOP_INVOKE_OBJECT_INIT_JUMBO_debugger        @ Yes - skip optimization
10450    FETCH_ADVANCE_INST(4+1)       @ advance to next instr, load rINST
10451    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
10452    GOTO_OPCODE(ip)                     @ execute it
10453
10454
10455/* ------------------------------ */
10456    .balign 64
10457.L_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
10458/* File: armv5te/OP_IGET_VOLATILE_JUMBO.S */
10459/* File: armv5te/OP_IGET_JUMBO.S */
10460    /*
10461     * Jumbo 32-bit instance field get.
10462     *
10463     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10464     *      iget-char/jumbo, iget-short/jumbo
10465     */
10466    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10467    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10468    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10469    FETCH(r0, 4)                        @ r0<- CCCC
10470    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10471    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10472    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10473    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10474    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10475    cmp     r0, #0                      @ is resolved entry null?
10476    bne     .LOP_IGET_VOLATILE_JUMBO_finish          @ no, already resolved
104778:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10478    EXPORT_PC()                         @ resolve() could throw
10479    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10480    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10481    b       .LOP_IGET_VOLATILE_JUMBO_resolved        @ resolved, continue
10482
10483
10484/* ------------------------------ */
10485    .balign 64
10486.L_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
10487/* File: armv5te/OP_IGET_WIDE_VOLATILE_JUMBO.S */
10488/* File: armv5te/OP_IGET_WIDE_JUMBO.S */
10489    /*
10490     * Jumbo 64-bit instance field get.
10491     */
10492    /* iget-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10493    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10494    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10495    FETCH(r0, 4)                        @ r0<- CCCC
10496    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10497    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10498    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10499    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10500    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10501    cmp     r0, #0                      @ is resolved entry null?
10502    bne     .LOP_IGET_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
10503    ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10504    EXPORT_PC()                         @ resolve() could throw
10505    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10506    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10507    b       .LOP_IGET_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10508
10509
10510/* ------------------------------ */
10511    .balign 64
10512.L_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
10513/* File: armv5te/OP_IGET_OBJECT_VOLATILE_JUMBO.S */
10514/* File: armv5te/OP_IGET_OBJECT_JUMBO.S */
10515/* File: armv5te/OP_IGET_JUMBO.S */
10516    /*
10517     * Jumbo 32-bit instance field get.
10518     *
10519     * for: iget/jumbo, iget-object/jumbo, iget-boolean/jumbo, iget-byte/jumbo,
10520     *      iget-char/jumbo, iget-short/jumbo
10521     */
10522    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10523    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10524    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10525    FETCH(r0, 4)                        @ r0<- CCCC
10526    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10527    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10528    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10529    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10530    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10531    cmp     r0, #0                      @ is resolved entry null?
10532    bne     .LOP_IGET_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
105338:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10534    EXPORT_PC()                         @ resolve() could throw
10535    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10536    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10537    b       .LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10538
10539
10540
10541/* ------------------------------ */
10542    .balign 64
10543.L_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
10544/* File: armv5te/OP_IPUT_VOLATILE_JUMBO.S */
10545/* File: armv5te/OP_IPUT_JUMBO.S */
10546    /*
10547     * Jumbo 32-bit instance field put.
10548     *
10549     * for: iput/jumbo, iput-boolean/jumbo, iput-byte/jumbo, iput-char/jumbo,
10550     *      iput-short/jumbo
10551     */
10552    /* exop vBBBB, vCCCC, field@AAAAAAAA */
10553    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10554    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10555    FETCH(r0, 4)                        @ r0<- CCCC
10556    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10557    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10558    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10559    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10560    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10561    cmp     r0, #0                      @ is resolved entry null?
10562    bne     .LOP_IPUT_VOLATILE_JUMBO_finish          @ no, already resolved
105638:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10564    EXPORT_PC()                         @ resolve() could throw
10565    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10566    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10567    b       .LOP_IPUT_VOLATILE_JUMBO_resolved        @ resolved, continue
10568
10569
10570/* ------------------------------ */
10571    .balign 64
10572.L_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
10573/* File: armv5te/OP_IPUT_WIDE_VOLATILE_JUMBO.S */
10574/* File: armv5te/OP_IPUT_WIDE_JUMBO.S */
10575    /* iput-wide/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10576    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10577    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10578    FETCH(r0, 4)                        @ r0<- CCCC
10579    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10580    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10581    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
10582    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
10583    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10584    cmp     r0, #0                      @ is resolved entry null?
10585    bne     .LOP_IPUT_WIDE_VOLATILE_JUMBO_finish          @ no, already resolved
105868:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
10587    EXPORT_PC()                         @ resolve() could throw
10588    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10589    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10590    b       .LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved        @ resolved, continue
10591
10592
10593/* ------------------------------ */
10594    .balign 64
10595.L_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
10596/* File: armv5te/OP_IPUT_OBJECT_VOLATILE_JUMBO.S */
10597/* File: armv5te/OP_IPUT_OBJECT_JUMBO.S */
10598    /*
10599     * Jumbo 32-bit instance field put.
10600     */
10601    /* iput-object/jumbo vBBBB, vCCCC, field@AAAAAAAA */
10602    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10603    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10604    FETCH(r0, 4)                        @ r0<- CCCC
10605    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
10606    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10607    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
10608    GET_VREG(r9, r0)                    @ r9<- fp[CCCC], the object pointer
10609    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
10610    cmp     r0, #0                      @ is resolved entry null?
10611    bne     .LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish          @ no, already resolved
106128:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10613    EXPORT_PC()                         @ resolve() could throw
10614    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10615    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
10616    b       .LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved        @ resolved, continue
10617
10618
10619/* ------------------------------ */
10620    .balign 64
10621.L_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
10622/* File: armv5te/OP_SGET_VOLATILE_JUMBO.S */
10623/* File: armv5te/OP_SGET_JUMBO.S */
10624    /*
10625     * Jumbo 32-bit SGET handler.
10626     *
10627     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
10628     *      sget-char/jumbo, sget-short/jumbo
10629     */
10630    /* exop vBBBB, field@AAAAAAAA */
10631    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10632    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10633    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10634    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10635    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10636    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10637    cmp     r0, #0                      @ is resolved entry null?
10638    beq     .LOP_SGET_VOLATILE_JUMBO_resolve         @ yes, do resolve
10639.LOP_SGET_VOLATILE_JUMBO_finish: @ field ptr in r0
10640    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
10641    SMP_DMB                            @ acquiring load
10642    FETCH(r2, 3)                        @ r2<- BBBB
10643    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10644    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
10645    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10646    GOTO_OPCODE(ip)                     @ jump to next instruction
10647
10648
10649/* ------------------------------ */
10650    .balign 64
10651.L_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
10652/* File: armv5te/OP_SGET_WIDE_VOLATILE_JUMBO.S */
10653/* File: armv5te/OP_SGET_WIDE_JUMBO.S */
10654    /*
10655     * Jumbo 64-bit SGET handler.
10656     */
10657    /* sget-wide/jumbo vBBBB, field@AAAAAAAA */
10658    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10659    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10660    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10661    ldr     r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields
10662    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10663    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved StaticField ptr
10664    cmp     r0, #0                      @ is resolved entry null?
10665    beq     .LOP_SGET_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
10666.LOP_SGET_WIDE_VOLATILE_JUMBO_finish:
10667    FETCH(r9, 3)                        @ r9<- BBBB
10668    .if 1
10669    add     r0, r0, #offStaticField_value @ r0<- pointer to data
10670    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
10671    .else
10672    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
10673    .endif
10674    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
10675    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10676    stmia   r9, {r0-r1}                 @ vBBBB/vBBBB+1<- r0/r1
10677    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10678    GOTO_OPCODE(ip)                     @ jump to next instruction
10679
10680
10681/* ------------------------------ */
10682    .balign 64
10683.L_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
10684/* File: armv5te/OP_SGET_OBJECT_VOLATILE_JUMBO.S */
10685/* File: armv5te/OP_SGET_OBJECT_JUMBO.S */
10686/* File: armv5te/OP_SGET_JUMBO.S */
10687    /*
10688     * Jumbo 32-bit SGET handler.
10689     *
10690     * for: sget/jumbo, sget-object/jumbo, sget-boolean/jumbo, sget-byte/jumbo,
10691     *      sget-char/jumbo, sget-short/jumbo
10692     */
10693    /* exop vBBBB, field@AAAAAAAA */
10694    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10695    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10696    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10697    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10698    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10699    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10700    cmp     r0, #0                      @ is resolved entry null?
10701    beq     .LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10702.LOP_SGET_OBJECT_VOLATILE_JUMBO_finish: @ field ptr in r0
10703    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
10704    SMP_DMB                            @ acquiring load
10705    FETCH(r2, 3)                        @ r2<- BBBB
10706    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10707    SET_VREG(r1, r2)                    @ fp[BBBB]<- r1
10708    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10709    GOTO_OPCODE(ip)                     @ jump to next instruction
10710
10711
10712
10713/* ------------------------------ */
10714    .balign 64
10715.L_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
10716/* File: armv5te/OP_SPUT_VOLATILE_JUMBO.S */
10717/* File: armv5te/OP_SPUT_JUMBO.S */
10718    /*
10719     * Jumbo 32-bit SPUT handler.
10720     *
10721     * for: sput/jumbo, sput-boolean/jumbo, sput-byte/jumbo, sput-char/jumbo,
10722     *      sput-short/jumbo
10723     */
10724    /* exop vBBBB, field@AAAAAAAA */
10725    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10726    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10727    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10728    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10729    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10730    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
10731    cmp     r0, #0                      @ is resolved entry null?
10732    beq     .LOP_SPUT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10733.LOP_SPUT_VOLATILE_JUMBO_finish:   @ field ptr in r0
10734    FETCH(r2, 3)                        @ r2<- BBBB
10735    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10736    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
10737    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10738    SMP_DMB_ST                        @ releasing store
10739    str     r1, [r0, #offStaticField_value] @ field<- vBBBB
10740    SMP_DMB
10741    GOTO_OPCODE(ip)                     @ jump to next instruction
10742
10743
10744/* ------------------------------ */
10745    .balign 64
10746.L_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
10747/* File: armv5te/OP_SPUT_WIDE_VOLATILE_JUMBO.S */
10748/* File: armv5te/OP_SPUT_WIDE_JUMBO.S */
10749    /*
10750     * Jumbo 64-bit SPUT handler.
10751     */
10752    /* sput-wide/jumbo vBBBB, field@AAAAAAAA */
10753    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
10754    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10755    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10756    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10757    orr     r1, r1, r2, lsl #16         @ r1<- AAAAaaaa
10758    FETCH(r9, 3)                        @ r9<- BBBB
10759    ldr     r2, [r10, r1, lsl #2]       @ r2<- resolved StaticField ptr
10760    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BBBB]
10761    cmp     r2, #0                      @ is resolved entry null?
10762    beq     .LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve         @ yes, do resolve
10763.LOP_SPUT_WIDE_VOLATILE_JUMBO_finish: @ field ptr in r2, BBBB in r9
10764    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10765    ldmia   r9, {r0-r1}                 @ r0/r1<- vBBBB/vBBBB+1
10766    GET_INST_OPCODE(r10)                @ extract opcode from rINST
10767    .if 1
10768    add     r2, r2, #offStaticField_value @ r2<- pointer to data
10769    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
10770    .else
10771    strd    r0, [r2, #offStaticField_value] @ field<- vBBBB/vBBBB+1
10772    .endif
10773    GOTO_OPCODE(r10)                    @ jump to next instruction
10774
10775
10776/* ------------------------------ */
10777    .balign 64
10778.L_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
10779/* File: armv5te/OP_SPUT_OBJECT_VOLATILE_JUMBO.S */
10780/* File: armv5te/OP_SPUT_OBJECT_JUMBO.S */
10781    /*
10782     * Jumbo 32-bit SPUT handler for objects
10783     */
10784    /* sput-object/jumbo vBBBB, field@AAAAAAAA */
10785    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
10786    FETCH(r0, 1)                        @ r0<- aaaa (lo)
10787    FETCH(r1, 2)                        @ r1<- AAAA (hi)
10788    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
10789    orr     r1, r0, r1, lsl #16         @ r1<- AAAAaaaa
10790    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
10791    cmp     r0, #0                      @ is resolved entry null?
10792    beq     .LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve         @ yes, do resolve
10793.LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish:   @ field ptr in r0
10794    FETCH(r2, 3)                        @ r2<- BBBB
10795    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
10796    GET_VREG(r1, r2)                    @ r1<- fp[BBBB]
10797    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
10798    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
10799    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10800    SMP_DMB_ST                        @ releasing store
10801    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_end
10802
10803
10804/* ------------------------------ */
10805    .balign 64
10806.L_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
10807/* File: armv5te/OP_THROW_VERIFICATION_ERROR_JUMBO.S */
10808    /*
10809     * Handle a jumbo throw-verification-error instruction.  This throws an
10810     * exception for an error discovered during verification.  The
10811     * exception is indicated by BBBB, with some detail provided by AAAAAAAA.
10812     */
10813    /* exop BBBB, Class@AAAAAAAA */
10814    FETCH(r1, 1)                        @ r1<- aaaa (lo)
10815    FETCH(r2, 2)                        @ r2<- AAAA (hi)
10816    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
10817    orr     r2, r1, r2, lsl #16         @ r2<- AAAAaaaa
10818    EXPORT_PC()                         @ export the PC
10819    FETCH(r1, 3)                        @ r1<- BBBB
10820    bl      dvmThrowVerificationError   @ always throws
10821    b       common_exceptionThrown      @ handle exception
10822
10823    .balign 64
10824    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
10825    .global dvmAsmInstructionEnd
10826dvmAsmInstructionEnd:
10827
10828/*
10829 * ===========================================================================
10830 *  Sister implementations
10831 * ===========================================================================
10832 */
10833    .global dvmAsmSisterStart
10834    .type   dvmAsmSisterStart, %function
10835    .text
10836    .balign 4
10837dvmAsmSisterStart:
10838
10839/* continuation for OP_CONST_STRING */
10840
10841    /*
10842     * Continuation if the String has not yet been resolved.
10843     *  r1: BBBB (String ref)
10844     *  r9: target register
10845     */
10846.LOP_CONST_STRING_resolve:
10847    EXPORT_PC()
10848    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10849    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10850    bl      dvmResolveString            @ r0<- String reference
10851    cmp     r0, #0                      @ failed?
10852    beq     common_exceptionThrown      @ yup, handle the exception
10853    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10854    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10855    SET_VREG(r0, r9)                    @ vAA<- r0
10856    GOTO_OPCODE(ip)                     @ jump to next instruction
10857
10858/* continuation for OP_CONST_STRING_JUMBO */
10859
10860    /*
10861     * Continuation if the String has not yet been resolved.
10862     *  r1: BBBBBBBB (String ref)
10863     *  r9: target register
10864     */
10865.LOP_CONST_STRING_JUMBO_resolve:
10866    EXPORT_PC()
10867    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10868    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10869    bl      dvmResolveString            @ r0<- String reference
10870    cmp     r0, #0                      @ failed?
10871    beq     common_exceptionThrown      @ yup, handle the exception
10872    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
10873    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10874    SET_VREG(r0, r9)                    @ vAA<- r0
10875    GOTO_OPCODE(ip)                     @ jump to next instruction
10876
10877/* continuation for OP_CONST_CLASS */
10878
10879    /*
10880     * Continuation if the Class has not yet been resolved.
10881     *  r1: BBBB (Class ref)
10882     *  r9: target register
10883     */
10884.LOP_CONST_CLASS_resolve:
10885    EXPORT_PC()
10886    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
10887    mov     r2, #1                      @ r2<- true
10888    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10889    bl      dvmResolveClass             @ r0<- Class reference
10890    cmp     r0, #0                      @ failed?
10891    beq     common_exceptionThrown      @ yup, handle the exception
10892    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10893    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10894    SET_VREG(r0, r9)                    @ vAA<- r0
10895    GOTO_OPCODE(ip)                     @ jump to next instruction
10896
10897/* continuation for OP_CHECK_CAST */
10898
10899    /*
10900     * Trivial test failed, need to perform full check.  This is common.
10901     *  r0 holds obj->clazz
10902     *  r1 holds desired class resolved from BBBB
10903     *  r9 holds object
10904     */
10905.LOP_CHECK_CAST_fullcheck:
10906    mov     r10, r1                     @ avoid ClassObject getting clobbered
10907    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
10908    cmp     r0, #0                      @ failed?
10909    bne     .LOP_CHECK_CAST_okay            @ no, success
10910
10911    @ A cast has failed.  We need to throw a ClassCastException.
10912    EXPORT_PC()                         @ about to throw
10913    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
10914    mov     r1, r10                     @ r1<- desired class
10915    bl      dvmThrowClassCastException
10916    b       common_exceptionThrown
10917
10918    /*
10919     * Resolution required.  This is the least-likely path.
10920     *
10921     *  r2 holds BBBB
10922     *  r9 holds object
10923     */
10924.LOP_CHECK_CAST_resolve:
10925    EXPORT_PC()                         @ resolve() could throw
10926    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
10927    mov     r1, r2                      @ r1<- BBBB
10928    mov     r2, #0                      @ r2<- false
10929    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
10930    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
10931    cmp     r0, #0                      @ got null?
10932    beq     common_exceptionThrown      @ yes, handle exception
10933    mov     r1, r0                      @ r1<- class resolved from BBB
10934    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
10935    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
10936
10937/* continuation for OP_INSTANCE_OF */
10938
10939    /*
10940     * Trivial test failed, need to perform full check.  This is common.
10941     *  r0 holds obj->clazz
10942     *  r1 holds class resolved from BBBB
10943     *  r9 holds A
10944     */
10945.LOP_INSTANCE_OF_fullcheck:
10946    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
10947    @ fall through to OP_INSTANCE_OF_store
10948
10949    /*
10950     * r0 holds boolean result
10951     * r9 holds A
10952     */
10953.LOP_INSTANCE_OF_store:
10954    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10955    SET_VREG(r0, r9)                    @ vA<- r0
10956    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10957    GOTO_OPCODE(ip)                     @ jump to next instruction
10958
10959    /*
10960     * Trivial test succeeded, save and bail.
10961     *  r9 holds A
10962     */
10963.LOP_INSTANCE_OF_trivial:
10964    mov     r0, #1                      @ indicate success
10965    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
10966    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10967    SET_VREG(r0, r9)                    @ vA<- r0
10968    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10969    GOTO_OPCODE(ip)                     @ jump to next instruction
10970
10971    /*
10972     * Resolution required.  This is the least-likely path.
10973     *
10974     *  r3 holds BBBB
10975     *  r9 holds A
10976     */
10977.LOP_INSTANCE_OF_resolve:
10978    EXPORT_PC()                         @ resolve() could throw
10979    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
10980    mov     r1, r3                      @ r1<- BBBB
10981    mov     r2, #1                      @ r2<- true
10982    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
10983    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
10984    cmp     r0, #0                      @ got null?
10985    beq     common_exceptionThrown      @ yes, handle exception
10986    mov     r1, r0                      @ r1<- class resolved from BBB
10987    mov     r3, rINST, lsr #12          @ r3<- B
10988    GET_VREG(r0, r3)                    @ r0<- vB (object)
10989    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
10990    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
10991
10992/* continuation for OP_NEW_INSTANCE */
10993
10994    .balign 32                          @ minimize cache lines
10995.LOP_NEW_INSTANCE_finish: @ r0=new object
10996    mov     r3, rINST, lsr #8           @ r3<- AA
10997    cmp     r0, #0                      @ failed?
10998#if defined(WITH_JIT)
10999    /*
11000     * The JIT needs the class to be fully resolved before it can
11001     * include this instruction in a trace.
11002     */
11003    ldrh    r1, [rSELF, #offThread_subMode]
11004    beq     common_exceptionThrown      @ yes, handle the exception
11005    ands    r1, #kSubModeJitTraceBuild  @ under construction?
11006    bne     .LOP_NEW_INSTANCE_jitCheck
11007#else
11008    beq     common_exceptionThrown      @ yes, handle the exception
11009#endif
11010.LOP_NEW_INSTANCE_end:
11011    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11012    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11013    SET_VREG(r0, r3)                    @ vAA<- r0
11014    GOTO_OPCODE(ip)                     @ jump to next instruction
11015
11016#if defined(WITH_JIT)
11017    /*
11018     * Check to see if we need to stop the trace building early.
11019     * r0: new object
11020     * r3: vAA
11021     */
11022.LOP_NEW_INSTANCE_jitCheck:
11023    ldr     r1, [r10]                   @ reload resolved class
11024    cmp     r1, #0                      @ okay?
11025    bne     .LOP_NEW_INSTANCE_end             @ yes, finish
11026    mov     r9, r0                      @ preserve new object
11027    mov     r10, r3                     @ preserve vAA
11028    mov     r0, rSELF
11029    mov     r1, rPC
11030    bl      dvmJitEndTraceSelect        @ (self, pc)
11031    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11032    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11033    SET_VREG(r9, r10)                   @ vAA<- new object
11034    GOTO_OPCODE(ip)                     @ jump to next instruction
11035#endif
11036
11037    /*
11038     * Class initialization required.
11039     *
11040     *  r0 holds class object
11041     */
11042.LOP_NEW_INSTANCE_needinit:
11043    mov     r9, r0                      @ save r0
11044    bl      dvmInitClass                @ initialize class
11045    cmp     r0, #0                      @ check boolean result
11046    mov     r0, r9                      @ restore r0
11047    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
11048    b       common_exceptionThrown      @ failed, deal with init exception
11049
11050    /*
11051     * Resolution required.  This is the least-likely path.
11052     *
11053     *  r1 holds BBBB
11054     */
11055.LOP_NEW_INSTANCE_resolve:
11056    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11057    mov     r2, #0                      @ r2<- false
11058    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11059    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
11060    cmp     r0, #0                      @ got null?
11061    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
11062    b       common_exceptionThrown      @ yes, handle exception
11063
11064/* continuation for OP_NEW_ARRAY */
11065
11066
11067    /*
11068     * Resolve class.  (This is an uncommon case.)
11069     *
11070     *  r1 holds array length
11071     *  r2 holds class ref CCCC
11072     */
11073.LOP_NEW_ARRAY_resolve:
11074    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
11075    mov     r9, r1                      @ r9<- length (save)
11076    mov     r1, r2                      @ r1<- CCCC
11077    mov     r2, #0                      @ r2<- false
11078    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
11079    bl      dvmResolveClass             @ r0<- call(clazz, ref)
11080    cmp     r0, #0                      @ got null?
11081    mov     r1, r9                      @ r1<- length (restore)
11082    beq     common_exceptionThrown      @ yes, handle exception
11083    @ fall through to OP_NEW_ARRAY_finish
11084
11085    /*
11086     * Finish allocation.
11087     *
11088     *  r0 holds class
11089     *  r1 holds array length
11090     */
11091.LOP_NEW_ARRAY_finish:
11092    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
11093    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
11094    cmp     r0, #0                      @ failed?
11095    mov     r2, rINST, lsr #8           @ r2<- A+
11096    beq     common_exceptionThrown      @ yes, handle the exception
11097    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11098    and     r2, r2, #15                 @ r2<- A
11099    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11100    SET_VREG(r0, r2)                    @ vA<- r0
11101    GOTO_OPCODE(ip)                     @ jump to next instruction
11102
11103/* continuation for OP_FILLED_NEW_ARRAY */
11104
11105    /*
11106     * On entry:
11107     *  r0 holds array class
11108     *  r10 holds AA or BA
11109     */
11110.LOP_FILLED_NEW_ARRAY_continue:
11111    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11112    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11113    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11114    .if     0
11115    mov     r1, r10                     @ r1<- AA (length)
11116    .else
11117    mov     r1, r10, lsr #4             @ r1<- B (length)
11118    .endif
11119    cmp     rINST, #'I'                 @ array of ints?
11120    cmpne   rINST, #'L'                 @ array of objects?
11121    cmpne   rINST, #'['                 @ array of arrays?
11122    mov     r9, r1                      @ save length in r9
11123    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
11124    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11125    cmp     r0, #0                      @ null return?
11126    beq     common_exceptionThrown      @ alloc failed, handle exception
11127
11128    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11129    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11130    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11131    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11132    subs    r9, r9, #1                  @ length--, check for neg
11133    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11134    bmi     2f                          @ was zero, bail
11135
11136    @ copy values from registers into the array
11137    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11138    .if     0
11139    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
111401:  ldr     r3, [r2], #4                @ r3<- *r2++
11141    subs    r9, r9, #1                  @ count--
11142    str     r3, [r0], #4                @ *contents++ = vX
11143    bpl     1b
11144    @ continue at 2
11145    .else
11146    cmp     r9, #4                      @ length was initially 5?
11147    and     r2, r10, #15                @ r2<- A
11148    bne     1f                          @ <= 4 args, branch
11149    GET_VREG(r3, r2)                    @ r3<- vA
11150    sub     r9, r9, #1                  @ count--
11151    str     r3, [r0, #16]               @ contents[4] = vA
111521:  and     r2, r1, #15                 @ r2<- F/E/D/C
11153    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11154    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11155    subs    r9, r9, #1                  @ count--
11156    str     r3, [r0], #4                @ *contents++ = vX
11157    bpl     1b
11158    @ continue at 2
11159    .endif
11160
111612:
11162    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11163    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11164    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11165    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11166    cmp     r1, #'I'                         @ Is int array?
11167    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11168    GOTO_OPCODE(ip)                          @ execute it
11169
11170    /*
11171     * Throw an exception indicating that we have not implemented this
11172     * mode of filled-new-array.
11173     */
11174.LOP_FILLED_NEW_ARRAY_notimpl:
11175    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY
11176    bl      dvmThrowInternalError
11177    b       common_exceptionThrown
11178
11179    /*
11180     * Ideally we'd only define this once, but depending on layout we can
11181     * exceed the range of the load above.
11182     */
11183
11184.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY:
11185    .word   .LstrFilledNewArrayNotImpl
11186
11187/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
11188
11189    /*
11190     * On entry:
11191     *  r0 holds array class
11192     *  r10 holds AA or BA
11193     */
11194.LOP_FILLED_NEW_ARRAY_RANGE_continue:
11195    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
11196    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
11197    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
11198    .if     1
11199    mov     r1, r10                     @ r1<- AA (length)
11200    .else
11201    mov     r1, r10, lsr #4             @ r1<- B (length)
11202    .endif
11203    cmp     rINST, #'I'                 @ array of ints?
11204    cmpne   rINST, #'L'                 @ array of objects?
11205    cmpne   rINST, #'['                 @ array of arrays?
11206    mov     r9, r1                      @ save length in r9
11207    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
11208    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
11209    cmp     r0, #0                      @ null return?
11210    beq     common_exceptionThrown      @ alloc failed, handle exception
11211
11212    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
11213    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
11214    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
11215    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
11216    subs    r9, r9, #1                  @ length--, check for neg
11217    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
11218    bmi     2f                          @ was zero, bail
11219
11220    @ copy values from registers into the array
11221    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
11222    .if     1
11223    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
112241:  ldr     r3, [r2], #4                @ r3<- *r2++
11225    subs    r9, r9, #1                  @ count--
11226    str     r3, [r0], #4                @ *contents++ = vX
11227    bpl     1b
11228    @ continue at 2
11229    .else
11230    cmp     r9, #4                      @ length was initially 5?
11231    and     r2, r10, #15                @ r2<- A
11232    bne     1f                          @ <= 4 args, branch
11233    GET_VREG(r3, r2)                    @ r3<- vA
11234    sub     r9, r9, #1                  @ count--
11235    str     r3, [r0, #16]               @ contents[4] = vA
112361:  and     r2, r1, #15                 @ r2<- F/E/D/C
11237    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
11238    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
11239    subs    r9, r9, #1                  @ count--
11240    str     r3, [r0], #4                @ *contents++ = vX
11241    bpl     1b
11242    @ continue at 2
11243    .endif
11244
112452:
11246    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
11247    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
11248    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11249    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
11250    cmp     r1, #'I'                         @ Is int array?
11251    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
11252    GOTO_OPCODE(ip)                          @ execute it
11253
11254    /*
11255     * Throw an exception indicating that we have not implemented this
11256     * mode of filled-new-array.
11257     */
11258.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
11259    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE
11260    bl      dvmThrowInternalError
11261    b       common_exceptionThrown
11262
11263    /*
11264     * Ideally we'd only define this once, but depending on layout we can
11265     * exceed the range of the load above.
11266     */
11267
11268.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE:
11269    .word   .LstrFilledNewArrayNotImpl
11270
11271/* continuation for OP_CMPL_FLOAT */
11272.LOP_CMPL_FLOAT_finish:
11273    SET_VREG(r0, r9)                    @ vAA<- r0
11274    GOTO_OPCODE(ip)                     @ jump to next instruction
11275
11276/* continuation for OP_CMPG_FLOAT */
11277.LOP_CMPG_FLOAT_finish:
11278    SET_VREG(r0, r9)                    @ vAA<- r0
11279    GOTO_OPCODE(ip)                     @ jump to next instruction
11280
11281/* continuation for OP_CMPL_DOUBLE */
11282.LOP_CMPL_DOUBLE_finish:
11283    SET_VREG(r0, r9)                    @ vAA<- r0
11284    GOTO_OPCODE(ip)                     @ jump to next instruction
11285
11286/* continuation for OP_CMPG_DOUBLE */
11287.LOP_CMPG_DOUBLE_finish:
11288    SET_VREG(r0, r9)                    @ vAA<- r0
11289    GOTO_OPCODE(ip)                     @ jump to next instruction
11290
11291/* continuation for OP_CMP_LONG */
11292
11293.LOP_CMP_LONG_less:
11294    mvn     r1, #0                      @ r1<- -1
11295    @ Want to cond code the next mov so we can avoid branch, but don't see it;
11296    @ instead, we just replicate the tail end.
11297    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11298    SET_VREG(r1, r9)                    @ vAA<- r1
11299    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11300    GOTO_OPCODE(ip)                     @ jump to next instruction
11301
11302.LOP_CMP_LONG_greater:
11303    mov     r1, #1                      @ r1<- 1
11304    @ fall through to _finish
11305
11306.LOP_CMP_LONG_finish:
11307    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11308    SET_VREG(r1, r9)                    @ vAA<- r1
11309    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11310    GOTO_OPCODE(ip)                     @ jump to next instruction
11311
11312/* continuation for OP_AGET_WIDE */
11313
11314.LOP_AGET_WIDE_finish:
11315    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11316    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11317    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
11318    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11319    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
11320    GOTO_OPCODE(ip)                     @ jump to next instruction
11321
11322/* continuation for OP_APUT_WIDE */
11323
11324.LOP_APUT_WIDE_finish:
11325    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11326    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
11327    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11328    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
11329    GOTO_OPCODE(ip)                     @ jump to next instruction
11330
11331/* continuation for OP_APUT_OBJECT */
11332    /*
11333     * On entry:
11334     *  rINST = vBB (arrayObj)
11335     *  r9 = vAA (obj)
11336     *  r10 = offset into array (vBB + vCC * width)
11337     */
11338.LOP_APUT_OBJECT_finish:
11339    cmp     r9, #0                      @ storing null reference?
11340    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
11341    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
11342    ldr     r1, [rINST, #offObject_clazz]  @ r1<- arrayObj->clazz
11343    bl      dvmCanPutArrayElement       @ test object type vs. array type
11344    cmp     r0, #0                      @ okay?
11345    beq     .LOP_APUT_OBJECT_throw           @ no
11346    mov     r1, rINST                   @ r1<- arrayObj
11347    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11348    ldr     r2, [rSELF, #offThread_cardTable]     @ get biased CT base
11349    add     r10, #offArrayObject_contents   @ r0<- pointer to slot
11350    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11351    str     r9, [r10]                   @ vBB[vCC]<- vAA
11352    strb    r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
11353    GOTO_OPCODE(ip)                     @ jump to next instruction
11354.LOP_APUT_OBJECT_skip_check:
11355    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11356    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11357    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
11358    GOTO_OPCODE(ip)                     @ jump to next instruction
11359.LOP_APUT_OBJECT_throw:
11360    @ The types don't match.  We need to throw an ArrayStoreException.
11361    ldr     r0, [r9, #offObject_clazz]
11362    ldr     r1, [rINST, #offObject_clazz]
11363    EXPORT_PC()
11364    bl      dvmThrowArrayStoreExceptionIncompatibleElement
11365    b       common_exceptionThrown
11366
11367/* continuation for OP_IGET */
11368
11369    /*
11370     * Currently:
11371     *  r0 holds resolved field
11372     *  r9 holds object
11373     */
11374.LOP_IGET_finish:
11375    @bl      common_squeak0
11376    cmp     r9, #0                      @ check object for null
11377    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11378    beq     common_errNullObject        @ object was null
11379    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11380    @ no-op                             @ acquiring load
11381    mov     r2, rINST, lsr #8           @ r2<- A+
11382    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11383    and     r2, r2, #15                 @ r2<- A
11384    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11385    SET_VREG(r0, r2)                    @ fp[A]<- r0
11386    GOTO_OPCODE(ip)                     @ jump to next instruction
11387
11388/* continuation for OP_IGET_WIDE */
11389
11390    /*
11391     * Currently:
11392     *  r0 holds resolved field
11393     *  r9 holds object
11394     */
11395.LOP_IGET_WIDE_finish:
11396    cmp     r9, #0                      @ check object for null
11397    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11398    beq     common_errNullObject        @ object was null
11399    .if     0
11400    add     r0, r9, r3                  @ r0<- address of field
11401    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
11402    .else
11403    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
11404    .endif
11405    mov     r2, rINST, lsr #8           @ r2<- A+
11406    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11407    and     r2, r2, #15                 @ r2<- A
11408    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
11409    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11410    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
11411    GOTO_OPCODE(ip)                     @ jump to next instruction
11412
11413/* continuation for OP_IGET_OBJECT */
11414
11415    /*
11416     * Currently:
11417     *  r0 holds resolved field
11418     *  r9 holds object
11419     */
11420.LOP_IGET_OBJECT_finish:
11421    @bl      common_squeak0
11422    cmp     r9, #0                      @ check object for null
11423    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11424    beq     common_errNullObject        @ object was null
11425    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11426    @ no-op                             @ acquiring load
11427    mov     r2, rINST, lsr #8           @ r2<- A+
11428    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11429    and     r2, r2, #15                 @ r2<- A
11430    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11431    SET_VREG(r0, r2)                    @ fp[A]<- r0
11432    GOTO_OPCODE(ip)                     @ jump to next instruction
11433
11434/* continuation for OP_IGET_BOOLEAN */
11435
11436    /*
11437     * Currently:
11438     *  r0 holds resolved field
11439     *  r9 holds object
11440     */
11441.LOP_IGET_BOOLEAN_finish:
11442    @bl      common_squeak1
11443    cmp     r9, #0                      @ check object for null
11444    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11445    beq     common_errNullObject        @ object was null
11446    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11447    @ no-op                             @ acquiring load
11448    mov     r2, rINST, lsr #8           @ r2<- A+
11449    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11450    and     r2, r2, #15                 @ r2<- A
11451    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11452    SET_VREG(r0, r2)                    @ fp[A]<- r0
11453    GOTO_OPCODE(ip)                     @ jump to next instruction
11454
11455/* continuation for OP_IGET_BYTE */
11456
11457    /*
11458     * Currently:
11459     *  r0 holds resolved field
11460     *  r9 holds object
11461     */
11462.LOP_IGET_BYTE_finish:
11463    @bl      common_squeak2
11464    cmp     r9, #0                      @ check object for null
11465    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11466    beq     common_errNullObject        @ object was null
11467    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11468    @ no-op                             @ acquiring load
11469    mov     r2, rINST, lsr #8           @ r2<- A+
11470    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11471    and     r2, r2, #15                 @ r2<- A
11472    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11473    SET_VREG(r0, r2)                    @ fp[A]<- r0
11474    GOTO_OPCODE(ip)                     @ jump to next instruction
11475
11476/* continuation for OP_IGET_CHAR */
11477
11478    /*
11479     * Currently:
11480     *  r0 holds resolved field
11481     *  r9 holds object
11482     */
11483.LOP_IGET_CHAR_finish:
11484    @bl      common_squeak3
11485    cmp     r9, #0                      @ check object for null
11486    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11487    beq     common_errNullObject        @ object was null
11488    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11489    @ no-op                             @ acquiring load
11490    mov     r2, rINST, lsr #8           @ r2<- A+
11491    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11492    and     r2, r2, #15                 @ r2<- A
11493    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11494    SET_VREG(r0, r2)                    @ fp[A]<- r0
11495    GOTO_OPCODE(ip)                     @ jump to next instruction
11496
11497/* continuation for OP_IGET_SHORT */
11498
11499    /*
11500     * Currently:
11501     *  r0 holds resolved field
11502     *  r9 holds object
11503     */
11504.LOP_IGET_SHORT_finish:
11505    @bl      common_squeak4
11506    cmp     r9, #0                      @ check object for null
11507    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11508    beq     common_errNullObject        @ object was null
11509    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
11510    @ no-op                             @ acquiring load
11511    mov     r2, rINST, lsr #8           @ r2<- A+
11512    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11513    and     r2, r2, #15                 @ r2<- A
11514    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11515    SET_VREG(r0, r2)                    @ fp[A]<- r0
11516    GOTO_OPCODE(ip)                     @ jump to next instruction
11517
11518/* continuation for OP_IPUT */
11519
11520    /*
11521     * Currently:
11522     *  r0 holds resolved field
11523     *  r9 holds object
11524     */
11525.LOP_IPUT_finish:
11526    @bl      common_squeak0
11527    mov     r1, rINST, lsr #8           @ r1<- A+
11528    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11529    and     r1, r1, #15                 @ r1<- A
11530    cmp     r9, #0                      @ check object for null
11531    GET_VREG(r0, r1)                    @ r0<- fp[A]
11532    beq     common_errNullObject        @ object was null
11533    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11534    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11535    @ no-op                         @ releasing store
11536    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11537    @ no-op
11538    GOTO_OPCODE(ip)                     @ jump to next instruction
11539
11540/* continuation for OP_IPUT_WIDE */
11541
11542    /*
11543     * Currently:
11544     *  r0 holds resolved field
11545     *  r9 holds object
11546     */
11547.LOP_IPUT_WIDE_finish:
11548    mov     r2, rINST, lsr #8           @ r2<- A+
11549    cmp     r9, #0                      @ check object for null
11550    and     r2, r2, #15                 @ r2<- A
11551    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11552    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
11553    beq     common_errNullObject        @ object was null
11554    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11555    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
11556    GET_INST_OPCODE(r10)                @ extract opcode from rINST
11557    .if     0
11558    add     r2, r9, r3                  @ r2<- target address
11559    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
11560    .else
11561    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
11562    .endif
11563    GOTO_OPCODE(r10)                    @ jump to next instruction
11564
11565/* continuation for OP_IPUT_OBJECT */
11566
11567    /*
11568     * Currently:
11569     *  r0 holds resolved field
11570     *  r9 holds object
11571     */
11572.LOP_IPUT_OBJECT_finish:
11573    @bl      common_squeak0
11574    mov     r1, rINST, lsr #8           @ r1<- A+
11575    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11576    and     r1, r1, #15                 @ r1<- A
11577    cmp     r9, #0                      @ check object for null
11578    GET_VREG(r0, r1)                    @ r0<- fp[A]
11579    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
11580    beq     common_errNullObject        @ object was null
11581    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11582    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11583    @ no-op                         @ releasing store
11584    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
11585    @ no-op
11586    cmp     r0, #0                      @ stored a null reference?
11587    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
11588    GOTO_OPCODE(ip)                     @ jump to next instruction
11589
11590/* continuation for OP_IPUT_BOOLEAN */
11591
11592    /*
11593     * Currently:
11594     *  r0 holds resolved field
11595     *  r9 holds object
11596     */
11597.LOP_IPUT_BOOLEAN_finish:
11598    @bl      common_squeak1
11599    mov     r1, rINST, lsr #8           @ r1<- A+
11600    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11601    and     r1, r1, #15                 @ r1<- A
11602    cmp     r9, #0                      @ check object for null
11603    GET_VREG(r0, r1)                    @ r0<- fp[A]
11604    beq     common_errNullObject        @ object was null
11605    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11606    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11607    @ no-op                         @ releasing store
11608    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11609    @ no-op
11610    GOTO_OPCODE(ip)                     @ jump to next instruction
11611
11612/* continuation for OP_IPUT_BYTE */
11613
11614    /*
11615     * Currently:
11616     *  r0 holds resolved field
11617     *  r9 holds object
11618     */
11619.LOP_IPUT_BYTE_finish:
11620    @bl      common_squeak2
11621    mov     r1, rINST, lsr #8           @ r1<- A+
11622    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11623    and     r1, r1, #15                 @ r1<- A
11624    cmp     r9, #0                      @ check object for null
11625    GET_VREG(r0, r1)                    @ r0<- fp[A]
11626    beq     common_errNullObject        @ object was null
11627    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11628    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11629    @ no-op                         @ releasing store
11630    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11631    @ no-op
11632    GOTO_OPCODE(ip)                     @ jump to next instruction
11633
11634/* continuation for OP_IPUT_CHAR */
11635
11636    /*
11637     * Currently:
11638     *  r0 holds resolved field
11639     *  r9 holds object
11640     */
11641.LOP_IPUT_CHAR_finish:
11642    @bl      common_squeak3
11643    mov     r1, rINST, lsr #8           @ r1<- A+
11644    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11645    and     r1, r1, #15                 @ r1<- A
11646    cmp     r9, #0                      @ check object for null
11647    GET_VREG(r0, r1)                    @ r0<- fp[A]
11648    beq     common_errNullObject        @ object was null
11649    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11650    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11651    @ no-op                         @ releasing store
11652    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11653    @ no-op
11654    GOTO_OPCODE(ip)                     @ jump to next instruction
11655
11656/* continuation for OP_IPUT_SHORT */
11657
11658    /*
11659     * Currently:
11660     *  r0 holds resolved field
11661     *  r9 holds object
11662     */
11663.LOP_IPUT_SHORT_finish:
11664    @bl      common_squeak4
11665    mov     r1, rINST, lsr #8           @ r1<- A+
11666    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
11667    and     r1, r1, #15                 @ r1<- A
11668    cmp     r9, #0                      @ check object for null
11669    GET_VREG(r0, r1)                    @ r0<- fp[A]
11670    beq     common_errNullObject        @ object was null
11671    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
11672    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
11673    @ no-op                         @ releasing store
11674    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
11675    @ no-op
11676    GOTO_OPCODE(ip)                     @ jump to next instruction
11677
11678/* continuation for OP_SGET */
11679
11680    /*
11681     * Continuation if the field has not yet been resolved.
11682     *  r1:  BBBB field ref
11683     *  r10: dvmDex->pResFields
11684     */
11685.LOP_SGET_resolve:
11686    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11687#if defined(WITH_JIT)
11688    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11689#endif
11690    EXPORT_PC()                         @ resolve() could throw, so export now
11691    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11692    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11693    cmp     r0, #0                      @ success?
11694    beq     common_exceptionThrown      @ no, handle exception
11695#if defined(WITH_JIT)
11696    /*
11697     * If the JIT is actively building a trace we need to make sure
11698     * that the field is fully resolved before including this instruction.
11699     */
11700    bl      common_verifyField
11701#endif
11702    b       .LOP_SGET_finish
11703
11704/* continuation for OP_SGET_WIDE */
11705
11706    /*
11707     * Continuation if the field has not yet been resolved.
11708     *  r1:  BBBB field ref
11709     *  r10: dvmDex->pResFields
11710     *
11711     * Returns StaticField pointer in r0.
11712     */
11713.LOP_SGET_WIDE_resolve:
11714    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11715#if defined(WITH_JIT)
11716    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
11717#endif
11718    EXPORT_PC()                         @ resolve() could throw, so export now
11719    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11720    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11721    cmp     r0, #0                      @ success?
11722    beq     common_exceptionThrown      @ no, handle exception
11723#if defined(WITH_JIT)
11724    /*
11725     * If the JIT is actively building a trace we need to make sure
11726     * that the field is fully resolved before including this instruction.
11727     */
11728    bl      common_verifyField
11729#endif
11730    b       .LOP_SGET_WIDE_finish          @ resume
11731
11732/* continuation for OP_SGET_OBJECT */
11733
11734    /*
11735     * Continuation if the field has not yet been resolved.
11736     *  r1:  BBBB field ref
11737     *  r10: dvmDex->pResFields
11738     */
11739.LOP_SGET_OBJECT_resolve:
11740    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11741#if defined(WITH_JIT)
11742    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11743#endif
11744    EXPORT_PC()                         @ resolve() could throw, so export now
11745    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11746    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11747    cmp     r0, #0                      @ success?
11748    beq     common_exceptionThrown      @ no, handle exception
11749#if defined(WITH_JIT)
11750    /*
11751     * If the JIT is actively building a trace we need to make sure
11752     * that the field is fully resolved before including this instruction.
11753     */
11754    bl      common_verifyField
11755#endif
11756    b       .LOP_SGET_OBJECT_finish
11757
11758/* continuation for OP_SGET_BOOLEAN */
11759
11760    /*
11761     * Continuation if the field has not yet been resolved.
11762     *  r1:  BBBB field ref
11763     *  r10: dvmDex->pResFields
11764     */
11765.LOP_SGET_BOOLEAN_resolve:
11766    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11767#if defined(WITH_JIT)
11768    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11769#endif
11770    EXPORT_PC()                         @ resolve() could throw, so export now
11771    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11772    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11773    cmp     r0, #0                      @ success?
11774    beq     common_exceptionThrown      @ no, handle exception
11775#if defined(WITH_JIT)
11776    /*
11777     * If the JIT is actively building a trace we need to make sure
11778     * that the field is fully resolved before including this instruction.
11779     */
11780    bl      common_verifyField
11781#endif
11782    b       .LOP_SGET_BOOLEAN_finish
11783
11784/* continuation for OP_SGET_BYTE */
11785
11786    /*
11787     * Continuation if the field has not yet been resolved.
11788     *  r1:  BBBB field ref
11789     *  r10: dvmDex->pResFields
11790     */
11791.LOP_SGET_BYTE_resolve:
11792    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11793#if defined(WITH_JIT)
11794    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11795#endif
11796    EXPORT_PC()                         @ resolve() could throw, so export now
11797    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11798    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11799    cmp     r0, #0                      @ success?
11800    beq     common_exceptionThrown      @ no, handle exception
11801#if defined(WITH_JIT)
11802    /*
11803     * If the JIT is actively building a trace we need to make sure
11804     * that the field is fully resolved before including this instruction.
11805     */
11806    bl      common_verifyField
11807#endif
11808    b       .LOP_SGET_BYTE_finish
11809
11810/* continuation for OP_SGET_CHAR */
11811
11812    /*
11813     * Continuation if the field has not yet been resolved.
11814     *  r1:  BBBB field ref
11815     *  r10: dvmDex->pResFields
11816     */
11817.LOP_SGET_CHAR_resolve:
11818    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11819#if defined(WITH_JIT)
11820    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11821#endif
11822    EXPORT_PC()                         @ resolve() could throw, so export now
11823    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11824    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11825    cmp     r0, #0                      @ success?
11826    beq     common_exceptionThrown      @ no, handle exception
11827#if defined(WITH_JIT)
11828    /*
11829     * If the JIT is actively building a trace we need to make sure
11830     * that the field is fully resolved before including this instruction.
11831     */
11832    bl      common_verifyField
11833#endif
11834    b       .LOP_SGET_CHAR_finish
11835
11836/* continuation for OP_SGET_SHORT */
11837
11838    /*
11839     * Continuation if the field has not yet been resolved.
11840     *  r1:  BBBB field ref
11841     *  r10: dvmDex->pResFields
11842     */
11843.LOP_SGET_SHORT_resolve:
11844    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11845#if defined(WITH_JIT)
11846    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11847#endif
11848    EXPORT_PC()                         @ resolve() could throw, so export now
11849    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11850    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11851    cmp     r0, #0                      @ success?
11852    beq     common_exceptionThrown      @ no, handle exception
11853#if defined(WITH_JIT)
11854    /*
11855     * If the JIT is actively building a trace we need to make sure
11856     * that the field is fully resolved before including this instruction.
11857     */
11858    bl      common_verifyField
11859#endif
11860    b       .LOP_SGET_SHORT_finish
11861
11862/* continuation for OP_SPUT */
11863
11864    /*
11865     * Continuation if the field has not yet been resolved.
11866     *  r1:  BBBB field ref
11867     *  r10: dvmDex->pResFields
11868     */
11869.LOP_SPUT_resolve:
11870    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11871#if defined(WITH_JIT)
11872    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11873#endif
11874    EXPORT_PC()                         @ resolve() could throw, so export now
11875    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11876    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11877    cmp     r0, #0                      @ success?
11878    beq     common_exceptionThrown      @ no, handle exception
11879#if defined(WITH_JIT)
11880    /*
11881     * If the JIT is actively building a trace we need to make sure
11882     * that the field is fully resolved before including this instruction.
11883     */
11884    bl      common_verifyField
11885#endif
11886    b       .LOP_SPUT_finish          @ resume
11887
11888/* continuation for OP_SPUT_WIDE */
11889
11890    /*
11891     * Continuation if the field has not yet been resolved.
11892     *  r1:  BBBB field ref
11893     *  r9:  &fp[AA]
11894     *  r10: dvmDex->pResFields
11895     *
11896     * Returns StaticField pointer in r2.
11897     */
11898.LOP_SPUT_WIDE_resolve:
11899    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11900#if defined(WITH_JIT)
11901    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11902#endif
11903    EXPORT_PC()                         @ resolve() could throw, so export now
11904    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11905    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11906    cmp     r0, #0                      @ success?
11907    mov     r2, r0                      @ copy to r2
11908    beq     common_exceptionThrown      @ no, handle exception
11909#if defined(WITH_JIT)
11910    /*
11911     * If the JIT is actively building a trace we need to make sure
11912     * that the field is fully resolved before including this instruction.
11913     */
11914    bl      common_verifyField
11915#endif
11916    b       .LOP_SPUT_WIDE_finish          @ resume
11917
11918/* continuation for OP_SPUT_OBJECT */
11919
11920
11921.LOP_SPUT_OBJECT_end:
11922    str     r1, [r0, #offStaticField_value]  @ field<- vAA
11923    @ no-op
11924    cmp     r1, #0                      @ stored a null object?
11925    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
11926    GOTO_OPCODE(ip)                     @ jump to next instruction
11927
11928    /* Continuation if the field has not yet been resolved.
11929     * r1:  BBBB field ref
11930     * r10: dvmDex->pResFields
11931     */
11932.LOP_SPUT_OBJECT_resolve:
11933    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11934#if defined(WITH_JIT)
11935    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11936#endif
11937    EXPORT_PC()                         @ resolve() could throw, so export now
11938    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11939    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11940    cmp     r0, #0                      @ success?
11941    beq     common_exceptionThrown      @ no, handle exception
11942#if defined(WITH_JIT)
11943    /*
11944     * If the JIT is actively building a trace we need to make sure
11945     * that the field is fully resolved before including this instruction.
11946     */
11947    bl      common_verifyField
11948#endif
11949    b       .LOP_SPUT_OBJECT_finish          @ resume
11950
11951
11952/* continuation for OP_SPUT_BOOLEAN */
11953
11954    /*
11955     * Continuation if the field has not yet been resolved.
11956     *  r1:  BBBB field ref
11957     *  r10: dvmDex->pResFields
11958     */
11959.LOP_SPUT_BOOLEAN_resolve:
11960    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11961#if defined(WITH_JIT)
11962    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11963#endif
11964    EXPORT_PC()                         @ resolve() could throw, so export now
11965    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11966    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11967    cmp     r0, #0                      @ success?
11968    beq     common_exceptionThrown      @ no, handle exception
11969#if defined(WITH_JIT)
11970    /*
11971     * If the JIT is actively building a trace we need to make sure
11972     * that the field is fully resolved before including this instruction.
11973     */
11974    bl      common_verifyField
11975#endif
11976    b       .LOP_SPUT_BOOLEAN_finish          @ resume
11977
11978/* continuation for OP_SPUT_BYTE */
11979
11980    /*
11981     * Continuation if the field has not yet been resolved.
11982     *  r1:  BBBB field ref
11983     *  r10: dvmDex->pResFields
11984     */
11985.LOP_SPUT_BYTE_resolve:
11986    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
11987#if defined(WITH_JIT)
11988    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
11989#endif
11990    EXPORT_PC()                         @ resolve() could throw, so export now
11991    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
11992    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
11993    cmp     r0, #0                      @ success?
11994    beq     common_exceptionThrown      @ no, handle exception
11995#if defined(WITH_JIT)
11996    /*
11997     * If the JIT is actively building a trace we need to make sure
11998     * that the field is fully resolved before including this instruction.
11999     */
12000    bl      common_verifyField
12001#endif
12002    b       .LOP_SPUT_BYTE_finish          @ resume
12003
12004/* continuation for OP_SPUT_CHAR */
12005
12006    /*
12007     * Continuation if the field has not yet been resolved.
12008     *  r1:  BBBB field ref
12009     *  r10: dvmDex->pResFields
12010     */
12011.LOP_SPUT_CHAR_resolve:
12012    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12013#if defined(WITH_JIT)
12014    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12015#endif
12016    EXPORT_PC()                         @ resolve() could throw, so export now
12017    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12018    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12019    cmp     r0, #0                      @ success?
12020    beq     common_exceptionThrown      @ no, handle exception
12021#if defined(WITH_JIT)
12022    /*
12023     * If the JIT is actively building a trace we need to make sure
12024     * that the field is fully resolved before including this instruction.
12025     */
12026    bl      common_verifyField
12027#endif
12028    b       .LOP_SPUT_CHAR_finish          @ resume
12029
12030/* continuation for OP_SPUT_SHORT */
12031
12032    /*
12033     * Continuation if the field has not yet been resolved.
12034     *  r1:  BBBB field ref
12035     *  r10: dvmDex->pResFields
12036     */
12037.LOP_SPUT_SHORT_resolve:
12038    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12039#if defined(WITH_JIT)
12040    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12041#endif
12042    EXPORT_PC()                         @ resolve() could throw, so export now
12043    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12044    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12045    cmp     r0, #0                      @ success?
12046    beq     common_exceptionThrown      @ no, handle exception
12047#if defined(WITH_JIT)
12048    /*
12049     * If the JIT is actively building a trace we need to make sure
12050     * that the field is fully resolved before including this instruction.
12051     */
12052    bl      common_verifyField
12053#endif
12054    b       .LOP_SPUT_SHORT_finish          @ resume
12055
12056/* continuation for OP_INVOKE_VIRTUAL */
12057
12058    /*
12059     * At this point:
12060     *  r0 = resolved base method
12061     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
12062     */
12063.LOP_INVOKE_VIRTUAL_continue:
12064    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12065    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12066    cmp     r9, #0                      @ is "this" null?
12067    beq     common_errNullObject        @ null "this", throw exception
12068    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12069    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12070    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12071    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
12072
12073/* continuation for OP_INVOKE_SUPER */
12074
12075    /*
12076     * At this point:
12077     *  r0 = resolved base method
12078     *  r10 = method->clazz
12079     */
12080.LOP_INVOKE_SUPER_continue:
12081    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12082    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12083    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12084    EXPORT_PC()                         @ must export for invoke
12085    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12086    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
12087    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12088    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12089    bl      common_invokeMethodNoRange @ continue on
12090
12091.LOP_INVOKE_SUPER_resolve:
12092    mov     r0, r10                     @ r0<- method->clazz
12093    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12094    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12095    cmp     r0, #0                      @ got null?
12096    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
12097    b       common_exceptionThrown      @ yes, handle exception
12098
12099    /*
12100     * Throw a NoSuchMethodError with the method name as the message.
12101     *  r0 = resolved base method
12102     */
12103.LOP_INVOKE_SUPER_nsm:
12104    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12105    b       common_errNoSuchMethod
12106
12107/* continuation for OP_INVOKE_DIRECT */
12108
12109    /*
12110     * On entry:
12111     *  r1 = reference (BBBB or CCCC)
12112     *  r10 = "this" register
12113     */
12114.LOP_INVOKE_DIRECT_resolve:
12115    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12116    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12117    mov     r2, #METHOD_DIRECT          @ resolver method type
12118    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12119    cmp     r0, #0                      @ got null?
12120    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
12121    b       common_exceptionThrown      @ yes, handle exception
12122
12123/* continuation for OP_INVOKE_STATIC */
12124
12125
12126.LOP_INVOKE_STATIC_resolve:
12127    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12128    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12129    mov     r2, #METHOD_STATIC          @ resolver method type
12130    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12131    cmp     r0, #0                      @ got null?
12132#if defined(WITH_JIT)
12133    /*
12134     * Check to see if we're actively building a trace.  If so,
12135     * we need to keep this instruction out of it.
12136     * r10: &resolved_methodToCall
12137     */
12138    ldrh    r2, [rSELF, #offThread_subMode]
12139    beq     common_exceptionThrown            @ null, handle exception
12140    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12141    beq     common_invokeMethodNoRange     @ no (r0=method, r9="this")
12142    ldr     r1, [r10]                         @ reload resolved method
12143    cmp     r1, #0                            @ finished resolving?
12144    bne     common_invokeMethodNoRange     @ yes (r0=method, r9="this")
12145    mov     r10, r0                           @ preserve method
12146    mov     r0, rSELF
12147    mov     r1, rPC
12148    bl      dvmJitEndTraceSelect              @ (self, pc)
12149    mov     r0, r10
12150    b       common_invokeMethodNoRange     @ whew, finally!
12151#else
12152    bne     common_invokeMethodNoRange     @ (r0=method, r9="this")
12153    b       common_exceptionThrown            @ yes, handle exception
12154#endif
12155
12156/* continuation for OP_INVOKE_VIRTUAL_RANGE */
12157
12158    /*
12159     * At this point:
12160     *  r0 = resolved base method
12161     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
12162     */
12163.LOP_INVOKE_VIRTUAL_RANGE_continue:
12164    GET_VREG(r9, r10)                   @ r9<- "this" ptr
12165    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12166    cmp     r9, #0                      @ is "this" null?
12167    beq     common_errNullObject        @ null "this", throw exception
12168    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
12169    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
12170    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
12171    bl      common_invokeMethodRange @ (r0=method, r9="this")
12172
12173/* continuation for OP_INVOKE_SUPER_RANGE */
12174
12175    /*
12176     * At this point:
12177     *  r0 = resolved base method
12178     *  r10 = method->clazz
12179     */
12180.LOP_INVOKE_SUPER_RANGE_continue:
12181    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
12182    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
12183    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
12184    EXPORT_PC()                         @ must export for invoke
12185    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
12186    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
12187    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
12188    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
12189    bl      common_invokeMethodRange @ continue on
12190
12191.LOP_INVOKE_SUPER_RANGE_resolve:
12192    mov     r0, r10                     @ r0<- method->clazz
12193    mov     r2, #METHOD_VIRTUAL         @ resolver method type
12194    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12195    cmp     r0, #0                      @ got null?
12196    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
12197    b       common_exceptionThrown      @ yes, handle exception
12198
12199    /*
12200     * Throw a NoSuchMethodError with the method name as the message.
12201     *  r0 = resolved base method
12202     */
12203.LOP_INVOKE_SUPER_RANGE_nsm:
12204    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
12205    b       common_errNoSuchMethod
12206
12207/* continuation for OP_INVOKE_DIRECT_RANGE */
12208
12209    /*
12210     * On entry:
12211     *  r1 = reference (BBBB or CCCC)
12212     *  r10 = "this" register
12213     */
12214.LOP_INVOKE_DIRECT_RANGE_resolve:
12215    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12216    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12217    mov     r2, #METHOD_DIRECT          @ resolver method type
12218    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12219    cmp     r0, #0                      @ got null?
12220    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
12221    b       common_exceptionThrown      @ yes, handle exception
12222
12223/* continuation for OP_INVOKE_STATIC_RANGE */
12224
12225
12226.LOP_INVOKE_STATIC_RANGE_resolve:
12227    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12228    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12229    mov     r2, #METHOD_STATIC          @ resolver method type
12230    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
12231    cmp     r0, #0                      @ got null?
12232#if defined(WITH_JIT)
12233    /*
12234     * Check to see if we're actively building a trace.  If so,
12235     * we need to keep this instruction out of it.
12236     * r10: &resolved_methodToCall
12237     */
12238    ldrh    r2, [rSELF, #offThread_subMode]
12239    beq     common_exceptionThrown            @ null, handle exception
12240    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
12241    beq     common_invokeMethodRange     @ no (r0=method, r9="this")
12242    ldr     r1, [r10]                         @ reload resolved method
12243    cmp     r1, #0                            @ finished resolving?
12244    bne     common_invokeMethodRange     @ yes (r0=method, r9="this")
12245    mov     r10, r0                           @ preserve method
12246    mov     r0, rSELF
12247    mov     r1, rPC
12248    bl      dvmJitEndTraceSelect              @ (self, pc)
12249    mov     r0, r10
12250    b       common_invokeMethodRange     @ whew, finally!
12251#else
12252    bne     common_invokeMethodRange     @ (r0=method, r9="this")
12253    b       common_exceptionThrown            @ yes, handle exception
12254#endif
12255
12256/* continuation for OP_FLOAT_TO_LONG */
12257/*
12258 * Convert the float in r0 to a long in r0/r1.
12259 *
12260 * We have to clip values to long min/max per the specification.  The
12261 * expected common case is a "reasonable" value that converts directly
12262 * to modest integer.  The EABI convert function isn't doing this for us.
12263 */
12264f2l_doconv:
12265    stmfd   sp!, {r4, lr}
12266    mov     r1, #0x5f000000             @ (float)maxlong
12267    mov     r4, r0
12268    bl      __aeabi_fcmpge              @ is arg >= maxlong?
12269    cmp     r0, #0                      @ nonzero == yes
12270    mvnne   r0, #0                      @ return maxlong (7fffffff)
12271    mvnne   r1, #0x80000000
12272    ldmnefd sp!, {r4, pc}
12273
12274    mov     r0, r4                      @ recover arg
12275    mov     r1, #0xdf000000             @ (float)minlong
12276    bl      __aeabi_fcmple              @ is arg <= minlong?
12277    cmp     r0, #0                      @ nonzero == yes
12278    movne   r0, #0                      @ return minlong (80000000)
12279    movne   r1, #0x80000000
12280    ldmnefd sp!, {r4, pc}
12281
12282    mov     r0, r4                      @ recover arg
12283    mov     r1, r4
12284    bl      __aeabi_fcmpeq              @ is arg == self?
12285    cmp     r0, #0                      @ zero == no
12286    moveq   r1, #0                      @ return zero for NaN
12287    ldmeqfd sp!, {r4, pc}
12288
12289    mov     r0, r4                      @ recover arg
12290    bl      __aeabi_f2lz                @ convert float to long
12291    ldmfd   sp!, {r4, pc}
12292
12293/* continuation for OP_DOUBLE_TO_LONG */
12294/*
12295 * Convert the double in r0/r1 to a long in r0/r1.
12296 *
12297 * We have to clip values to long min/max per the specification.  The
12298 * expected common case is a "reasonable" value that converts directly
12299 * to modest integer.  The EABI convert function isn't doing this for us.
12300 */
12301d2l_doconv:
12302    stmfd   sp!, {r4, r5, lr}           @ save regs
12303    mov     r3, #0x43000000             @ maxlong, as a double (high word)
12304    add     r3, #0x00e00000             @  0x43e00000
12305    mov     r2, #0                      @ maxlong, as a double (low word)
12306    sub     sp, sp, #4                  @ align for EABI
12307    mov     r4, r0                      @ save a copy of r0
12308    mov     r5, r1                      @  and r1
12309    bl      __aeabi_dcmpge              @ is arg >= maxlong?
12310    cmp     r0, #0                      @ nonzero == yes
12311    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
12312    mvnne   r1, #0x80000000
12313    bne     1f
12314
12315    mov     r0, r4                      @ recover arg
12316    mov     r1, r5
12317    mov     r3, #0xc3000000             @ minlong, as a double (high word)
12318    add     r3, #0x00e00000             @  0xc3e00000
12319    mov     r2, #0                      @ minlong, as a double (low word)
12320    bl      __aeabi_dcmple              @ is arg <= minlong?
12321    cmp     r0, #0                      @ nonzero == yes
12322    movne   r0, #0                      @ return minlong (8000000000000000)
12323    movne   r1, #0x80000000
12324    bne     1f
12325
12326    mov     r0, r4                      @ recover arg
12327    mov     r1, r5
12328    mov     r2, r4                      @ compare against self
12329    mov     r3, r5
12330    bl      __aeabi_dcmpeq              @ is arg == self?
12331    cmp     r0, #0                      @ zero == no
12332    moveq   r1, #0                      @ return zero for NaN
12333    beq     1f
12334
12335    mov     r0, r4                      @ recover arg
12336    mov     r1, r5
12337    bl      __aeabi_d2lz                @ convert double to long
12338
123391:
12340    add     sp, sp, #4
12341    ldmfd   sp!, {r4, r5, pc}
12342
12343/* continuation for OP_MUL_LONG */
12344
12345.LOP_MUL_LONG_finish:
12346    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12347    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
12348    GOTO_OPCODE(ip)                     @ jump to next instruction
12349
12350/* continuation for OP_SHL_LONG */
12351
12352.LOP_SHL_LONG_finish:
12353    mov     r0, r0, asl r2              @  r0<- r0 << r2
12354    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12355    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12356    GOTO_OPCODE(ip)                     @ jump to next instruction
12357
12358/* continuation for OP_SHR_LONG */
12359
12360.LOP_SHR_LONG_finish:
12361    mov     r1, r1, asr r2              @  r1<- r1 >> r2
12362    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12363    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12364    GOTO_OPCODE(ip)                     @ jump to next instruction
12365
12366/* continuation for OP_USHR_LONG */
12367
12368.LOP_USHR_LONG_finish:
12369    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
12370    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12371    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12372    GOTO_OPCODE(ip)                     @ jump to next instruction
12373
12374/* continuation for OP_SHL_LONG_2ADDR */
12375
12376.LOP_SHL_LONG_2ADDR_finish:
12377    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12378    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12379    GOTO_OPCODE(ip)                     @ jump to next instruction
12380
12381/* continuation for OP_SHR_LONG_2ADDR */
12382
12383.LOP_SHR_LONG_2ADDR_finish:
12384    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12385    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12386    GOTO_OPCODE(ip)                     @ jump to next instruction
12387
12388/* continuation for OP_USHR_LONG_2ADDR */
12389
12390.LOP_USHR_LONG_2ADDR_finish:
12391    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12392    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
12393    GOTO_OPCODE(ip)                     @ jump to next instruction
12394
12395/* continuation for OP_IGET_VOLATILE */
12396
12397    /*
12398     * Currently:
12399     *  r0 holds resolved field
12400     *  r9 holds object
12401     */
12402.LOP_IGET_VOLATILE_finish:
12403    @bl      common_squeak0
12404    cmp     r9, #0                      @ check object for null
12405    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12406    beq     common_errNullObject        @ object was null
12407    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12408    SMP_DMB                            @ acquiring load
12409    mov     r2, rINST, lsr #8           @ r2<- A+
12410    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12411    and     r2, r2, #15                 @ r2<- A
12412    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12413    SET_VREG(r0, r2)                    @ fp[A]<- r0
12414    GOTO_OPCODE(ip)                     @ jump to next instruction
12415
12416/* continuation for OP_IPUT_VOLATILE */
12417
12418    /*
12419     * Currently:
12420     *  r0 holds resolved field
12421     *  r9 holds object
12422     */
12423.LOP_IPUT_VOLATILE_finish:
12424    @bl      common_squeak0
12425    mov     r1, rINST, lsr #8           @ r1<- A+
12426    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12427    and     r1, r1, #15                 @ r1<- A
12428    cmp     r9, #0                      @ check object for null
12429    GET_VREG(r0, r1)                    @ r0<- fp[A]
12430    beq     common_errNullObject        @ object was null
12431    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12432    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12433    SMP_DMB_ST                        @ releasing store
12434    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
12435    SMP_DMB
12436    GOTO_OPCODE(ip)                     @ jump to next instruction
12437
12438/* continuation for OP_SGET_VOLATILE */
12439
12440    /*
12441     * Continuation if the field has not yet been resolved.
12442     *  r1:  BBBB field ref
12443     *  r10: dvmDex->pResFields
12444     */
12445.LOP_SGET_VOLATILE_resolve:
12446    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12447#if defined(WITH_JIT)
12448    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12449#endif
12450    EXPORT_PC()                         @ resolve() could throw, so export now
12451    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12452    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12453    cmp     r0, #0                      @ success?
12454    beq     common_exceptionThrown      @ no, handle exception
12455#if defined(WITH_JIT)
12456    /*
12457     * If the JIT is actively building a trace we need to make sure
12458     * that the field is fully resolved before including this instruction.
12459     */
12460    bl      common_verifyField
12461#endif
12462    b       .LOP_SGET_VOLATILE_finish
12463
12464/* continuation for OP_SPUT_VOLATILE */
12465
12466    /*
12467     * Continuation if the field has not yet been resolved.
12468     *  r1:  BBBB field ref
12469     *  r10: dvmDex->pResFields
12470     */
12471.LOP_SPUT_VOLATILE_resolve:
12472    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12473#if defined(WITH_JIT)
12474    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12475#endif
12476    EXPORT_PC()                         @ resolve() could throw, so export now
12477    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12478    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12479    cmp     r0, #0                      @ success?
12480    beq     common_exceptionThrown      @ no, handle exception
12481#if defined(WITH_JIT)
12482    /*
12483     * If the JIT is actively building a trace we need to make sure
12484     * that the field is fully resolved before including this instruction.
12485     */
12486    bl      common_verifyField
12487#endif
12488    b       .LOP_SPUT_VOLATILE_finish          @ resume
12489
12490/* continuation for OP_IGET_OBJECT_VOLATILE */
12491
12492    /*
12493     * Currently:
12494     *  r0 holds resolved field
12495     *  r9 holds object
12496     */
12497.LOP_IGET_OBJECT_VOLATILE_finish:
12498    @bl      common_squeak0
12499    cmp     r9, #0                      @ check object for null
12500    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12501    beq     common_errNullObject        @ object was null
12502    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
12503    SMP_DMB                            @ acquiring load
12504    mov     r2, rINST, lsr #8           @ r2<- A+
12505    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12506    and     r2, r2, #15                 @ r2<- A
12507    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12508    SET_VREG(r0, r2)                    @ fp[A]<- r0
12509    GOTO_OPCODE(ip)                     @ jump to next instruction
12510
12511/* continuation for OP_IGET_WIDE_VOLATILE */
12512
12513    /*
12514     * Currently:
12515     *  r0 holds resolved field
12516     *  r9 holds object
12517     */
12518.LOP_IGET_WIDE_VOLATILE_finish:
12519    cmp     r9, #0                      @ check object for null
12520    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12521    beq     common_errNullObject        @ object was null
12522    .if     1
12523    add     r0, r9, r3                  @ r0<- address of field
12524    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
12525    .else
12526    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
12527    .endif
12528    mov     r2, rINST, lsr #8           @ r2<- A+
12529    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12530    and     r2, r2, #15                 @ r2<- A
12531    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
12532    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12533    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
12534    GOTO_OPCODE(ip)                     @ jump to next instruction
12535
12536/* continuation for OP_IPUT_WIDE_VOLATILE */
12537
12538    /*
12539     * Currently:
12540     *  r0 holds resolved field
12541     *  r9 holds object
12542     */
12543.LOP_IPUT_WIDE_VOLATILE_finish:
12544    mov     r2, rINST, lsr #8           @ r2<- A+
12545    cmp     r9, #0                      @ check object for null
12546    and     r2, r2, #15                 @ r2<- A
12547    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12548    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
12549    beq     common_errNullObject        @ object was null
12550    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12551    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
12552    GET_INST_OPCODE(r10)                @ extract opcode from rINST
12553    .if     1
12554    add     r2, r9, r3                  @ r2<- target address
12555    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
12556    .else
12557    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
12558    .endif
12559    GOTO_OPCODE(r10)                    @ jump to next instruction
12560
12561/* continuation for OP_SGET_WIDE_VOLATILE */
12562
12563    /*
12564     * Continuation if the field has not yet been resolved.
12565     *  r1:  BBBB field ref
12566     *  r10: dvmDex->pResFields
12567     *
12568     * Returns StaticField pointer in r0.
12569     */
12570.LOP_SGET_WIDE_VOLATILE_resolve:
12571    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12572#if defined(WITH_JIT)
12573    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
12574#endif
12575    EXPORT_PC()                         @ resolve() could throw, so export now
12576    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12577    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12578    cmp     r0, #0                      @ success?
12579    beq     common_exceptionThrown      @ no, handle exception
12580#if defined(WITH_JIT)
12581    /*
12582     * If the JIT is actively building a trace we need to make sure
12583     * that the field is fully resolved before including this instruction.
12584     */
12585    bl      common_verifyField
12586#endif
12587    b       .LOP_SGET_WIDE_VOLATILE_finish          @ resume
12588
12589/* continuation for OP_SPUT_WIDE_VOLATILE */
12590
12591    /*
12592     * Continuation if the field has not yet been resolved.
12593     *  r1:  BBBB field ref
12594     *  r9:  &fp[AA]
12595     *  r10: dvmDex->pResFields
12596     *
12597     * Returns StaticField pointer in r2.
12598     */
12599.LOP_SPUT_WIDE_VOLATILE_resolve:
12600    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12601#if defined(WITH_JIT)
12602    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12603#endif
12604    EXPORT_PC()                         @ resolve() could throw, so export now
12605    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12606    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12607    cmp     r0, #0                      @ success?
12608    mov     r2, r0                      @ copy to r2
12609    beq     common_exceptionThrown      @ no, handle exception
12610#if defined(WITH_JIT)
12611    /*
12612     * If the JIT is actively building a trace we need to make sure
12613     * that the field is fully resolved before including this instruction.
12614     */
12615    bl      common_verifyField
12616#endif
12617    b       .LOP_SPUT_WIDE_VOLATILE_finish          @ resume
12618
12619/* continuation for OP_EXECUTE_INLINE */
12620
12621    /*
12622     * Extract args, call function.
12623     *  r0 = #of args (0-4)
12624     *  r10 = call index
12625     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
12626     *
12627     * Other ideas:
12628     * - Use a jump table from the main piece to jump directly into the
12629     *   AND/LDR pairs.  Costs a data load, saves a branch.
12630     * - Have five separate pieces that do the loading, so we can work the
12631     *   interleave a little better.  Increases code size.
12632     */
12633.LOP_EXECUTE_INLINE_continue:
12634    rsb     r0, r0, #4                  @ r0<- 4-r0
12635    FETCH(rINST, 2)                     @ rINST<- FEDC
12636    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
12637    bl      common_abort                @ (skipped due to ARM prefetch)
126384:  and     ip, rINST, #0xf000          @ isolate F
12639    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
126403:  and     ip, rINST, #0x0f00          @ isolate E
12641    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
126422:  and     ip, rINST, #0x00f0          @ isolate D
12643    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
126441:  and     ip, rINST, #0x000f          @ isolate C
12645    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
126460:
12647    ldr     rINST, .LOP_EXECUTE_INLINE_table    @ table of InlineOperation
12648    ldr     pc, [rINST, r10, lsl #4]    @ sizeof=16, "func" is first entry
12649    @ (not reached)
12650
12651    /*
12652     * We're debugging or profiling.
12653     * r10: opIndex
12654     */
12655.LOP_EXECUTE_INLINE_debugmode:
12656    mov     r0, r10
12657    bl      dvmResolveInlineNative
12658    cmp     r0, #0                      @ did it resolve?
12659    beq     .LOP_EXECUTE_INLINE_resume          @ no, just move on
12660    mov     r9, r0                      @ remember method
12661    mov     r1, rSELF
12662    bl      dvmFastMethodTraceEnter     @ (method, self)
12663    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
12664    sub     sp, sp, #8                  @ make room for arg, +64 bit align
12665    mov     r0, rINST, lsr #12          @ r0<- B
12666    str     r1, [sp]                    @ push &self->retval
12667    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
12668    mov     rINST, r0                   @ save result of inline
12669    add     sp, sp, #8                  @ pop stack
12670    mov     r0, r9                      @ r0<- method
12671    mov     r1, rSELF
12672    bl      dvmFastNativeMethodTraceExit @ (method, self)
12673    cmp     rINST, #0                   @ test boolean result of inline
12674    beq     common_exceptionThrown      @ returned false, handle exception
12675    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
12676    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12677    GOTO_OPCODE(ip)                     @ jump to next instruction
12678
12679
12680
12681
12682.LOP_EXECUTE_INLINE_table:
12683    .word   gDvmInlineOpsTable
12684
12685/* continuation for OP_EXECUTE_INLINE_RANGE */
12686
12687    /*
12688     * Extract args, call function.
12689     *  r0 = #of args (0-4)
12690     *  r10 = call index
12691     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
12692     */
12693.LOP_EXECUTE_INLINE_RANGE_continue:
12694    rsb     r0, r0, #4                  @ r0<- 4-r0
12695    FETCH(r9, 2)                        @ r9<- CCCC
12696    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
12697    bl      common_abort                @ (skipped due to ARM prefetch)
126984:  add     ip, r9, #3                  @ base+3
12699    GET_VREG(r3, ip)                    @ r3<- vBase[3]
127003:  add     ip, r9, #2                  @ base+2
12701    GET_VREG(r2, ip)                    @ r2<- vBase[2]
127022:  add     ip, r9, #1                  @ base+1
12703    GET_VREG(r1, ip)                    @ r1<- vBase[1]
127041:  add     ip, r9, #0                  @ (nop)
12705    GET_VREG(r0, ip)                    @ r0<- vBase[0]
127060:
12707    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
12708    ldr     pc, [r9, r10, lsl #4]       @ sizeof=16, "func" is first entry
12709    @ (not reached)
12710
12711
12712    /*
12713     * We're debugging or profiling.
12714     * r10: opIndex
12715     */
12716.LOP_EXECUTE_INLINE_RANGE_debugmode:
12717    mov     r0, r10
12718    bl      dvmResolveInlineNative
12719    cmp     r0, #0                      @ did it resolve?
12720    beq     .LOP_EXECUTE_INLINE_RANGE_resume          @ no, just move on
12721    mov     r9, r0                      @ remember method
12722    mov     r1, rSELF
12723    bl      dvmFastMethodTraceEnter     @ (method, self)
12724    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
12725    sub     sp, sp, #8                  @ make room for arg, +64 bit align
12726    mov     r0, rINST, lsr #8           @ r0<- B
12727    mov     rINST, r9                   @ rINST<- method
12728    str     r1, [sp]                    @ push &self->retval
12729    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
12730    mov     r9, r0                      @ save result of inline
12731    add     sp, sp, #8                  @ pop stack
12732    mov     r0, rINST                   @ r0<- method
12733    mov     r1, rSELF
12734    bl      dvmFastNativeMethodTraceExit  @ (method, self)
12735    cmp     r9, #0                      @ test boolean result of inline
12736    beq     common_exceptionThrown      @ returned false, handle exception
12737    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
12738    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12739    GOTO_OPCODE(ip)                     @ jump to next instruction
12740
12741
12742
12743
12744.LOP_EXECUTE_INLINE_RANGE_table:
12745    .word   gDvmInlineOpsTable
12746
12747
12748/* continuation for OP_INVOKE_OBJECT_INIT_RANGE */
12749
12750.LOP_INVOKE_OBJECT_INIT_RANGE_setFinal:
12751    EXPORT_PC()                         @ can throw
12752    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
12753    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
12754    cmp     r0, #0                      @ exception pending?
12755    bne     common_exceptionThrown      @ yes, handle it
12756    b       .LOP_INVOKE_OBJECT_INIT_RANGE_finish
12757
12758    /*
12759     * A debugger is attached, so we need to go ahead and do
12760     * this.  For simplicity, we'll just jump directly to the
12761     * corresponding handler.  Note that we can't use
12762     * rIBASE here because it may be in single-step mode.
12763     * Load the primary table base directly.
12764     */
12765.LOP_INVOKE_OBJECT_INIT_RANGE_debugger:
12766    ldr     r1, [rSELF, #offThread_mainHandlerTable]
12767    .if 0
12768    mov     ip, #OP_INVOKE_DIRECT_JUMBO
12769    .else
12770    mov     ip, #OP_INVOKE_DIRECT_RANGE
12771    .endif
12772    GOTO_OPCODE_BASE(r1,ip)             @ execute it
12773
12774/* continuation for OP_IPUT_OBJECT_VOLATILE */
12775
12776    /*
12777     * Currently:
12778     *  r0 holds resolved field
12779     *  r9 holds object
12780     */
12781.LOP_IPUT_OBJECT_VOLATILE_finish:
12782    @bl      common_squeak0
12783    mov     r1, rINST, lsr #8           @ r1<- A+
12784    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
12785    and     r1, r1, #15                 @ r1<- A
12786    cmp     r9, #0                      @ check object for null
12787    GET_VREG(r0, r1)                    @ r0<- fp[A]
12788    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
12789    beq     common_errNullObject        @ object was null
12790    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
12791    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12792    SMP_DMB_ST                        @ releasing store
12793    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
12794    SMP_DMB
12795    cmp     r0, #0                      @ stored a null reference?
12796    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
12797    GOTO_OPCODE(ip)                     @ jump to next instruction
12798
12799/* continuation for OP_SGET_OBJECT_VOLATILE */
12800
12801    /*
12802     * Continuation if the field has not yet been resolved.
12803     *  r1:  BBBB field ref
12804     *  r10: dvmDex->pResFields
12805     */
12806.LOP_SGET_OBJECT_VOLATILE_resolve:
12807    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12808#if defined(WITH_JIT)
12809    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12810#endif
12811    EXPORT_PC()                         @ resolve() could throw, so export now
12812    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12813    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12814    cmp     r0, #0                      @ success?
12815    beq     common_exceptionThrown      @ no, handle exception
12816#if defined(WITH_JIT)
12817    /*
12818     * If the JIT is actively building a trace we need to make sure
12819     * that the field is fully resolved before including this instruction.
12820     */
12821    bl      common_verifyField
12822#endif
12823    b       .LOP_SGET_OBJECT_VOLATILE_finish
12824
12825/* continuation for OP_SPUT_OBJECT_VOLATILE */
12826
12827
12828.LOP_SPUT_OBJECT_VOLATILE_end:
12829    str     r1, [r0, #offStaticField_value]  @ field<- vAA
12830    SMP_DMB
12831    cmp     r1, #0                      @ stored a null object?
12832    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
12833    GOTO_OPCODE(ip)                     @ jump to next instruction
12834
12835    /* Continuation if the field has not yet been resolved.
12836     * r1:  BBBB field ref
12837     * r10: dvmDex->pResFields
12838     */
12839.LOP_SPUT_OBJECT_VOLATILE_resolve:
12840    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
12841#if defined(WITH_JIT)
12842    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
12843#endif
12844    EXPORT_PC()                         @ resolve() could throw, so export now
12845    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
12846    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
12847    cmp     r0, #0                      @ success?
12848    beq     common_exceptionThrown      @ no, handle exception
12849#if defined(WITH_JIT)
12850    /*
12851     * If the JIT is actively building a trace we need to make sure
12852     * that the field is fully resolved before including this instruction.
12853     */
12854    bl      common_verifyField
12855#endif
12856    b       .LOP_SPUT_OBJECT_VOLATILE_finish          @ resume
12857
12858
12859/* continuation for OP_CONST_CLASS_JUMBO */
12860
12861    /*
12862     * Continuation if the Class has not yet been resolved.
12863     *  r1: AAAAAAAA (Class ref)
12864     *  r9: target register
12865     */
12866.LOP_CONST_CLASS_JUMBO_resolve:
12867    EXPORT_PC()
12868    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
12869    mov     r2, #1                      @ r2<- true
12870    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
12871    bl      dvmResolveClass             @ r0<- Class reference
12872    cmp     r0, #0                      @ failed?
12873    beq     common_exceptionThrown      @ yup, handle the exception
12874    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12875    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12876    SET_VREG(r0, r9)                    @ vBBBB<- r0
12877    GOTO_OPCODE(ip)                     @ jump to next instruction
12878
12879/* continuation for OP_CHECK_CAST_JUMBO */
12880
12881    /*
12882     * Trivial test failed, need to perform full check.  This is common.
12883     *  r0 holds obj->clazz
12884     *  r1 holds desired class resolved from AAAAAAAA
12885     *  r9 holds object
12886     */
12887.LOP_CHECK_CAST_JUMBO_fullcheck:
12888    mov     r10, r1                     @ avoid ClassObject getting clobbered
12889    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
12890    cmp     r0, #0                      @ failed?
12891    bne     .LOP_CHECK_CAST_JUMBO_okay            @ no, success
12892
12893    @ A cast has failed.  We need to throw a ClassCastException.
12894    EXPORT_PC()                         @ about to throw
12895    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
12896    mov     r1, r10                     @ r1<- desired class
12897    bl      dvmThrowClassCastException
12898    b       common_exceptionThrown
12899
12900    /*
12901     * Advance PC and get the next opcode.
12902     */
12903.LOP_CHECK_CAST_JUMBO_okay:
12904    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
12905    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12906    GOTO_OPCODE(ip)                     @ jump to next instruction
12907
12908    /*
12909     * Resolution required.  This is the least-likely path.
12910     *
12911     *  r2 holds AAAAAAAA
12912     *  r9 holds object
12913     */
12914.LOP_CHECK_CAST_JUMBO_resolve:
12915    EXPORT_PC()                         @ resolve() could throw
12916    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
12917    mov     r1, r2                      @ r1<- AAAAAAAA
12918    mov     r2, #0                      @ r2<- false
12919    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
12920    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12921    cmp     r0, #0                      @ got null?
12922    beq     common_exceptionThrown      @ yes, handle exception
12923    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
12924    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
12925    b       .LOP_CHECK_CAST_JUMBO_resolved        @ pick up where we left off
12926
12927/* continuation for OP_INSTANCE_OF_JUMBO */
12928
12929    /*
12930     * Class resolved, determine type of check necessary.  This is common.
12931     *  r0 holds obj->clazz
12932     *  r1 holds class resolved from AAAAAAAA
12933     *  r9 holds BBBB
12934     */
12935.LOP_INSTANCE_OF_JUMBO_resolved:
12936    cmp     r0, r1                      @ same class (trivial success)?
12937    beq     .LOP_INSTANCE_OF_JUMBO_trivial         @ yes, trivial finish
12938    @ fall through to OP_INSTANCE_OF_JUMBO_fullcheck
12939
12940    /*
12941     * Trivial test failed, need to perform full check.  This is common.
12942     *  r0 holds obj->clazz
12943     *  r1 holds class resolved from AAAAAAAA
12944     *  r9 holds BBBB
12945     */
12946.LOP_INSTANCE_OF_JUMBO_fullcheck:
12947    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
12948    @ fall through to OP_INSTANCE_OF_JUMBO_store
12949
12950    /*
12951     * r0 holds boolean result
12952     * r9 holds BBBB
12953     */
12954.LOP_INSTANCE_OF_JUMBO_store:
12955    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
12956    SET_VREG(r0, r9)                    @ vBBBB<- r0
12957    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12958    GOTO_OPCODE(ip)                     @ jump to next instruction
12959
12960    /*
12961     * Trivial test succeeded, save and bail.
12962     *  r9 holds BBBB
12963     */
12964.LOP_INSTANCE_OF_JUMBO_trivial:
12965    mov     r0, #1                      @ indicate success
12966    @ could b OP_INSTANCE_OF_JUMBO_store, but copying is faster and cheaper
12967    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
12968    SET_VREG(r0, r9)                    @ vBBBB<- r0
12969    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
12970    GOTO_OPCODE(ip)                     @ jump to next instruction
12971
12972    /*
12973     * Resolution required.  This is the least-likely path.
12974     *
12975     *  r3 holds AAAAAAAA
12976     *  r9 holds BBBB
12977     */
12978
12979.LOP_INSTANCE_OF_JUMBO_resolve:
12980    EXPORT_PC()                         @ resolve() could throw
12981    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
12982    mov     r1, r3                      @ r1<- AAAAAAAA
12983    mov     r2, #1                      @ r2<- true
12984    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
12985    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
12986    cmp     r0, #0                      @ got null?
12987    beq     common_exceptionThrown      @ yes, handle exception
12988    FETCH(r3, 4)                        @ r3<- vCCCC
12989    mov     r1, r0                      @ r1<- class resolved from AAAAAAAA
12990    GET_VREG(r0, r3)                    @ r0<- vCCCC (object)
12991    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
12992    b       .LOP_INSTANCE_OF_JUMBO_resolved        @ pick up where we left off
12993
12994/* continuation for OP_NEW_INSTANCE_JUMBO */
12995
12996    .balign 32                          @ minimize cache lines
12997.LOP_NEW_INSTANCE_JUMBO_finish: @ r0=new object
12998    FETCH(r3, 3)                        @ r3<- BBBB
12999    cmp     r0, #0                      @ failed?
13000#if defined(WITH_JIT)
13001    /*
13002     * The JIT needs the class to be fully resolved before it can
13003     * include this instruction in a trace.
13004     */
13005    ldrh    r1, [rSELF, #offThread_subMode]
13006    beq     common_exceptionThrown      @ yes, handle the exception
13007    ands    r1, #kSubModeJitTraceBuild  @ under construction?
13008    bne     .LOP_NEW_INSTANCE_JUMBO_jitCheck
13009#else
13010    beq     common_exceptionThrown      @ yes, handle the exception
13011#endif
13012.LOP_NEW_INSTANCE_JUMBO_end:
13013    FETCH_ADVANCE_INST(4)               @ advance rPC, load rINST
13014    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13015    SET_VREG(r0, r3)                    @ vBBBB<- r0
13016    GOTO_OPCODE(ip)                     @ jump to next instruction
13017
13018#if defined(WITH_JIT)
13019    /*
13020     * Check to see if we need to stop the trace building early.
13021     * r0: new object
13022     * r3: vAA
13023     */
13024.LOP_NEW_INSTANCE_JUMBO_jitCheck:
13025    ldr     r1, [r10]                   @ reload resolved class
13026    cmp     r1, #0                      @ okay?
13027    bne     .LOP_NEW_INSTANCE_JUMBO_end             @ yes, finish
13028    mov     r9, r0                      @ preserve new object
13029    mov     r10, r3                     @ preserve vAA
13030    mov     r0, rSELF
13031    mov     r1, rPC
13032    bl      dvmJitEndTraceSelect        @ (self, pc)
13033    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
13034    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13035    SET_VREG(r9, r10)                   @ vAA<- new object
13036    GOTO_OPCODE(ip)                     @ jump to next instruction
13037#endif
13038
13039    /*
13040     * Class initialization required.
13041     *
13042     *  r0 holds class object
13043     */
13044.LOP_NEW_INSTANCE_JUMBO_needinit:
13045    mov     r9, r0                      @ save r0
13046    bl      dvmInitClass                @ initialize class
13047    cmp     r0, #0                      @ check boolean result
13048    mov     r0, r9                      @ restore r0
13049    bne     .LOP_NEW_INSTANCE_JUMBO_initialized     @ success, continue
13050    b       common_exceptionThrown      @ failed, deal with init exception
13051
13052    /*
13053     * Resolution required.  This is the least-likely path.
13054     *
13055     *  r1 holds AAAAAAAA
13056     */
13057.LOP_NEW_INSTANCE_JUMBO_resolve:
13058    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13059    mov     r2, #0                      @ r2<- false
13060    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13061    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
13062    cmp     r0, #0                      @ got null?
13063    bne     .LOP_NEW_INSTANCE_JUMBO_resolved        @ no, continue
13064    b       common_exceptionThrown      @ yes, handle exception
13065
13066/* continuation for OP_NEW_ARRAY_JUMBO */
13067
13068
13069    /*
13070     * Resolve class.  (This is an uncommon case.)
13071     *
13072     *  r1 holds array length
13073     *  r2 holds class ref AAAAAAAA
13074     */
13075.LOP_NEW_ARRAY_JUMBO_resolve:
13076    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
13077    mov     r9, r1                      @ r9<- length (save)
13078    mov     r1, r2                      @ r1<- AAAAAAAA
13079    mov     r2, #0                      @ r2<- false
13080    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
13081    bl      dvmResolveClass             @ r0<- call(clazz, ref)
13082    cmp     r0, #0                      @ got null?
13083    mov     r1, r9                      @ r1<- length (restore)
13084    beq     common_exceptionThrown      @ yes, handle exception
13085    @ fall through to OP_NEW_ARRAY_JUMBO_finish
13086
13087    /*
13088     * Finish allocation.
13089     *
13090     *  r0 holds class
13091     *  r1 holds array length
13092     */
13093.LOP_NEW_ARRAY_JUMBO_finish:
13094    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
13095    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
13096    cmp     r0, #0                      @ failed?
13097    FETCH(r2, 3)                        @ r2<- vBBBB
13098    beq     common_exceptionThrown      @ yes, handle the exception
13099    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13100    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13101    SET_VREG(r0, r2)                    @ vBBBB<- r0
13102    GOTO_OPCODE(ip)                     @ jump to next instruction
13103
13104/* continuation for OP_FILLED_NEW_ARRAY_JUMBO */
13105
13106    /*
13107     * On entry:
13108     *  r0 holds array class
13109     */
13110.LOP_FILLED_NEW_ARRAY_JUMBO_continue:
13111    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
13112    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
13113    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
13114    FETCH(r1, 3)                        @ r1<- BBBB (length)
13115    cmp     rINST, #'I'                 @ array of ints?
13116    cmpne   rINST, #'L'                 @ array of objects?
13117    cmpne   rINST, #'['                 @ array of arrays?
13118    mov     r9, r1                      @ save length in r9
13119    bne     .LOP_FILLED_NEW_ARRAY_JUMBO_notimpl         @ no, not handled yet
13120    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
13121    cmp     r0, #0                      @ null return?
13122    beq     common_exceptionThrown      @ alloc failed, handle exception
13123
13124    FETCH(r1, 4)                        @ r1<- CCCC
13125    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
13126    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
13127    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
13128    subs    r9, r9, #1                  @ length--, check for neg
13129    FETCH_ADVANCE_INST(5)               @ advance to next instr, load rINST
13130    bmi     2f                          @ was zero, bail
13131
13132    @ copy values from registers into the array
13133    @ r0=array, r1=CCCC, r9=BBBB (length)
13134    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
131351:  ldr     r3, [r2], #4                @ r3<- *r2++
13136    subs    r9, r9, #1                  @ count--
13137    str     r3, [r0], #4                @ *contents++ = vX
13138    bpl     1b
13139
131402:  ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
13141    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
13142    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13143    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
13144    cmp     r1, #'I'                         @ Is int array?
13145    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
13146    GOTO_OPCODE(ip)                          @ execute it
13147
13148    /*
13149     * Throw an exception indicating that we have not implemented this
13150     * mode of filled-new-array.
13151     */
13152.LOP_FILLED_NEW_ARRAY_JUMBO_notimpl:
13153    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO
13154    bl      dvmThrowInternalError
13155    b       common_exceptionThrown
13156
13157    /*
13158     * Ideally we'd only define this once, but depending on layout we can
13159     * exceed the range of the load above.
13160     */
13161
13162.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_JUMBO:
13163    .word   .LstrFilledNewArrayNotImpl
13164
13165/* continuation for OP_IGET_JUMBO */
13166
13167    /*
13168     * Currently:
13169     *  r0 holds resolved field
13170     *  r9 holds object
13171     */
13172.LOP_IGET_JUMBO_resolved:
13173    cmp     r0, #0                      @ resolution unsuccessful?
13174    beq     common_exceptionThrown      @ yes, throw exception
13175    @ fall through to OP_IGET_JUMBO_finish
13176
13177    /*
13178     * Currently:
13179     *  r0 holds resolved field
13180     *  r9 holds object
13181     */
13182.LOP_IGET_JUMBO_finish:
13183    @bl      common_squeak0
13184    cmp     r9, #0                      @ check object for null
13185    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13186    beq     common_errNullObject        @ object was null
13187    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13188    @ no-op                             @ acquiring load
13189    FETCH(r2, 3)                        @ r2<- BBBB
13190    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13191    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13192    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13193    GOTO_OPCODE(ip)                     @ jump to next instruction
13194
13195/* continuation for OP_IGET_WIDE_JUMBO */
13196
13197    /*
13198     * Currently:
13199     *  r0 holds resolved field
13200     *  r9 holds object
13201     */
13202.LOP_IGET_WIDE_JUMBO_resolved:
13203    cmp     r0, #0                      @ resolution unsuccessful?
13204    beq     common_exceptionThrown      @ yes, throw exception
13205    @ fall through to OP_IGET_WIDE_JUMBO_finish
13206
13207    /*
13208     * Currently:
13209     *  r0 holds resolved field
13210     *  r9 holds object
13211     */
13212.LOP_IGET_WIDE_JUMBO_finish:
13213    cmp     r9, #0                      @ check object for null
13214    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13215    beq     common_errNullObject        @ object was null
13216    .if     0
13217    add     r0, r9, r3                  @ r0<- address of field
13218    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
13219    .else
13220    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
13221    .endif
13222    FETCH(r2, 3)                        @ r2<- BBBB
13223    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13224    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13225    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13226    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
13227    GOTO_OPCODE(ip)                     @ jump to next instruction
13228
13229/* continuation for OP_IGET_OBJECT_JUMBO */
13230
13231    /*
13232     * Currently:
13233     *  r0 holds resolved field
13234     *  r9 holds object
13235     */
13236.LOP_IGET_OBJECT_JUMBO_resolved:
13237    cmp     r0, #0                      @ resolution unsuccessful?
13238    beq     common_exceptionThrown      @ yes, throw exception
13239    @ fall through to OP_IGET_OBJECT_JUMBO_finish
13240
13241    /*
13242     * Currently:
13243     *  r0 holds resolved field
13244     *  r9 holds object
13245     */
13246.LOP_IGET_OBJECT_JUMBO_finish:
13247    @bl      common_squeak0
13248    cmp     r9, #0                      @ check object for null
13249    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13250    beq     common_errNullObject        @ object was null
13251    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13252    @ no-op                             @ acquiring load
13253    FETCH(r2, 3)                        @ r2<- BBBB
13254    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13255    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13256    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13257    GOTO_OPCODE(ip)                     @ jump to next instruction
13258
13259/* continuation for OP_IGET_BOOLEAN_JUMBO */
13260
13261    /*
13262     * Currently:
13263     *  r0 holds resolved field
13264     *  r9 holds object
13265     */
13266.LOP_IGET_BOOLEAN_JUMBO_resolved:
13267    cmp     r0, #0                      @ resolution unsuccessful?
13268    beq     common_exceptionThrown      @ yes, throw exception
13269    @ fall through to OP_IGET_BOOLEAN_JUMBO_finish
13270
13271    /*
13272     * Currently:
13273     *  r0 holds resolved field
13274     *  r9 holds object
13275     */
13276.LOP_IGET_BOOLEAN_JUMBO_finish:
13277    @bl      common_squeak1
13278    cmp     r9, #0                      @ check object for null
13279    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13280    beq     common_errNullObject        @ object was null
13281    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13282    @ no-op                             @ acquiring load
13283    FETCH(r2, 3)                        @ r2<- BBBB
13284    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13285    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13286    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13287    GOTO_OPCODE(ip)                     @ jump to next instruction
13288
13289/* continuation for OP_IGET_BYTE_JUMBO */
13290
13291    /*
13292     * Currently:
13293     *  r0 holds resolved field
13294     *  r9 holds object
13295     */
13296.LOP_IGET_BYTE_JUMBO_resolved:
13297    cmp     r0, #0                      @ resolution unsuccessful?
13298    beq     common_exceptionThrown      @ yes, throw exception
13299    @ fall through to OP_IGET_BYTE_JUMBO_finish
13300
13301    /*
13302     * Currently:
13303     *  r0 holds resolved field
13304     *  r9 holds object
13305     */
13306.LOP_IGET_BYTE_JUMBO_finish:
13307    @bl      common_squeak2
13308    cmp     r9, #0                      @ check object for null
13309    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13310    beq     common_errNullObject        @ object was null
13311    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13312    @ no-op                             @ acquiring load
13313    FETCH(r2, 3)                        @ r2<- BBBB
13314    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13315    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13316    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13317    GOTO_OPCODE(ip)                     @ jump to next instruction
13318
13319/* continuation for OP_IGET_CHAR_JUMBO */
13320
13321    /*
13322     * Currently:
13323     *  r0 holds resolved field
13324     *  r9 holds object
13325     */
13326.LOP_IGET_CHAR_JUMBO_resolved:
13327    cmp     r0, #0                      @ resolution unsuccessful?
13328    beq     common_exceptionThrown      @ yes, throw exception
13329    @ fall through to OP_IGET_CHAR_JUMBO_finish
13330
13331    /*
13332     * Currently:
13333     *  r0 holds resolved field
13334     *  r9 holds object
13335     */
13336.LOP_IGET_CHAR_JUMBO_finish:
13337    @bl      common_squeak3
13338    cmp     r9, #0                      @ check object for null
13339    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13340    beq     common_errNullObject        @ object was null
13341    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13342    @ no-op                             @ acquiring load
13343    FETCH(r2, 3)                        @ r2<- BBBB
13344    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13345    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13346    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13347    GOTO_OPCODE(ip)                     @ jump to next instruction
13348
13349/* continuation for OP_IGET_SHORT_JUMBO */
13350
13351    /*
13352     * Currently:
13353     *  r0 holds resolved field
13354     *  r9 holds object
13355     */
13356.LOP_IGET_SHORT_JUMBO_resolved:
13357    cmp     r0, #0                      @ resolution unsuccessful?
13358    beq     common_exceptionThrown      @ yes, throw exception
13359    @ fall through to OP_IGET_SHORT_JUMBO_finish
13360
13361    /*
13362     * Currently:
13363     *  r0 holds resolved field
13364     *  r9 holds object
13365     */
13366.LOP_IGET_SHORT_JUMBO_finish:
13367    @bl      common_squeak4
13368    cmp     r9, #0                      @ check object for null
13369    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13370    beq     common_errNullObject        @ object was null
13371    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
13372    @ no-op                             @ acquiring load
13373    FETCH(r2, 3)                        @ r2<- BBBB
13374    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13375    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
13376    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13377    GOTO_OPCODE(ip)                     @ jump to next instruction
13378
13379/* continuation for OP_IPUT_JUMBO */
13380
13381    /*
13382     * Currently:
13383     *  r0 holds resolved field
13384     *  r9 holds object
13385     */
13386.LOP_IPUT_JUMBO_resolved:
13387     cmp     r0, #0                     @ resolution unsuccessful?
13388     beq     common_exceptionThrown     @ yes, throw exception
13389     @ fall through to OP_IPUT_JUMBO_finish
13390
13391    /*
13392     * Currently:
13393     *  r0 holds resolved field
13394     *  r9 holds object
13395     */
13396.LOP_IPUT_JUMBO_finish:
13397    @bl      common_squeak0
13398    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13399    FETCH(r1, 3)                        @ r1<- BBBB
13400    cmp     r9, #0                      @ check object for null
13401    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13402    beq     common_errNullObject        @ object was null
13403    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13404    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13405    @ no-op                          @ releasing store
13406    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13407    @ no-op
13408    GOTO_OPCODE(ip)                     @ jump to next instruction
13409
13410/* continuation for OP_IPUT_WIDE_JUMBO */
13411
13412    /*
13413     * Currently:
13414     *  r0 holds resolved field
13415     *  r9 holds object
13416     */
13417.LOP_IPUT_WIDE_JUMBO_resolved:
13418     cmp     r0, #0                     @ resolution unsuccessful?
13419     beq     common_exceptionThrown     @ yes, throw exception
13420     @ fall through to OP_IPUT_WIDE_JUMBO_finish
13421
13422    /*
13423     * Currently:
13424     *  r0 holds resolved field
13425     *  r9 holds object
13426     */
13427.LOP_IPUT_WIDE_JUMBO_finish:
13428    cmp     r9, #0                      @ check object for null
13429    FETCH(r2, 3)                        @ r1<- BBBB
13430    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13431    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
13432    beq     common_errNullObject        @ object was null
13433    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13434    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
13435    GET_INST_OPCODE(r10)                @ extract opcode from rINST
13436    .if     0
13437    add     r2, r9, r3                  @ r2<- target address
13438    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
13439    .else
13440    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
13441    .endif
13442    GOTO_OPCODE(r10)                    @ jump to next instruction
13443
13444/* continuation for OP_IPUT_OBJECT_JUMBO */
13445
13446    /*
13447     * Currently:
13448     *  r0 holds resolved field
13449     *  r9 holds object
13450     */
13451.LOP_IPUT_OBJECT_JUMBO_resolved:
13452     cmp     r0, #0                     @ resolution unsuccessful?
13453     beq     common_exceptionThrown     @ yes, throw exception
13454     @ fall through to OP_IPUT_OBJECT_JUMBO_finish
13455
13456    /*
13457     * Currently:
13458     *  r0 holds resolved field
13459     *  r9 holds object
13460     */
13461.LOP_IPUT_OBJECT_JUMBO_finish:
13462    @bl      common_squeak0
13463    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13464    FETCH(r1, 3)                        @ r1<- BBBB
13465    cmp     r9, #0                      @ check object for null
13466    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13467    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
13468    beq     common_errNullObject        @ object was null
13469    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13470    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13471    @ no-op                         @ releasing store
13472    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
13473    @ no-op
13474    cmp     r0, #0                      @ stored a null reference?
13475    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
13476    GOTO_OPCODE(ip)                     @ jump to next instruction
13477
13478/* continuation for OP_IPUT_BOOLEAN_JUMBO */
13479
13480    /*
13481     * Currently:
13482     *  r0 holds resolved field
13483     *  r9 holds object
13484     */
13485.LOP_IPUT_BOOLEAN_JUMBO_resolved:
13486     cmp     r0, #0                     @ resolution unsuccessful?
13487     beq     common_exceptionThrown     @ yes, throw exception
13488     @ fall through to OP_IPUT_BOOLEAN_JUMBO_finish
13489
13490    /*
13491     * Currently:
13492     *  r0 holds resolved field
13493     *  r9 holds object
13494     */
13495.LOP_IPUT_BOOLEAN_JUMBO_finish:
13496    @bl      common_squeak1
13497    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13498    FETCH(r1, 3)                        @ r1<- BBBB
13499    cmp     r9, #0                      @ check object for null
13500    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13501    beq     common_errNullObject        @ object was null
13502    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13503    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13504    @ no-op                          @ releasing store
13505    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13506    @ no-op
13507    GOTO_OPCODE(ip)                     @ jump to next instruction
13508
13509/* continuation for OP_IPUT_BYTE_JUMBO */
13510
13511    /*
13512     * Currently:
13513     *  r0 holds resolved field
13514     *  r9 holds object
13515     */
13516.LOP_IPUT_BYTE_JUMBO_resolved:
13517     cmp     r0, #0                     @ resolution unsuccessful?
13518     beq     common_exceptionThrown     @ yes, throw exception
13519     @ fall through to OP_IPUT_BYTE_JUMBO_finish
13520
13521    /*
13522     * Currently:
13523     *  r0 holds resolved field
13524     *  r9 holds object
13525     */
13526.LOP_IPUT_BYTE_JUMBO_finish:
13527    @bl      common_squeak2
13528    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13529    FETCH(r1, 3)                        @ r1<- BBBB
13530    cmp     r9, #0                      @ check object for null
13531    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13532    beq     common_errNullObject        @ object was null
13533    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13534    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13535    @ no-op                          @ releasing store
13536    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13537    @ no-op
13538    GOTO_OPCODE(ip)                     @ jump to next instruction
13539
13540/* continuation for OP_IPUT_CHAR_JUMBO */
13541
13542    /*
13543     * Currently:
13544     *  r0 holds resolved field
13545     *  r9 holds object
13546     */
13547.LOP_IPUT_CHAR_JUMBO_resolved:
13548     cmp     r0, #0                     @ resolution unsuccessful?
13549     beq     common_exceptionThrown     @ yes, throw exception
13550     @ fall through to OP_IPUT_CHAR_JUMBO_finish
13551
13552    /*
13553     * Currently:
13554     *  r0 holds resolved field
13555     *  r9 holds object
13556     */
13557.LOP_IPUT_CHAR_JUMBO_finish:
13558    @bl      common_squeak3
13559    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13560    FETCH(r1, 3)                        @ r1<- BBBB
13561    cmp     r9, #0                      @ check object for null
13562    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13563    beq     common_errNullObject        @ object was null
13564    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13565    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13566    @ no-op                          @ releasing store
13567    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13568    @ no-op
13569    GOTO_OPCODE(ip)                     @ jump to next instruction
13570
13571/* continuation for OP_IPUT_SHORT_JUMBO */
13572
13573    /*
13574     * Currently:
13575     *  r0 holds resolved field
13576     *  r9 holds object
13577     */
13578.LOP_IPUT_SHORT_JUMBO_resolved:
13579     cmp     r0, #0                     @ resolution unsuccessful?
13580     beq     common_exceptionThrown     @ yes, throw exception
13581     @ fall through to OP_IPUT_SHORT_JUMBO_finish
13582
13583    /*
13584     * Currently:
13585     *  r0 holds resolved field
13586     *  r9 holds object
13587     */
13588.LOP_IPUT_SHORT_JUMBO_finish:
13589    @bl      common_squeak4
13590    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
13591    FETCH(r1, 3)                        @ r1<- BBBB
13592    cmp     r9, #0                      @ check object for null
13593    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
13594    beq     common_errNullObject        @ object was null
13595    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
13596    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
13597    @ no-op                          @ releasing store
13598    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
13599    @ no-op
13600    GOTO_OPCODE(ip)                     @ jump to next instruction
13601
13602/* continuation for OP_SGET_JUMBO */
13603
13604    /*
13605     * Continuation if the field has not yet been resolved.
13606     *  r1:  AAAAAAAA field ref
13607     *  r10: dvmDex->pResFields
13608     */
13609.LOP_SGET_JUMBO_resolve:
13610    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13611#if defined(WITH_JIT)
13612    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13613#endif
13614    EXPORT_PC()                         @ resolve() could throw, so export now
13615    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13616    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13617    cmp     r0, #0                      @ success?
13618    beq     common_exceptionThrown      @ no, handle exception
13619#if defined(WITH_JIT)
13620    /*
13621     * If the JIT is actively building a trace we need to make sure
13622     * that the field is fully resolved before including this instruction.
13623     */
13624    bl      common_verifyField
13625#endif
13626    b       .LOP_SGET_JUMBO_finish          @ resume
13627
13628/* continuation for OP_SGET_WIDE_JUMBO */
13629
13630    /*
13631     * Continuation if the field has not yet been resolved.
13632     *  r1: AAAAAAAA field ref
13633     *
13634     * Returns StaticField pointer in r0.
13635     */
13636.LOP_SGET_WIDE_JUMBO_resolve:
13637    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13638    EXPORT_PC()                         @ resolve() could throw, so export now
13639    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13640    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13641    cmp     r0, #0                      @ success?
13642    bne     .LOP_SGET_WIDE_JUMBO_finish          @ yes, finish
13643    b       common_exceptionThrown      @ no, handle exception
13644
13645/* continuation for OP_SGET_OBJECT_JUMBO */
13646
13647    /*
13648     * Continuation if the field has not yet been resolved.
13649     *  r1:  AAAAAAAA field ref
13650     *  r10: dvmDex->pResFields
13651     */
13652.LOP_SGET_OBJECT_JUMBO_resolve:
13653    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13654#if defined(WITH_JIT)
13655    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13656#endif
13657    EXPORT_PC()                         @ resolve() could throw, so export now
13658    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13659    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13660    cmp     r0, #0                      @ success?
13661    beq     common_exceptionThrown      @ no, handle exception
13662#if defined(WITH_JIT)
13663    /*
13664     * If the JIT is actively building a trace we need to make sure
13665     * that the field is fully resolved before including this instruction.
13666     */
13667    bl      common_verifyField
13668#endif
13669    b       .LOP_SGET_OBJECT_JUMBO_finish          @ resume
13670
13671/* continuation for OP_SGET_BOOLEAN_JUMBO */
13672
13673    /*
13674     * Continuation if the field has not yet been resolved.
13675     *  r1:  AAAAAAAA field ref
13676     *  r10: dvmDex->pResFields
13677     */
13678.LOP_SGET_BOOLEAN_JUMBO_resolve:
13679    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13680#if defined(WITH_JIT)
13681    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13682#endif
13683    EXPORT_PC()                         @ resolve() could throw, so export now
13684    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13685    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13686    cmp     r0, #0                      @ success?
13687    beq     common_exceptionThrown      @ no, handle exception
13688#if defined(WITH_JIT)
13689    /*
13690     * If the JIT is actively building a trace we need to make sure
13691     * that the field is fully resolved before including this instruction.
13692     */
13693    bl      common_verifyField
13694#endif
13695    b       .LOP_SGET_BOOLEAN_JUMBO_finish          @ resume
13696
13697/* continuation for OP_SGET_BYTE_JUMBO */
13698
13699    /*
13700     * Continuation if the field has not yet been resolved.
13701     *  r1:  AAAAAAAA field ref
13702     *  r10: dvmDex->pResFields
13703     */
13704.LOP_SGET_BYTE_JUMBO_resolve:
13705    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13706#if defined(WITH_JIT)
13707    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13708#endif
13709    EXPORT_PC()                         @ resolve() could throw, so export now
13710    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13711    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13712    cmp     r0, #0                      @ success?
13713    beq     common_exceptionThrown      @ no, handle exception
13714#if defined(WITH_JIT)
13715    /*
13716     * If the JIT is actively building a trace we need to make sure
13717     * that the field is fully resolved before including this instruction.
13718     */
13719    bl      common_verifyField
13720#endif
13721    b       .LOP_SGET_BYTE_JUMBO_finish          @ resume
13722
13723/* continuation for OP_SGET_CHAR_JUMBO */
13724
13725    /*
13726     * Continuation if the field has not yet been resolved.
13727     *  r1:  AAAAAAAA field ref
13728     *  r10: dvmDex->pResFields
13729     */
13730.LOP_SGET_CHAR_JUMBO_resolve:
13731    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13732#if defined(WITH_JIT)
13733    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13734#endif
13735    EXPORT_PC()                         @ resolve() could throw, so export now
13736    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13737    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13738    cmp     r0, #0                      @ success?
13739    beq     common_exceptionThrown      @ no, handle exception
13740#if defined(WITH_JIT)
13741    /*
13742     * If the JIT is actively building a trace we need to make sure
13743     * that the field is fully resolved before including this instruction.
13744     */
13745    bl      common_verifyField
13746#endif
13747    b       .LOP_SGET_CHAR_JUMBO_finish          @ resume
13748
13749/* continuation for OP_SGET_SHORT_JUMBO */
13750
13751    /*
13752     * Continuation if the field has not yet been resolved.
13753     *  r1:  AAAAAAAA field ref
13754     *  r10: dvmDex->pResFields
13755     */
13756.LOP_SGET_SHORT_JUMBO_resolve:
13757    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13758#if defined(WITH_JIT)
13759    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13760#endif
13761    EXPORT_PC()                         @ resolve() could throw, so export now
13762    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13763    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13764    cmp     r0, #0                      @ success?
13765    beq     common_exceptionThrown      @ no, handle exception
13766#if defined(WITH_JIT)
13767    /*
13768     * If the JIT is actively building a trace we need to make sure
13769     * that the field is fully resolved before including this instruction.
13770     */
13771    bl      common_verifyField
13772#endif
13773    b       .LOP_SGET_SHORT_JUMBO_finish          @ resume
13774
13775/* continuation for OP_SPUT_JUMBO */
13776
13777    /*
13778     * Continuation if the field has not yet been resolved.
13779     *  r1:  AAAAAAAA field ref
13780     *  r10: dvmDex->pResFields
13781     */
13782.LOP_SPUT_JUMBO_resolve:
13783    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13784#if defined(WITH_JIT)
13785    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13786#endif
13787    EXPORT_PC()                         @ resolve() could throw, so export now
13788    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13789    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13790    cmp     r0, #0                      @ success?
13791    beq     common_exceptionThrown      @ no, handle exception
13792#if defined(WITH_JIT)
13793    /*
13794     * If the JIT is actively building a trace we need to make sure
13795     * that the field is fully resolved before including this instruction.
13796     */
13797    bl      common_verifyField
13798#endif
13799    b       .LOP_SPUT_JUMBO_finish          @ resume
13800
13801/* continuation for OP_SPUT_WIDE_JUMBO */
13802
13803    /*
13804     * Continuation if the field has not yet been resolved.
13805     *  r1:  AAAAAAAA field ref
13806     *  r9:  &fp[BBBB]
13807     *  r10: dvmDex->pResFields
13808     *
13809     * Returns StaticField pointer in r2.
13810     */
13811.LOP_SPUT_WIDE_JUMBO_resolve:
13812    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13813#if defined(WITH_JIT)
13814    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13815#endif
13816    EXPORT_PC()                         @ resolve() could throw, so export now
13817    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13818    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13819    cmp     r0, #0                      @ success?
13820    mov     r2, r0                      @ copy to r2
13821    beq     common_exceptionThrown      @ no, handle exception
13822#if defined(WITH_JIT)
13823    /*
13824     * If the JIT is actively building a trace we need to make sure
13825     * that the field is fully resolved before including this instruction.
13826     */
13827    bl      common_verifyField
13828#endif
13829    b       .LOP_SPUT_WIDE_JUMBO_finish          @ resume
13830
13831/* continuation for OP_SPUT_OBJECT_JUMBO */
13832
13833
13834.LOP_SPUT_OBJECT_JUMBO_end:
13835    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
13836    @ no-op
13837    cmp     r1, #0                      @ stored a null object?
13838    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
13839    GOTO_OPCODE(ip)                     @ jump to next instruction
13840
13841    /* Continuation if the field has not yet been resolved.
13842     * r1:  AAAAaaaa field ref
13843     * r10: dvmDex->pResFields
13844     */
13845.LOP_SPUT_OBJECT_JUMBO_resolve:
13846    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
13847#if defined(WITH_JIT)
13848    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13849#endif
13850    EXPORT_PC()                         @ resolve() could throw, so export now
13851    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13852    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13853    cmp     r0, #0                      @ success?
13854    beq     common_exceptionThrown      @ no, handle exception
13855#if defined(WITH_JIT)
13856    /*
13857     * If the JIT is actively building a trace we need to make sure
13858     * that the field is fully resolved before including this instruction.
13859     */
13860    bl      common_verifyField
13861#endif
13862    b       .LOP_SPUT_OBJECT_JUMBO_finish          @ resume
13863
13864
13865/* continuation for OP_SPUT_BOOLEAN_JUMBO */
13866
13867    /*
13868     * Continuation if the field has not yet been resolved.
13869     *  r1:  AAAAAAAA field ref
13870     *  r10: dvmDex->pResFields
13871     */
13872.LOP_SPUT_BOOLEAN_JUMBO_resolve:
13873    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13874#if defined(WITH_JIT)
13875    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13876#endif
13877    EXPORT_PC()                         @ resolve() could throw, so export now
13878    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13879    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13880    cmp     r0, #0                      @ success?
13881    beq     common_exceptionThrown      @ no, handle exception
13882#if defined(WITH_JIT)
13883    /*
13884     * If the JIT is actively building a trace we need to make sure
13885     * that the field is fully resolved before including this instruction.
13886     */
13887    bl      common_verifyField
13888#endif
13889    b       .LOP_SPUT_BOOLEAN_JUMBO_finish          @ resume
13890
13891/* continuation for OP_SPUT_BYTE_JUMBO */
13892
13893    /*
13894     * Continuation if the field has not yet been resolved.
13895     *  r1:  AAAAAAAA field ref
13896     *  r10: dvmDex->pResFields
13897     */
13898.LOP_SPUT_BYTE_JUMBO_resolve:
13899    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13900#if defined(WITH_JIT)
13901    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13902#endif
13903    EXPORT_PC()                         @ resolve() could throw, so export now
13904    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13905    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13906    cmp     r0, #0                      @ success?
13907    beq     common_exceptionThrown      @ no, handle exception
13908#if defined(WITH_JIT)
13909    /*
13910     * If the JIT is actively building a trace we need to make sure
13911     * that the field is fully resolved before including this instruction.
13912     */
13913    bl      common_verifyField
13914#endif
13915    b       .LOP_SPUT_BYTE_JUMBO_finish          @ resume
13916
13917/* continuation for OP_SPUT_CHAR_JUMBO */
13918
13919    /*
13920     * Continuation if the field has not yet been resolved.
13921     *  r1:  AAAAAAAA field ref
13922     *  r10: dvmDex->pResFields
13923     */
13924.LOP_SPUT_CHAR_JUMBO_resolve:
13925    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13926#if defined(WITH_JIT)
13927    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13928#endif
13929    EXPORT_PC()                         @ resolve() could throw, so export now
13930    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13931    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13932    cmp     r0, #0                      @ success?
13933    beq     common_exceptionThrown      @ no, handle exception
13934#if defined(WITH_JIT)
13935    /*
13936     * If the JIT is actively building a trace we need to make sure
13937     * that the field is fully resolved before including this instruction.
13938     */
13939    bl      common_verifyField
13940#endif
13941    b       .LOP_SPUT_CHAR_JUMBO_finish          @ resume
13942
13943/* continuation for OP_SPUT_SHORT_JUMBO */
13944
13945    /*
13946     * Continuation if the field has not yet been resolved.
13947     *  r1:  AAAAAAAA field ref
13948     *  r10: dvmDex->pResFields
13949     */
13950.LOP_SPUT_SHORT_JUMBO_resolve:
13951    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
13952#if defined(WITH_JIT)
13953    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
13954#endif
13955    EXPORT_PC()                         @ resolve() could throw, so export now
13956    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
13957    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
13958    cmp     r0, #0                      @ success?
13959    beq     common_exceptionThrown      @ no, handle exception
13960#if defined(WITH_JIT)
13961    /*
13962     * If the JIT is actively building a trace we need to make sure
13963     * that the field is fully resolved before including this instruction.
13964     */
13965    bl      common_verifyField
13966#endif
13967    b       .LOP_SPUT_SHORT_JUMBO_finish          @ resume
13968
13969/* continuation for OP_INVOKE_VIRTUAL_JUMBO */
13970
13971    /*
13972     * At this point:
13973     *  r0 = resolved base method
13974     */
13975.LOP_INVOKE_VIRTUAL_JUMBO_continue:
13976    FETCH(r10, 4)                       @ r10<- CCCC
13977    GET_VREG(r9, r10)                   @ r9<- "this" ptr
13978    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
13979    cmp     r9, #0                      @ is "this" null?
13980    beq     common_errNullObject        @ null "this", throw exception
13981    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
13982    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
13983    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
13984    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
13985
13986/* continuation for OP_INVOKE_SUPER_JUMBO */
13987
13988    /*
13989     * At this point:
13990     *  r0 = resolved base method
13991     *  r10 = method->clazz
13992     */
13993.LOP_INVOKE_SUPER_JUMBO_continue:
13994    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
13995    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
13996    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
13997    EXPORT_PC()                         @ must export for invoke
13998    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
13999    bcs     .LOP_INVOKE_SUPER_JUMBO_nsm             @ method not present in superclass
14000    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
14001    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
14002    bl      common_invokeMethodJumbo    @ (r0=method, r9="this")
14003
14004.LOP_INVOKE_SUPER_JUMBO_resolve:
14005    mov     r0, r10                     @ r0<- method->clazz
14006    mov     r2, #METHOD_VIRTUAL         @ resolver method type
14007    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14008    cmp     r0, #0                      @ got null?
14009    bne     .LOP_INVOKE_SUPER_JUMBO_continue        @ no, continue
14010    b       common_exceptionThrown      @ yes, handle exception
14011
14012    /*
14013     * Throw a NoSuchMethodError with the method name as the message.
14014     *  r0 = resolved base method
14015     */
14016.LOP_INVOKE_SUPER_JUMBO_nsm:
14017    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
14018    b       common_errNoSuchMethod
14019
14020/* continuation for OP_INVOKE_DIRECT_JUMBO */
14021
14022    /*
14023     * On entry:
14024     *  r1 = reference (CCCC)
14025     *  r10 = "this" register
14026     */
14027.LOP_INVOKE_DIRECT_JUMBO_resolve:
14028    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
14029    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
14030    mov     r2, #METHOD_DIRECT          @ resolver method type
14031    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14032    cmp     r0, #0                      @ got null?
14033    bne     .LOP_INVOKE_DIRECT_JUMBO_finish          @ no, continue
14034    b       common_exceptionThrown      @ yes, handle exception
14035
14036/* continuation for OP_INVOKE_STATIC_JUMBO */
14037
14038
14039.LOP_INVOKE_STATIC_JUMBO_resolve:
14040    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
14041    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
14042    mov     r2, #METHOD_STATIC          @ resolver method type
14043    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
14044    cmp     r0, #0                      @ got null?
14045#if defined(WITH_JIT)
14046    /*
14047     * Check to see if we're actively building a trace.  If so,
14048     * we need to keep this instruction out of it.
14049     * r10: &resolved_methodToCall
14050     */
14051    ldrh    r2, [rSELF, #offThread_subMode]
14052    beq     common_exceptionThrown            @ null, handle exception
14053    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
14054    beq     common_invokeMethodJumboNoThis    @ no (r0=method, r9="this")
14055    ldr     r1, [r10]                         @ reload resolved method
14056    cmp     r1, #0                            @ finished resolving?
14057    bne     common_invokeMethodJumboNoThis    @ yes (r0=method, r9="this")
14058    mov     r10, r0                           @ preserve method
14059    mov     r0, rSELF
14060    mov     r1, rPC
14061    bl      dvmJitEndTraceSelect              @ (self, pc)
14062    mov     r0, r10
14063    b       common_invokeMethodJumboNoThis    @ whew, finally!
14064#else
14065    bne     common_invokeMethodJumboNoThis    @ (r0=method, r9="this")
14066    b       common_exceptionThrown            @ yes, handle exception
14067#endif
14068
14069/* continuation for OP_INVOKE_OBJECT_INIT_JUMBO */
14070
14071.LOP_INVOKE_OBJECT_INIT_JUMBO_setFinal:
14072    EXPORT_PC()                         @ can throw
14073    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
14074    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
14075    cmp     r0, #0                      @ exception pending?
14076    bne     common_exceptionThrown      @ yes, handle it
14077    b       .LOP_INVOKE_OBJECT_INIT_JUMBO_finish
14078
14079    /*
14080     * A debugger is attached, so we need to go ahead and do
14081     * this.  For simplicity, we'll just jump directly to the
14082     * corresponding handler.  Note that we can't use
14083     * rIBASE here because it may be in single-step mode.
14084     * Load the primary table base directly.
14085     */
14086.LOP_INVOKE_OBJECT_INIT_JUMBO_debugger:
14087    ldr     r1, [rSELF, #offThread_mainHandlerTable]
14088    .if 1
14089    mov     ip, #OP_INVOKE_DIRECT_JUMBO
14090    .else
14091    mov     ip, #OP_INVOKE_DIRECT_RANGE
14092    .endif
14093    GOTO_OPCODE_BASE(r1,ip)             @ execute it
14094
14095/* continuation for OP_IGET_VOLATILE_JUMBO */
14096
14097    /*
14098     * Currently:
14099     *  r0 holds resolved field
14100     *  r9 holds object
14101     */
14102.LOP_IGET_VOLATILE_JUMBO_resolved:
14103    cmp     r0, #0                      @ resolution unsuccessful?
14104    beq     common_exceptionThrown      @ yes, throw exception
14105    @ fall through to OP_IGET_VOLATILE_JUMBO_finish
14106
14107    /*
14108     * Currently:
14109     *  r0 holds resolved field
14110     *  r9 holds object
14111     */
14112.LOP_IGET_VOLATILE_JUMBO_finish:
14113    @bl      common_squeak0
14114    cmp     r9, #0                      @ check object for null
14115    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14116    beq     common_errNullObject        @ object was null
14117    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14118    SMP_DMB                            @ acquiring load
14119    FETCH(r2, 3)                        @ r2<- BBBB
14120    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14121    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14122    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14123    GOTO_OPCODE(ip)                     @ jump to next instruction
14124
14125/* continuation for OP_IGET_WIDE_VOLATILE_JUMBO */
14126
14127    /*
14128     * Currently:
14129     *  r0 holds resolved field
14130     *  r9 holds object
14131     */
14132.LOP_IGET_WIDE_VOLATILE_JUMBO_resolved:
14133    cmp     r0, #0                      @ resolution unsuccessful?
14134    beq     common_exceptionThrown      @ yes, throw exception
14135    @ fall through to OP_IGET_WIDE_VOLATILE_JUMBO_finish
14136
14137    /*
14138     * Currently:
14139     *  r0 holds resolved field
14140     *  r9 holds object
14141     */
14142.LOP_IGET_WIDE_VOLATILE_JUMBO_finish:
14143    cmp     r9, #0                      @ check object for null
14144    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14145    beq     common_errNullObject        @ object was null
14146    .if     1
14147    add     r0, r9, r3                  @ r0<- address of field
14148    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
14149    .else
14150    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
14151    .endif
14152    FETCH(r2, 3)                        @ r2<- BBBB
14153    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14154    add     r3, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14155    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14156    stmia   r3, {r0-r1}                 @ fp[BBBB]<- r0/r1
14157    GOTO_OPCODE(ip)                     @ jump to next instruction
14158
14159/* continuation for OP_IGET_OBJECT_VOLATILE_JUMBO */
14160
14161    /*
14162     * Currently:
14163     *  r0 holds resolved field
14164     *  r9 holds object
14165     */
14166.LOP_IGET_OBJECT_VOLATILE_JUMBO_resolved:
14167    cmp     r0, #0                      @ resolution unsuccessful?
14168    beq     common_exceptionThrown      @ yes, throw exception
14169    @ fall through to OP_IGET_OBJECT_VOLATILE_JUMBO_finish
14170
14171    /*
14172     * Currently:
14173     *  r0 holds resolved field
14174     *  r9 holds object
14175     */
14176.LOP_IGET_OBJECT_VOLATILE_JUMBO_finish:
14177    @bl      common_squeak0
14178    cmp     r9, #0                      @ check object for null
14179    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14180    beq     common_errNullObject        @ object was null
14181    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
14182    SMP_DMB                            @ acquiring load
14183    FETCH(r2, 3)                        @ r2<- BBBB
14184    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14185    SET_VREG(r0, r2)                    @ fp[BBBB]<- r0
14186    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14187    GOTO_OPCODE(ip)                     @ jump to next instruction
14188
14189/* continuation for OP_IPUT_VOLATILE_JUMBO */
14190
14191    /*
14192     * Currently:
14193     *  r0 holds resolved field
14194     *  r9 holds object
14195     */
14196.LOP_IPUT_VOLATILE_JUMBO_resolved:
14197     cmp     r0, #0                     @ resolution unsuccessful?
14198     beq     common_exceptionThrown     @ yes, throw exception
14199     @ fall through to OP_IPUT_VOLATILE_JUMBO_finish
14200
14201    /*
14202     * Currently:
14203     *  r0 holds resolved field
14204     *  r9 holds object
14205     */
14206.LOP_IPUT_VOLATILE_JUMBO_finish:
14207    @bl      common_squeak0
14208    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14209    FETCH(r1, 3)                        @ r1<- BBBB
14210    cmp     r9, #0                      @ check object for null
14211    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14212    beq     common_errNullObject        @ object was null
14213    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14214    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14215    SMP_DMB_ST                         @ releasing store
14216    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
14217    SMP_DMB
14218    GOTO_OPCODE(ip)                     @ jump to next instruction
14219
14220/* continuation for OP_IPUT_WIDE_VOLATILE_JUMBO */
14221
14222    /*
14223     * Currently:
14224     *  r0 holds resolved field
14225     *  r9 holds object
14226     */
14227.LOP_IPUT_WIDE_VOLATILE_JUMBO_resolved:
14228     cmp     r0, #0                     @ resolution unsuccessful?
14229     beq     common_exceptionThrown     @ yes, throw exception
14230     @ fall through to OP_IPUT_WIDE_VOLATILE_JUMBO_finish
14231
14232    /*
14233     * Currently:
14234     *  r0 holds resolved field
14235     *  r9 holds object
14236     */
14237.LOP_IPUT_WIDE_VOLATILE_JUMBO_finish:
14238    cmp     r9, #0                      @ check object for null
14239    FETCH(r2, 3)                        @ r1<- BBBB
14240    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14241    add     r2, rFP, r2, lsl #2         @ r3<- &fp[BBBB]
14242    beq     common_errNullObject        @ object was null
14243    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14244    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[BBBB]
14245    GET_INST_OPCODE(r10)                @ extract opcode from rINST
14246    .if     1
14247    add     r2, r9, r3                  @ r2<- target address
14248    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
14249    .else
14250    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
14251    .endif
14252    GOTO_OPCODE(r10)                    @ jump to next instruction
14253
14254/* continuation for OP_IPUT_OBJECT_VOLATILE_JUMBO */
14255
14256    /*
14257     * Currently:
14258     *  r0 holds resolved field
14259     *  r9 holds object
14260     */
14261.LOP_IPUT_OBJECT_VOLATILE_JUMBO_resolved:
14262     cmp     r0, #0                     @ resolution unsuccessful?
14263     beq     common_exceptionThrown     @ yes, throw exception
14264     @ fall through to OP_IPUT_OBJECT_VOLATILE_JUMBO_finish
14265
14266    /*
14267     * Currently:
14268     *  r0 holds resolved field
14269     *  r9 holds object
14270     */
14271.LOP_IPUT_OBJECT_VOLATILE_JUMBO_finish:
14272    @bl      common_squeak0
14273    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
14274    FETCH(r1, 3)                        @ r1<- BBBB
14275    cmp     r9, #0                      @ check object for null
14276    GET_VREG(r0, r1)                    @ r0<- fp[BBBB]
14277    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
14278    beq     common_errNullObject        @ object was null
14279    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
14280    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
14281    SMP_DMB_ST                        @ releasing store
14282    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
14283    SMP_DMB
14284    cmp     r0, #0                      @ stored a null reference?
14285    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
14286    GOTO_OPCODE(ip)                     @ jump to next instruction
14287
14288/* continuation for OP_SGET_VOLATILE_JUMBO */
14289
14290    /*
14291     * Continuation if the field has not yet been resolved.
14292     *  r1:  AAAAAAAA field ref
14293     *  r10: dvmDex->pResFields
14294     */
14295.LOP_SGET_VOLATILE_JUMBO_resolve:
14296    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14297#if defined(WITH_JIT)
14298    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14299#endif
14300    EXPORT_PC()                         @ resolve() could throw, so export now
14301    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14302    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14303    cmp     r0, #0                      @ success?
14304    beq     common_exceptionThrown      @ no, handle exception
14305#if defined(WITH_JIT)
14306    /*
14307     * If the JIT is actively building a trace we need to make sure
14308     * that the field is fully resolved before including this instruction.
14309     */
14310    bl      common_verifyField
14311#endif
14312    b       .LOP_SGET_VOLATILE_JUMBO_finish          @ resume
14313
14314/* continuation for OP_SGET_WIDE_VOLATILE_JUMBO */
14315
14316    /*
14317     * Continuation if the field has not yet been resolved.
14318     *  r1: AAAAAAAA field ref
14319     *
14320     * Returns StaticField pointer in r0.
14321     */
14322.LOP_SGET_WIDE_VOLATILE_JUMBO_resolve:
14323    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14324    EXPORT_PC()                         @ resolve() could throw, so export now
14325    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14326    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14327    cmp     r0, #0                      @ success?
14328    bne     .LOP_SGET_WIDE_VOLATILE_JUMBO_finish          @ yes, finish
14329    b       common_exceptionThrown      @ no, handle exception
14330
14331/* continuation for OP_SGET_OBJECT_VOLATILE_JUMBO */
14332
14333    /*
14334     * Continuation if the field has not yet been resolved.
14335     *  r1:  AAAAAAAA field ref
14336     *  r10: dvmDex->pResFields
14337     */
14338.LOP_SGET_OBJECT_VOLATILE_JUMBO_resolve:
14339    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14340#if defined(WITH_JIT)
14341    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14342#endif
14343    EXPORT_PC()                         @ resolve() could throw, so export now
14344    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14345    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14346    cmp     r0, #0                      @ success?
14347    beq     common_exceptionThrown      @ no, handle exception
14348#if defined(WITH_JIT)
14349    /*
14350     * If the JIT is actively building a trace we need to make sure
14351     * that the field is fully resolved before including this instruction.
14352     */
14353    bl      common_verifyField
14354#endif
14355    b       .LOP_SGET_OBJECT_VOLATILE_JUMBO_finish          @ resume
14356
14357/* continuation for OP_SPUT_VOLATILE_JUMBO */
14358
14359    /*
14360     * Continuation if the field has not yet been resolved.
14361     *  r1:  AAAAAAAA field ref
14362     *  r10: dvmDex->pResFields
14363     */
14364.LOP_SPUT_VOLATILE_JUMBO_resolve:
14365    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14366#if defined(WITH_JIT)
14367    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14368#endif
14369    EXPORT_PC()                         @ resolve() could throw, so export now
14370    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14371    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14372    cmp     r0, #0                      @ success?
14373    beq     common_exceptionThrown      @ no, handle exception
14374#if defined(WITH_JIT)
14375    /*
14376     * If the JIT is actively building a trace we need to make sure
14377     * that the field is fully resolved before including this instruction.
14378     */
14379    bl      common_verifyField
14380#endif
14381    b       .LOP_SPUT_VOLATILE_JUMBO_finish          @ resume
14382
14383/* continuation for OP_SPUT_WIDE_VOLATILE_JUMBO */
14384
14385    /*
14386     * Continuation if the field has not yet been resolved.
14387     *  r1:  AAAAAAAA field ref
14388     *  r9:  &fp[BBBB]
14389     *  r10: dvmDex->pResFields
14390     *
14391     * Returns StaticField pointer in r2.
14392     */
14393.LOP_SPUT_WIDE_VOLATILE_JUMBO_resolve:
14394    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
14395#if defined(WITH_JIT)
14396    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14397#endif
14398    EXPORT_PC()                         @ resolve() could throw, so export now
14399    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14400    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14401    cmp     r0, #0                      @ success?
14402    mov     r2, r0                      @ copy to r2
14403    beq     common_exceptionThrown      @ no, handle exception
14404#if defined(WITH_JIT)
14405    /*
14406     * If the JIT is actively building a trace we need to make sure
14407     * that the field is fully resolved before including this instruction.
14408     */
14409    bl      common_verifyField
14410#endif
14411    b       .LOP_SPUT_WIDE_VOLATILE_JUMBO_finish          @ resume
14412
14413/* continuation for OP_SPUT_OBJECT_VOLATILE_JUMBO */
14414
14415
14416.LOP_SPUT_OBJECT_VOLATILE_JUMBO_end:
14417    str     r1, [r0, #offStaticField_value]  @ field<- vBBBB
14418    SMP_DMB
14419    cmp     r1, #0                      @ stored a null object?
14420    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
14421    GOTO_OPCODE(ip)                     @ jump to next instruction
14422
14423    /* Continuation if the field has not yet been resolved.
14424     * r1:  AAAAaaaa field ref
14425     * r10: dvmDex->pResFields
14426     */
14427.LOP_SPUT_OBJECT_VOLATILE_JUMBO_resolve:
14428    ldr     r2, [rSELF, #offThread_method]    @ r9<- current method
14429#if defined(WITH_JIT)
14430    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
14431#endif
14432    EXPORT_PC()                         @ resolve() could throw, so export now
14433    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
14434    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
14435    cmp     r0, #0                      @ success?
14436    beq     common_exceptionThrown      @ no, handle exception
14437#if defined(WITH_JIT)
14438    /*
14439     * If the JIT is actively building a trace we need to make sure
14440     * that the field is fully resolved before including this instruction.
14441     */
14442    bl      common_verifyField
14443#endif
14444    b       .LOP_SPUT_OBJECT_VOLATILE_JUMBO_finish          @ resume
14445
14446
14447    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
14448    .global dvmAsmSisterEnd
14449dvmAsmSisterEnd:
14450
14451
14452    .global dvmAsmAltInstructionStart
14453    .type   dvmAsmAltInstructionStart, %function
14454    .text
14455
14456dvmAsmAltInstructionStart = .L_ALT_OP_NOP
14457/* ------------------------------ */
14458    .balign 64
14459.L_ALT_OP_NOP: /* 0x00 */
14460/* File: armv5te/alt_stub.S */
14461/*
14462 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14463 * any interesting requests and then jump to the real instruction
14464 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14465 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14466 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14467 * bail to the real handler if breakFlags==0.
14468 */
14469    ldrb   r3, [rSELF, #offThread_breakFlags]
14470    adrl   lr, dvmAsmInstructionStart + (0 * 64)
14471    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14472    cmp    r3, #0
14473    bxeq   lr                   @ nothing to do - jump to real handler
14474    EXPORT_PC()
14475    mov    r0, rPC              @ arg0
14476    mov    r1, rFP              @ arg1
14477    mov    r2, rSELF            @ arg2
14478    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14479
14480/* ------------------------------ */
14481    .balign 64
14482.L_ALT_OP_MOVE: /* 0x01 */
14483/* File: armv5te/alt_stub.S */
14484/*
14485 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14486 * any interesting requests and then jump to the real instruction
14487 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14488 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14489 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14490 * bail to the real handler if breakFlags==0.
14491 */
14492    ldrb   r3, [rSELF, #offThread_breakFlags]
14493    adrl   lr, dvmAsmInstructionStart + (1 * 64)
14494    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14495    cmp    r3, #0
14496    bxeq   lr                   @ nothing to do - jump to real handler
14497    EXPORT_PC()
14498    mov    r0, rPC              @ arg0
14499    mov    r1, rFP              @ arg1
14500    mov    r2, rSELF            @ arg2
14501    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14502
14503/* ------------------------------ */
14504    .balign 64
14505.L_ALT_OP_MOVE_FROM16: /* 0x02 */
14506/* File: armv5te/alt_stub.S */
14507/*
14508 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14509 * any interesting requests and then jump to the real instruction
14510 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14511 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14512 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14513 * bail to the real handler if breakFlags==0.
14514 */
14515    ldrb   r3, [rSELF, #offThread_breakFlags]
14516    adrl   lr, dvmAsmInstructionStart + (2 * 64)
14517    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14518    cmp    r3, #0
14519    bxeq   lr                   @ nothing to do - jump to real handler
14520    EXPORT_PC()
14521    mov    r0, rPC              @ arg0
14522    mov    r1, rFP              @ arg1
14523    mov    r2, rSELF            @ arg2
14524    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14525
14526/* ------------------------------ */
14527    .balign 64
14528.L_ALT_OP_MOVE_16: /* 0x03 */
14529/* File: armv5te/alt_stub.S */
14530/*
14531 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14532 * any interesting requests and then jump to the real instruction
14533 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14534 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14535 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14536 * bail to the real handler if breakFlags==0.
14537 */
14538    ldrb   r3, [rSELF, #offThread_breakFlags]
14539    adrl   lr, dvmAsmInstructionStart + (3 * 64)
14540    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14541    cmp    r3, #0
14542    bxeq   lr                   @ nothing to do - jump to real handler
14543    EXPORT_PC()
14544    mov    r0, rPC              @ arg0
14545    mov    r1, rFP              @ arg1
14546    mov    r2, rSELF            @ arg2
14547    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14548
14549/* ------------------------------ */
14550    .balign 64
14551.L_ALT_OP_MOVE_WIDE: /* 0x04 */
14552/* File: armv5te/alt_stub.S */
14553/*
14554 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14555 * any interesting requests and then jump to the real instruction
14556 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14557 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14558 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14559 * bail to the real handler if breakFlags==0.
14560 */
14561    ldrb   r3, [rSELF, #offThread_breakFlags]
14562    adrl   lr, dvmAsmInstructionStart + (4 * 64)
14563    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14564    cmp    r3, #0
14565    bxeq   lr                   @ nothing to do - jump to real handler
14566    EXPORT_PC()
14567    mov    r0, rPC              @ arg0
14568    mov    r1, rFP              @ arg1
14569    mov    r2, rSELF            @ arg2
14570    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14571
14572/* ------------------------------ */
14573    .balign 64
14574.L_ALT_OP_MOVE_WIDE_FROM16: /* 0x05 */
14575/* File: armv5te/alt_stub.S */
14576/*
14577 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14578 * any interesting requests and then jump to the real instruction
14579 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14580 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14581 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14582 * bail to the real handler if breakFlags==0.
14583 */
14584    ldrb   r3, [rSELF, #offThread_breakFlags]
14585    adrl   lr, dvmAsmInstructionStart + (5 * 64)
14586    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14587    cmp    r3, #0
14588    bxeq   lr                   @ nothing to do - jump to real handler
14589    EXPORT_PC()
14590    mov    r0, rPC              @ arg0
14591    mov    r1, rFP              @ arg1
14592    mov    r2, rSELF            @ arg2
14593    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14594
14595/* ------------------------------ */
14596    .balign 64
14597.L_ALT_OP_MOVE_WIDE_16: /* 0x06 */
14598/* File: armv5te/alt_stub.S */
14599/*
14600 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14601 * any interesting requests and then jump to the real instruction
14602 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14603 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14604 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14605 * bail to the real handler if breakFlags==0.
14606 */
14607    ldrb   r3, [rSELF, #offThread_breakFlags]
14608    adrl   lr, dvmAsmInstructionStart + (6 * 64)
14609    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14610    cmp    r3, #0
14611    bxeq   lr                   @ nothing to do - jump to real handler
14612    EXPORT_PC()
14613    mov    r0, rPC              @ arg0
14614    mov    r1, rFP              @ arg1
14615    mov    r2, rSELF            @ arg2
14616    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14617
14618/* ------------------------------ */
14619    .balign 64
14620.L_ALT_OP_MOVE_OBJECT: /* 0x07 */
14621/* File: armv5te/alt_stub.S */
14622/*
14623 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14624 * any interesting requests and then jump to the real instruction
14625 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14626 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14627 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14628 * bail to the real handler if breakFlags==0.
14629 */
14630    ldrb   r3, [rSELF, #offThread_breakFlags]
14631    adrl   lr, dvmAsmInstructionStart + (7 * 64)
14632    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14633    cmp    r3, #0
14634    bxeq   lr                   @ nothing to do - jump to real handler
14635    EXPORT_PC()
14636    mov    r0, rPC              @ arg0
14637    mov    r1, rFP              @ arg1
14638    mov    r2, rSELF            @ arg2
14639    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14640
14641/* ------------------------------ */
14642    .balign 64
14643.L_ALT_OP_MOVE_OBJECT_FROM16: /* 0x08 */
14644/* File: armv5te/alt_stub.S */
14645/*
14646 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14647 * any interesting requests and then jump to the real instruction
14648 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14649 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14650 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14651 * bail to the real handler if breakFlags==0.
14652 */
14653    ldrb   r3, [rSELF, #offThread_breakFlags]
14654    adrl   lr, dvmAsmInstructionStart + (8 * 64)
14655    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14656    cmp    r3, #0
14657    bxeq   lr                   @ nothing to do - jump to real handler
14658    EXPORT_PC()
14659    mov    r0, rPC              @ arg0
14660    mov    r1, rFP              @ arg1
14661    mov    r2, rSELF            @ arg2
14662    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14663
14664/* ------------------------------ */
14665    .balign 64
14666.L_ALT_OP_MOVE_OBJECT_16: /* 0x09 */
14667/* File: armv5te/alt_stub.S */
14668/*
14669 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14670 * any interesting requests and then jump to the real instruction
14671 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14672 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14673 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14674 * bail to the real handler if breakFlags==0.
14675 */
14676    ldrb   r3, [rSELF, #offThread_breakFlags]
14677    adrl   lr, dvmAsmInstructionStart + (9 * 64)
14678    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14679    cmp    r3, #0
14680    bxeq   lr                   @ nothing to do - jump to real handler
14681    EXPORT_PC()
14682    mov    r0, rPC              @ arg0
14683    mov    r1, rFP              @ arg1
14684    mov    r2, rSELF            @ arg2
14685    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14686
14687/* ------------------------------ */
14688    .balign 64
14689.L_ALT_OP_MOVE_RESULT: /* 0x0a */
14690/* File: armv5te/alt_stub.S */
14691/*
14692 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14693 * any interesting requests and then jump to the real instruction
14694 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14695 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14696 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14697 * bail to the real handler if breakFlags==0.
14698 */
14699    ldrb   r3, [rSELF, #offThread_breakFlags]
14700    adrl   lr, dvmAsmInstructionStart + (10 * 64)
14701    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14702    cmp    r3, #0
14703    bxeq   lr                   @ nothing to do - jump to real handler
14704    EXPORT_PC()
14705    mov    r0, rPC              @ arg0
14706    mov    r1, rFP              @ arg1
14707    mov    r2, rSELF            @ arg2
14708    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14709
14710/* ------------------------------ */
14711    .balign 64
14712.L_ALT_OP_MOVE_RESULT_WIDE: /* 0x0b */
14713/* File: armv5te/alt_stub.S */
14714/*
14715 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14716 * any interesting requests and then jump to the real instruction
14717 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14718 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14719 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14720 * bail to the real handler if breakFlags==0.
14721 */
14722    ldrb   r3, [rSELF, #offThread_breakFlags]
14723    adrl   lr, dvmAsmInstructionStart + (11 * 64)
14724    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14725    cmp    r3, #0
14726    bxeq   lr                   @ nothing to do - jump to real handler
14727    EXPORT_PC()
14728    mov    r0, rPC              @ arg0
14729    mov    r1, rFP              @ arg1
14730    mov    r2, rSELF            @ arg2
14731    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14732
14733/* ------------------------------ */
14734    .balign 64
14735.L_ALT_OP_MOVE_RESULT_OBJECT: /* 0x0c */
14736/* File: armv5te/alt_stub.S */
14737/*
14738 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14739 * any interesting requests and then jump to the real instruction
14740 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14741 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14742 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14743 * bail to the real handler if breakFlags==0.
14744 */
14745    ldrb   r3, [rSELF, #offThread_breakFlags]
14746    adrl   lr, dvmAsmInstructionStart + (12 * 64)
14747    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14748    cmp    r3, #0
14749    bxeq   lr                   @ nothing to do - jump to real handler
14750    EXPORT_PC()
14751    mov    r0, rPC              @ arg0
14752    mov    r1, rFP              @ arg1
14753    mov    r2, rSELF            @ arg2
14754    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14755
14756/* ------------------------------ */
14757    .balign 64
14758.L_ALT_OP_MOVE_EXCEPTION: /* 0x0d */
14759/* File: armv5te/alt_stub.S */
14760/*
14761 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14762 * any interesting requests and then jump to the real instruction
14763 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14764 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14765 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14766 * bail to the real handler if breakFlags==0.
14767 */
14768    ldrb   r3, [rSELF, #offThread_breakFlags]
14769    adrl   lr, dvmAsmInstructionStart + (13 * 64)
14770    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14771    cmp    r3, #0
14772    bxeq   lr                   @ nothing to do - jump to real handler
14773    EXPORT_PC()
14774    mov    r0, rPC              @ arg0
14775    mov    r1, rFP              @ arg1
14776    mov    r2, rSELF            @ arg2
14777    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14778
14779/* ------------------------------ */
14780    .balign 64
14781.L_ALT_OP_RETURN_VOID: /* 0x0e */
14782/* File: armv5te/alt_stub.S */
14783/*
14784 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14785 * any interesting requests and then jump to the real instruction
14786 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14787 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14788 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14789 * bail to the real handler if breakFlags==0.
14790 */
14791    ldrb   r3, [rSELF, #offThread_breakFlags]
14792    adrl   lr, dvmAsmInstructionStart + (14 * 64)
14793    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14794    cmp    r3, #0
14795    bxeq   lr                   @ nothing to do - jump to real handler
14796    EXPORT_PC()
14797    mov    r0, rPC              @ arg0
14798    mov    r1, rFP              @ arg1
14799    mov    r2, rSELF            @ arg2
14800    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14801
14802/* ------------------------------ */
14803    .balign 64
14804.L_ALT_OP_RETURN: /* 0x0f */
14805/* File: armv5te/alt_stub.S */
14806/*
14807 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14808 * any interesting requests and then jump to the real instruction
14809 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14810 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14811 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14812 * bail to the real handler if breakFlags==0.
14813 */
14814    ldrb   r3, [rSELF, #offThread_breakFlags]
14815    adrl   lr, dvmAsmInstructionStart + (15 * 64)
14816    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14817    cmp    r3, #0
14818    bxeq   lr                   @ nothing to do - jump to real handler
14819    EXPORT_PC()
14820    mov    r0, rPC              @ arg0
14821    mov    r1, rFP              @ arg1
14822    mov    r2, rSELF            @ arg2
14823    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14824
14825/* ------------------------------ */
14826    .balign 64
14827.L_ALT_OP_RETURN_WIDE: /* 0x10 */
14828/* File: armv5te/alt_stub.S */
14829/*
14830 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14831 * any interesting requests and then jump to the real instruction
14832 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14833 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14834 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14835 * bail to the real handler if breakFlags==0.
14836 */
14837    ldrb   r3, [rSELF, #offThread_breakFlags]
14838    adrl   lr, dvmAsmInstructionStart + (16 * 64)
14839    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14840    cmp    r3, #0
14841    bxeq   lr                   @ nothing to do - jump to real handler
14842    EXPORT_PC()
14843    mov    r0, rPC              @ arg0
14844    mov    r1, rFP              @ arg1
14845    mov    r2, rSELF            @ arg2
14846    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14847
14848/* ------------------------------ */
14849    .balign 64
14850.L_ALT_OP_RETURN_OBJECT: /* 0x11 */
14851/* File: armv5te/alt_stub.S */
14852/*
14853 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14854 * any interesting requests and then jump to the real instruction
14855 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14856 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14857 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14858 * bail to the real handler if breakFlags==0.
14859 */
14860    ldrb   r3, [rSELF, #offThread_breakFlags]
14861    adrl   lr, dvmAsmInstructionStart + (17 * 64)
14862    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14863    cmp    r3, #0
14864    bxeq   lr                   @ nothing to do - jump to real handler
14865    EXPORT_PC()
14866    mov    r0, rPC              @ arg0
14867    mov    r1, rFP              @ arg1
14868    mov    r2, rSELF            @ arg2
14869    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14870
14871/* ------------------------------ */
14872    .balign 64
14873.L_ALT_OP_CONST_4: /* 0x12 */
14874/* File: armv5te/alt_stub.S */
14875/*
14876 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14877 * any interesting requests and then jump to the real instruction
14878 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14879 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14880 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14881 * bail to the real handler if breakFlags==0.
14882 */
14883    ldrb   r3, [rSELF, #offThread_breakFlags]
14884    adrl   lr, dvmAsmInstructionStart + (18 * 64)
14885    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14886    cmp    r3, #0
14887    bxeq   lr                   @ nothing to do - jump to real handler
14888    EXPORT_PC()
14889    mov    r0, rPC              @ arg0
14890    mov    r1, rFP              @ arg1
14891    mov    r2, rSELF            @ arg2
14892    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14893
14894/* ------------------------------ */
14895    .balign 64
14896.L_ALT_OP_CONST_16: /* 0x13 */
14897/* File: armv5te/alt_stub.S */
14898/*
14899 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14900 * any interesting requests and then jump to the real instruction
14901 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14902 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14903 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14904 * bail to the real handler if breakFlags==0.
14905 */
14906    ldrb   r3, [rSELF, #offThread_breakFlags]
14907    adrl   lr, dvmAsmInstructionStart + (19 * 64)
14908    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14909    cmp    r3, #0
14910    bxeq   lr                   @ nothing to do - jump to real handler
14911    EXPORT_PC()
14912    mov    r0, rPC              @ arg0
14913    mov    r1, rFP              @ arg1
14914    mov    r2, rSELF            @ arg2
14915    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14916
14917/* ------------------------------ */
14918    .balign 64
14919.L_ALT_OP_CONST: /* 0x14 */
14920/* File: armv5te/alt_stub.S */
14921/*
14922 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14923 * any interesting requests and then jump to the real instruction
14924 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14925 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14926 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14927 * bail to the real handler if breakFlags==0.
14928 */
14929    ldrb   r3, [rSELF, #offThread_breakFlags]
14930    adrl   lr, dvmAsmInstructionStart + (20 * 64)
14931    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14932    cmp    r3, #0
14933    bxeq   lr                   @ nothing to do - jump to real handler
14934    EXPORT_PC()
14935    mov    r0, rPC              @ arg0
14936    mov    r1, rFP              @ arg1
14937    mov    r2, rSELF            @ arg2
14938    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14939
14940/* ------------------------------ */
14941    .balign 64
14942.L_ALT_OP_CONST_HIGH16: /* 0x15 */
14943/* File: armv5te/alt_stub.S */
14944/*
14945 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14946 * any interesting requests and then jump to the real instruction
14947 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14948 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14949 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14950 * bail to the real handler if breakFlags==0.
14951 */
14952    ldrb   r3, [rSELF, #offThread_breakFlags]
14953    adrl   lr, dvmAsmInstructionStart + (21 * 64)
14954    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14955    cmp    r3, #0
14956    bxeq   lr                   @ nothing to do - jump to real handler
14957    EXPORT_PC()
14958    mov    r0, rPC              @ arg0
14959    mov    r1, rFP              @ arg1
14960    mov    r2, rSELF            @ arg2
14961    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14962
14963/* ------------------------------ */
14964    .balign 64
14965.L_ALT_OP_CONST_WIDE_16: /* 0x16 */
14966/* File: armv5te/alt_stub.S */
14967/*
14968 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14969 * any interesting requests and then jump to the real instruction
14970 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14971 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14972 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14973 * bail to the real handler if breakFlags==0.
14974 */
14975    ldrb   r3, [rSELF, #offThread_breakFlags]
14976    adrl   lr, dvmAsmInstructionStart + (22 * 64)
14977    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
14978    cmp    r3, #0
14979    bxeq   lr                   @ nothing to do - jump to real handler
14980    EXPORT_PC()
14981    mov    r0, rPC              @ arg0
14982    mov    r1, rFP              @ arg1
14983    mov    r2, rSELF            @ arg2
14984    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14985
14986/* ------------------------------ */
14987    .balign 64
14988.L_ALT_OP_CONST_WIDE_32: /* 0x17 */
14989/* File: armv5te/alt_stub.S */
14990/*
14991 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14992 * any interesting requests and then jump to the real instruction
14993 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
14994 * rIBASE updates won't be seen until a refresh, and we can tell we have a
14995 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
14996 * bail to the real handler if breakFlags==0.
14997 */
14998    ldrb   r3, [rSELF, #offThread_breakFlags]
14999    adrl   lr, dvmAsmInstructionStart + (23 * 64)
15000    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15001    cmp    r3, #0
15002    bxeq   lr                   @ nothing to do - jump to real handler
15003    EXPORT_PC()
15004    mov    r0, rPC              @ arg0
15005    mov    r1, rFP              @ arg1
15006    mov    r2, rSELF            @ arg2
15007    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15008
15009/* ------------------------------ */
15010    .balign 64
15011.L_ALT_OP_CONST_WIDE: /* 0x18 */
15012/* File: armv5te/alt_stub.S */
15013/*
15014 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15015 * any interesting requests and then jump to the real instruction
15016 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15017 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15018 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15019 * bail to the real handler if breakFlags==0.
15020 */
15021    ldrb   r3, [rSELF, #offThread_breakFlags]
15022    adrl   lr, dvmAsmInstructionStart + (24 * 64)
15023    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15024    cmp    r3, #0
15025    bxeq   lr                   @ nothing to do - jump to real handler
15026    EXPORT_PC()
15027    mov    r0, rPC              @ arg0
15028    mov    r1, rFP              @ arg1
15029    mov    r2, rSELF            @ arg2
15030    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15031
15032/* ------------------------------ */
15033    .balign 64
15034.L_ALT_OP_CONST_WIDE_HIGH16: /* 0x19 */
15035/* File: armv5te/alt_stub.S */
15036/*
15037 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15038 * any interesting requests and then jump to the real instruction
15039 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15040 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15041 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15042 * bail to the real handler if breakFlags==0.
15043 */
15044    ldrb   r3, [rSELF, #offThread_breakFlags]
15045    adrl   lr, dvmAsmInstructionStart + (25 * 64)
15046    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15047    cmp    r3, #0
15048    bxeq   lr                   @ nothing to do - jump to real handler
15049    EXPORT_PC()
15050    mov    r0, rPC              @ arg0
15051    mov    r1, rFP              @ arg1
15052    mov    r2, rSELF            @ arg2
15053    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15054
15055/* ------------------------------ */
15056    .balign 64
15057.L_ALT_OP_CONST_STRING: /* 0x1a */
15058/* File: armv5te/alt_stub.S */
15059/*
15060 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15061 * any interesting requests and then jump to the real instruction
15062 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15063 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15064 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15065 * bail to the real handler if breakFlags==0.
15066 */
15067    ldrb   r3, [rSELF, #offThread_breakFlags]
15068    adrl   lr, dvmAsmInstructionStart + (26 * 64)
15069    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15070    cmp    r3, #0
15071    bxeq   lr                   @ nothing to do - jump to real handler
15072    EXPORT_PC()
15073    mov    r0, rPC              @ arg0
15074    mov    r1, rFP              @ arg1
15075    mov    r2, rSELF            @ arg2
15076    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15077
15078/* ------------------------------ */
15079    .balign 64
15080.L_ALT_OP_CONST_STRING_JUMBO: /* 0x1b */
15081/* File: armv5te/alt_stub.S */
15082/*
15083 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15084 * any interesting requests and then jump to the real instruction
15085 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15086 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15087 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15088 * bail to the real handler if breakFlags==0.
15089 */
15090    ldrb   r3, [rSELF, #offThread_breakFlags]
15091    adrl   lr, dvmAsmInstructionStart + (27 * 64)
15092    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15093    cmp    r3, #0
15094    bxeq   lr                   @ nothing to do - jump to real handler
15095    EXPORT_PC()
15096    mov    r0, rPC              @ arg0
15097    mov    r1, rFP              @ arg1
15098    mov    r2, rSELF            @ arg2
15099    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15100
15101/* ------------------------------ */
15102    .balign 64
15103.L_ALT_OP_CONST_CLASS: /* 0x1c */
15104/* File: armv5te/alt_stub.S */
15105/*
15106 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15107 * any interesting requests and then jump to the real instruction
15108 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15109 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15110 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15111 * bail to the real handler if breakFlags==0.
15112 */
15113    ldrb   r3, [rSELF, #offThread_breakFlags]
15114    adrl   lr, dvmAsmInstructionStart + (28 * 64)
15115    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15116    cmp    r3, #0
15117    bxeq   lr                   @ nothing to do - jump to real handler
15118    EXPORT_PC()
15119    mov    r0, rPC              @ arg0
15120    mov    r1, rFP              @ arg1
15121    mov    r2, rSELF            @ arg2
15122    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15123
15124/* ------------------------------ */
15125    .balign 64
15126.L_ALT_OP_MONITOR_ENTER: /* 0x1d */
15127/* File: armv5te/alt_stub.S */
15128/*
15129 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15130 * any interesting requests and then jump to the real instruction
15131 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15132 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15133 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15134 * bail to the real handler if breakFlags==0.
15135 */
15136    ldrb   r3, [rSELF, #offThread_breakFlags]
15137    adrl   lr, dvmAsmInstructionStart + (29 * 64)
15138    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15139    cmp    r3, #0
15140    bxeq   lr                   @ nothing to do - jump to real handler
15141    EXPORT_PC()
15142    mov    r0, rPC              @ arg0
15143    mov    r1, rFP              @ arg1
15144    mov    r2, rSELF            @ arg2
15145    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15146
15147/* ------------------------------ */
15148    .balign 64
15149.L_ALT_OP_MONITOR_EXIT: /* 0x1e */
15150/* File: armv5te/alt_stub.S */
15151/*
15152 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15153 * any interesting requests and then jump to the real instruction
15154 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15155 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15156 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15157 * bail to the real handler if breakFlags==0.
15158 */
15159    ldrb   r3, [rSELF, #offThread_breakFlags]
15160    adrl   lr, dvmAsmInstructionStart + (30 * 64)
15161    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15162    cmp    r3, #0
15163    bxeq   lr                   @ nothing to do - jump to real handler
15164    EXPORT_PC()
15165    mov    r0, rPC              @ arg0
15166    mov    r1, rFP              @ arg1
15167    mov    r2, rSELF            @ arg2
15168    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15169
15170/* ------------------------------ */
15171    .balign 64
15172.L_ALT_OP_CHECK_CAST: /* 0x1f */
15173/* File: armv5te/alt_stub.S */
15174/*
15175 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15176 * any interesting requests and then jump to the real instruction
15177 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15178 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15179 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15180 * bail to the real handler if breakFlags==0.
15181 */
15182    ldrb   r3, [rSELF, #offThread_breakFlags]
15183    adrl   lr, dvmAsmInstructionStart + (31 * 64)
15184    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15185    cmp    r3, #0
15186    bxeq   lr                   @ nothing to do - jump to real handler
15187    EXPORT_PC()
15188    mov    r0, rPC              @ arg0
15189    mov    r1, rFP              @ arg1
15190    mov    r2, rSELF            @ arg2
15191    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15192
15193/* ------------------------------ */
15194    .balign 64
15195.L_ALT_OP_INSTANCE_OF: /* 0x20 */
15196/* File: armv5te/alt_stub.S */
15197/*
15198 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15199 * any interesting requests and then jump to the real instruction
15200 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15201 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15202 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15203 * bail to the real handler if breakFlags==0.
15204 */
15205    ldrb   r3, [rSELF, #offThread_breakFlags]
15206    adrl   lr, dvmAsmInstructionStart + (32 * 64)
15207    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15208    cmp    r3, #0
15209    bxeq   lr                   @ nothing to do - jump to real handler
15210    EXPORT_PC()
15211    mov    r0, rPC              @ arg0
15212    mov    r1, rFP              @ arg1
15213    mov    r2, rSELF            @ arg2
15214    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15215
15216/* ------------------------------ */
15217    .balign 64
15218.L_ALT_OP_ARRAY_LENGTH: /* 0x21 */
15219/* File: armv5te/alt_stub.S */
15220/*
15221 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15222 * any interesting requests and then jump to the real instruction
15223 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15224 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15225 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15226 * bail to the real handler if breakFlags==0.
15227 */
15228    ldrb   r3, [rSELF, #offThread_breakFlags]
15229    adrl   lr, dvmAsmInstructionStart + (33 * 64)
15230    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15231    cmp    r3, #0
15232    bxeq   lr                   @ nothing to do - jump to real handler
15233    EXPORT_PC()
15234    mov    r0, rPC              @ arg0
15235    mov    r1, rFP              @ arg1
15236    mov    r2, rSELF            @ arg2
15237    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15238
15239/* ------------------------------ */
15240    .balign 64
15241.L_ALT_OP_NEW_INSTANCE: /* 0x22 */
15242/* File: armv5te/alt_stub.S */
15243/*
15244 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15245 * any interesting requests and then jump to the real instruction
15246 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15247 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15248 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15249 * bail to the real handler if breakFlags==0.
15250 */
15251    ldrb   r3, [rSELF, #offThread_breakFlags]
15252    adrl   lr, dvmAsmInstructionStart + (34 * 64)
15253    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15254    cmp    r3, #0
15255    bxeq   lr                   @ nothing to do - jump to real handler
15256    EXPORT_PC()
15257    mov    r0, rPC              @ arg0
15258    mov    r1, rFP              @ arg1
15259    mov    r2, rSELF            @ arg2
15260    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15261
15262/* ------------------------------ */
15263    .balign 64
15264.L_ALT_OP_NEW_ARRAY: /* 0x23 */
15265/* File: armv5te/alt_stub.S */
15266/*
15267 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15268 * any interesting requests and then jump to the real instruction
15269 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15270 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15271 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15272 * bail to the real handler if breakFlags==0.
15273 */
15274    ldrb   r3, [rSELF, #offThread_breakFlags]
15275    adrl   lr, dvmAsmInstructionStart + (35 * 64)
15276    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15277    cmp    r3, #0
15278    bxeq   lr                   @ nothing to do - jump to real handler
15279    EXPORT_PC()
15280    mov    r0, rPC              @ arg0
15281    mov    r1, rFP              @ arg1
15282    mov    r2, rSELF            @ arg2
15283    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15284
15285/* ------------------------------ */
15286    .balign 64
15287.L_ALT_OP_FILLED_NEW_ARRAY: /* 0x24 */
15288/* File: armv5te/alt_stub.S */
15289/*
15290 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15291 * any interesting requests and then jump to the real instruction
15292 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15293 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15294 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15295 * bail to the real handler if breakFlags==0.
15296 */
15297    ldrb   r3, [rSELF, #offThread_breakFlags]
15298    adrl   lr, dvmAsmInstructionStart + (36 * 64)
15299    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15300    cmp    r3, #0
15301    bxeq   lr                   @ nothing to do - jump to real handler
15302    EXPORT_PC()
15303    mov    r0, rPC              @ arg0
15304    mov    r1, rFP              @ arg1
15305    mov    r2, rSELF            @ arg2
15306    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15307
15308/* ------------------------------ */
15309    .balign 64
15310.L_ALT_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
15311/* File: armv5te/alt_stub.S */
15312/*
15313 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15314 * any interesting requests and then jump to the real instruction
15315 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15316 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15317 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15318 * bail to the real handler if breakFlags==0.
15319 */
15320    ldrb   r3, [rSELF, #offThread_breakFlags]
15321    adrl   lr, dvmAsmInstructionStart + (37 * 64)
15322    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15323    cmp    r3, #0
15324    bxeq   lr                   @ nothing to do - jump to real handler
15325    EXPORT_PC()
15326    mov    r0, rPC              @ arg0
15327    mov    r1, rFP              @ arg1
15328    mov    r2, rSELF            @ arg2
15329    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15330
15331/* ------------------------------ */
15332    .balign 64
15333.L_ALT_OP_FILL_ARRAY_DATA: /* 0x26 */
15334/* File: armv5te/alt_stub.S */
15335/*
15336 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15337 * any interesting requests and then jump to the real instruction
15338 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15339 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15340 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15341 * bail to the real handler if breakFlags==0.
15342 */
15343    ldrb   r3, [rSELF, #offThread_breakFlags]
15344    adrl   lr, dvmAsmInstructionStart + (38 * 64)
15345    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15346    cmp    r3, #0
15347    bxeq   lr                   @ nothing to do - jump to real handler
15348    EXPORT_PC()
15349    mov    r0, rPC              @ arg0
15350    mov    r1, rFP              @ arg1
15351    mov    r2, rSELF            @ arg2
15352    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15353
15354/* ------------------------------ */
15355    .balign 64
15356.L_ALT_OP_THROW: /* 0x27 */
15357/* File: armv5te/alt_stub.S */
15358/*
15359 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15360 * any interesting requests and then jump to the real instruction
15361 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15362 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15363 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15364 * bail to the real handler if breakFlags==0.
15365 */
15366    ldrb   r3, [rSELF, #offThread_breakFlags]
15367    adrl   lr, dvmAsmInstructionStart + (39 * 64)
15368    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15369    cmp    r3, #0
15370    bxeq   lr                   @ nothing to do - jump to real handler
15371    EXPORT_PC()
15372    mov    r0, rPC              @ arg0
15373    mov    r1, rFP              @ arg1
15374    mov    r2, rSELF            @ arg2
15375    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15376
15377/* ------------------------------ */
15378    .balign 64
15379.L_ALT_OP_GOTO: /* 0x28 */
15380/* File: armv5te/alt_stub.S */
15381/*
15382 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15383 * any interesting requests and then jump to the real instruction
15384 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15385 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15386 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15387 * bail to the real handler if breakFlags==0.
15388 */
15389    ldrb   r3, [rSELF, #offThread_breakFlags]
15390    adrl   lr, dvmAsmInstructionStart + (40 * 64)
15391    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15392    cmp    r3, #0
15393    bxeq   lr                   @ nothing to do - jump to real handler
15394    EXPORT_PC()
15395    mov    r0, rPC              @ arg0
15396    mov    r1, rFP              @ arg1
15397    mov    r2, rSELF            @ arg2
15398    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15399
15400/* ------------------------------ */
15401    .balign 64
15402.L_ALT_OP_GOTO_16: /* 0x29 */
15403/* File: armv5te/alt_stub.S */
15404/*
15405 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15406 * any interesting requests and then jump to the real instruction
15407 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15408 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15409 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15410 * bail to the real handler if breakFlags==0.
15411 */
15412    ldrb   r3, [rSELF, #offThread_breakFlags]
15413    adrl   lr, dvmAsmInstructionStart + (41 * 64)
15414    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15415    cmp    r3, #0
15416    bxeq   lr                   @ nothing to do - jump to real handler
15417    EXPORT_PC()
15418    mov    r0, rPC              @ arg0
15419    mov    r1, rFP              @ arg1
15420    mov    r2, rSELF            @ arg2
15421    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15422
15423/* ------------------------------ */
15424    .balign 64
15425.L_ALT_OP_GOTO_32: /* 0x2a */
15426/* File: armv5te/alt_stub.S */
15427/*
15428 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15429 * any interesting requests and then jump to the real instruction
15430 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15431 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15432 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15433 * bail to the real handler if breakFlags==0.
15434 */
15435    ldrb   r3, [rSELF, #offThread_breakFlags]
15436    adrl   lr, dvmAsmInstructionStart + (42 * 64)
15437    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15438    cmp    r3, #0
15439    bxeq   lr                   @ nothing to do - jump to real handler
15440    EXPORT_PC()
15441    mov    r0, rPC              @ arg0
15442    mov    r1, rFP              @ arg1
15443    mov    r2, rSELF            @ arg2
15444    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15445
15446/* ------------------------------ */
15447    .balign 64
15448.L_ALT_OP_PACKED_SWITCH: /* 0x2b */
15449/* File: armv5te/alt_stub.S */
15450/*
15451 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15452 * any interesting requests and then jump to the real instruction
15453 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15454 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15455 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15456 * bail to the real handler if breakFlags==0.
15457 */
15458    ldrb   r3, [rSELF, #offThread_breakFlags]
15459    adrl   lr, dvmAsmInstructionStart + (43 * 64)
15460    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15461    cmp    r3, #0
15462    bxeq   lr                   @ nothing to do - jump to real handler
15463    EXPORT_PC()
15464    mov    r0, rPC              @ arg0
15465    mov    r1, rFP              @ arg1
15466    mov    r2, rSELF            @ arg2
15467    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15468
15469/* ------------------------------ */
15470    .balign 64
15471.L_ALT_OP_SPARSE_SWITCH: /* 0x2c */
15472/* File: armv5te/alt_stub.S */
15473/*
15474 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15475 * any interesting requests and then jump to the real instruction
15476 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15477 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15478 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15479 * bail to the real handler if breakFlags==0.
15480 */
15481    ldrb   r3, [rSELF, #offThread_breakFlags]
15482    adrl   lr, dvmAsmInstructionStart + (44 * 64)
15483    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15484    cmp    r3, #0
15485    bxeq   lr                   @ nothing to do - jump to real handler
15486    EXPORT_PC()
15487    mov    r0, rPC              @ arg0
15488    mov    r1, rFP              @ arg1
15489    mov    r2, rSELF            @ arg2
15490    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15491
15492/* ------------------------------ */
15493    .balign 64
15494.L_ALT_OP_CMPL_FLOAT: /* 0x2d */
15495/* File: armv5te/alt_stub.S */
15496/*
15497 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15498 * any interesting requests and then jump to the real instruction
15499 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15500 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15501 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15502 * bail to the real handler if breakFlags==0.
15503 */
15504    ldrb   r3, [rSELF, #offThread_breakFlags]
15505    adrl   lr, dvmAsmInstructionStart + (45 * 64)
15506    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15507    cmp    r3, #0
15508    bxeq   lr                   @ nothing to do - jump to real handler
15509    EXPORT_PC()
15510    mov    r0, rPC              @ arg0
15511    mov    r1, rFP              @ arg1
15512    mov    r2, rSELF            @ arg2
15513    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15514
15515/* ------------------------------ */
15516    .balign 64
15517.L_ALT_OP_CMPG_FLOAT: /* 0x2e */
15518/* File: armv5te/alt_stub.S */
15519/*
15520 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15521 * any interesting requests and then jump to the real instruction
15522 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15523 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15524 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15525 * bail to the real handler if breakFlags==0.
15526 */
15527    ldrb   r3, [rSELF, #offThread_breakFlags]
15528    adrl   lr, dvmAsmInstructionStart + (46 * 64)
15529    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15530    cmp    r3, #0
15531    bxeq   lr                   @ nothing to do - jump to real handler
15532    EXPORT_PC()
15533    mov    r0, rPC              @ arg0
15534    mov    r1, rFP              @ arg1
15535    mov    r2, rSELF            @ arg2
15536    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15537
15538/* ------------------------------ */
15539    .balign 64
15540.L_ALT_OP_CMPL_DOUBLE: /* 0x2f */
15541/* File: armv5te/alt_stub.S */
15542/*
15543 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15544 * any interesting requests and then jump to the real instruction
15545 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15546 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15547 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15548 * bail to the real handler if breakFlags==0.
15549 */
15550    ldrb   r3, [rSELF, #offThread_breakFlags]
15551    adrl   lr, dvmAsmInstructionStart + (47 * 64)
15552    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15553    cmp    r3, #0
15554    bxeq   lr                   @ nothing to do - jump to real handler
15555    EXPORT_PC()
15556    mov    r0, rPC              @ arg0
15557    mov    r1, rFP              @ arg1
15558    mov    r2, rSELF            @ arg2
15559    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15560
15561/* ------------------------------ */
15562    .balign 64
15563.L_ALT_OP_CMPG_DOUBLE: /* 0x30 */
15564/* File: armv5te/alt_stub.S */
15565/*
15566 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15567 * any interesting requests and then jump to the real instruction
15568 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15569 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15570 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15571 * bail to the real handler if breakFlags==0.
15572 */
15573    ldrb   r3, [rSELF, #offThread_breakFlags]
15574    adrl   lr, dvmAsmInstructionStart + (48 * 64)
15575    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15576    cmp    r3, #0
15577    bxeq   lr                   @ nothing to do - jump to real handler
15578    EXPORT_PC()
15579    mov    r0, rPC              @ arg0
15580    mov    r1, rFP              @ arg1
15581    mov    r2, rSELF            @ arg2
15582    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15583
15584/* ------------------------------ */
15585    .balign 64
15586.L_ALT_OP_CMP_LONG: /* 0x31 */
15587/* File: armv5te/alt_stub.S */
15588/*
15589 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15590 * any interesting requests and then jump to the real instruction
15591 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15592 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15593 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15594 * bail to the real handler if breakFlags==0.
15595 */
15596    ldrb   r3, [rSELF, #offThread_breakFlags]
15597    adrl   lr, dvmAsmInstructionStart + (49 * 64)
15598    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15599    cmp    r3, #0
15600    bxeq   lr                   @ nothing to do - jump to real handler
15601    EXPORT_PC()
15602    mov    r0, rPC              @ arg0
15603    mov    r1, rFP              @ arg1
15604    mov    r2, rSELF            @ arg2
15605    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15606
15607/* ------------------------------ */
15608    .balign 64
15609.L_ALT_OP_IF_EQ: /* 0x32 */
15610/* File: armv5te/alt_stub.S */
15611/*
15612 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15613 * any interesting requests and then jump to the real instruction
15614 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15615 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15616 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15617 * bail to the real handler if breakFlags==0.
15618 */
15619    ldrb   r3, [rSELF, #offThread_breakFlags]
15620    adrl   lr, dvmAsmInstructionStart + (50 * 64)
15621    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15622    cmp    r3, #0
15623    bxeq   lr                   @ nothing to do - jump to real handler
15624    EXPORT_PC()
15625    mov    r0, rPC              @ arg0
15626    mov    r1, rFP              @ arg1
15627    mov    r2, rSELF            @ arg2
15628    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15629
15630/* ------------------------------ */
15631    .balign 64
15632.L_ALT_OP_IF_NE: /* 0x33 */
15633/* File: armv5te/alt_stub.S */
15634/*
15635 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15636 * any interesting requests and then jump to the real instruction
15637 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15638 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15639 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15640 * bail to the real handler if breakFlags==0.
15641 */
15642    ldrb   r3, [rSELF, #offThread_breakFlags]
15643    adrl   lr, dvmAsmInstructionStart + (51 * 64)
15644    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15645    cmp    r3, #0
15646    bxeq   lr                   @ nothing to do - jump to real handler
15647    EXPORT_PC()
15648    mov    r0, rPC              @ arg0
15649    mov    r1, rFP              @ arg1
15650    mov    r2, rSELF            @ arg2
15651    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15652
15653/* ------------------------------ */
15654    .balign 64
15655.L_ALT_OP_IF_LT: /* 0x34 */
15656/* File: armv5te/alt_stub.S */
15657/*
15658 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15659 * any interesting requests and then jump to the real instruction
15660 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15661 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15662 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15663 * bail to the real handler if breakFlags==0.
15664 */
15665    ldrb   r3, [rSELF, #offThread_breakFlags]
15666    adrl   lr, dvmAsmInstructionStart + (52 * 64)
15667    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15668    cmp    r3, #0
15669    bxeq   lr                   @ nothing to do - jump to real handler
15670    EXPORT_PC()
15671    mov    r0, rPC              @ arg0
15672    mov    r1, rFP              @ arg1
15673    mov    r2, rSELF            @ arg2
15674    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15675
15676/* ------------------------------ */
15677    .balign 64
15678.L_ALT_OP_IF_GE: /* 0x35 */
15679/* File: armv5te/alt_stub.S */
15680/*
15681 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15682 * any interesting requests and then jump to the real instruction
15683 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15684 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15685 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15686 * bail to the real handler if breakFlags==0.
15687 */
15688    ldrb   r3, [rSELF, #offThread_breakFlags]
15689    adrl   lr, dvmAsmInstructionStart + (53 * 64)
15690    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15691    cmp    r3, #0
15692    bxeq   lr                   @ nothing to do - jump to real handler
15693    EXPORT_PC()
15694    mov    r0, rPC              @ arg0
15695    mov    r1, rFP              @ arg1
15696    mov    r2, rSELF            @ arg2
15697    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15698
15699/* ------------------------------ */
15700    .balign 64
15701.L_ALT_OP_IF_GT: /* 0x36 */
15702/* File: armv5te/alt_stub.S */
15703/*
15704 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15705 * any interesting requests and then jump to the real instruction
15706 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15707 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15708 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15709 * bail to the real handler if breakFlags==0.
15710 */
15711    ldrb   r3, [rSELF, #offThread_breakFlags]
15712    adrl   lr, dvmAsmInstructionStart + (54 * 64)
15713    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15714    cmp    r3, #0
15715    bxeq   lr                   @ nothing to do - jump to real handler
15716    EXPORT_PC()
15717    mov    r0, rPC              @ arg0
15718    mov    r1, rFP              @ arg1
15719    mov    r2, rSELF            @ arg2
15720    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15721
15722/* ------------------------------ */
15723    .balign 64
15724.L_ALT_OP_IF_LE: /* 0x37 */
15725/* File: armv5te/alt_stub.S */
15726/*
15727 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15728 * any interesting requests and then jump to the real instruction
15729 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15730 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15731 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15732 * bail to the real handler if breakFlags==0.
15733 */
15734    ldrb   r3, [rSELF, #offThread_breakFlags]
15735    adrl   lr, dvmAsmInstructionStart + (55 * 64)
15736    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15737    cmp    r3, #0
15738    bxeq   lr                   @ nothing to do - jump to real handler
15739    EXPORT_PC()
15740    mov    r0, rPC              @ arg0
15741    mov    r1, rFP              @ arg1
15742    mov    r2, rSELF            @ arg2
15743    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15744
15745/* ------------------------------ */
15746    .balign 64
15747.L_ALT_OP_IF_EQZ: /* 0x38 */
15748/* File: armv5te/alt_stub.S */
15749/*
15750 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15751 * any interesting requests and then jump to the real instruction
15752 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15753 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15754 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15755 * bail to the real handler if breakFlags==0.
15756 */
15757    ldrb   r3, [rSELF, #offThread_breakFlags]
15758    adrl   lr, dvmAsmInstructionStart + (56 * 64)
15759    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15760    cmp    r3, #0
15761    bxeq   lr                   @ nothing to do - jump to real handler
15762    EXPORT_PC()
15763    mov    r0, rPC              @ arg0
15764    mov    r1, rFP              @ arg1
15765    mov    r2, rSELF            @ arg2
15766    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15767
15768/* ------------------------------ */
15769    .balign 64
15770.L_ALT_OP_IF_NEZ: /* 0x39 */
15771/* File: armv5te/alt_stub.S */
15772/*
15773 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15774 * any interesting requests and then jump to the real instruction
15775 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15776 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15777 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15778 * bail to the real handler if breakFlags==0.
15779 */
15780    ldrb   r3, [rSELF, #offThread_breakFlags]
15781    adrl   lr, dvmAsmInstructionStart + (57 * 64)
15782    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15783    cmp    r3, #0
15784    bxeq   lr                   @ nothing to do - jump to real handler
15785    EXPORT_PC()
15786    mov    r0, rPC              @ arg0
15787    mov    r1, rFP              @ arg1
15788    mov    r2, rSELF            @ arg2
15789    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15790
15791/* ------------------------------ */
15792    .balign 64
15793.L_ALT_OP_IF_LTZ: /* 0x3a */
15794/* File: armv5te/alt_stub.S */
15795/*
15796 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15797 * any interesting requests and then jump to the real instruction
15798 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15799 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15800 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15801 * bail to the real handler if breakFlags==0.
15802 */
15803    ldrb   r3, [rSELF, #offThread_breakFlags]
15804    adrl   lr, dvmAsmInstructionStart + (58 * 64)
15805    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15806    cmp    r3, #0
15807    bxeq   lr                   @ nothing to do - jump to real handler
15808    EXPORT_PC()
15809    mov    r0, rPC              @ arg0
15810    mov    r1, rFP              @ arg1
15811    mov    r2, rSELF            @ arg2
15812    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15813
15814/* ------------------------------ */
15815    .balign 64
15816.L_ALT_OP_IF_GEZ: /* 0x3b */
15817/* File: armv5te/alt_stub.S */
15818/*
15819 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15820 * any interesting requests and then jump to the real instruction
15821 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15822 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15823 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15824 * bail to the real handler if breakFlags==0.
15825 */
15826    ldrb   r3, [rSELF, #offThread_breakFlags]
15827    adrl   lr, dvmAsmInstructionStart + (59 * 64)
15828    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15829    cmp    r3, #0
15830    bxeq   lr                   @ nothing to do - jump to real handler
15831    EXPORT_PC()
15832    mov    r0, rPC              @ arg0
15833    mov    r1, rFP              @ arg1
15834    mov    r2, rSELF            @ arg2
15835    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15836
15837/* ------------------------------ */
15838    .balign 64
15839.L_ALT_OP_IF_GTZ: /* 0x3c */
15840/* File: armv5te/alt_stub.S */
15841/*
15842 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15843 * any interesting requests and then jump to the real instruction
15844 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15845 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15846 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15847 * bail to the real handler if breakFlags==0.
15848 */
15849    ldrb   r3, [rSELF, #offThread_breakFlags]
15850    adrl   lr, dvmAsmInstructionStart + (60 * 64)
15851    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15852    cmp    r3, #0
15853    bxeq   lr                   @ nothing to do - jump to real handler
15854    EXPORT_PC()
15855    mov    r0, rPC              @ arg0
15856    mov    r1, rFP              @ arg1
15857    mov    r2, rSELF            @ arg2
15858    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15859
15860/* ------------------------------ */
15861    .balign 64
15862.L_ALT_OP_IF_LEZ: /* 0x3d */
15863/* File: armv5te/alt_stub.S */
15864/*
15865 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15866 * any interesting requests and then jump to the real instruction
15867 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15868 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15869 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15870 * bail to the real handler if breakFlags==0.
15871 */
15872    ldrb   r3, [rSELF, #offThread_breakFlags]
15873    adrl   lr, dvmAsmInstructionStart + (61 * 64)
15874    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15875    cmp    r3, #0
15876    bxeq   lr                   @ nothing to do - jump to real handler
15877    EXPORT_PC()
15878    mov    r0, rPC              @ arg0
15879    mov    r1, rFP              @ arg1
15880    mov    r2, rSELF            @ arg2
15881    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15882
15883/* ------------------------------ */
15884    .balign 64
15885.L_ALT_OP_UNUSED_3E: /* 0x3e */
15886/* File: armv5te/alt_stub.S */
15887/*
15888 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15889 * any interesting requests and then jump to the real instruction
15890 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15891 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15892 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15893 * bail to the real handler if breakFlags==0.
15894 */
15895    ldrb   r3, [rSELF, #offThread_breakFlags]
15896    adrl   lr, dvmAsmInstructionStart + (62 * 64)
15897    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15898    cmp    r3, #0
15899    bxeq   lr                   @ nothing to do - jump to real handler
15900    EXPORT_PC()
15901    mov    r0, rPC              @ arg0
15902    mov    r1, rFP              @ arg1
15903    mov    r2, rSELF            @ arg2
15904    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15905
15906/* ------------------------------ */
15907    .balign 64
15908.L_ALT_OP_UNUSED_3F: /* 0x3f */
15909/* File: armv5te/alt_stub.S */
15910/*
15911 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15912 * any interesting requests and then jump to the real instruction
15913 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15914 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15915 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15916 * bail to the real handler if breakFlags==0.
15917 */
15918    ldrb   r3, [rSELF, #offThread_breakFlags]
15919    adrl   lr, dvmAsmInstructionStart + (63 * 64)
15920    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15921    cmp    r3, #0
15922    bxeq   lr                   @ nothing to do - jump to real handler
15923    EXPORT_PC()
15924    mov    r0, rPC              @ arg0
15925    mov    r1, rFP              @ arg1
15926    mov    r2, rSELF            @ arg2
15927    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15928
15929/* ------------------------------ */
15930    .balign 64
15931.L_ALT_OP_UNUSED_40: /* 0x40 */
15932/* File: armv5te/alt_stub.S */
15933/*
15934 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15935 * any interesting requests and then jump to the real instruction
15936 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15937 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15938 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15939 * bail to the real handler if breakFlags==0.
15940 */
15941    ldrb   r3, [rSELF, #offThread_breakFlags]
15942    adrl   lr, dvmAsmInstructionStart + (64 * 64)
15943    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15944    cmp    r3, #0
15945    bxeq   lr                   @ nothing to do - jump to real handler
15946    EXPORT_PC()
15947    mov    r0, rPC              @ arg0
15948    mov    r1, rFP              @ arg1
15949    mov    r2, rSELF            @ arg2
15950    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15951
15952/* ------------------------------ */
15953    .balign 64
15954.L_ALT_OP_UNUSED_41: /* 0x41 */
15955/* File: armv5te/alt_stub.S */
15956/*
15957 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15958 * any interesting requests and then jump to the real instruction
15959 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15960 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15961 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15962 * bail to the real handler if breakFlags==0.
15963 */
15964    ldrb   r3, [rSELF, #offThread_breakFlags]
15965    adrl   lr, dvmAsmInstructionStart + (65 * 64)
15966    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15967    cmp    r3, #0
15968    bxeq   lr                   @ nothing to do - jump to real handler
15969    EXPORT_PC()
15970    mov    r0, rPC              @ arg0
15971    mov    r1, rFP              @ arg1
15972    mov    r2, rSELF            @ arg2
15973    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15974
15975/* ------------------------------ */
15976    .balign 64
15977.L_ALT_OP_UNUSED_42: /* 0x42 */
15978/* File: armv5te/alt_stub.S */
15979/*
15980 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15981 * any interesting requests and then jump to the real instruction
15982 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
15983 * rIBASE updates won't be seen until a refresh, and we can tell we have a
15984 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
15985 * bail to the real handler if breakFlags==0.
15986 */
15987    ldrb   r3, [rSELF, #offThread_breakFlags]
15988    adrl   lr, dvmAsmInstructionStart + (66 * 64)
15989    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
15990    cmp    r3, #0
15991    bxeq   lr                   @ nothing to do - jump to real handler
15992    EXPORT_PC()
15993    mov    r0, rPC              @ arg0
15994    mov    r1, rFP              @ arg1
15995    mov    r2, rSELF            @ arg2
15996    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15997
15998/* ------------------------------ */
15999    .balign 64
16000.L_ALT_OP_UNUSED_43: /* 0x43 */
16001/* File: armv5te/alt_stub.S */
16002/*
16003 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16004 * any interesting requests and then jump to the real instruction
16005 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16006 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16007 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16008 * bail to the real handler if breakFlags==0.
16009 */
16010    ldrb   r3, [rSELF, #offThread_breakFlags]
16011    adrl   lr, dvmAsmInstructionStart + (67 * 64)
16012    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16013    cmp    r3, #0
16014    bxeq   lr                   @ nothing to do - jump to real handler
16015    EXPORT_PC()
16016    mov    r0, rPC              @ arg0
16017    mov    r1, rFP              @ arg1
16018    mov    r2, rSELF            @ arg2
16019    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16020
16021/* ------------------------------ */
16022    .balign 64
16023.L_ALT_OP_AGET: /* 0x44 */
16024/* File: armv5te/alt_stub.S */
16025/*
16026 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16027 * any interesting requests and then jump to the real instruction
16028 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16029 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16030 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16031 * bail to the real handler if breakFlags==0.
16032 */
16033    ldrb   r3, [rSELF, #offThread_breakFlags]
16034    adrl   lr, dvmAsmInstructionStart + (68 * 64)
16035    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16036    cmp    r3, #0
16037    bxeq   lr                   @ nothing to do - jump to real handler
16038    EXPORT_PC()
16039    mov    r0, rPC              @ arg0
16040    mov    r1, rFP              @ arg1
16041    mov    r2, rSELF            @ arg2
16042    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16043
16044/* ------------------------------ */
16045    .balign 64
16046.L_ALT_OP_AGET_WIDE: /* 0x45 */
16047/* File: armv5te/alt_stub.S */
16048/*
16049 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16050 * any interesting requests and then jump to the real instruction
16051 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16052 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16053 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16054 * bail to the real handler if breakFlags==0.
16055 */
16056    ldrb   r3, [rSELF, #offThread_breakFlags]
16057    adrl   lr, dvmAsmInstructionStart + (69 * 64)
16058    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16059    cmp    r3, #0
16060    bxeq   lr                   @ nothing to do - jump to real handler
16061    EXPORT_PC()
16062    mov    r0, rPC              @ arg0
16063    mov    r1, rFP              @ arg1
16064    mov    r2, rSELF            @ arg2
16065    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16066
16067/* ------------------------------ */
16068    .balign 64
16069.L_ALT_OP_AGET_OBJECT: /* 0x46 */
16070/* File: armv5te/alt_stub.S */
16071/*
16072 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16073 * any interesting requests and then jump to the real instruction
16074 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16075 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16076 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16077 * bail to the real handler if breakFlags==0.
16078 */
16079    ldrb   r3, [rSELF, #offThread_breakFlags]
16080    adrl   lr, dvmAsmInstructionStart + (70 * 64)
16081    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16082    cmp    r3, #0
16083    bxeq   lr                   @ nothing to do - jump to real handler
16084    EXPORT_PC()
16085    mov    r0, rPC              @ arg0
16086    mov    r1, rFP              @ arg1
16087    mov    r2, rSELF            @ arg2
16088    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16089
16090/* ------------------------------ */
16091    .balign 64
16092.L_ALT_OP_AGET_BOOLEAN: /* 0x47 */
16093/* File: armv5te/alt_stub.S */
16094/*
16095 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16096 * any interesting requests and then jump to the real instruction
16097 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16098 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16099 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16100 * bail to the real handler if breakFlags==0.
16101 */
16102    ldrb   r3, [rSELF, #offThread_breakFlags]
16103    adrl   lr, dvmAsmInstructionStart + (71 * 64)
16104    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16105    cmp    r3, #0
16106    bxeq   lr                   @ nothing to do - jump to real handler
16107    EXPORT_PC()
16108    mov    r0, rPC              @ arg0
16109    mov    r1, rFP              @ arg1
16110    mov    r2, rSELF            @ arg2
16111    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16112
16113/* ------------------------------ */
16114    .balign 64
16115.L_ALT_OP_AGET_BYTE: /* 0x48 */
16116/* File: armv5te/alt_stub.S */
16117/*
16118 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16119 * any interesting requests and then jump to the real instruction
16120 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16121 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16122 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16123 * bail to the real handler if breakFlags==0.
16124 */
16125    ldrb   r3, [rSELF, #offThread_breakFlags]
16126    adrl   lr, dvmAsmInstructionStart + (72 * 64)
16127    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16128    cmp    r3, #0
16129    bxeq   lr                   @ nothing to do - jump to real handler
16130    EXPORT_PC()
16131    mov    r0, rPC              @ arg0
16132    mov    r1, rFP              @ arg1
16133    mov    r2, rSELF            @ arg2
16134    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16135
16136/* ------------------------------ */
16137    .balign 64
16138.L_ALT_OP_AGET_CHAR: /* 0x49 */
16139/* File: armv5te/alt_stub.S */
16140/*
16141 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16142 * any interesting requests and then jump to the real instruction
16143 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16144 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16145 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16146 * bail to the real handler if breakFlags==0.
16147 */
16148    ldrb   r3, [rSELF, #offThread_breakFlags]
16149    adrl   lr, dvmAsmInstructionStart + (73 * 64)
16150    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16151    cmp    r3, #0
16152    bxeq   lr                   @ nothing to do - jump to real handler
16153    EXPORT_PC()
16154    mov    r0, rPC              @ arg0
16155    mov    r1, rFP              @ arg1
16156    mov    r2, rSELF            @ arg2
16157    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16158
16159/* ------------------------------ */
16160    .balign 64
16161.L_ALT_OP_AGET_SHORT: /* 0x4a */
16162/* File: armv5te/alt_stub.S */
16163/*
16164 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16165 * any interesting requests and then jump to the real instruction
16166 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16167 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16168 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16169 * bail to the real handler if breakFlags==0.
16170 */
16171    ldrb   r3, [rSELF, #offThread_breakFlags]
16172    adrl   lr, dvmAsmInstructionStart + (74 * 64)
16173    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16174    cmp    r3, #0
16175    bxeq   lr                   @ nothing to do - jump to real handler
16176    EXPORT_PC()
16177    mov    r0, rPC              @ arg0
16178    mov    r1, rFP              @ arg1
16179    mov    r2, rSELF            @ arg2
16180    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16181
16182/* ------------------------------ */
16183    .balign 64
16184.L_ALT_OP_APUT: /* 0x4b */
16185/* File: armv5te/alt_stub.S */
16186/*
16187 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16188 * any interesting requests and then jump to the real instruction
16189 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16190 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16191 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16192 * bail to the real handler if breakFlags==0.
16193 */
16194    ldrb   r3, [rSELF, #offThread_breakFlags]
16195    adrl   lr, dvmAsmInstructionStart + (75 * 64)
16196    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16197    cmp    r3, #0
16198    bxeq   lr                   @ nothing to do - jump to real handler
16199    EXPORT_PC()
16200    mov    r0, rPC              @ arg0
16201    mov    r1, rFP              @ arg1
16202    mov    r2, rSELF            @ arg2
16203    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16204
16205/* ------------------------------ */
16206    .balign 64
16207.L_ALT_OP_APUT_WIDE: /* 0x4c */
16208/* File: armv5te/alt_stub.S */
16209/*
16210 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16211 * any interesting requests and then jump to the real instruction
16212 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16213 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16214 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16215 * bail to the real handler if breakFlags==0.
16216 */
16217    ldrb   r3, [rSELF, #offThread_breakFlags]
16218    adrl   lr, dvmAsmInstructionStart + (76 * 64)
16219    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16220    cmp    r3, #0
16221    bxeq   lr                   @ nothing to do - jump to real handler
16222    EXPORT_PC()
16223    mov    r0, rPC              @ arg0
16224    mov    r1, rFP              @ arg1
16225    mov    r2, rSELF            @ arg2
16226    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16227
16228/* ------------------------------ */
16229    .balign 64
16230.L_ALT_OP_APUT_OBJECT: /* 0x4d */
16231/* File: armv5te/alt_stub.S */
16232/*
16233 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16234 * any interesting requests and then jump to the real instruction
16235 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16236 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16237 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16238 * bail to the real handler if breakFlags==0.
16239 */
16240    ldrb   r3, [rSELF, #offThread_breakFlags]
16241    adrl   lr, dvmAsmInstructionStart + (77 * 64)
16242    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16243    cmp    r3, #0
16244    bxeq   lr                   @ nothing to do - jump to real handler
16245    EXPORT_PC()
16246    mov    r0, rPC              @ arg0
16247    mov    r1, rFP              @ arg1
16248    mov    r2, rSELF            @ arg2
16249    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16250
16251/* ------------------------------ */
16252    .balign 64
16253.L_ALT_OP_APUT_BOOLEAN: /* 0x4e */
16254/* File: armv5te/alt_stub.S */
16255/*
16256 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16257 * any interesting requests and then jump to the real instruction
16258 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16259 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16260 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16261 * bail to the real handler if breakFlags==0.
16262 */
16263    ldrb   r3, [rSELF, #offThread_breakFlags]
16264    adrl   lr, dvmAsmInstructionStart + (78 * 64)
16265    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16266    cmp    r3, #0
16267    bxeq   lr                   @ nothing to do - jump to real handler
16268    EXPORT_PC()
16269    mov    r0, rPC              @ arg0
16270    mov    r1, rFP              @ arg1
16271    mov    r2, rSELF            @ arg2
16272    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16273
16274/* ------------------------------ */
16275    .balign 64
16276.L_ALT_OP_APUT_BYTE: /* 0x4f */
16277/* File: armv5te/alt_stub.S */
16278/*
16279 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16280 * any interesting requests and then jump to the real instruction
16281 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16282 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16283 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16284 * bail to the real handler if breakFlags==0.
16285 */
16286    ldrb   r3, [rSELF, #offThread_breakFlags]
16287    adrl   lr, dvmAsmInstructionStart + (79 * 64)
16288    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16289    cmp    r3, #0
16290    bxeq   lr                   @ nothing to do - jump to real handler
16291    EXPORT_PC()
16292    mov    r0, rPC              @ arg0
16293    mov    r1, rFP              @ arg1
16294    mov    r2, rSELF            @ arg2
16295    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16296
16297/* ------------------------------ */
16298    .balign 64
16299.L_ALT_OP_APUT_CHAR: /* 0x50 */
16300/* File: armv5te/alt_stub.S */
16301/*
16302 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16303 * any interesting requests and then jump to the real instruction
16304 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16305 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16306 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16307 * bail to the real handler if breakFlags==0.
16308 */
16309    ldrb   r3, [rSELF, #offThread_breakFlags]
16310    adrl   lr, dvmAsmInstructionStart + (80 * 64)
16311    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16312    cmp    r3, #0
16313    bxeq   lr                   @ nothing to do - jump to real handler
16314    EXPORT_PC()
16315    mov    r0, rPC              @ arg0
16316    mov    r1, rFP              @ arg1
16317    mov    r2, rSELF            @ arg2
16318    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16319
16320/* ------------------------------ */
16321    .balign 64
16322.L_ALT_OP_APUT_SHORT: /* 0x51 */
16323/* File: armv5te/alt_stub.S */
16324/*
16325 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16326 * any interesting requests and then jump to the real instruction
16327 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16328 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16329 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16330 * bail to the real handler if breakFlags==0.
16331 */
16332    ldrb   r3, [rSELF, #offThread_breakFlags]
16333    adrl   lr, dvmAsmInstructionStart + (81 * 64)
16334    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16335    cmp    r3, #0
16336    bxeq   lr                   @ nothing to do - jump to real handler
16337    EXPORT_PC()
16338    mov    r0, rPC              @ arg0
16339    mov    r1, rFP              @ arg1
16340    mov    r2, rSELF            @ arg2
16341    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16342
16343/* ------------------------------ */
16344    .balign 64
16345.L_ALT_OP_IGET: /* 0x52 */
16346/* File: armv5te/alt_stub.S */
16347/*
16348 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16349 * any interesting requests and then jump to the real instruction
16350 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16351 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16352 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16353 * bail to the real handler if breakFlags==0.
16354 */
16355    ldrb   r3, [rSELF, #offThread_breakFlags]
16356    adrl   lr, dvmAsmInstructionStart + (82 * 64)
16357    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16358    cmp    r3, #0
16359    bxeq   lr                   @ nothing to do - jump to real handler
16360    EXPORT_PC()
16361    mov    r0, rPC              @ arg0
16362    mov    r1, rFP              @ arg1
16363    mov    r2, rSELF            @ arg2
16364    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16365
16366/* ------------------------------ */
16367    .balign 64
16368.L_ALT_OP_IGET_WIDE: /* 0x53 */
16369/* File: armv5te/alt_stub.S */
16370/*
16371 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16372 * any interesting requests and then jump to the real instruction
16373 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16374 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16375 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16376 * bail to the real handler if breakFlags==0.
16377 */
16378    ldrb   r3, [rSELF, #offThread_breakFlags]
16379    adrl   lr, dvmAsmInstructionStart + (83 * 64)
16380    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16381    cmp    r3, #0
16382    bxeq   lr                   @ nothing to do - jump to real handler
16383    EXPORT_PC()
16384    mov    r0, rPC              @ arg0
16385    mov    r1, rFP              @ arg1
16386    mov    r2, rSELF            @ arg2
16387    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16388
16389/* ------------------------------ */
16390    .balign 64
16391.L_ALT_OP_IGET_OBJECT: /* 0x54 */
16392/* File: armv5te/alt_stub.S */
16393/*
16394 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16395 * any interesting requests and then jump to the real instruction
16396 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16397 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16398 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16399 * bail to the real handler if breakFlags==0.
16400 */
16401    ldrb   r3, [rSELF, #offThread_breakFlags]
16402    adrl   lr, dvmAsmInstructionStart + (84 * 64)
16403    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16404    cmp    r3, #0
16405    bxeq   lr                   @ nothing to do - jump to real handler
16406    EXPORT_PC()
16407    mov    r0, rPC              @ arg0
16408    mov    r1, rFP              @ arg1
16409    mov    r2, rSELF            @ arg2
16410    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16411
16412/* ------------------------------ */
16413    .balign 64
16414.L_ALT_OP_IGET_BOOLEAN: /* 0x55 */
16415/* File: armv5te/alt_stub.S */
16416/*
16417 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16418 * any interesting requests and then jump to the real instruction
16419 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16420 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16421 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16422 * bail to the real handler if breakFlags==0.
16423 */
16424    ldrb   r3, [rSELF, #offThread_breakFlags]
16425    adrl   lr, dvmAsmInstructionStart + (85 * 64)
16426    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16427    cmp    r3, #0
16428    bxeq   lr                   @ nothing to do - jump to real handler
16429    EXPORT_PC()
16430    mov    r0, rPC              @ arg0
16431    mov    r1, rFP              @ arg1
16432    mov    r2, rSELF            @ arg2
16433    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16434
16435/* ------------------------------ */
16436    .balign 64
16437.L_ALT_OP_IGET_BYTE: /* 0x56 */
16438/* File: armv5te/alt_stub.S */
16439/*
16440 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16441 * any interesting requests and then jump to the real instruction
16442 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16443 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16444 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16445 * bail to the real handler if breakFlags==0.
16446 */
16447    ldrb   r3, [rSELF, #offThread_breakFlags]
16448    adrl   lr, dvmAsmInstructionStart + (86 * 64)
16449    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16450    cmp    r3, #0
16451    bxeq   lr                   @ nothing to do - jump to real handler
16452    EXPORT_PC()
16453    mov    r0, rPC              @ arg0
16454    mov    r1, rFP              @ arg1
16455    mov    r2, rSELF            @ arg2
16456    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16457
16458/* ------------------------------ */
16459    .balign 64
16460.L_ALT_OP_IGET_CHAR: /* 0x57 */
16461/* File: armv5te/alt_stub.S */
16462/*
16463 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16464 * any interesting requests and then jump to the real instruction
16465 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16466 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16467 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16468 * bail to the real handler if breakFlags==0.
16469 */
16470    ldrb   r3, [rSELF, #offThread_breakFlags]
16471    adrl   lr, dvmAsmInstructionStart + (87 * 64)
16472    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16473    cmp    r3, #0
16474    bxeq   lr                   @ nothing to do - jump to real handler
16475    EXPORT_PC()
16476    mov    r0, rPC              @ arg0
16477    mov    r1, rFP              @ arg1
16478    mov    r2, rSELF            @ arg2
16479    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16480
16481/* ------------------------------ */
16482    .balign 64
16483.L_ALT_OP_IGET_SHORT: /* 0x58 */
16484/* File: armv5te/alt_stub.S */
16485/*
16486 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16487 * any interesting requests and then jump to the real instruction
16488 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16489 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16490 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16491 * bail to the real handler if breakFlags==0.
16492 */
16493    ldrb   r3, [rSELF, #offThread_breakFlags]
16494    adrl   lr, dvmAsmInstructionStart + (88 * 64)
16495    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16496    cmp    r3, #0
16497    bxeq   lr                   @ nothing to do - jump to real handler
16498    EXPORT_PC()
16499    mov    r0, rPC              @ arg0
16500    mov    r1, rFP              @ arg1
16501    mov    r2, rSELF            @ arg2
16502    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16503
16504/* ------------------------------ */
16505    .balign 64
16506.L_ALT_OP_IPUT: /* 0x59 */
16507/* File: armv5te/alt_stub.S */
16508/*
16509 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16510 * any interesting requests and then jump to the real instruction
16511 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16512 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16513 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16514 * bail to the real handler if breakFlags==0.
16515 */
16516    ldrb   r3, [rSELF, #offThread_breakFlags]
16517    adrl   lr, dvmAsmInstructionStart + (89 * 64)
16518    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16519    cmp    r3, #0
16520    bxeq   lr                   @ nothing to do - jump to real handler
16521    EXPORT_PC()
16522    mov    r0, rPC              @ arg0
16523    mov    r1, rFP              @ arg1
16524    mov    r2, rSELF            @ arg2
16525    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16526
16527/* ------------------------------ */
16528    .balign 64
16529.L_ALT_OP_IPUT_WIDE: /* 0x5a */
16530/* File: armv5te/alt_stub.S */
16531/*
16532 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16533 * any interesting requests and then jump to the real instruction
16534 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16535 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16536 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16537 * bail to the real handler if breakFlags==0.
16538 */
16539    ldrb   r3, [rSELF, #offThread_breakFlags]
16540    adrl   lr, dvmAsmInstructionStart + (90 * 64)
16541    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16542    cmp    r3, #0
16543    bxeq   lr                   @ nothing to do - jump to real handler
16544    EXPORT_PC()
16545    mov    r0, rPC              @ arg0
16546    mov    r1, rFP              @ arg1
16547    mov    r2, rSELF            @ arg2
16548    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16549
16550/* ------------------------------ */
16551    .balign 64
16552.L_ALT_OP_IPUT_OBJECT: /* 0x5b */
16553/* File: armv5te/alt_stub.S */
16554/*
16555 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16556 * any interesting requests and then jump to the real instruction
16557 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16558 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16559 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16560 * bail to the real handler if breakFlags==0.
16561 */
16562    ldrb   r3, [rSELF, #offThread_breakFlags]
16563    adrl   lr, dvmAsmInstructionStart + (91 * 64)
16564    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16565    cmp    r3, #0
16566    bxeq   lr                   @ nothing to do - jump to real handler
16567    EXPORT_PC()
16568    mov    r0, rPC              @ arg0
16569    mov    r1, rFP              @ arg1
16570    mov    r2, rSELF            @ arg2
16571    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16572
16573/* ------------------------------ */
16574    .balign 64
16575.L_ALT_OP_IPUT_BOOLEAN: /* 0x5c */
16576/* File: armv5te/alt_stub.S */
16577/*
16578 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16579 * any interesting requests and then jump to the real instruction
16580 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16581 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16582 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16583 * bail to the real handler if breakFlags==0.
16584 */
16585    ldrb   r3, [rSELF, #offThread_breakFlags]
16586    adrl   lr, dvmAsmInstructionStart + (92 * 64)
16587    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16588    cmp    r3, #0
16589    bxeq   lr                   @ nothing to do - jump to real handler
16590    EXPORT_PC()
16591    mov    r0, rPC              @ arg0
16592    mov    r1, rFP              @ arg1
16593    mov    r2, rSELF            @ arg2
16594    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16595
16596/* ------------------------------ */
16597    .balign 64
16598.L_ALT_OP_IPUT_BYTE: /* 0x5d */
16599/* File: armv5te/alt_stub.S */
16600/*
16601 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16602 * any interesting requests and then jump to the real instruction
16603 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16604 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16605 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16606 * bail to the real handler if breakFlags==0.
16607 */
16608    ldrb   r3, [rSELF, #offThread_breakFlags]
16609    adrl   lr, dvmAsmInstructionStart + (93 * 64)
16610    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16611    cmp    r3, #0
16612    bxeq   lr                   @ nothing to do - jump to real handler
16613    EXPORT_PC()
16614    mov    r0, rPC              @ arg0
16615    mov    r1, rFP              @ arg1
16616    mov    r2, rSELF            @ arg2
16617    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16618
16619/* ------------------------------ */
16620    .balign 64
16621.L_ALT_OP_IPUT_CHAR: /* 0x5e */
16622/* File: armv5te/alt_stub.S */
16623/*
16624 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16625 * any interesting requests and then jump to the real instruction
16626 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16627 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16628 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16629 * bail to the real handler if breakFlags==0.
16630 */
16631    ldrb   r3, [rSELF, #offThread_breakFlags]
16632    adrl   lr, dvmAsmInstructionStart + (94 * 64)
16633    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16634    cmp    r3, #0
16635    bxeq   lr                   @ nothing to do - jump to real handler
16636    EXPORT_PC()
16637    mov    r0, rPC              @ arg0
16638    mov    r1, rFP              @ arg1
16639    mov    r2, rSELF            @ arg2
16640    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16641
16642/* ------------------------------ */
16643    .balign 64
16644.L_ALT_OP_IPUT_SHORT: /* 0x5f */
16645/* File: armv5te/alt_stub.S */
16646/*
16647 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16648 * any interesting requests and then jump to the real instruction
16649 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16650 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16651 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16652 * bail to the real handler if breakFlags==0.
16653 */
16654    ldrb   r3, [rSELF, #offThread_breakFlags]
16655    adrl   lr, dvmAsmInstructionStart + (95 * 64)
16656    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16657    cmp    r3, #0
16658    bxeq   lr                   @ nothing to do - jump to real handler
16659    EXPORT_PC()
16660    mov    r0, rPC              @ arg0
16661    mov    r1, rFP              @ arg1
16662    mov    r2, rSELF            @ arg2
16663    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16664
16665/* ------------------------------ */
16666    .balign 64
16667.L_ALT_OP_SGET: /* 0x60 */
16668/* File: armv5te/alt_stub.S */
16669/*
16670 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16671 * any interesting requests and then jump to the real instruction
16672 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16673 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16674 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16675 * bail to the real handler if breakFlags==0.
16676 */
16677    ldrb   r3, [rSELF, #offThread_breakFlags]
16678    adrl   lr, dvmAsmInstructionStart + (96 * 64)
16679    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16680    cmp    r3, #0
16681    bxeq   lr                   @ nothing to do - jump to real handler
16682    EXPORT_PC()
16683    mov    r0, rPC              @ arg0
16684    mov    r1, rFP              @ arg1
16685    mov    r2, rSELF            @ arg2
16686    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16687
16688/* ------------------------------ */
16689    .balign 64
16690.L_ALT_OP_SGET_WIDE: /* 0x61 */
16691/* File: armv5te/alt_stub.S */
16692/*
16693 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16694 * any interesting requests and then jump to the real instruction
16695 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16696 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16697 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16698 * bail to the real handler if breakFlags==0.
16699 */
16700    ldrb   r3, [rSELF, #offThread_breakFlags]
16701    adrl   lr, dvmAsmInstructionStart + (97 * 64)
16702    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16703    cmp    r3, #0
16704    bxeq   lr                   @ nothing to do - jump to real handler
16705    EXPORT_PC()
16706    mov    r0, rPC              @ arg0
16707    mov    r1, rFP              @ arg1
16708    mov    r2, rSELF            @ arg2
16709    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16710
16711/* ------------------------------ */
16712    .balign 64
16713.L_ALT_OP_SGET_OBJECT: /* 0x62 */
16714/* File: armv5te/alt_stub.S */
16715/*
16716 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16717 * any interesting requests and then jump to the real instruction
16718 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16719 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16720 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16721 * bail to the real handler if breakFlags==0.
16722 */
16723    ldrb   r3, [rSELF, #offThread_breakFlags]
16724    adrl   lr, dvmAsmInstructionStart + (98 * 64)
16725    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16726    cmp    r3, #0
16727    bxeq   lr                   @ nothing to do - jump to real handler
16728    EXPORT_PC()
16729    mov    r0, rPC              @ arg0
16730    mov    r1, rFP              @ arg1
16731    mov    r2, rSELF            @ arg2
16732    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16733
16734/* ------------------------------ */
16735    .balign 64
16736.L_ALT_OP_SGET_BOOLEAN: /* 0x63 */
16737/* File: armv5te/alt_stub.S */
16738/*
16739 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16740 * any interesting requests and then jump to the real instruction
16741 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16742 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16743 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16744 * bail to the real handler if breakFlags==0.
16745 */
16746    ldrb   r3, [rSELF, #offThread_breakFlags]
16747    adrl   lr, dvmAsmInstructionStart + (99 * 64)
16748    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16749    cmp    r3, #0
16750    bxeq   lr                   @ nothing to do - jump to real handler
16751    EXPORT_PC()
16752    mov    r0, rPC              @ arg0
16753    mov    r1, rFP              @ arg1
16754    mov    r2, rSELF            @ arg2
16755    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16756
16757/* ------------------------------ */
16758    .balign 64
16759.L_ALT_OP_SGET_BYTE: /* 0x64 */
16760/* File: armv5te/alt_stub.S */
16761/*
16762 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16763 * any interesting requests and then jump to the real instruction
16764 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16765 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16766 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16767 * bail to the real handler if breakFlags==0.
16768 */
16769    ldrb   r3, [rSELF, #offThread_breakFlags]
16770    adrl   lr, dvmAsmInstructionStart + (100 * 64)
16771    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16772    cmp    r3, #0
16773    bxeq   lr                   @ nothing to do - jump to real handler
16774    EXPORT_PC()
16775    mov    r0, rPC              @ arg0
16776    mov    r1, rFP              @ arg1
16777    mov    r2, rSELF            @ arg2
16778    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16779
16780/* ------------------------------ */
16781    .balign 64
16782.L_ALT_OP_SGET_CHAR: /* 0x65 */
16783/* File: armv5te/alt_stub.S */
16784/*
16785 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16786 * any interesting requests and then jump to the real instruction
16787 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16788 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16789 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16790 * bail to the real handler if breakFlags==0.
16791 */
16792    ldrb   r3, [rSELF, #offThread_breakFlags]
16793    adrl   lr, dvmAsmInstructionStart + (101 * 64)
16794    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16795    cmp    r3, #0
16796    bxeq   lr                   @ nothing to do - jump to real handler
16797    EXPORT_PC()
16798    mov    r0, rPC              @ arg0
16799    mov    r1, rFP              @ arg1
16800    mov    r2, rSELF            @ arg2
16801    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16802
16803/* ------------------------------ */
16804    .balign 64
16805.L_ALT_OP_SGET_SHORT: /* 0x66 */
16806/* File: armv5te/alt_stub.S */
16807/*
16808 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16809 * any interesting requests and then jump to the real instruction
16810 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16811 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16812 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16813 * bail to the real handler if breakFlags==0.
16814 */
16815    ldrb   r3, [rSELF, #offThread_breakFlags]
16816    adrl   lr, dvmAsmInstructionStart + (102 * 64)
16817    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16818    cmp    r3, #0
16819    bxeq   lr                   @ nothing to do - jump to real handler
16820    EXPORT_PC()
16821    mov    r0, rPC              @ arg0
16822    mov    r1, rFP              @ arg1
16823    mov    r2, rSELF            @ arg2
16824    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16825
16826/* ------------------------------ */
16827    .balign 64
16828.L_ALT_OP_SPUT: /* 0x67 */
16829/* File: armv5te/alt_stub.S */
16830/*
16831 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16832 * any interesting requests and then jump to the real instruction
16833 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16834 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16835 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16836 * bail to the real handler if breakFlags==0.
16837 */
16838    ldrb   r3, [rSELF, #offThread_breakFlags]
16839    adrl   lr, dvmAsmInstructionStart + (103 * 64)
16840    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16841    cmp    r3, #0
16842    bxeq   lr                   @ nothing to do - jump to real handler
16843    EXPORT_PC()
16844    mov    r0, rPC              @ arg0
16845    mov    r1, rFP              @ arg1
16846    mov    r2, rSELF            @ arg2
16847    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16848
16849/* ------------------------------ */
16850    .balign 64
16851.L_ALT_OP_SPUT_WIDE: /* 0x68 */
16852/* File: armv5te/alt_stub.S */
16853/*
16854 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16855 * any interesting requests and then jump to the real instruction
16856 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16857 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16858 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16859 * bail to the real handler if breakFlags==0.
16860 */
16861    ldrb   r3, [rSELF, #offThread_breakFlags]
16862    adrl   lr, dvmAsmInstructionStart + (104 * 64)
16863    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16864    cmp    r3, #0
16865    bxeq   lr                   @ nothing to do - jump to real handler
16866    EXPORT_PC()
16867    mov    r0, rPC              @ arg0
16868    mov    r1, rFP              @ arg1
16869    mov    r2, rSELF            @ arg2
16870    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16871
16872/* ------------------------------ */
16873    .balign 64
16874.L_ALT_OP_SPUT_OBJECT: /* 0x69 */
16875/* File: armv5te/alt_stub.S */
16876/*
16877 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16878 * any interesting requests and then jump to the real instruction
16879 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16880 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16881 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16882 * bail to the real handler if breakFlags==0.
16883 */
16884    ldrb   r3, [rSELF, #offThread_breakFlags]
16885    adrl   lr, dvmAsmInstructionStart + (105 * 64)
16886    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16887    cmp    r3, #0
16888    bxeq   lr                   @ nothing to do - jump to real handler
16889    EXPORT_PC()
16890    mov    r0, rPC              @ arg0
16891    mov    r1, rFP              @ arg1
16892    mov    r2, rSELF            @ arg2
16893    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16894
16895/* ------------------------------ */
16896    .balign 64
16897.L_ALT_OP_SPUT_BOOLEAN: /* 0x6a */
16898/* File: armv5te/alt_stub.S */
16899/*
16900 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16901 * any interesting requests and then jump to the real instruction
16902 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16903 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16904 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16905 * bail to the real handler if breakFlags==0.
16906 */
16907    ldrb   r3, [rSELF, #offThread_breakFlags]
16908    adrl   lr, dvmAsmInstructionStart + (106 * 64)
16909    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16910    cmp    r3, #0
16911    bxeq   lr                   @ nothing to do - jump to real handler
16912    EXPORT_PC()
16913    mov    r0, rPC              @ arg0
16914    mov    r1, rFP              @ arg1
16915    mov    r2, rSELF            @ arg2
16916    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16917
16918/* ------------------------------ */
16919    .balign 64
16920.L_ALT_OP_SPUT_BYTE: /* 0x6b */
16921/* File: armv5te/alt_stub.S */
16922/*
16923 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16924 * any interesting requests and then jump to the real instruction
16925 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16926 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16927 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16928 * bail to the real handler if breakFlags==0.
16929 */
16930    ldrb   r3, [rSELF, #offThread_breakFlags]
16931    adrl   lr, dvmAsmInstructionStart + (107 * 64)
16932    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16933    cmp    r3, #0
16934    bxeq   lr                   @ nothing to do - jump to real handler
16935    EXPORT_PC()
16936    mov    r0, rPC              @ arg0
16937    mov    r1, rFP              @ arg1
16938    mov    r2, rSELF            @ arg2
16939    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16940
16941/* ------------------------------ */
16942    .balign 64
16943.L_ALT_OP_SPUT_CHAR: /* 0x6c */
16944/* File: armv5te/alt_stub.S */
16945/*
16946 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16947 * any interesting requests and then jump to the real instruction
16948 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16949 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16950 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16951 * bail to the real handler if breakFlags==0.
16952 */
16953    ldrb   r3, [rSELF, #offThread_breakFlags]
16954    adrl   lr, dvmAsmInstructionStart + (108 * 64)
16955    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16956    cmp    r3, #0
16957    bxeq   lr                   @ nothing to do - jump to real handler
16958    EXPORT_PC()
16959    mov    r0, rPC              @ arg0
16960    mov    r1, rFP              @ arg1
16961    mov    r2, rSELF            @ arg2
16962    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16963
16964/* ------------------------------ */
16965    .balign 64
16966.L_ALT_OP_SPUT_SHORT: /* 0x6d */
16967/* File: armv5te/alt_stub.S */
16968/*
16969 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16970 * any interesting requests and then jump to the real instruction
16971 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16972 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16973 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16974 * bail to the real handler if breakFlags==0.
16975 */
16976    ldrb   r3, [rSELF, #offThread_breakFlags]
16977    adrl   lr, dvmAsmInstructionStart + (109 * 64)
16978    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16979    cmp    r3, #0
16980    bxeq   lr                   @ nothing to do - jump to real handler
16981    EXPORT_PC()
16982    mov    r0, rPC              @ arg0
16983    mov    r1, rFP              @ arg1
16984    mov    r2, rSELF            @ arg2
16985    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16986
16987/* ------------------------------ */
16988    .balign 64
16989.L_ALT_OP_INVOKE_VIRTUAL: /* 0x6e */
16990/* File: armv5te/alt_stub.S */
16991/*
16992 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16993 * any interesting requests and then jump to the real instruction
16994 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
16995 * rIBASE updates won't be seen until a refresh, and we can tell we have a
16996 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
16997 * bail to the real handler if breakFlags==0.
16998 */
16999    ldrb   r3, [rSELF, #offThread_breakFlags]
17000    adrl   lr, dvmAsmInstructionStart + (110 * 64)
17001    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17002    cmp    r3, #0
17003    bxeq   lr                   @ nothing to do - jump to real handler
17004    EXPORT_PC()
17005    mov    r0, rPC              @ arg0
17006    mov    r1, rFP              @ arg1
17007    mov    r2, rSELF            @ arg2
17008    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17009
17010/* ------------------------------ */
17011    .balign 64
17012.L_ALT_OP_INVOKE_SUPER: /* 0x6f */
17013/* File: armv5te/alt_stub.S */
17014/*
17015 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17016 * any interesting requests and then jump to the real instruction
17017 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17018 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17019 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17020 * bail to the real handler if breakFlags==0.
17021 */
17022    ldrb   r3, [rSELF, #offThread_breakFlags]
17023    adrl   lr, dvmAsmInstructionStart + (111 * 64)
17024    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17025    cmp    r3, #0
17026    bxeq   lr                   @ nothing to do - jump to real handler
17027    EXPORT_PC()
17028    mov    r0, rPC              @ arg0
17029    mov    r1, rFP              @ arg1
17030    mov    r2, rSELF            @ arg2
17031    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17032
17033/* ------------------------------ */
17034    .balign 64
17035.L_ALT_OP_INVOKE_DIRECT: /* 0x70 */
17036/* File: armv5te/alt_stub.S */
17037/*
17038 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17039 * any interesting requests and then jump to the real instruction
17040 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17041 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17042 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17043 * bail to the real handler if breakFlags==0.
17044 */
17045    ldrb   r3, [rSELF, #offThread_breakFlags]
17046    adrl   lr, dvmAsmInstructionStart + (112 * 64)
17047    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17048    cmp    r3, #0
17049    bxeq   lr                   @ nothing to do - jump to real handler
17050    EXPORT_PC()
17051    mov    r0, rPC              @ arg0
17052    mov    r1, rFP              @ arg1
17053    mov    r2, rSELF            @ arg2
17054    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17055
17056/* ------------------------------ */
17057    .balign 64
17058.L_ALT_OP_INVOKE_STATIC: /* 0x71 */
17059/* File: armv5te/alt_stub.S */
17060/*
17061 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17062 * any interesting requests and then jump to the real instruction
17063 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17064 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17065 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17066 * bail to the real handler if breakFlags==0.
17067 */
17068    ldrb   r3, [rSELF, #offThread_breakFlags]
17069    adrl   lr, dvmAsmInstructionStart + (113 * 64)
17070    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17071    cmp    r3, #0
17072    bxeq   lr                   @ nothing to do - jump to real handler
17073    EXPORT_PC()
17074    mov    r0, rPC              @ arg0
17075    mov    r1, rFP              @ arg1
17076    mov    r2, rSELF            @ arg2
17077    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17078
17079/* ------------------------------ */
17080    .balign 64
17081.L_ALT_OP_INVOKE_INTERFACE: /* 0x72 */
17082/* File: armv5te/alt_stub.S */
17083/*
17084 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17085 * any interesting requests and then jump to the real instruction
17086 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17087 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17088 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17089 * bail to the real handler if breakFlags==0.
17090 */
17091    ldrb   r3, [rSELF, #offThread_breakFlags]
17092    adrl   lr, dvmAsmInstructionStart + (114 * 64)
17093    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17094    cmp    r3, #0
17095    bxeq   lr                   @ nothing to do - jump to real handler
17096    EXPORT_PC()
17097    mov    r0, rPC              @ arg0
17098    mov    r1, rFP              @ arg1
17099    mov    r2, rSELF            @ arg2
17100    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17101
17102/* ------------------------------ */
17103    .balign 64
17104.L_ALT_OP_UNUSED_73: /* 0x73 */
17105/* File: armv5te/alt_stub.S */
17106/*
17107 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17108 * any interesting requests and then jump to the real instruction
17109 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17110 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17111 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17112 * bail to the real handler if breakFlags==0.
17113 */
17114    ldrb   r3, [rSELF, #offThread_breakFlags]
17115    adrl   lr, dvmAsmInstructionStart + (115 * 64)
17116    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17117    cmp    r3, #0
17118    bxeq   lr                   @ nothing to do - jump to real handler
17119    EXPORT_PC()
17120    mov    r0, rPC              @ arg0
17121    mov    r1, rFP              @ arg1
17122    mov    r2, rSELF            @ arg2
17123    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17124
17125/* ------------------------------ */
17126    .balign 64
17127.L_ALT_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
17128/* File: armv5te/alt_stub.S */
17129/*
17130 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17131 * any interesting requests and then jump to the real instruction
17132 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17133 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17134 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17135 * bail to the real handler if breakFlags==0.
17136 */
17137    ldrb   r3, [rSELF, #offThread_breakFlags]
17138    adrl   lr, dvmAsmInstructionStart + (116 * 64)
17139    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17140    cmp    r3, #0
17141    bxeq   lr                   @ nothing to do - jump to real handler
17142    EXPORT_PC()
17143    mov    r0, rPC              @ arg0
17144    mov    r1, rFP              @ arg1
17145    mov    r2, rSELF            @ arg2
17146    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17147
17148/* ------------------------------ */
17149    .balign 64
17150.L_ALT_OP_INVOKE_SUPER_RANGE: /* 0x75 */
17151/* File: armv5te/alt_stub.S */
17152/*
17153 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17154 * any interesting requests and then jump to the real instruction
17155 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17156 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17157 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17158 * bail to the real handler if breakFlags==0.
17159 */
17160    ldrb   r3, [rSELF, #offThread_breakFlags]
17161    adrl   lr, dvmAsmInstructionStart + (117 * 64)
17162    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17163    cmp    r3, #0
17164    bxeq   lr                   @ nothing to do - jump to real handler
17165    EXPORT_PC()
17166    mov    r0, rPC              @ arg0
17167    mov    r1, rFP              @ arg1
17168    mov    r2, rSELF            @ arg2
17169    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17170
17171/* ------------------------------ */
17172    .balign 64
17173.L_ALT_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
17174/* File: armv5te/alt_stub.S */
17175/*
17176 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17177 * any interesting requests and then jump to the real instruction
17178 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17179 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17180 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17181 * bail to the real handler if breakFlags==0.
17182 */
17183    ldrb   r3, [rSELF, #offThread_breakFlags]
17184    adrl   lr, dvmAsmInstructionStart + (118 * 64)
17185    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17186    cmp    r3, #0
17187    bxeq   lr                   @ nothing to do - jump to real handler
17188    EXPORT_PC()
17189    mov    r0, rPC              @ arg0
17190    mov    r1, rFP              @ arg1
17191    mov    r2, rSELF            @ arg2
17192    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17193
17194/* ------------------------------ */
17195    .balign 64
17196.L_ALT_OP_INVOKE_STATIC_RANGE: /* 0x77 */
17197/* File: armv5te/alt_stub.S */
17198/*
17199 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17200 * any interesting requests and then jump to the real instruction
17201 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17202 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17203 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17204 * bail to the real handler if breakFlags==0.
17205 */
17206    ldrb   r3, [rSELF, #offThread_breakFlags]
17207    adrl   lr, dvmAsmInstructionStart + (119 * 64)
17208    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17209    cmp    r3, #0
17210    bxeq   lr                   @ nothing to do - jump to real handler
17211    EXPORT_PC()
17212    mov    r0, rPC              @ arg0
17213    mov    r1, rFP              @ arg1
17214    mov    r2, rSELF            @ arg2
17215    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17216
17217/* ------------------------------ */
17218    .balign 64
17219.L_ALT_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
17220/* File: armv5te/alt_stub.S */
17221/*
17222 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17223 * any interesting requests and then jump to the real instruction
17224 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17225 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17226 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17227 * bail to the real handler if breakFlags==0.
17228 */
17229    ldrb   r3, [rSELF, #offThread_breakFlags]
17230    adrl   lr, dvmAsmInstructionStart + (120 * 64)
17231    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17232    cmp    r3, #0
17233    bxeq   lr                   @ nothing to do - jump to real handler
17234    EXPORT_PC()
17235    mov    r0, rPC              @ arg0
17236    mov    r1, rFP              @ arg1
17237    mov    r2, rSELF            @ arg2
17238    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17239
17240/* ------------------------------ */
17241    .balign 64
17242.L_ALT_OP_UNUSED_79: /* 0x79 */
17243/* File: armv5te/alt_stub.S */
17244/*
17245 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17246 * any interesting requests and then jump to the real instruction
17247 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17248 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17249 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17250 * bail to the real handler if breakFlags==0.
17251 */
17252    ldrb   r3, [rSELF, #offThread_breakFlags]
17253    adrl   lr, dvmAsmInstructionStart + (121 * 64)
17254    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17255    cmp    r3, #0
17256    bxeq   lr                   @ nothing to do - jump to real handler
17257    EXPORT_PC()
17258    mov    r0, rPC              @ arg0
17259    mov    r1, rFP              @ arg1
17260    mov    r2, rSELF            @ arg2
17261    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17262
17263/* ------------------------------ */
17264    .balign 64
17265.L_ALT_OP_UNUSED_7A: /* 0x7a */
17266/* File: armv5te/alt_stub.S */
17267/*
17268 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17269 * any interesting requests and then jump to the real instruction
17270 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17271 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17272 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17273 * bail to the real handler if breakFlags==0.
17274 */
17275    ldrb   r3, [rSELF, #offThread_breakFlags]
17276    adrl   lr, dvmAsmInstructionStart + (122 * 64)
17277    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17278    cmp    r3, #0
17279    bxeq   lr                   @ nothing to do - jump to real handler
17280    EXPORT_PC()
17281    mov    r0, rPC              @ arg0
17282    mov    r1, rFP              @ arg1
17283    mov    r2, rSELF            @ arg2
17284    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17285
17286/* ------------------------------ */
17287    .balign 64
17288.L_ALT_OP_NEG_INT: /* 0x7b */
17289/* File: armv5te/alt_stub.S */
17290/*
17291 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17292 * any interesting requests and then jump to the real instruction
17293 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17294 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17295 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17296 * bail to the real handler if breakFlags==0.
17297 */
17298    ldrb   r3, [rSELF, #offThread_breakFlags]
17299    adrl   lr, dvmAsmInstructionStart + (123 * 64)
17300    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17301    cmp    r3, #0
17302    bxeq   lr                   @ nothing to do - jump to real handler
17303    EXPORT_PC()
17304    mov    r0, rPC              @ arg0
17305    mov    r1, rFP              @ arg1
17306    mov    r2, rSELF            @ arg2
17307    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17308
17309/* ------------------------------ */
17310    .balign 64
17311.L_ALT_OP_NOT_INT: /* 0x7c */
17312/* File: armv5te/alt_stub.S */
17313/*
17314 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17315 * any interesting requests and then jump to the real instruction
17316 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17317 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17318 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17319 * bail to the real handler if breakFlags==0.
17320 */
17321    ldrb   r3, [rSELF, #offThread_breakFlags]
17322    adrl   lr, dvmAsmInstructionStart + (124 * 64)
17323    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17324    cmp    r3, #0
17325    bxeq   lr                   @ nothing to do - jump to real handler
17326    EXPORT_PC()
17327    mov    r0, rPC              @ arg0
17328    mov    r1, rFP              @ arg1
17329    mov    r2, rSELF            @ arg2
17330    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17331
17332/* ------------------------------ */
17333    .balign 64
17334.L_ALT_OP_NEG_LONG: /* 0x7d */
17335/* File: armv5te/alt_stub.S */
17336/*
17337 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17338 * any interesting requests and then jump to the real instruction
17339 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17340 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17341 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17342 * bail to the real handler if breakFlags==0.
17343 */
17344    ldrb   r3, [rSELF, #offThread_breakFlags]
17345    adrl   lr, dvmAsmInstructionStart + (125 * 64)
17346    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17347    cmp    r3, #0
17348    bxeq   lr                   @ nothing to do - jump to real handler
17349    EXPORT_PC()
17350    mov    r0, rPC              @ arg0
17351    mov    r1, rFP              @ arg1
17352    mov    r2, rSELF            @ arg2
17353    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17354
17355/* ------------------------------ */
17356    .balign 64
17357.L_ALT_OP_NOT_LONG: /* 0x7e */
17358/* File: armv5te/alt_stub.S */
17359/*
17360 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17361 * any interesting requests and then jump to the real instruction
17362 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17363 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17364 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17365 * bail to the real handler if breakFlags==0.
17366 */
17367    ldrb   r3, [rSELF, #offThread_breakFlags]
17368    adrl   lr, dvmAsmInstructionStart + (126 * 64)
17369    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17370    cmp    r3, #0
17371    bxeq   lr                   @ nothing to do - jump to real handler
17372    EXPORT_PC()
17373    mov    r0, rPC              @ arg0
17374    mov    r1, rFP              @ arg1
17375    mov    r2, rSELF            @ arg2
17376    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17377
17378/* ------------------------------ */
17379    .balign 64
17380.L_ALT_OP_NEG_FLOAT: /* 0x7f */
17381/* File: armv5te/alt_stub.S */
17382/*
17383 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17384 * any interesting requests and then jump to the real instruction
17385 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17386 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17387 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17388 * bail to the real handler if breakFlags==0.
17389 */
17390    ldrb   r3, [rSELF, #offThread_breakFlags]
17391    adrl   lr, dvmAsmInstructionStart + (127 * 64)
17392    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17393    cmp    r3, #0
17394    bxeq   lr                   @ nothing to do - jump to real handler
17395    EXPORT_PC()
17396    mov    r0, rPC              @ arg0
17397    mov    r1, rFP              @ arg1
17398    mov    r2, rSELF            @ arg2
17399    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17400
17401/* ------------------------------ */
17402    .balign 64
17403.L_ALT_OP_NEG_DOUBLE: /* 0x80 */
17404/* File: armv5te/alt_stub.S */
17405/*
17406 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17407 * any interesting requests and then jump to the real instruction
17408 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17409 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17410 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17411 * bail to the real handler if breakFlags==0.
17412 */
17413    ldrb   r3, [rSELF, #offThread_breakFlags]
17414    adrl   lr, dvmAsmInstructionStart + (128 * 64)
17415    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17416    cmp    r3, #0
17417    bxeq   lr                   @ nothing to do - jump to real handler
17418    EXPORT_PC()
17419    mov    r0, rPC              @ arg0
17420    mov    r1, rFP              @ arg1
17421    mov    r2, rSELF            @ arg2
17422    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17423
17424/* ------------------------------ */
17425    .balign 64
17426.L_ALT_OP_INT_TO_LONG: /* 0x81 */
17427/* File: armv5te/alt_stub.S */
17428/*
17429 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17430 * any interesting requests and then jump to the real instruction
17431 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17432 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17433 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17434 * bail to the real handler if breakFlags==0.
17435 */
17436    ldrb   r3, [rSELF, #offThread_breakFlags]
17437    adrl   lr, dvmAsmInstructionStart + (129 * 64)
17438    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17439    cmp    r3, #0
17440    bxeq   lr                   @ nothing to do - jump to real handler
17441    EXPORT_PC()
17442    mov    r0, rPC              @ arg0
17443    mov    r1, rFP              @ arg1
17444    mov    r2, rSELF            @ arg2
17445    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17446
17447/* ------------------------------ */
17448    .balign 64
17449.L_ALT_OP_INT_TO_FLOAT: /* 0x82 */
17450/* File: armv5te/alt_stub.S */
17451/*
17452 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17453 * any interesting requests and then jump to the real instruction
17454 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17455 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17456 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17457 * bail to the real handler if breakFlags==0.
17458 */
17459    ldrb   r3, [rSELF, #offThread_breakFlags]
17460    adrl   lr, dvmAsmInstructionStart + (130 * 64)
17461    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17462    cmp    r3, #0
17463    bxeq   lr                   @ nothing to do - jump to real handler
17464    EXPORT_PC()
17465    mov    r0, rPC              @ arg0
17466    mov    r1, rFP              @ arg1
17467    mov    r2, rSELF            @ arg2
17468    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17469
17470/* ------------------------------ */
17471    .balign 64
17472.L_ALT_OP_INT_TO_DOUBLE: /* 0x83 */
17473/* File: armv5te/alt_stub.S */
17474/*
17475 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17476 * any interesting requests and then jump to the real instruction
17477 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17478 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17479 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17480 * bail to the real handler if breakFlags==0.
17481 */
17482    ldrb   r3, [rSELF, #offThread_breakFlags]
17483    adrl   lr, dvmAsmInstructionStart + (131 * 64)
17484    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17485    cmp    r3, #0
17486    bxeq   lr                   @ nothing to do - jump to real handler
17487    EXPORT_PC()
17488    mov    r0, rPC              @ arg0
17489    mov    r1, rFP              @ arg1
17490    mov    r2, rSELF            @ arg2
17491    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17492
17493/* ------------------------------ */
17494    .balign 64
17495.L_ALT_OP_LONG_TO_INT: /* 0x84 */
17496/* File: armv5te/alt_stub.S */
17497/*
17498 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17499 * any interesting requests and then jump to the real instruction
17500 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17501 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17502 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17503 * bail to the real handler if breakFlags==0.
17504 */
17505    ldrb   r3, [rSELF, #offThread_breakFlags]
17506    adrl   lr, dvmAsmInstructionStart + (132 * 64)
17507    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17508    cmp    r3, #0
17509    bxeq   lr                   @ nothing to do - jump to real handler
17510    EXPORT_PC()
17511    mov    r0, rPC              @ arg0
17512    mov    r1, rFP              @ arg1
17513    mov    r2, rSELF            @ arg2
17514    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17515
17516/* ------------------------------ */
17517    .balign 64
17518.L_ALT_OP_LONG_TO_FLOAT: /* 0x85 */
17519/* File: armv5te/alt_stub.S */
17520/*
17521 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17522 * any interesting requests and then jump to the real instruction
17523 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17524 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17525 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17526 * bail to the real handler if breakFlags==0.
17527 */
17528    ldrb   r3, [rSELF, #offThread_breakFlags]
17529    adrl   lr, dvmAsmInstructionStart + (133 * 64)
17530    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17531    cmp    r3, #0
17532    bxeq   lr                   @ nothing to do - jump to real handler
17533    EXPORT_PC()
17534    mov    r0, rPC              @ arg0
17535    mov    r1, rFP              @ arg1
17536    mov    r2, rSELF            @ arg2
17537    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17538
17539/* ------------------------------ */
17540    .balign 64
17541.L_ALT_OP_LONG_TO_DOUBLE: /* 0x86 */
17542/* File: armv5te/alt_stub.S */
17543/*
17544 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17545 * any interesting requests and then jump to the real instruction
17546 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17547 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17548 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17549 * bail to the real handler if breakFlags==0.
17550 */
17551    ldrb   r3, [rSELF, #offThread_breakFlags]
17552    adrl   lr, dvmAsmInstructionStart + (134 * 64)
17553    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17554    cmp    r3, #0
17555    bxeq   lr                   @ nothing to do - jump to real handler
17556    EXPORT_PC()
17557    mov    r0, rPC              @ arg0
17558    mov    r1, rFP              @ arg1
17559    mov    r2, rSELF            @ arg2
17560    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17561
17562/* ------------------------------ */
17563    .balign 64
17564.L_ALT_OP_FLOAT_TO_INT: /* 0x87 */
17565/* File: armv5te/alt_stub.S */
17566/*
17567 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17568 * any interesting requests and then jump to the real instruction
17569 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17570 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17571 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17572 * bail to the real handler if breakFlags==0.
17573 */
17574    ldrb   r3, [rSELF, #offThread_breakFlags]
17575    adrl   lr, dvmAsmInstructionStart + (135 * 64)
17576    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17577    cmp    r3, #0
17578    bxeq   lr                   @ nothing to do - jump to real handler
17579    EXPORT_PC()
17580    mov    r0, rPC              @ arg0
17581    mov    r1, rFP              @ arg1
17582    mov    r2, rSELF            @ arg2
17583    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17584
17585/* ------------------------------ */
17586    .balign 64
17587.L_ALT_OP_FLOAT_TO_LONG: /* 0x88 */
17588/* File: armv5te/alt_stub.S */
17589/*
17590 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17591 * any interesting requests and then jump to the real instruction
17592 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17593 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17594 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17595 * bail to the real handler if breakFlags==0.
17596 */
17597    ldrb   r3, [rSELF, #offThread_breakFlags]
17598    adrl   lr, dvmAsmInstructionStart + (136 * 64)
17599    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17600    cmp    r3, #0
17601    bxeq   lr                   @ nothing to do - jump to real handler
17602    EXPORT_PC()
17603    mov    r0, rPC              @ arg0
17604    mov    r1, rFP              @ arg1
17605    mov    r2, rSELF            @ arg2
17606    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17607
17608/* ------------------------------ */
17609    .balign 64
17610.L_ALT_OP_FLOAT_TO_DOUBLE: /* 0x89 */
17611/* File: armv5te/alt_stub.S */
17612/*
17613 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17614 * any interesting requests and then jump to the real instruction
17615 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17616 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17617 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17618 * bail to the real handler if breakFlags==0.
17619 */
17620    ldrb   r3, [rSELF, #offThread_breakFlags]
17621    adrl   lr, dvmAsmInstructionStart + (137 * 64)
17622    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17623    cmp    r3, #0
17624    bxeq   lr                   @ nothing to do - jump to real handler
17625    EXPORT_PC()
17626    mov    r0, rPC              @ arg0
17627    mov    r1, rFP              @ arg1
17628    mov    r2, rSELF            @ arg2
17629    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17630
17631/* ------------------------------ */
17632    .balign 64
17633.L_ALT_OP_DOUBLE_TO_INT: /* 0x8a */
17634/* File: armv5te/alt_stub.S */
17635/*
17636 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17637 * any interesting requests and then jump to the real instruction
17638 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17639 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17640 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17641 * bail to the real handler if breakFlags==0.
17642 */
17643    ldrb   r3, [rSELF, #offThread_breakFlags]
17644    adrl   lr, dvmAsmInstructionStart + (138 * 64)
17645    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17646    cmp    r3, #0
17647    bxeq   lr                   @ nothing to do - jump to real handler
17648    EXPORT_PC()
17649    mov    r0, rPC              @ arg0
17650    mov    r1, rFP              @ arg1
17651    mov    r2, rSELF            @ arg2
17652    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17653
17654/* ------------------------------ */
17655    .balign 64
17656.L_ALT_OP_DOUBLE_TO_LONG: /* 0x8b */
17657/* File: armv5te/alt_stub.S */
17658/*
17659 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17660 * any interesting requests and then jump to the real instruction
17661 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17662 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17663 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17664 * bail to the real handler if breakFlags==0.
17665 */
17666    ldrb   r3, [rSELF, #offThread_breakFlags]
17667    adrl   lr, dvmAsmInstructionStart + (139 * 64)
17668    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17669    cmp    r3, #0
17670    bxeq   lr                   @ nothing to do - jump to real handler
17671    EXPORT_PC()
17672    mov    r0, rPC              @ arg0
17673    mov    r1, rFP              @ arg1
17674    mov    r2, rSELF            @ arg2
17675    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17676
17677/* ------------------------------ */
17678    .balign 64
17679.L_ALT_OP_DOUBLE_TO_FLOAT: /* 0x8c */
17680/* File: armv5te/alt_stub.S */
17681/*
17682 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17683 * any interesting requests and then jump to the real instruction
17684 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17685 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17686 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17687 * bail to the real handler if breakFlags==0.
17688 */
17689    ldrb   r3, [rSELF, #offThread_breakFlags]
17690    adrl   lr, dvmAsmInstructionStart + (140 * 64)
17691    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17692    cmp    r3, #0
17693    bxeq   lr                   @ nothing to do - jump to real handler
17694    EXPORT_PC()
17695    mov    r0, rPC              @ arg0
17696    mov    r1, rFP              @ arg1
17697    mov    r2, rSELF            @ arg2
17698    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17699
17700/* ------------------------------ */
17701    .balign 64
17702.L_ALT_OP_INT_TO_BYTE: /* 0x8d */
17703/* File: armv5te/alt_stub.S */
17704/*
17705 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17706 * any interesting requests and then jump to the real instruction
17707 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17708 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17709 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17710 * bail to the real handler if breakFlags==0.
17711 */
17712    ldrb   r3, [rSELF, #offThread_breakFlags]
17713    adrl   lr, dvmAsmInstructionStart + (141 * 64)
17714    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17715    cmp    r3, #0
17716    bxeq   lr                   @ nothing to do - jump to real handler
17717    EXPORT_PC()
17718    mov    r0, rPC              @ arg0
17719    mov    r1, rFP              @ arg1
17720    mov    r2, rSELF            @ arg2
17721    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17722
17723/* ------------------------------ */
17724    .balign 64
17725.L_ALT_OP_INT_TO_CHAR: /* 0x8e */
17726/* File: armv5te/alt_stub.S */
17727/*
17728 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17729 * any interesting requests and then jump to the real instruction
17730 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17731 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17732 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17733 * bail to the real handler if breakFlags==0.
17734 */
17735    ldrb   r3, [rSELF, #offThread_breakFlags]
17736    adrl   lr, dvmAsmInstructionStart + (142 * 64)
17737    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17738    cmp    r3, #0
17739    bxeq   lr                   @ nothing to do - jump to real handler
17740    EXPORT_PC()
17741    mov    r0, rPC              @ arg0
17742    mov    r1, rFP              @ arg1
17743    mov    r2, rSELF            @ arg2
17744    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17745
17746/* ------------------------------ */
17747    .balign 64
17748.L_ALT_OP_INT_TO_SHORT: /* 0x8f */
17749/* File: armv5te/alt_stub.S */
17750/*
17751 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17752 * any interesting requests and then jump to the real instruction
17753 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17754 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17755 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17756 * bail to the real handler if breakFlags==0.
17757 */
17758    ldrb   r3, [rSELF, #offThread_breakFlags]
17759    adrl   lr, dvmAsmInstructionStart + (143 * 64)
17760    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17761    cmp    r3, #0
17762    bxeq   lr                   @ nothing to do - jump to real handler
17763    EXPORT_PC()
17764    mov    r0, rPC              @ arg0
17765    mov    r1, rFP              @ arg1
17766    mov    r2, rSELF            @ arg2
17767    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17768
17769/* ------------------------------ */
17770    .balign 64
17771.L_ALT_OP_ADD_INT: /* 0x90 */
17772/* File: armv5te/alt_stub.S */
17773/*
17774 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17775 * any interesting requests and then jump to the real instruction
17776 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17777 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17778 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17779 * bail to the real handler if breakFlags==0.
17780 */
17781    ldrb   r3, [rSELF, #offThread_breakFlags]
17782    adrl   lr, dvmAsmInstructionStart + (144 * 64)
17783    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17784    cmp    r3, #0
17785    bxeq   lr                   @ nothing to do - jump to real handler
17786    EXPORT_PC()
17787    mov    r0, rPC              @ arg0
17788    mov    r1, rFP              @ arg1
17789    mov    r2, rSELF            @ arg2
17790    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17791
17792/* ------------------------------ */
17793    .balign 64
17794.L_ALT_OP_SUB_INT: /* 0x91 */
17795/* File: armv5te/alt_stub.S */
17796/*
17797 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17798 * any interesting requests and then jump to the real instruction
17799 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17800 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17801 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17802 * bail to the real handler if breakFlags==0.
17803 */
17804    ldrb   r3, [rSELF, #offThread_breakFlags]
17805    adrl   lr, dvmAsmInstructionStart + (145 * 64)
17806    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17807    cmp    r3, #0
17808    bxeq   lr                   @ nothing to do - jump to real handler
17809    EXPORT_PC()
17810    mov    r0, rPC              @ arg0
17811    mov    r1, rFP              @ arg1
17812    mov    r2, rSELF            @ arg2
17813    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17814
17815/* ------------------------------ */
17816    .balign 64
17817.L_ALT_OP_MUL_INT: /* 0x92 */
17818/* File: armv5te/alt_stub.S */
17819/*
17820 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17821 * any interesting requests and then jump to the real instruction
17822 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17823 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17824 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17825 * bail to the real handler if breakFlags==0.
17826 */
17827    ldrb   r3, [rSELF, #offThread_breakFlags]
17828    adrl   lr, dvmAsmInstructionStart + (146 * 64)
17829    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17830    cmp    r3, #0
17831    bxeq   lr                   @ nothing to do - jump to real handler
17832    EXPORT_PC()
17833    mov    r0, rPC              @ arg0
17834    mov    r1, rFP              @ arg1
17835    mov    r2, rSELF            @ arg2
17836    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17837
17838/* ------------------------------ */
17839    .balign 64
17840.L_ALT_OP_DIV_INT: /* 0x93 */
17841/* File: armv5te/alt_stub.S */
17842/*
17843 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17844 * any interesting requests and then jump to the real instruction
17845 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17846 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17847 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17848 * bail to the real handler if breakFlags==0.
17849 */
17850    ldrb   r3, [rSELF, #offThread_breakFlags]
17851    adrl   lr, dvmAsmInstructionStart + (147 * 64)
17852    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17853    cmp    r3, #0
17854    bxeq   lr                   @ nothing to do - jump to real handler
17855    EXPORT_PC()
17856    mov    r0, rPC              @ arg0
17857    mov    r1, rFP              @ arg1
17858    mov    r2, rSELF            @ arg2
17859    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17860
17861/* ------------------------------ */
17862    .balign 64
17863.L_ALT_OP_REM_INT: /* 0x94 */
17864/* File: armv5te/alt_stub.S */
17865/*
17866 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17867 * any interesting requests and then jump to the real instruction
17868 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17869 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17870 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17871 * bail to the real handler if breakFlags==0.
17872 */
17873    ldrb   r3, [rSELF, #offThread_breakFlags]
17874    adrl   lr, dvmAsmInstructionStart + (148 * 64)
17875    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17876    cmp    r3, #0
17877    bxeq   lr                   @ nothing to do - jump to real handler
17878    EXPORT_PC()
17879    mov    r0, rPC              @ arg0
17880    mov    r1, rFP              @ arg1
17881    mov    r2, rSELF            @ arg2
17882    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17883
17884/* ------------------------------ */
17885    .balign 64
17886.L_ALT_OP_AND_INT: /* 0x95 */
17887/* File: armv5te/alt_stub.S */
17888/*
17889 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17890 * any interesting requests and then jump to the real instruction
17891 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17892 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17893 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17894 * bail to the real handler if breakFlags==0.
17895 */
17896    ldrb   r3, [rSELF, #offThread_breakFlags]
17897    adrl   lr, dvmAsmInstructionStart + (149 * 64)
17898    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17899    cmp    r3, #0
17900    bxeq   lr                   @ nothing to do - jump to real handler
17901    EXPORT_PC()
17902    mov    r0, rPC              @ arg0
17903    mov    r1, rFP              @ arg1
17904    mov    r2, rSELF            @ arg2
17905    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17906
17907/* ------------------------------ */
17908    .balign 64
17909.L_ALT_OP_OR_INT: /* 0x96 */
17910/* File: armv5te/alt_stub.S */
17911/*
17912 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17913 * any interesting requests and then jump to the real instruction
17914 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17915 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17916 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17917 * bail to the real handler if breakFlags==0.
17918 */
17919    ldrb   r3, [rSELF, #offThread_breakFlags]
17920    adrl   lr, dvmAsmInstructionStart + (150 * 64)
17921    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17922    cmp    r3, #0
17923    bxeq   lr                   @ nothing to do - jump to real handler
17924    EXPORT_PC()
17925    mov    r0, rPC              @ arg0
17926    mov    r1, rFP              @ arg1
17927    mov    r2, rSELF            @ arg2
17928    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17929
17930/* ------------------------------ */
17931    .balign 64
17932.L_ALT_OP_XOR_INT: /* 0x97 */
17933/* File: armv5te/alt_stub.S */
17934/*
17935 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17936 * any interesting requests and then jump to the real instruction
17937 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17938 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17939 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17940 * bail to the real handler if breakFlags==0.
17941 */
17942    ldrb   r3, [rSELF, #offThread_breakFlags]
17943    adrl   lr, dvmAsmInstructionStart + (151 * 64)
17944    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17945    cmp    r3, #0
17946    bxeq   lr                   @ nothing to do - jump to real handler
17947    EXPORT_PC()
17948    mov    r0, rPC              @ arg0
17949    mov    r1, rFP              @ arg1
17950    mov    r2, rSELF            @ arg2
17951    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17952
17953/* ------------------------------ */
17954    .balign 64
17955.L_ALT_OP_SHL_INT: /* 0x98 */
17956/* File: armv5te/alt_stub.S */
17957/*
17958 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17959 * any interesting requests and then jump to the real instruction
17960 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17961 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17962 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17963 * bail to the real handler if breakFlags==0.
17964 */
17965    ldrb   r3, [rSELF, #offThread_breakFlags]
17966    adrl   lr, dvmAsmInstructionStart + (152 * 64)
17967    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17968    cmp    r3, #0
17969    bxeq   lr                   @ nothing to do - jump to real handler
17970    EXPORT_PC()
17971    mov    r0, rPC              @ arg0
17972    mov    r1, rFP              @ arg1
17973    mov    r2, rSELF            @ arg2
17974    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17975
17976/* ------------------------------ */
17977    .balign 64
17978.L_ALT_OP_SHR_INT: /* 0x99 */
17979/* File: armv5te/alt_stub.S */
17980/*
17981 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
17982 * any interesting requests and then jump to the real instruction
17983 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
17984 * rIBASE updates won't be seen until a refresh, and we can tell we have a
17985 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
17986 * bail to the real handler if breakFlags==0.
17987 */
17988    ldrb   r3, [rSELF, #offThread_breakFlags]
17989    adrl   lr, dvmAsmInstructionStart + (153 * 64)
17990    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
17991    cmp    r3, #0
17992    bxeq   lr                   @ nothing to do - jump to real handler
17993    EXPORT_PC()
17994    mov    r0, rPC              @ arg0
17995    mov    r1, rFP              @ arg1
17996    mov    r2, rSELF            @ arg2
17997    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
17998
17999/* ------------------------------ */
18000    .balign 64
18001.L_ALT_OP_USHR_INT: /* 0x9a */
18002/* File: armv5te/alt_stub.S */
18003/*
18004 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18005 * any interesting requests and then jump to the real instruction
18006 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18007 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18008 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18009 * bail to the real handler if breakFlags==0.
18010 */
18011    ldrb   r3, [rSELF, #offThread_breakFlags]
18012    adrl   lr, dvmAsmInstructionStart + (154 * 64)
18013    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18014    cmp    r3, #0
18015    bxeq   lr                   @ nothing to do - jump to real handler
18016    EXPORT_PC()
18017    mov    r0, rPC              @ arg0
18018    mov    r1, rFP              @ arg1
18019    mov    r2, rSELF            @ arg2
18020    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18021
18022/* ------------------------------ */
18023    .balign 64
18024.L_ALT_OP_ADD_LONG: /* 0x9b */
18025/* File: armv5te/alt_stub.S */
18026/*
18027 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18028 * any interesting requests and then jump to the real instruction
18029 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18030 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18031 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18032 * bail to the real handler if breakFlags==0.
18033 */
18034    ldrb   r3, [rSELF, #offThread_breakFlags]
18035    adrl   lr, dvmAsmInstructionStart + (155 * 64)
18036    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18037    cmp    r3, #0
18038    bxeq   lr                   @ nothing to do - jump to real handler
18039    EXPORT_PC()
18040    mov    r0, rPC              @ arg0
18041    mov    r1, rFP              @ arg1
18042    mov    r2, rSELF            @ arg2
18043    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18044
18045/* ------------------------------ */
18046    .balign 64
18047.L_ALT_OP_SUB_LONG: /* 0x9c */
18048/* File: armv5te/alt_stub.S */
18049/*
18050 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18051 * any interesting requests and then jump to the real instruction
18052 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18053 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18054 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18055 * bail to the real handler if breakFlags==0.
18056 */
18057    ldrb   r3, [rSELF, #offThread_breakFlags]
18058    adrl   lr, dvmAsmInstructionStart + (156 * 64)
18059    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18060    cmp    r3, #0
18061    bxeq   lr                   @ nothing to do - jump to real handler
18062    EXPORT_PC()
18063    mov    r0, rPC              @ arg0
18064    mov    r1, rFP              @ arg1
18065    mov    r2, rSELF            @ arg2
18066    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18067
18068/* ------------------------------ */
18069    .balign 64
18070.L_ALT_OP_MUL_LONG: /* 0x9d */
18071/* File: armv5te/alt_stub.S */
18072/*
18073 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18074 * any interesting requests and then jump to the real instruction
18075 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18076 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18077 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18078 * bail to the real handler if breakFlags==0.
18079 */
18080    ldrb   r3, [rSELF, #offThread_breakFlags]
18081    adrl   lr, dvmAsmInstructionStart + (157 * 64)
18082    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18083    cmp    r3, #0
18084    bxeq   lr                   @ nothing to do - jump to real handler
18085    EXPORT_PC()
18086    mov    r0, rPC              @ arg0
18087    mov    r1, rFP              @ arg1
18088    mov    r2, rSELF            @ arg2
18089    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18090
18091/* ------------------------------ */
18092    .balign 64
18093.L_ALT_OP_DIV_LONG: /* 0x9e */
18094/* File: armv5te/alt_stub.S */
18095/*
18096 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18097 * any interesting requests and then jump to the real instruction
18098 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18099 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18100 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18101 * bail to the real handler if breakFlags==0.
18102 */
18103    ldrb   r3, [rSELF, #offThread_breakFlags]
18104    adrl   lr, dvmAsmInstructionStart + (158 * 64)
18105    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18106    cmp    r3, #0
18107    bxeq   lr                   @ nothing to do - jump to real handler
18108    EXPORT_PC()
18109    mov    r0, rPC              @ arg0
18110    mov    r1, rFP              @ arg1
18111    mov    r2, rSELF            @ arg2
18112    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18113
18114/* ------------------------------ */
18115    .balign 64
18116.L_ALT_OP_REM_LONG: /* 0x9f */
18117/* File: armv5te/alt_stub.S */
18118/*
18119 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18120 * any interesting requests and then jump to the real instruction
18121 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18122 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18123 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18124 * bail to the real handler if breakFlags==0.
18125 */
18126    ldrb   r3, [rSELF, #offThread_breakFlags]
18127    adrl   lr, dvmAsmInstructionStart + (159 * 64)
18128    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18129    cmp    r3, #0
18130    bxeq   lr                   @ nothing to do - jump to real handler
18131    EXPORT_PC()
18132    mov    r0, rPC              @ arg0
18133    mov    r1, rFP              @ arg1
18134    mov    r2, rSELF            @ arg2
18135    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18136
18137/* ------------------------------ */
18138    .balign 64
18139.L_ALT_OP_AND_LONG: /* 0xa0 */
18140/* File: armv5te/alt_stub.S */
18141/*
18142 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18143 * any interesting requests and then jump to the real instruction
18144 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18145 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18146 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18147 * bail to the real handler if breakFlags==0.
18148 */
18149    ldrb   r3, [rSELF, #offThread_breakFlags]
18150    adrl   lr, dvmAsmInstructionStart + (160 * 64)
18151    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18152    cmp    r3, #0
18153    bxeq   lr                   @ nothing to do - jump to real handler
18154    EXPORT_PC()
18155    mov    r0, rPC              @ arg0
18156    mov    r1, rFP              @ arg1
18157    mov    r2, rSELF            @ arg2
18158    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18159
18160/* ------------------------------ */
18161    .balign 64
18162.L_ALT_OP_OR_LONG: /* 0xa1 */
18163/* File: armv5te/alt_stub.S */
18164/*
18165 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18166 * any interesting requests and then jump to the real instruction
18167 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18168 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18169 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18170 * bail to the real handler if breakFlags==0.
18171 */
18172    ldrb   r3, [rSELF, #offThread_breakFlags]
18173    adrl   lr, dvmAsmInstructionStart + (161 * 64)
18174    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18175    cmp    r3, #0
18176    bxeq   lr                   @ nothing to do - jump to real handler
18177    EXPORT_PC()
18178    mov    r0, rPC              @ arg0
18179    mov    r1, rFP              @ arg1
18180    mov    r2, rSELF            @ arg2
18181    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18182
18183/* ------------------------------ */
18184    .balign 64
18185.L_ALT_OP_XOR_LONG: /* 0xa2 */
18186/* File: armv5te/alt_stub.S */
18187/*
18188 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18189 * any interesting requests and then jump to the real instruction
18190 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18191 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18192 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18193 * bail to the real handler if breakFlags==0.
18194 */
18195    ldrb   r3, [rSELF, #offThread_breakFlags]
18196    adrl   lr, dvmAsmInstructionStart + (162 * 64)
18197    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18198    cmp    r3, #0
18199    bxeq   lr                   @ nothing to do - jump to real handler
18200    EXPORT_PC()
18201    mov    r0, rPC              @ arg0
18202    mov    r1, rFP              @ arg1
18203    mov    r2, rSELF            @ arg2
18204    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18205
18206/* ------------------------------ */
18207    .balign 64
18208.L_ALT_OP_SHL_LONG: /* 0xa3 */
18209/* File: armv5te/alt_stub.S */
18210/*
18211 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18212 * any interesting requests and then jump to the real instruction
18213 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18214 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18215 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18216 * bail to the real handler if breakFlags==0.
18217 */
18218    ldrb   r3, [rSELF, #offThread_breakFlags]
18219    adrl   lr, dvmAsmInstructionStart + (163 * 64)
18220    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18221    cmp    r3, #0
18222    bxeq   lr                   @ nothing to do - jump to real handler
18223    EXPORT_PC()
18224    mov    r0, rPC              @ arg0
18225    mov    r1, rFP              @ arg1
18226    mov    r2, rSELF            @ arg2
18227    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18228
18229/* ------------------------------ */
18230    .balign 64
18231.L_ALT_OP_SHR_LONG: /* 0xa4 */
18232/* File: armv5te/alt_stub.S */
18233/*
18234 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18235 * any interesting requests and then jump to the real instruction
18236 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18237 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18238 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18239 * bail to the real handler if breakFlags==0.
18240 */
18241    ldrb   r3, [rSELF, #offThread_breakFlags]
18242    adrl   lr, dvmAsmInstructionStart + (164 * 64)
18243    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18244    cmp    r3, #0
18245    bxeq   lr                   @ nothing to do - jump to real handler
18246    EXPORT_PC()
18247    mov    r0, rPC              @ arg0
18248    mov    r1, rFP              @ arg1
18249    mov    r2, rSELF            @ arg2
18250    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18251
18252/* ------------------------------ */
18253    .balign 64
18254.L_ALT_OP_USHR_LONG: /* 0xa5 */
18255/* File: armv5te/alt_stub.S */
18256/*
18257 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18258 * any interesting requests and then jump to the real instruction
18259 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18260 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18261 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18262 * bail to the real handler if breakFlags==0.
18263 */
18264    ldrb   r3, [rSELF, #offThread_breakFlags]
18265    adrl   lr, dvmAsmInstructionStart + (165 * 64)
18266    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18267    cmp    r3, #0
18268    bxeq   lr                   @ nothing to do - jump to real handler
18269    EXPORT_PC()
18270    mov    r0, rPC              @ arg0
18271    mov    r1, rFP              @ arg1
18272    mov    r2, rSELF            @ arg2
18273    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18274
18275/* ------------------------------ */
18276    .balign 64
18277.L_ALT_OP_ADD_FLOAT: /* 0xa6 */
18278/* File: armv5te/alt_stub.S */
18279/*
18280 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18281 * any interesting requests and then jump to the real instruction
18282 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18283 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18284 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18285 * bail to the real handler if breakFlags==0.
18286 */
18287    ldrb   r3, [rSELF, #offThread_breakFlags]
18288    adrl   lr, dvmAsmInstructionStart + (166 * 64)
18289    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18290    cmp    r3, #0
18291    bxeq   lr                   @ nothing to do - jump to real handler
18292    EXPORT_PC()
18293    mov    r0, rPC              @ arg0
18294    mov    r1, rFP              @ arg1
18295    mov    r2, rSELF            @ arg2
18296    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18297
18298/* ------------------------------ */
18299    .balign 64
18300.L_ALT_OP_SUB_FLOAT: /* 0xa7 */
18301/* File: armv5te/alt_stub.S */
18302/*
18303 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18304 * any interesting requests and then jump to the real instruction
18305 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18306 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18307 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18308 * bail to the real handler if breakFlags==0.
18309 */
18310    ldrb   r3, [rSELF, #offThread_breakFlags]
18311    adrl   lr, dvmAsmInstructionStart + (167 * 64)
18312    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18313    cmp    r3, #0
18314    bxeq   lr                   @ nothing to do - jump to real handler
18315    EXPORT_PC()
18316    mov    r0, rPC              @ arg0
18317    mov    r1, rFP              @ arg1
18318    mov    r2, rSELF            @ arg2
18319    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18320
18321/* ------------------------------ */
18322    .balign 64
18323.L_ALT_OP_MUL_FLOAT: /* 0xa8 */
18324/* File: armv5te/alt_stub.S */
18325/*
18326 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18327 * any interesting requests and then jump to the real instruction
18328 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18329 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18330 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18331 * bail to the real handler if breakFlags==0.
18332 */
18333    ldrb   r3, [rSELF, #offThread_breakFlags]
18334    adrl   lr, dvmAsmInstructionStart + (168 * 64)
18335    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18336    cmp    r3, #0
18337    bxeq   lr                   @ nothing to do - jump to real handler
18338    EXPORT_PC()
18339    mov    r0, rPC              @ arg0
18340    mov    r1, rFP              @ arg1
18341    mov    r2, rSELF            @ arg2
18342    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18343
18344/* ------------------------------ */
18345    .balign 64
18346.L_ALT_OP_DIV_FLOAT: /* 0xa9 */
18347/* File: armv5te/alt_stub.S */
18348/*
18349 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18350 * any interesting requests and then jump to the real instruction
18351 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18352 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18353 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18354 * bail to the real handler if breakFlags==0.
18355 */
18356    ldrb   r3, [rSELF, #offThread_breakFlags]
18357    adrl   lr, dvmAsmInstructionStart + (169 * 64)
18358    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18359    cmp    r3, #0
18360    bxeq   lr                   @ nothing to do - jump to real handler
18361    EXPORT_PC()
18362    mov    r0, rPC              @ arg0
18363    mov    r1, rFP              @ arg1
18364    mov    r2, rSELF            @ arg2
18365    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18366
18367/* ------------------------------ */
18368    .balign 64
18369.L_ALT_OP_REM_FLOAT: /* 0xaa */
18370/* File: armv5te/alt_stub.S */
18371/*
18372 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18373 * any interesting requests and then jump to the real instruction
18374 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18375 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18376 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18377 * bail to the real handler if breakFlags==0.
18378 */
18379    ldrb   r3, [rSELF, #offThread_breakFlags]
18380    adrl   lr, dvmAsmInstructionStart + (170 * 64)
18381    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18382    cmp    r3, #0
18383    bxeq   lr                   @ nothing to do - jump to real handler
18384    EXPORT_PC()
18385    mov    r0, rPC              @ arg0
18386    mov    r1, rFP              @ arg1
18387    mov    r2, rSELF            @ arg2
18388    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18389
18390/* ------------------------------ */
18391    .balign 64
18392.L_ALT_OP_ADD_DOUBLE: /* 0xab */
18393/* File: armv5te/alt_stub.S */
18394/*
18395 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18396 * any interesting requests and then jump to the real instruction
18397 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18398 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18399 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18400 * bail to the real handler if breakFlags==0.
18401 */
18402    ldrb   r3, [rSELF, #offThread_breakFlags]
18403    adrl   lr, dvmAsmInstructionStart + (171 * 64)
18404    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18405    cmp    r3, #0
18406    bxeq   lr                   @ nothing to do - jump to real handler
18407    EXPORT_PC()
18408    mov    r0, rPC              @ arg0
18409    mov    r1, rFP              @ arg1
18410    mov    r2, rSELF            @ arg2
18411    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18412
18413/* ------------------------------ */
18414    .balign 64
18415.L_ALT_OP_SUB_DOUBLE: /* 0xac */
18416/* File: armv5te/alt_stub.S */
18417/*
18418 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18419 * any interesting requests and then jump to the real instruction
18420 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18421 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18422 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18423 * bail to the real handler if breakFlags==0.
18424 */
18425    ldrb   r3, [rSELF, #offThread_breakFlags]
18426    adrl   lr, dvmAsmInstructionStart + (172 * 64)
18427    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18428    cmp    r3, #0
18429    bxeq   lr                   @ nothing to do - jump to real handler
18430    EXPORT_PC()
18431    mov    r0, rPC              @ arg0
18432    mov    r1, rFP              @ arg1
18433    mov    r2, rSELF            @ arg2
18434    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18435
18436/* ------------------------------ */
18437    .balign 64
18438.L_ALT_OP_MUL_DOUBLE: /* 0xad */
18439/* File: armv5te/alt_stub.S */
18440/*
18441 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18442 * any interesting requests and then jump to the real instruction
18443 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18444 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18445 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18446 * bail to the real handler if breakFlags==0.
18447 */
18448    ldrb   r3, [rSELF, #offThread_breakFlags]
18449    adrl   lr, dvmAsmInstructionStart + (173 * 64)
18450    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18451    cmp    r3, #0
18452    bxeq   lr                   @ nothing to do - jump to real handler
18453    EXPORT_PC()
18454    mov    r0, rPC              @ arg0
18455    mov    r1, rFP              @ arg1
18456    mov    r2, rSELF            @ arg2
18457    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18458
18459/* ------------------------------ */
18460    .balign 64
18461.L_ALT_OP_DIV_DOUBLE: /* 0xae */
18462/* File: armv5te/alt_stub.S */
18463/*
18464 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18465 * any interesting requests and then jump to the real instruction
18466 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18467 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18468 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18469 * bail to the real handler if breakFlags==0.
18470 */
18471    ldrb   r3, [rSELF, #offThread_breakFlags]
18472    adrl   lr, dvmAsmInstructionStart + (174 * 64)
18473    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18474    cmp    r3, #0
18475    bxeq   lr                   @ nothing to do - jump to real handler
18476    EXPORT_PC()
18477    mov    r0, rPC              @ arg0
18478    mov    r1, rFP              @ arg1
18479    mov    r2, rSELF            @ arg2
18480    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18481
18482/* ------------------------------ */
18483    .balign 64
18484.L_ALT_OP_REM_DOUBLE: /* 0xaf */
18485/* File: armv5te/alt_stub.S */
18486/*
18487 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18488 * any interesting requests and then jump to the real instruction
18489 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18490 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18491 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18492 * bail to the real handler if breakFlags==0.
18493 */
18494    ldrb   r3, [rSELF, #offThread_breakFlags]
18495    adrl   lr, dvmAsmInstructionStart + (175 * 64)
18496    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18497    cmp    r3, #0
18498    bxeq   lr                   @ nothing to do - jump to real handler
18499    EXPORT_PC()
18500    mov    r0, rPC              @ arg0
18501    mov    r1, rFP              @ arg1
18502    mov    r2, rSELF            @ arg2
18503    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18504
18505/* ------------------------------ */
18506    .balign 64
18507.L_ALT_OP_ADD_INT_2ADDR: /* 0xb0 */
18508/* File: armv5te/alt_stub.S */
18509/*
18510 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18511 * any interesting requests and then jump to the real instruction
18512 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18513 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18514 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18515 * bail to the real handler if breakFlags==0.
18516 */
18517    ldrb   r3, [rSELF, #offThread_breakFlags]
18518    adrl   lr, dvmAsmInstructionStart + (176 * 64)
18519    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18520    cmp    r3, #0
18521    bxeq   lr                   @ nothing to do - jump to real handler
18522    EXPORT_PC()
18523    mov    r0, rPC              @ arg0
18524    mov    r1, rFP              @ arg1
18525    mov    r2, rSELF            @ arg2
18526    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18527
18528/* ------------------------------ */
18529    .balign 64
18530.L_ALT_OP_SUB_INT_2ADDR: /* 0xb1 */
18531/* File: armv5te/alt_stub.S */
18532/*
18533 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18534 * any interesting requests and then jump to the real instruction
18535 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18536 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18537 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18538 * bail to the real handler if breakFlags==0.
18539 */
18540    ldrb   r3, [rSELF, #offThread_breakFlags]
18541    adrl   lr, dvmAsmInstructionStart + (177 * 64)
18542    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18543    cmp    r3, #0
18544    bxeq   lr                   @ nothing to do - jump to real handler
18545    EXPORT_PC()
18546    mov    r0, rPC              @ arg0
18547    mov    r1, rFP              @ arg1
18548    mov    r2, rSELF            @ arg2
18549    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18550
18551/* ------------------------------ */
18552    .balign 64
18553.L_ALT_OP_MUL_INT_2ADDR: /* 0xb2 */
18554/* File: armv5te/alt_stub.S */
18555/*
18556 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18557 * any interesting requests and then jump to the real instruction
18558 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18559 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18560 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18561 * bail to the real handler if breakFlags==0.
18562 */
18563    ldrb   r3, [rSELF, #offThread_breakFlags]
18564    adrl   lr, dvmAsmInstructionStart + (178 * 64)
18565    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18566    cmp    r3, #0
18567    bxeq   lr                   @ nothing to do - jump to real handler
18568    EXPORT_PC()
18569    mov    r0, rPC              @ arg0
18570    mov    r1, rFP              @ arg1
18571    mov    r2, rSELF            @ arg2
18572    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18573
18574/* ------------------------------ */
18575    .balign 64
18576.L_ALT_OP_DIV_INT_2ADDR: /* 0xb3 */
18577/* File: armv5te/alt_stub.S */
18578/*
18579 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18580 * any interesting requests and then jump to the real instruction
18581 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18582 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18583 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18584 * bail to the real handler if breakFlags==0.
18585 */
18586    ldrb   r3, [rSELF, #offThread_breakFlags]
18587    adrl   lr, dvmAsmInstructionStart + (179 * 64)
18588    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18589    cmp    r3, #0
18590    bxeq   lr                   @ nothing to do - jump to real handler
18591    EXPORT_PC()
18592    mov    r0, rPC              @ arg0
18593    mov    r1, rFP              @ arg1
18594    mov    r2, rSELF            @ arg2
18595    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18596
18597/* ------------------------------ */
18598    .balign 64
18599.L_ALT_OP_REM_INT_2ADDR: /* 0xb4 */
18600/* File: armv5te/alt_stub.S */
18601/*
18602 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18603 * any interesting requests and then jump to the real instruction
18604 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18605 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18606 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18607 * bail to the real handler if breakFlags==0.
18608 */
18609    ldrb   r3, [rSELF, #offThread_breakFlags]
18610    adrl   lr, dvmAsmInstructionStart + (180 * 64)
18611    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18612    cmp    r3, #0
18613    bxeq   lr                   @ nothing to do - jump to real handler
18614    EXPORT_PC()
18615    mov    r0, rPC              @ arg0
18616    mov    r1, rFP              @ arg1
18617    mov    r2, rSELF            @ arg2
18618    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18619
18620/* ------------------------------ */
18621    .balign 64
18622.L_ALT_OP_AND_INT_2ADDR: /* 0xb5 */
18623/* File: armv5te/alt_stub.S */
18624/*
18625 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18626 * any interesting requests and then jump to the real instruction
18627 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18628 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18629 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18630 * bail to the real handler if breakFlags==0.
18631 */
18632    ldrb   r3, [rSELF, #offThread_breakFlags]
18633    adrl   lr, dvmAsmInstructionStart + (181 * 64)
18634    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18635    cmp    r3, #0
18636    bxeq   lr                   @ nothing to do - jump to real handler
18637    EXPORT_PC()
18638    mov    r0, rPC              @ arg0
18639    mov    r1, rFP              @ arg1
18640    mov    r2, rSELF            @ arg2
18641    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18642
18643/* ------------------------------ */
18644    .balign 64
18645.L_ALT_OP_OR_INT_2ADDR: /* 0xb6 */
18646/* File: armv5te/alt_stub.S */
18647/*
18648 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18649 * any interesting requests and then jump to the real instruction
18650 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18651 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18652 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18653 * bail to the real handler if breakFlags==0.
18654 */
18655    ldrb   r3, [rSELF, #offThread_breakFlags]
18656    adrl   lr, dvmAsmInstructionStart + (182 * 64)
18657    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18658    cmp    r3, #0
18659    bxeq   lr                   @ nothing to do - jump to real handler
18660    EXPORT_PC()
18661    mov    r0, rPC              @ arg0
18662    mov    r1, rFP              @ arg1
18663    mov    r2, rSELF            @ arg2
18664    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18665
18666/* ------------------------------ */
18667    .balign 64
18668.L_ALT_OP_XOR_INT_2ADDR: /* 0xb7 */
18669/* File: armv5te/alt_stub.S */
18670/*
18671 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18672 * any interesting requests and then jump to the real instruction
18673 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18674 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18675 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18676 * bail to the real handler if breakFlags==0.
18677 */
18678    ldrb   r3, [rSELF, #offThread_breakFlags]
18679    adrl   lr, dvmAsmInstructionStart + (183 * 64)
18680    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18681    cmp    r3, #0
18682    bxeq   lr                   @ nothing to do - jump to real handler
18683    EXPORT_PC()
18684    mov    r0, rPC              @ arg0
18685    mov    r1, rFP              @ arg1
18686    mov    r2, rSELF            @ arg2
18687    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18688
18689/* ------------------------------ */
18690    .balign 64
18691.L_ALT_OP_SHL_INT_2ADDR: /* 0xb8 */
18692/* File: armv5te/alt_stub.S */
18693/*
18694 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18695 * any interesting requests and then jump to the real instruction
18696 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18697 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18698 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18699 * bail to the real handler if breakFlags==0.
18700 */
18701    ldrb   r3, [rSELF, #offThread_breakFlags]
18702    adrl   lr, dvmAsmInstructionStart + (184 * 64)
18703    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18704    cmp    r3, #0
18705    bxeq   lr                   @ nothing to do - jump to real handler
18706    EXPORT_PC()
18707    mov    r0, rPC              @ arg0
18708    mov    r1, rFP              @ arg1
18709    mov    r2, rSELF            @ arg2
18710    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18711
18712/* ------------------------------ */
18713    .balign 64
18714.L_ALT_OP_SHR_INT_2ADDR: /* 0xb9 */
18715/* File: armv5te/alt_stub.S */
18716/*
18717 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18718 * any interesting requests and then jump to the real instruction
18719 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18720 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18721 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18722 * bail to the real handler if breakFlags==0.
18723 */
18724    ldrb   r3, [rSELF, #offThread_breakFlags]
18725    adrl   lr, dvmAsmInstructionStart + (185 * 64)
18726    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18727    cmp    r3, #0
18728    bxeq   lr                   @ nothing to do - jump to real handler
18729    EXPORT_PC()
18730    mov    r0, rPC              @ arg0
18731    mov    r1, rFP              @ arg1
18732    mov    r2, rSELF            @ arg2
18733    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18734
18735/* ------------------------------ */
18736    .balign 64
18737.L_ALT_OP_USHR_INT_2ADDR: /* 0xba */
18738/* File: armv5te/alt_stub.S */
18739/*
18740 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18741 * any interesting requests and then jump to the real instruction
18742 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18743 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18744 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18745 * bail to the real handler if breakFlags==0.
18746 */
18747    ldrb   r3, [rSELF, #offThread_breakFlags]
18748    adrl   lr, dvmAsmInstructionStart + (186 * 64)
18749    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18750    cmp    r3, #0
18751    bxeq   lr                   @ nothing to do - jump to real handler
18752    EXPORT_PC()
18753    mov    r0, rPC              @ arg0
18754    mov    r1, rFP              @ arg1
18755    mov    r2, rSELF            @ arg2
18756    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18757
18758/* ------------------------------ */
18759    .balign 64
18760.L_ALT_OP_ADD_LONG_2ADDR: /* 0xbb */
18761/* File: armv5te/alt_stub.S */
18762/*
18763 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18764 * any interesting requests and then jump to the real instruction
18765 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18766 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18767 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18768 * bail to the real handler if breakFlags==0.
18769 */
18770    ldrb   r3, [rSELF, #offThread_breakFlags]
18771    adrl   lr, dvmAsmInstructionStart + (187 * 64)
18772    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18773    cmp    r3, #0
18774    bxeq   lr                   @ nothing to do - jump to real handler
18775    EXPORT_PC()
18776    mov    r0, rPC              @ arg0
18777    mov    r1, rFP              @ arg1
18778    mov    r2, rSELF            @ arg2
18779    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18780
18781/* ------------------------------ */
18782    .balign 64
18783.L_ALT_OP_SUB_LONG_2ADDR: /* 0xbc */
18784/* File: armv5te/alt_stub.S */
18785/*
18786 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18787 * any interesting requests and then jump to the real instruction
18788 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18789 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18790 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18791 * bail to the real handler if breakFlags==0.
18792 */
18793    ldrb   r3, [rSELF, #offThread_breakFlags]
18794    adrl   lr, dvmAsmInstructionStart + (188 * 64)
18795    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18796    cmp    r3, #0
18797    bxeq   lr                   @ nothing to do - jump to real handler
18798    EXPORT_PC()
18799    mov    r0, rPC              @ arg0
18800    mov    r1, rFP              @ arg1
18801    mov    r2, rSELF            @ arg2
18802    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18803
18804/* ------------------------------ */
18805    .balign 64
18806.L_ALT_OP_MUL_LONG_2ADDR: /* 0xbd */
18807/* File: armv5te/alt_stub.S */
18808/*
18809 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18810 * any interesting requests and then jump to the real instruction
18811 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18812 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18813 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18814 * bail to the real handler if breakFlags==0.
18815 */
18816    ldrb   r3, [rSELF, #offThread_breakFlags]
18817    adrl   lr, dvmAsmInstructionStart + (189 * 64)
18818    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18819    cmp    r3, #0
18820    bxeq   lr                   @ nothing to do - jump to real handler
18821    EXPORT_PC()
18822    mov    r0, rPC              @ arg0
18823    mov    r1, rFP              @ arg1
18824    mov    r2, rSELF            @ arg2
18825    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18826
18827/* ------------------------------ */
18828    .balign 64
18829.L_ALT_OP_DIV_LONG_2ADDR: /* 0xbe */
18830/* File: armv5te/alt_stub.S */
18831/*
18832 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18833 * any interesting requests and then jump to the real instruction
18834 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18835 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18836 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18837 * bail to the real handler if breakFlags==0.
18838 */
18839    ldrb   r3, [rSELF, #offThread_breakFlags]
18840    adrl   lr, dvmAsmInstructionStart + (190 * 64)
18841    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18842    cmp    r3, #0
18843    bxeq   lr                   @ nothing to do - jump to real handler
18844    EXPORT_PC()
18845    mov    r0, rPC              @ arg0
18846    mov    r1, rFP              @ arg1
18847    mov    r2, rSELF            @ arg2
18848    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18849
18850/* ------------------------------ */
18851    .balign 64
18852.L_ALT_OP_REM_LONG_2ADDR: /* 0xbf */
18853/* File: armv5te/alt_stub.S */
18854/*
18855 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18856 * any interesting requests and then jump to the real instruction
18857 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18858 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18859 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18860 * bail to the real handler if breakFlags==0.
18861 */
18862    ldrb   r3, [rSELF, #offThread_breakFlags]
18863    adrl   lr, dvmAsmInstructionStart + (191 * 64)
18864    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18865    cmp    r3, #0
18866    bxeq   lr                   @ nothing to do - jump to real handler
18867    EXPORT_PC()
18868    mov    r0, rPC              @ arg0
18869    mov    r1, rFP              @ arg1
18870    mov    r2, rSELF            @ arg2
18871    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18872
18873/* ------------------------------ */
18874    .balign 64
18875.L_ALT_OP_AND_LONG_2ADDR: /* 0xc0 */
18876/* File: armv5te/alt_stub.S */
18877/*
18878 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18879 * any interesting requests and then jump to the real instruction
18880 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18881 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18882 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18883 * bail to the real handler if breakFlags==0.
18884 */
18885    ldrb   r3, [rSELF, #offThread_breakFlags]
18886    adrl   lr, dvmAsmInstructionStart + (192 * 64)
18887    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18888    cmp    r3, #0
18889    bxeq   lr                   @ nothing to do - jump to real handler
18890    EXPORT_PC()
18891    mov    r0, rPC              @ arg0
18892    mov    r1, rFP              @ arg1
18893    mov    r2, rSELF            @ arg2
18894    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18895
18896/* ------------------------------ */
18897    .balign 64
18898.L_ALT_OP_OR_LONG_2ADDR: /* 0xc1 */
18899/* File: armv5te/alt_stub.S */
18900/*
18901 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18902 * any interesting requests and then jump to the real instruction
18903 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18904 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18905 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18906 * bail to the real handler if breakFlags==0.
18907 */
18908    ldrb   r3, [rSELF, #offThread_breakFlags]
18909    adrl   lr, dvmAsmInstructionStart + (193 * 64)
18910    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18911    cmp    r3, #0
18912    bxeq   lr                   @ nothing to do - jump to real handler
18913    EXPORT_PC()
18914    mov    r0, rPC              @ arg0
18915    mov    r1, rFP              @ arg1
18916    mov    r2, rSELF            @ arg2
18917    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18918
18919/* ------------------------------ */
18920    .balign 64
18921.L_ALT_OP_XOR_LONG_2ADDR: /* 0xc2 */
18922/* File: armv5te/alt_stub.S */
18923/*
18924 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18925 * any interesting requests and then jump to the real instruction
18926 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18927 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18928 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18929 * bail to the real handler if breakFlags==0.
18930 */
18931    ldrb   r3, [rSELF, #offThread_breakFlags]
18932    adrl   lr, dvmAsmInstructionStart + (194 * 64)
18933    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18934    cmp    r3, #0
18935    bxeq   lr                   @ nothing to do - jump to real handler
18936    EXPORT_PC()
18937    mov    r0, rPC              @ arg0
18938    mov    r1, rFP              @ arg1
18939    mov    r2, rSELF            @ arg2
18940    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18941
18942/* ------------------------------ */
18943    .balign 64
18944.L_ALT_OP_SHL_LONG_2ADDR: /* 0xc3 */
18945/* File: armv5te/alt_stub.S */
18946/*
18947 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18948 * any interesting requests and then jump to the real instruction
18949 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18950 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18951 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18952 * bail to the real handler if breakFlags==0.
18953 */
18954    ldrb   r3, [rSELF, #offThread_breakFlags]
18955    adrl   lr, dvmAsmInstructionStart + (195 * 64)
18956    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18957    cmp    r3, #0
18958    bxeq   lr                   @ nothing to do - jump to real handler
18959    EXPORT_PC()
18960    mov    r0, rPC              @ arg0
18961    mov    r1, rFP              @ arg1
18962    mov    r2, rSELF            @ arg2
18963    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18964
18965/* ------------------------------ */
18966    .balign 64
18967.L_ALT_OP_SHR_LONG_2ADDR: /* 0xc4 */
18968/* File: armv5te/alt_stub.S */
18969/*
18970 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18971 * any interesting requests and then jump to the real instruction
18972 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18973 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18974 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18975 * bail to the real handler if breakFlags==0.
18976 */
18977    ldrb   r3, [rSELF, #offThread_breakFlags]
18978    adrl   lr, dvmAsmInstructionStart + (196 * 64)
18979    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
18980    cmp    r3, #0
18981    bxeq   lr                   @ nothing to do - jump to real handler
18982    EXPORT_PC()
18983    mov    r0, rPC              @ arg0
18984    mov    r1, rFP              @ arg1
18985    mov    r2, rSELF            @ arg2
18986    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
18987
18988/* ------------------------------ */
18989    .balign 64
18990.L_ALT_OP_USHR_LONG_2ADDR: /* 0xc5 */
18991/* File: armv5te/alt_stub.S */
18992/*
18993 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
18994 * any interesting requests and then jump to the real instruction
18995 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
18996 * rIBASE updates won't be seen until a refresh, and we can tell we have a
18997 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
18998 * bail to the real handler if breakFlags==0.
18999 */
19000    ldrb   r3, [rSELF, #offThread_breakFlags]
19001    adrl   lr, dvmAsmInstructionStart + (197 * 64)
19002    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19003    cmp    r3, #0
19004    bxeq   lr                   @ nothing to do - jump to real handler
19005    EXPORT_PC()
19006    mov    r0, rPC              @ arg0
19007    mov    r1, rFP              @ arg1
19008    mov    r2, rSELF            @ arg2
19009    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19010
19011/* ------------------------------ */
19012    .balign 64
19013.L_ALT_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
19014/* File: armv5te/alt_stub.S */
19015/*
19016 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19017 * any interesting requests and then jump to the real instruction
19018 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19019 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19020 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19021 * bail to the real handler if breakFlags==0.
19022 */
19023    ldrb   r3, [rSELF, #offThread_breakFlags]
19024    adrl   lr, dvmAsmInstructionStart + (198 * 64)
19025    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19026    cmp    r3, #0
19027    bxeq   lr                   @ nothing to do - jump to real handler
19028    EXPORT_PC()
19029    mov    r0, rPC              @ arg0
19030    mov    r1, rFP              @ arg1
19031    mov    r2, rSELF            @ arg2
19032    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19033
19034/* ------------------------------ */
19035    .balign 64
19036.L_ALT_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
19037/* File: armv5te/alt_stub.S */
19038/*
19039 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19040 * any interesting requests and then jump to the real instruction
19041 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19042 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19043 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19044 * bail to the real handler if breakFlags==0.
19045 */
19046    ldrb   r3, [rSELF, #offThread_breakFlags]
19047    adrl   lr, dvmAsmInstructionStart + (199 * 64)
19048    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19049    cmp    r3, #0
19050    bxeq   lr                   @ nothing to do - jump to real handler
19051    EXPORT_PC()
19052    mov    r0, rPC              @ arg0
19053    mov    r1, rFP              @ arg1
19054    mov    r2, rSELF            @ arg2
19055    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19056
19057/* ------------------------------ */
19058    .balign 64
19059.L_ALT_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
19060/* File: armv5te/alt_stub.S */
19061/*
19062 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19063 * any interesting requests and then jump to the real instruction
19064 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19065 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19066 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19067 * bail to the real handler if breakFlags==0.
19068 */
19069    ldrb   r3, [rSELF, #offThread_breakFlags]
19070    adrl   lr, dvmAsmInstructionStart + (200 * 64)
19071    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19072    cmp    r3, #0
19073    bxeq   lr                   @ nothing to do - jump to real handler
19074    EXPORT_PC()
19075    mov    r0, rPC              @ arg0
19076    mov    r1, rFP              @ arg1
19077    mov    r2, rSELF            @ arg2
19078    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19079
19080/* ------------------------------ */
19081    .balign 64
19082.L_ALT_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
19083/* File: armv5te/alt_stub.S */
19084/*
19085 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19086 * any interesting requests and then jump to the real instruction
19087 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19088 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19089 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19090 * bail to the real handler if breakFlags==0.
19091 */
19092    ldrb   r3, [rSELF, #offThread_breakFlags]
19093    adrl   lr, dvmAsmInstructionStart + (201 * 64)
19094    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19095    cmp    r3, #0
19096    bxeq   lr                   @ nothing to do - jump to real handler
19097    EXPORT_PC()
19098    mov    r0, rPC              @ arg0
19099    mov    r1, rFP              @ arg1
19100    mov    r2, rSELF            @ arg2
19101    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19102
19103/* ------------------------------ */
19104    .balign 64
19105.L_ALT_OP_REM_FLOAT_2ADDR: /* 0xca */
19106/* File: armv5te/alt_stub.S */
19107/*
19108 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19109 * any interesting requests and then jump to the real instruction
19110 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19111 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19112 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19113 * bail to the real handler if breakFlags==0.
19114 */
19115    ldrb   r3, [rSELF, #offThread_breakFlags]
19116    adrl   lr, dvmAsmInstructionStart + (202 * 64)
19117    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19118    cmp    r3, #0
19119    bxeq   lr                   @ nothing to do - jump to real handler
19120    EXPORT_PC()
19121    mov    r0, rPC              @ arg0
19122    mov    r1, rFP              @ arg1
19123    mov    r2, rSELF            @ arg2
19124    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19125
19126/* ------------------------------ */
19127    .balign 64
19128.L_ALT_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
19129/* File: armv5te/alt_stub.S */
19130/*
19131 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19132 * any interesting requests and then jump to the real instruction
19133 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19134 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19135 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19136 * bail to the real handler if breakFlags==0.
19137 */
19138    ldrb   r3, [rSELF, #offThread_breakFlags]
19139    adrl   lr, dvmAsmInstructionStart + (203 * 64)
19140    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19141    cmp    r3, #0
19142    bxeq   lr                   @ nothing to do - jump to real handler
19143    EXPORT_PC()
19144    mov    r0, rPC              @ arg0
19145    mov    r1, rFP              @ arg1
19146    mov    r2, rSELF            @ arg2
19147    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19148
19149/* ------------------------------ */
19150    .balign 64
19151.L_ALT_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
19152/* File: armv5te/alt_stub.S */
19153/*
19154 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19155 * any interesting requests and then jump to the real instruction
19156 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19157 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19158 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19159 * bail to the real handler if breakFlags==0.
19160 */
19161    ldrb   r3, [rSELF, #offThread_breakFlags]
19162    adrl   lr, dvmAsmInstructionStart + (204 * 64)
19163    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19164    cmp    r3, #0
19165    bxeq   lr                   @ nothing to do - jump to real handler
19166    EXPORT_PC()
19167    mov    r0, rPC              @ arg0
19168    mov    r1, rFP              @ arg1
19169    mov    r2, rSELF            @ arg2
19170    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19171
19172/* ------------------------------ */
19173    .balign 64
19174.L_ALT_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
19175/* File: armv5te/alt_stub.S */
19176/*
19177 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19178 * any interesting requests and then jump to the real instruction
19179 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19180 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19181 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19182 * bail to the real handler if breakFlags==0.
19183 */
19184    ldrb   r3, [rSELF, #offThread_breakFlags]
19185    adrl   lr, dvmAsmInstructionStart + (205 * 64)
19186    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19187    cmp    r3, #0
19188    bxeq   lr                   @ nothing to do - jump to real handler
19189    EXPORT_PC()
19190    mov    r0, rPC              @ arg0
19191    mov    r1, rFP              @ arg1
19192    mov    r2, rSELF            @ arg2
19193    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19194
19195/* ------------------------------ */
19196    .balign 64
19197.L_ALT_OP_DIV_DOUBLE_2ADDR: /* 0xce */
19198/* File: armv5te/alt_stub.S */
19199/*
19200 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19201 * any interesting requests and then jump to the real instruction
19202 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19203 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19204 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19205 * bail to the real handler if breakFlags==0.
19206 */
19207    ldrb   r3, [rSELF, #offThread_breakFlags]
19208    adrl   lr, dvmAsmInstructionStart + (206 * 64)
19209    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19210    cmp    r3, #0
19211    bxeq   lr                   @ nothing to do - jump to real handler
19212    EXPORT_PC()
19213    mov    r0, rPC              @ arg0
19214    mov    r1, rFP              @ arg1
19215    mov    r2, rSELF            @ arg2
19216    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19217
19218/* ------------------------------ */
19219    .balign 64
19220.L_ALT_OP_REM_DOUBLE_2ADDR: /* 0xcf */
19221/* File: armv5te/alt_stub.S */
19222/*
19223 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19224 * any interesting requests and then jump to the real instruction
19225 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19226 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19227 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19228 * bail to the real handler if breakFlags==0.
19229 */
19230    ldrb   r3, [rSELF, #offThread_breakFlags]
19231    adrl   lr, dvmAsmInstructionStart + (207 * 64)
19232    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19233    cmp    r3, #0
19234    bxeq   lr                   @ nothing to do - jump to real handler
19235    EXPORT_PC()
19236    mov    r0, rPC              @ arg0
19237    mov    r1, rFP              @ arg1
19238    mov    r2, rSELF            @ arg2
19239    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19240
19241/* ------------------------------ */
19242    .balign 64
19243.L_ALT_OP_ADD_INT_LIT16: /* 0xd0 */
19244/* File: armv5te/alt_stub.S */
19245/*
19246 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19247 * any interesting requests and then jump to the real instruction
19248 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19249 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19250 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19251 * bail to the real handler if breakFlags==0.
19252 */
19253    ldrb   r3, [rSELF, #offThread_breakFlags]
19254    adrl   lr, dvmAsmInstructionStart + (208 * 64)
19255    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19256    cmp    r3, #0
19257    bxeq   lr                   @ nothing to do - jump to real handler
19258    EXPORT_PC()
19259    mov    r0, rPC              @ arg0
19260    mov    r1, rFP              @ arg1
19261    mov    r2, rSELF            @ arg2
19262    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19263
19264/* ------------------------------ */
19265    .balign 64
19266.L_ALT_OP_RSUB_INT: /* 0xd1 */
19267/* File: armv5te/alt_stub.S */
19268/*
19269 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19270 * any interesting requests and then jump to the real instruction
19271 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19272 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19273 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19274 * bail to the real handler if breakFlags==0.
19275 */
19276    ldrb   r3, [rSELF, #offThread_breakFlags]
19277    adrl   lr, dvmAsmInstructionStart + (209 * 64)
19278    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19279    cmp    r3, #0
19280    bxeq   lr                   @ nothing to do - jump to real handler
19281    EXPORT_PC()
19282    mov    r0, rPC              @ arg0
19283    mov    r1, rFP              @ arg1
19284    mov    r2, rSELF            @ arg2
19285    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19286
19287/* ------------------------------ */
19288    .balign 64
19289.L_ALT_OP_MUL_INT_LIT16: /* 0xd2 */
19290/* File: armv5te/alt_stub.S */
19291/*
19292 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19293 * any interesting requests and then jump to the real instruction
19294 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19295 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19296 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19297 * bail to the real handler if breakFlags==0.
19298 */
19299    ldrb   r3, [rSELF, #offThread_breakFlags]
19300    adrl   lr, dvmAsmInstructionStart + (210 * 64)
19301    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19302    cmp    r3, #0
19303    bxeq   lr                   @ nothing to do - jump to real handler
19304    EXPORT_PC()
19305    mov    r0, rPC              @ arg0
19306    mov    r1, rFP              @ arg1
19307    mov    r2, rSELF            @ arg2
19308    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19309
19310/* ------------------------------ */
19311    .balign 64
19312.L_ALT_OP_DIV_INT_LIT16: /* 0xd3 */
19313/* File: armv5te/alt_stub.S */
19314/*
19315 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19316 * any interesting requests and then jump to the real instruction
19317 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19318 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19319 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19320 * bail to the real handler if breakFlags==0.
19321 */
19322    ldrb   r3, [rSELF, #offThread_breakFlags]
19323    adrl   lr, dvmAsmInstructionStart + (211 * 64)
19324    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19325    cmp    r3, #0
19326    bxeq   lr                   @ nothing to do - jump to real handler
19327    EXPORT_PC()
19328    mov    r0, rPC              @ arg0
19329    mov    r1, rFP              @ arg1
19330    mov    r2, rSELF            @ arg2
19331    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19332
19333/* ------------------------------ */
19334    .balign 64
19335.L_ALT_OP_REM_INT_LIT16: /* 0xd4 */
19336/* File: armv5te/alt_stub.S */
19337/*
19338 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19339 * any interesting requests and then jump to the real instruction
19340 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19341 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19342 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19343 * bail to the real handler if breakFlags==0.
19344 */
19345    ldrb   r3, [rSELF, #offThread_breakFlags]
19346    adrl   lr, dvmAsmInstructionStart + (212 * 64)
19347    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19348    cmp    r3, #0
19349    bxeq   lr                   @ nothing to do - jump to real handler
19350    EXPORT_PC()
19351    mov    r0, rPC              @ arg0
19352    mov    r1, rFP              @ arg1
19353    mov    r2, rSELF            @ arg2
19354    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19355
19356/* ------------------------------ */
19357    .balign 64
19358.L_ALT_OP_AND_INT_LIT16: /* 0xd5 */
19359/* File: armv5te/alt_stub.S */
19360/*
19361 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19362 * any interesting requests and then jump to the real instruction
19363 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19364 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19365 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19366 * bail to the real handler if breakFlags==0.
19367 */
19368    ldrb   r3, [rSELF, #offThread_breakFlags]
19369    adrl   lr, dvmAsmInstructionStart + (213 * 64)
19370    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19371    cmp    r3, #0
19372    bxeq   lr                   @ nothing to do - jump to real handler
19373    EXPORT_PC()
19374    mov    r0, rPC              @ arg0
19375    mov    r1, rFP              @ arg1
19376    mov    r2, rSELF            @ arg2
19377    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19378
19379/* ------------------------------ */
19380    .balign 64
19381.L_ALT_OP_OR_INT_LIT16: /* 0xd6 */
19382/* File: armv5te/alt_stub.S */
19383/*
19384 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19385 * any interesting requests and then jump to the real instruction
19386 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19387 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19388 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19389 * bail to the real handler if breakFlags==0.
19390 */
19391    ldrb   r3, [rSELF, #offThread_breakFlags]
19392    adrl   lr, dvmAsmInstructionStart + (214 * 64)
19393    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19394    cmp    r3, #0
19395    bxeq   lr                   @ nothing to do - jump to real handler
19396    EXPORT_PC()
19397    mov    r0, rPC              @ arg0
19398    mov    r1, rFP              @ arg1
19399    mov    r2, rSELF            @ arg2
19400    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19401
19402/* ------------------------------ */
19403    .balign 64
19404.L_ALT_OP_XOR_INT_LIT16: /* 0xd7 */
19405/* File: armv5te/alt_stub.S */
19406/*
19407 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19408 * any interesting requests and then jump to the real instruction
19409 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19410 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19411 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19412 * bail to the real handler if breakFlags==0.
19413 */
19414    ldrb   r3, [rSELF, #offThread_breakFlags]
19415    adrl   lr, dvmAsmInstructionStart + (215 * 64)
19416    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19417    cmp    r3, #0
19418    bxeq   lr                   @ nothing to do - jump to real handler
19419    EXPORT_PC()
19420    mov    r0, rPC              @ arg0
19421    mov    r1, rFP              @ arg1
19422    mov    r2, rSELF            @ arg2
19423    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19424
19425/* ------------------------------ */
19426    .balign 64
19427.L_ALT_OP_ADD_INT_LIT8: /* 0xd8 */
19428/* File: armv5te/alt_stub.S */
19429/*
19430 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19431 * any interesting requests and then jump to the real instruction
19432 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19433 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19434 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19435 * bail to the real handler if breakFlags==0.
19436 */
19437    ldrb   r3, [rSELF, #offThread_breakFlags]
19438    adrl   lr, dvmAsmInstructionStart + (216 * 64)
19439    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19440    cmp    r3, #0
19441    bxeq   lr                   @ nothing to do - jump to real handler
19442    EXPORT_PC()
19443    mov    r0, rPC              @ arg0
19444    mov    r1, rFP              @ arg1
19445    mov    r2, rSELF            @ arg2
19446    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19447
19448/* ------------------------------ */
19449    .balign 64
19450.L_ALT_OP_RSUB_INT_LIT8: /* 0xd9 */
19451/* File: armv5te/alt_stub.S */
19452/*
19453 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19454 * any interesting requests and then jump to the real instruction
19455 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19456 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19457 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19458 * bail to the real handler if breakFlags==0.
19459 */
19460    ldrb   r3, [rSELF, #offThread_breakFlags]
19461    adrl   lr, dvmAsmInstructionStart + (217 * 64)
19462    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19463    cmp    r3, #0
19464    bxeq   lr                   @ nothing to do - jump to real handler
19465    EXPORT_PC()
19466    mov    r0, rPC              @ arg0
19467    mov    r1, rFP              @ arg1
19468    mov    r2, rSELF            @ arg2
19469    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19470
19471/* ------------------------------ */
19472    .balign 64
19473.L_ALT_OP_MUL_INT_LIT8: /* 0xda */
19474/* File: armv5te/alt_stub.S */
19475/*
19476 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19477 * any interesting requests and then jump to the real instruction
19478 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19479 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19480 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19481 * bail to the real handler if breakFlags==0.
19482 */
19483    ldrb   r3, [rSELF, #offThread_breakFlags]
19484    adrl   lr, dvmAsmInstructionStart + (218 * 64)
19485    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19486    cmp    r3, #0
19487    bxeq   lr                   @ nothing to do - jump to real handler
19488    EXPORT_PC()
19489    mov    r0, rPC              @ arg0
19490    mov    r1, rFP              @ arg1
19491    mov    r2, rSELF            @ arg2
19492    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19493
19494/* ------------------------------ */
19495    .balign 64
19496.L_ALT_OP_DIV_INT_LIT8: /* 0xdb */
19497/* File: armv5te/alt_stub.S */
19498/*
19499 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19500 * any interesting requests and then jump to the real instruction
19501 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19502 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19503 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19504 * bail to the real handler if breakFlags==0.
19505 */
19506    ldrb   r3, [rSELF, #offThread_breakFlags]
19507    adrl   lr, dvmAsmInstructionStart + (219 * 64)
19508    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19509    cmp    r3, #0
19510    bxeq   lr                   @ nothing to do - jump to real handler
19511    EXPORT_PC()
19512    mov    r0, rPC              @ arg0
19513    mov    r1, rFP              @ arg1
19514    mov    r2, rSELF            @ arg2
19515    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19516
19517/* ------------------------------ */
19518    .balign 64
19519.L_ALT_OP_REM_INT_LIT8: /* 0xdc */
19520/* File: armv5te/alt_stub.S */
19521/*
19522 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19523 * any interesting requests and then jump to the real instruction
19524 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19525 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19526 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19527 * bail to the real handler if breakFlags==0.
19528 */
19529    ldrb   r3, [rSELF, #offThread_breakFlags]
19530    adrl   lr, dvmAsmInstructionStart + (220 * 64)
19531    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19532    cmp    r3, #0
19533    bxeq   lr                   @ nothing to do - jump to real handler
19534    EXPORT_PC()
19535    mov    r0, rPC              @ arg0
19536    mov    r1, rFP              @ arg1
19537    mov    r2, rSELF            @ arg2
19538    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19539
19540/* ------------------------------ */
19541    .balign 64
19542.L_ALT_OP_AND_INT_LIT8: /* 0xdd */
19543/* File: armv5te/alt_stub.S */
19544/*
19545 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19546 * any interesting requests and then jump to the real instruction
19547 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19548 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19549 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19550 * bail to the real handler if breakFlags==0.
19551 */
19552    ldrb   r3, [rSELF, #offThread_breakFlags]
19553    adrl   lr, dvmAsmInstructionStart + (221 * 64)
19554    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19555    cmp    r3, #0
19556    bxeq   lr                   @ nothing to do - jump to real handler
19557    EXPORT_PC()
19558    mov    r0, rPC              @ arg0
19559    mov    r1, rFP              @ arg1
19560    mov    r2, rSELF            @ arg2
19561    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19562
19563/* ------------------------------ */
19564    .balign 64
19565.L_ALT_OP_OR_INT_LIT8: /* 0xde */
19566/* File: armv5te/alt_stub.S */
19567/*
19568 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19569 * any interesting requests and then jump to the real instruction
19570 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19571 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19572 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19573 * bail to the real handler if breakFlags==0.
19574 */
19575    ldrb   r3, [rSELF, #offThread_breakFlags]
19576    adrl   lr, dvmAsmInstructionStart + (222 * 64)
19577    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19578    cmp    r3, #0
19579    bxeq   lr                   @ nothing to do - jump to real handler
19580    EXPORT_PC()
19581    mov    r0, rPC              @ arg0
19582    mov    r1, rFP              @ arg1
19583    mov    r2, rSELF            @ arg2
19584    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19585
19586/* ------------------------------ */
19587    .balign 64
19588.L_ALT_OP_XOR_INT_LIT8: /* 0xdf */
19589/* File: armv5te/alt_stub.S */
19590/*
19591 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19592 * any interesting requests and then jump to the real instruction
19593 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19594 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19595 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19596 * bail to the real handler if breakFlags==0.
19597 */
19598    ldrb   r3, [rSELF, #offThread_breakFlags]
19599    adrl   lr, dvmAsmInstructionStart + (223 * 64)
19600    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19601    cmp    r3, #0
19602    bxeq   lr                   @ nothing to do - jump to real handler
19603    EXPORT_PC()
19604    mov    r0, rPC              @ arg0
19605    mov    r1, rFP              @ arg1
19606    mov    r2, rSELF            @ arg2
19607    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19608
19609/* ------------------------------ */
19610    .balign 64
19611.L_ALT_OP_SHL_INT_LIT8: /* 0xe0 */
19612/* File: armv5te/alt_stub.S */
19613/*
19614 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19615 * any interesting requests and then jump to the real instruction
19616 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19617 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19618 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19619 * bail to the real handler if breakFlags==0.
19620 */
19621    ldrb   r3, [rSELF, #offThread_breakFlags]
19622    adrl   lr, dvmAsmInstructionStart + (224 * 64)
19623    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19624    cmp    r3, #0
19625    bxeq   lr                   @ nothing to do - jump to real handler
19626    EXPORT_PC()
19627    mov    r0, rPC              @ arg0
19628    mov    r1, rFP              @ arg1
19629    mov    r2, rSELF            @ arg2
19630    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19631
19632/* ------------------------------ */
19633    .balign 64
19634.L_ALT_OP_SHR_INT_LIT8: /* 0xe1 */
19635/* File: armv5te/alt_stub.S */
19636/*
19637 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19638 * any interesting requests and then jump to the real instruction
19639 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19640 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19641 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19642 * bail to the real handler if breakFlags==0.
19643 */
19644    ldrb   r3, [rSELF, #offThread_breakFlags]
19645    adrl   lr, dvmAsmInstructionStart + (225 * 64)
19646    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19647    cmp    r3, #0
19648    bxeq   lr                   @ nothing to do - jump to real handler
19649    EXPORT_PC()
19650    mov    r0, rPC              @ arg0
19651    mov    r1, rFP              @ arg1
19652    mov    r2, rSELF            @ arg2
19653    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19654
19655/* ------------------------------ */
19656    .balign 64
19657.L_ALT_OP_USHR_INT_LIT8: /* 0xe2 */
19658/* File: armv5te/alt_stub.S */
19659/*
19660 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19661 * any interesting requests and then jump to the real instruction
19662 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19663 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19664 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19665 * bail to the real handler if breakFlags==0.
19666 */
19667    ldrb   r3, [rSELF, #offThread_breakFlags]
19668    adrl   lr, dvmAsmInstructionStart + (226 * 64)
19669    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19670    cmp    r3, #0
19671    bxeq   lr                   @ nothing to do - jump to real handler
19672    EXPORT_PC()
19673    mov    r0, rPC              @ arg0
19674    mov    r1, rFP              @ arg1
19675    mov    r2, rSELF            @ arg2
19676    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19677
19678/* ------------------------------ */
19679    .balign 64
19680.L_ALT_OP_IGET_VOLATILE: /* 0xe3 */
19681/* File: armv5te/alt_stub.S */
19682/*
19683 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19684 * any interesting requests and then jump to the real instruction
19685 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19686 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19687 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19688 * bail to the real handler if breakFlags==0.
19689 */
19690    ldrb   r3, [rSELF, #offThread_breakFlags]
19691    adrl   lr, dvmAsmInstructionStart + (227 * 64)
19692    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19693    cmp    r3, #0
19694    bxeq   lr                   @ nothing to do - jump to real handler
19695    EXPORT_PC()
19696    mov    r0, rPC              @ arg0
19697    mov    r1, rFP              @ arg1
19698    mov    r2, rSELF            @ arg2
19699    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19700
19701/* ------------------------------ */
19702    .balign 64
19703.L_ALT_OP_IPUT_VOLATILE: /* 0xe4 */
19704/* File: armv5te/alt_stub.S */
19705/*
19706 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19707 * any interesting requests and then jump to the real instruction
19708 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19709 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19710 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19711 * bail to the real handler if breakFlags==0.
19712 */
19713    ldrb   r3, [rSELF, #offThread_breakFlags]
19714    adrl   lr, dvmAsmInstructionStart + (228 * 64)
19715    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19716    cmp    r3, #0
19717    bxeq   lr                   @ nothing to do - jump to real handler
19718    EXPORT_PC()
19719    mov    r0, rPC              @ arg0
19720    mov    r1, rFP              @ arg1
19721    mov    r2, rSELF            @ arg2
19722    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19723
19724/* ------------------------------ */
19725    .balign 64
19726.L_ALT_OP_SGET_VOLATILE: /* 0xe5 */
19727/* File: armv5te/alt_stub.S */
19728/*
19729 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19730 * any interesting requests and then jump to the real instruction
19731 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19732 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19733 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19734 * bail to the real handler if breakFlags==0.
19735 */
19736    ldrb   r3, [rSELF, #offThread_breakFlags]
19737    adrl   lr, dvmAsmInstructionStart + (229 * 64)
19738    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19739    cmp    r3, #0
19740    bxeq   lr                   @ nothing to do - jump to real handler
19741    EXPORT_PC()
19742    mov    r0, rPC              @ arg0
19743    mov    r1, rFP              @ arg1
19744    mov    r2, rSELF            @ arg2
19745    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19746
19747/* ------------------------------ */
19748    .balign 64
19749.L_ALT_OP_SPUT_VOLATILE: /* 0xe6 */
19750/* File: armv5te/alt_stub.S */
19751/*
19752 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19753 * any interesting requests and then jump to the real instruction
19754 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19755 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19756 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19757 * bail to the real handler if breakFlags==0.
19758 */
19759    ldrb   r3, [rSELF, #offThread_breakFlags]
19760    adrl   lr, dvmAsmInstructionStart + (230 * 64)
19761    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19762    cmp    r3, #0
19763    bxeq   lr                   @ nothing to do - jump to real handler
19764    EXPORT_PC()
19765    mov    r0, rPC              @ arg0
19766    mov    r1, rFP              @ arg1
19767    mov    r2, rSELF            @ arg2
19768    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19769
19770/* ------------------------------ */
19771    .balign 64
19772.L_ALT_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
19773/* File: armv5te/alt_stub.S */
19774/*
19775 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19776 * any interesting requests and then jump to the real instruction
19777 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19778 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19779 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19780 * bail to the real handler if breakFlags==0.
19781 */
19782    ldrb   r3, [rSELF, #offThread_breakFlags]
19783    adrl   lr, dvmAsmInstructionStart + (231 * 64)
19784    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19785    cmp    r3, #0
19786    bxeq   lr                   @ nothing to do - jump to real handler
19787    EXPORT_PC()
19788    mov    r0, rPC              @ arg0
19789    mov    r1, rFP              @ arg1
19790    mov    r2, rSELF            @ arg2
19791    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19792
19793/* ------------------------------ */
19794    .balign 64
19795.L_ALT_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
19796/* File: armv5te/alt_stub.S */
19797/*
19798 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19799 * any interesting requests and then jump to the real instruction
19800 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19801 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19802 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19803 * bail to the real handler if breakFlags==0.
19804 */
19805    ldrb   r3, [rSELF, #offThread_breakFlags]
19806    adrl   lr, dvmAsmInstructionStart + (232 * 64)
19807    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19808    cmp    r3, #0
19809    bxeq   lr                   @ nothing to do - jump to real handler
19810    EXPORT_PC()
19811    mov    r0, rPC              @ arg0
19812    mov    r1, rFP              @ arg1
19813    mov    r2, rSELF            @ arg2
19814    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19815
19816/* ------------------------------ */
19817    .balign 64
19818.L_ALT_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
19819/* File: armv5te/alt_stub.S */
19820/*
19821 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19822 * any interesting requests and then jump to the real instruction
19823 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19824 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19825 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19826 * bail to the real handler if breakFlags==0.
19827 */
19828    ldrb   r3, [rSELF, #offThread_breakFlags]
19829    adrl   lr, dvmAsmInstructionStart + (233 * 64)
19830    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19831    cmp    r3, #0
19832    bxeq   lr                   @ nothing to do - jump to real handler
19833    EXPORT_PC()
19834    mov    r0, rPC              @ arg0
19835    mov    r1, rFP              @ arg1
19836    mov    r2, rSELF            @ arg2
19837    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19838
19839/* ------------------------------ */
19840    .balign 64
19841.L_ALT_OP_SGET_WIDE_VOLATILE: /* 0xea */
19842/* File: armv5te/alt_stub.S */
19843/*
19844 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19845 * any interesting requests and then jump to the real instruction
19846 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19847 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19848 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19849 * bail to the real handler if breakFlags==0.
19850 */
19851    ldrb   r3, [rSELF, #offThread_breakFlags]
19852    adrl   lr, dvmAsmInstructionStart + (234 * 64)
19853    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19854    cmp    r3, #0
19855    bxeq   lr                   @ nothing to do - jump to real handler
19856    EXPORT_PC()
19857    mov    r0, rPC              @ arg0
19858    mov    r1, rFP              @ arg1
19859    mov    r2, rSELF            @ arg2
19860    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19861
19862/* ------------------------------ */
19863    .balign 64
19864.L_ALT_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
19865/* File: armv5te/alt_stub.S */
19866/*
19867 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19868 * any interesting requests and then jump to the real instruction
19869 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19870 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19871 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19872 * bail to the real handler if breakFlags==0.
19873 */
19874    ldrb   r3, [rSELF, #offThread_breakFlags]
19875    adrl   lr, dvmAsmInstructionStart + (235 * 64)
19876    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19877    cmp    r3, #0
19878    bxeq   lr                   @ nothing to do - jump to real handler
19879    EXPORT_PC()
19880    mov    r0, rPC              @ arg0
19881    mov    r1, rFP              @ arg1
19882    mov    r2, rSELF            @ arg2
19883    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19884
19885/* ------------------------------ */
19886    .balign 64
19887.L_ALT_OP_BREAKPOINT: /* 0xec */
19888/* File: armv5te/alt_stub.S */
19889/*
19890 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19891 * any interesting requests and then jump to the real instruction
19892 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19893 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19894 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19895 * bail to the real handler if breakFlags==0.
19896 */
19897    ldrb   r3, [rSELF, #offThread_breakFlags]
19898    adrl   lr, dvmAsmInstructionStart + (236 * 64)
19899    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19900    cmp    r3, #0
19901    bxeq   lr                   @ nothing to do - jump to real handler
19902    EXPORT_PC()
19903    mov    r0, rPC              @ arg0
19904    mov    r1, rFP              @ arg1
19905    mov    r2, rSELF            @ arg2
19906    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19907
19908/* ------------------------------ */
19909    .balign 64
19910.L_ALT_OP_THROW_VERIFICATION_ERROR: /* 0xed */
19911/* File: armv5te/alt_stub.S */
19912/*
19913 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19914 * any interesting requests and then jump to the real instruction
19915 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19916 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19917 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19918 * bail to the real handler if breakFlags==0.
19919 */
19920    ldrb   r3, [rSELF, #offThread_breakFlags]
19921    adrl   lr, dvmAsmInstructionStart + (237 * 64)
19922    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19923    cmp    r3, #0
19924    bxeq   lr                   @ nothing to do - jump to real handler
19925    EXPORT_PC()
19926    mov    r0, rPC              @ arg0
19927    mov    r1, rFP              @ arg1
19928    mov    r2, rSELF            @ arg2
19929    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19930
19931/* ------------------------------ */
19932    .balign 64
19933.L_ALT_OP_EXECUTE_INLINE: /* 0xee */
19934/* File: armv5te/alt_stub.S */
19935/*
19936 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19937 * any interesting requests and then jump to the real instruction
19938 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19939 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19940 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19941 * bail to the real handler if breakFlags==0.
19942 */
19943    ldrb   r3, [rSELF, #offThread_breakFlags]
19944    adrl   lr, dvmAsmInstructionStart + (238 * 64)
19945    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19946    cmp    r3, #0
19947    bxeq   lr                   @ nothing to do - jump to real handler
19948    EXPORT_PC()
19949    mov    r0, rPC              @ arg0
19950    mov    r1, rFP              @ arg1
19951    mov    r2, rSELF            @ arg2
19952    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19953
19954/* ------------------------------ */
19955    .balign 64
19956.L_ALT_OP_EXECUTE_INLINE_RANGE: /* 0xef */
19957/* File: armv5te/alt_stub.S */
19958/*
19959 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19960 * any interesting requests and then jump to the real instruction
19961 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19962 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19963 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19964 * bail to the real handler if breakFlags==0.
19965 */
19966    ldrb   r3, [rSELF, #offThread_breakFlags]
19967    adrl   lr, dvmAsmInstructionStart + (239 * 64)
19968    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19969    cmp    r3, #0
19970    bxeq   lr                   @ nothing to do - jump to real handler
19971    EXPORT_PC()
19972    mov    r0, rPC              @ arg0
19973    mov    r1, rFP              @ arg1
19974    mov    r2, rSELF            @ arg2
19975    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19976
19977/* ------------------------------ */
19978    .balign 64
19979.L_ALT_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
19980/* File: armv5te/alt_stub.S */
19981/*
19982 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
19983 * any interesting requests and then jump to the real instruction
19984 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
19985 * rIBASE updates won't be seen until a refresh, and we can tell we have a
19986 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
19987 * bail to the real handler if breakFlags==0.
19988 */
19989    ldrb   r3, [rSELF, #offThread_breakFlags]
19990    adrl   lr, dvmAsmInstructionStart + (240 * 64)
19991    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
19992    cmp    r3, #0
19993    bxeq   lr                   @ nothing to do - jump to real handler
19994    EXPORT_PC()
19995    mov    r0, rPC              @ arg0
19996    mov    r1, rFP              @ arg1
19997    mov    r2, rSELF            @ arg2
19998    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
19999
20000/* ------------------------------ */
20001    .balign 64
20002.L_ALT_OP_RETURN_VOID_BARRIER: /* 0xf1 */
20003/* File: armv5te/alt_stub.S */
20004/*
20005 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20006 * any interesting requests and then jump to the real instruction
20007 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20008 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20009 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20010 * bail to the real handler if breakFlags==0.
20011 */
20012    ldrb   r3, [rSELF, #offThread_breakFlags]
20013    adrl   lr, dvmAsmInstructionStart + (241 * 64)
20014    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20015    cmp    r3, #0
20016    bxeq   lr                   @ nothing to do - jump to real handler
20017    EXPORT_PC()
20018    mov    r0, rPC              @ arg0
20019    mov    r1, rFP              @ arg1
20020    mov    r2, rSELF            @ arg2
20021    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20022
20023/* ------------------------------ */
20024    .balign 64
20025.L_ALT_OP_IGET_QUICK: /* 0xf2 */
20026/* File: armv5te/alt_stub.S */
20027/*
20028 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20029 * any interesting requests and then jump to the real instruction
20030 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20031 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20032 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20033 * bail to the real handler if breakFlags==0.
20034 */
20035    ldrb   r3, [rSELF, #offThread_breakFlags]
20036    adrl   lr, dvmAsmInstructionStart + (242 * 64)
20037    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20038    cmp    r3, #0
20039    bxeq   lr                   @ nothing to do - jump to real handler
20040    EXPORT_PC()
20041    mov    r0, rPC              @ arg0
20042    mov    r1, rFP              @ arg1
20043    mov    r2, rSELF            @ arg2
20044    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20045
20046/* ------------------------------ */
20047    .balign 64
20048.L_ALT_OP_IGET_WIDE_QUICK: /* 0xf3 */
20049/* File: armv5te/alt_stub.S */
20050/*
20051 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20052 * any interesting requests and then jump to the real instruction
20053 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20054 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20055 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20056 * bail to the real handler if breakFlags==0.
20057 */
20058    ldrb   r3, [rSELF, #offThread_breakFlags]
20059    adrl   lr, dvmAsmInstructionStart + (243 * 64)
20060    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20061    cmp    r3, #0
20062    bxeq   lr                   @ nothing to do - jump to real handler
20063    EXPORT_PC()
20064    mov    r0, rPC              @ arg0
20065    mov    r1, rFP              @ arg1
20066    mov    r2, rSELF            @ arg2
20067    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20068
20069/* ------------------------------ */
20070    .balign 64
20071.L_ALT_OP_IGET_OBJECT_QUICK: /* 0xf4 */
20072/* File: armv5te/alt_stub.S */
20073/*
20074 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20075 * any interesting requests and then jump to the real instruction
20076 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20077 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20078 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20079 * bail to the real handler if breakFlags==0.
20080 */
20081    ldrb   r3, [rSELF, #offThread_breakFlags]
20082    adrl   lr, dvmAsmInstructionStart + (244 * 64)
20083    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20084    cmp    r3, #0
20085    bxeq   lr                   @ nothing to do - jump to real handler
20086    EXPORT_PC()
20087    mov    r0, rPC              @ arg0
20088    mov    r1, rFP              @ arg1
20089    mov    r2, rSELF            @ arg2
20090    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20091
20092/* ------------------------------ */
20093    .balign 64
20094.L_ALT_OP_IPUT_QUICK: /* 0xf5 */
20095/* File: armv5te/alt_stub.S */
20096/*
20097 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20098 * any interesting requests and then jump to the real instruction
20099 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20100 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20101 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20102 * bail to the real handler if breakFlags==0.
20103 */
20104    ldrb   r3, [rSELF, #offThread_breakFlags]
20105    adrl   lr, dvmAsmInstructionStart + (245 * 64)
20106    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20107    cmp    r3, #0
20108    bxeq   lr                   @ nothing to do - jump to real handler
20109    EXPORT_PC()
20110    mov    r0, rPC              @ arg0
20111    mov    r1, rFP              @ arg1
20112    mov    r2, rSELF            @ arg2
20113    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20114
20115/* ------------------------------ */
20116    .balign 64
20117.L_ALT_OP_IPUT_WIDE_QUICK: /* 0xf6 */
20118/* File: armv5te/alt_stub.S */
20119/*
20120 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20121 * any interesting requests and then jump to the real instruction
20122 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20123 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20124 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20125 * bail to the real handler if breakFlags==0.
20126 */
20127    ldrb   r3, [rSELF, #offThread_breakFlags]
20128    adrl   lr, dvmAsmInstructionStart + (246 * 64)
20129    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20130    cmp    r3, #0
20131    bxeq   lr                   @ nothing to do - jump to real handler
20132    EXPORT_PC()
20133    mov    r0, rPC              @ arg0
20134    mov    r1, rFP              @ arg1
20135    mov    r2, rSELF            @ arg2
20136    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20137
20138/* ------------------------------ */
20139    .balign 64
20140.L_ALT_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
20141/* File: armv5te/alt_stub.S */
20142/*
20143 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20144 * any interesting requests and then jump to the real instruction
20145 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20146 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20147 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20148 * bail to the real handler if breakFlags==0.
20149 */
20150    ldrb   r3, [rSELF, #offThread_breakFlags]
20151    adrl   lr, dvmAsmInstructionStart + (247 * 64)
20152    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20153    cmp    r3, #0
20154    bxeq   lr                   @ nothing to do - jump to real handler
20155    EXPORT_PC()
20156    mov    r0, rPC              @ arg0
20157    mov    r1, rFP              @ arg1
20158    mov    r2, rSELF            @ arg2
20159    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20160
20161/* ------------------------------ */
20162    .balign 64
20163.L_ALT_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
20164/* File: armv5te/alt_stub.S */
20165/*
20166 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20167 * any interesting requests and then jump to the real instruction
20168 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20169 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20170 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20171 * bail to the real handler if breakFlags==0.
20172 */
20173    ldrb   r3, [rSELF, #offThread_breakFlags]
20174    adrl   lr, dvmAsmInstructionStart + (248 * 64)
20175    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20176    cmp    r3, #0
20177    bxeq   lr                   @ nothing to do - jump to real handler
20178    EXPORT_PC()
20179    mov    r0, rPC              @ arg0
20180    mov    r1, rFP              @ arg1
20181    mov    r2, rSELF            @ arg2
20182    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20183
20184/* ------------------------------ */
20185    .balign 64
20186.L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
20187/* File: armv5te/alt_stub.S */
20188/*
20189 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20190 * any interesting requests and then jump to the real instruction
20191 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20192 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20193 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20194 * bail to the real handler if breakFlags==0.
20195 */
20196    ldrb   r3, [rSELF, #offThread_breakFlags]
20197    adrl   lr, dvmAsmInstructionStart + (249 * 64)
20198    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20199    cmp    r3, #0
20200    bxeq   lr                   @ nothing to do - jump to real handler
20201    EXPORT_PC()
20202    mov    r0, rPC              @ arg0
20203    mov    r1, rFP              @ arg1
20204    mov    r2, rSELF            @ arg2
20205    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20206
20207/* ------------------------------ */
20208    .balign 64
20209.L_ALT_OP_INVOKE_SUPER_QUICK: /* 0xfa */
20210/* File: armv5te/alt_stub.S */
20211/*
20212 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20213 * any interesting requests and then jump to the real instruction
20214 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20215 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20216 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20217 * bail to the real handler if breakFlags==0.
20218 */
20219    ldrb   r3, [rSELF, #offThread_breakFlags]
20220    adrl   lr, dvmAsmInstructionStart + (250 * 64)
20221    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20222    cmp    r3, #0
20223    bxeq   lr                   @ nothing to do - jump to real handler
20224    EXPORT_PC()
20225    mov    r0, rPC              @ arg0
20226    mov    r1, rFP              @ arg1
20227    mov    r2, rSELF            @ arg2
20228    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20229
20230/* ------------------------------ */
20231    .balign 64
20232.L_ALT_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
20233/* File: armv5te/alt_stub.S */
20234/*
20235 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20236 * any interesting requests and then jump to the real instruction
20237 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20238 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20239 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20240 * bail to the real handler if breakFlags==0.
20241 */
20242    ldrb   r3, [rSELF, #offThread_breakFlags]
20243    adrl   lr, dvmAsmInstructionStart + (251 * 64)
20244    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20245    cmp    r3, #0
20246    bxeq   lr                   @ nothing to do - jump to real handler
20247    EXPORT_PC()
20248    mov    r0, rPC              @ arg0
20249    mov    r1, rFP              @ arg1
20250    mov    r2, rSELF            @ arg2
20251    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20252
20253/* ------------------------------ */
20254    .balign 64
20255.L_ALT_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
20256/* File: armv5te/alt_stub.S */
20257/*
20258 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20259 * any interesting requests and then jump to the real instruction
20260 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20261 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20262 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20263 * bail to the real handler if breakFlags==0.
20264 */
20265    ldrb   r3, [rSELF, #offThread_breakFlags]
20266    adrl   lr, dvmAsmInstructionStart + (252 * 64)
20267    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20268    cmp    r3, #0
20269    bxeq   lr                   @ nothing to do - jump to real handler
20270    EXPORT_PC()
20271    mov    r0, rPC              @ arg0
20272    mov    r1, rFP              @ arg1
20273    mov    r2, rSELF            @ arg2
20274    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20275
20276/* ------------------------------ */
20277    .balign 64
20278.L_ALT_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
20279/* File: armv5te/alt_stub.S */
20280/*
20281 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20282 * any interesting requests and then jump to the real instruction
20283 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20284 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20285 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20286 * bail to the real handler if breakFlags==0.
20287 */
20288    ldrb   r3, [rSELF, #offThread_breakFlags]
20289    adrl   lr, dvmAsmInstructionStart + (253 * 64)
20290    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20291    cmp    r3, #0
20292    bxeq   lr                   @ nothing to do - jump to real handler
20293    EXPORT_PC()
20294    mov    r0, rPC              @ arg0
20295    mov    r1, rFP              @ arg1
20296    mov    r2, rSELF            @ arg2
20297    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20298
20299/* ------------------------------ */
20300    .balign 64
20301.L_ALT_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
20302/* File: armv5te/alt_stub.S */
20303/*
20304 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20305 * any interesting requests and then jump to the real instruction
20306 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20307 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20308 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20309 * bail to the real handler if breakFlags==0.
20310 */
20311    ldrb   r3, [rSELF, #offThread_breakFlags]
20312    adrl   lr, dvmAsmInstructionStart + (254 * 64)
20313    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20314    cmp    r3, #0
20315    bxeq   lr                   @ nothing to do - jump to real handler
20316    EXPORT_PC()
20317    mov    r0, rPC              @ arg0
20318    mov    r1, rFP              @ arg1
20319    mov    r2, rSELF            @ arg2
20320    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20321
20322/* ------------------------------ */
20323    .balign 64
20324.L_ALT_OP_DISPATCH_FF: /* 0xff */
20325/* File: armv5te/ALT_OP_DISPATCH_FF.S */
20326/*
20327 * Unlike other alt stubs, we don't want to call dvmCheckBefore() here.
20328 * Instead, just treat this as a trampoline to reach the real alt
20329 * handler (which will do the dvmCheckBefore() call.
20330 */
20331    mov     ip, rINST, lsr #8           @ ip<- extended opcode
20332    add     ip, ip, #256                @ add offset for extended opcodes
20333    GOTO_OPCODE(ip)                     @ go to proper extended handler
20334
20335
20336/* ------------------------------ */
20337    .balign 64
20338.L_ALT_OP_CONST_CLASS_JUMBO: /* 0x100 */
20339/* File: armv5te/alt_stub.S */
20340/*
20341 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20342 * any interesting requests and then jump to the real instruction
20343 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20344 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20345 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20346 * bail to the real handler if breakFlags==0.
20347 */
20348    ldrb   r3, [rSELF, #offThread_breakFlags]
20349    adrl   lr, dvmAsmInstructionStart + (256 * 64)
20350    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20351    cmp    r3, #0
20352    bxeq   lr                   @ nothing to do - jump to real handler
20353    EXPORT_PC()
20354    mov    r0, rPC              @ arg0
20355    mov    r1, rFP              @ arg1
20356    mov    r2, rSELF            @ arg2
20357    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20358
20359/* ------------------------------ */
20360    .balign 64
20361.L_ALT_OP_CHECK_CAST_JUMBO: /* 0x101 */
20362/* File: armv5te/alt_stub.S */
20363/*
20364 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20365 * any interesting requests and then jump to the real instruction
20366 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20367 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20368 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20369 * bail to the real handler if breakFlags==0.
20370 */
20371    ldrb   r3, [rSELF, #offThread_breakFlags]
20372    adrl   lr, dvmAsmInstructionStart + (257 * 64)
20373    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20374    cmp    r3, #0
20375    bxeq   lr                   @ nothing to do - jump to real handler
20376    EXPORT_PC()
20377    mov    r0, rPC              @ arg0
20378    mov    r1, rFP              @ arg1
20379    mov    r2, rSELF            @ arg2
20380    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20381
20382/* ------------------------------ */
20383    .balign 64
20384.L_ALT_OP_INSTANCE_OF_JUMBO: /* 0x102 */
20385/* File: armv5te/alt_stub.S */
20386/*
20387 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20388 * any interesting requests and then jump to the real instruction
20389 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20390 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20391 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20392 * bail to the real handler if breakFlags==0.
20393 */
20394    ldrb   r3, [rSELF, #offThread_breakFlags]
20395    adrl   lr, dvmAsmInstructionStart + (258 * 64)
20396    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20397    cmp    r3, #0
20398    bxeq   lr                   @ nothing to do - jump to real handler
20399    EXPORT_PC()
20400    mov    r0, rPC              @ arg0
20401    mov    r1, rFP              @ arg1
20402    mov    r2, rSELF            @ arg2
20403    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20404
20405/* ------------------------------ */
20406    .balign 64
20407.L_ALT_OP_NEW_INSTANCE_JUMBO: /* 0x103 */
20408/* File: armv5te/alt_stub.S */
20409/*
20410 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20411 * any interesting requests and then jump to the real instruction
20412 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20413 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20414 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20415 * bail to the real handler if breakFlags==0.
20416 */
20417    ldrb   r3, [rSELF, #offThread_breakFlags]
20418    adrl   lr, dvmAsmInstructionStart + (259 * 64)
20419    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20420    cmp    r3, #0
20421    bxeq   lr                   @ nothing to do - jump to real handler
20422    EXPORT_PC()
20423    mov    r0, rPC              @ arg0
20424    mov    r1, rFP              @ arg1
20425    mov    r2, rSELF            @ arg2
20426    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20427
20428/* ------------------------------ */
20429    .balign 64
20430.L_ALT_OP_NEW_ARRAY_JUMBO: /* 0x104 */
20431/* File: armv5te/alt_stub.S */
20432/*
20433 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20434 * any interesting requests and then jump to the real instruction
20435 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20436 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20437 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20438 * bail to the real handler if breakFlags==0.
20439 */
20440    ldrb   r3, [rSELF, #offThread_breakFlags]
20441    adrl   lr, dvmAsmInstructionStart + (260 * 64)
20442    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20443    cmp    r3, #0
20444    bxeq   lr                   @ nothing to do - jump to real handler
20445    EXPORT_PC()
20446    mov    r0, rPC              @ arg0
20447    mov    r1, rFP              @ arg1
20448    mov    r2, rSELF            @ arg2
20449    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20450
20451/* ------------------------------ */
20452    .balign 64
20453.L_ALT_OP_FILLED_NEW_ARRAY_JUMBO: /* 0x105 */
20454/* File: armv5te/alt_stub.S */
20455/*
20456 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20457 * any interesting requests and then jump to the real instruction
20458 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20459 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20460 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20461 * bail to the real handler if breakFlags==0.
20462 */
20463    ldrb   r3, [rSELF, #offThread_breakFlags]
20464    adrl   lr, dvmAsmInstructionStart + (261 * 64)
20465    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20466    cmp    r3, #0
20467    bxeq   lr                   @ nothing to do - jump to real handler
20468    EXPORT_PC()
20469    mov    r0, rPC              @ arg0
20470    mov    r1, rFP              @ arg1
20471    mov    r2, rSELF            @ arg2
20472    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20473
20474/* ------------------------------ */
20475    .balign 64
20476.L_ALT_OP_IGET_JUMBO: /* 0x106 */
20477/* File: armv5te/alt_stub.S */
20478/*
20479 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20480 * any interesting requests and then jump to the real instruction
20481 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20482 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20483 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20484 * bail to the real handler if breakFlags==0.
20485 */
20486    ldrb   r3, [rSELF, #offThread_breakFlags]
20487    adrl   lr, dvmAsmInstructionStart + (262 * 64)
20488    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20489    cmp    r3, #0
20490    bxeq   lr                   @ nothing to do - jump to real handler
20491    EXPORT_PC()
20492    mov    r0, rPC              @ arg0
20493    mov    r1, rFP              @ arg1
20494    mov    r2, rSELF            @ arg2
20495    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20496
20497/* ------------------------------ */
20498    .balign 64
20499.L_ALT_OP_IGET_WIDE_JUMBO: /* 0x107 */
20500/* File: armv5te/alt_stub.S */
20501/*
20502 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20503 * any interesting requests and then jump to the real instruction
20504 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20505 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20506 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20507 * bail to the real handler if breakFlags==0.
20508 */
20509    ldrb   r3, [rSELF, #offThread_breakFlags]
20510    adrl   lr, dvmAsmInstructionStart + (263 * 64)
20511    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20512    cmp    r3, #0
20513    bxeq   lr                   @ nothing to do - jump to real handler
20514    EXPORT_PC()
20515    mov    r0, rPC              @ arg0
20516    mov    r1, rFP              @ arg1
20517    mov    r2, rSELF            @ arg2
20518    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20519
20520/* ------------------------------ */
20521    .balign 64
20522.L_ALT_OP_IGET_OBJECT_JUMBO: /* 0x108 */
20523/* File: armv5te/alt_stub.S */
20524/*
20525 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20526 * any interesting requests and then jump to the real instruction
20527 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20528 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20529 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20530 * bail to the real handler if breakFlags==0.
20531 */
20532    ldrb   r3, [rSELF, #offThread_breakFlags]
20533    adrl   lr, dvmAsmInstructionStart + (264 * 64)
20534    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20535    cmp    r3, #0
20536    bxeq   lr                   @ nothing to do - jump to real handler
20537    EXPORT_PC()
20538    mov    r0, rPC              @ arg0
20539    mov    r1, rFP              @ arg1
20540    mov    r2, rSELF            @ arg2
20541    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20542
20543/* ------------------------------ */
20544    .balign 64
20545.L_ALT_OP_IGET_BOOLEAN_JUMBO: /* 0x109 */
20546/* File: armv5te/alt_stub.S */
20547/*
20548 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20549 * any interesting requests and then jump to the real instruction
20550 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20551 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20552 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20553 * bail to the real handler if breakFlags==0.
20554 */
20555    ldrb   r3, [rSELF, #offThread_breakFlags]
20556    adrl   lr, dvmAsmInstructionStart + (265 * 64)
20557    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20558    cmp    r3, #0
20559    bxeq   lr                   @ nothing to do - jump to real handler
20560    EXPORT_PC()
20561    mov    r0, rPC              @ arg0
20562    mov    r1, rFP              @ arg1
20563    mov    r2, rSELF            @ arg2
20564    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20565
20566/* ------------------------------ */
20567    .balign 64
20568.L_ALT_OP_IGET_BYTE_JUMBO: /* 0x10a */
20569/* File: armv5te/alt_stub.S */
20570/*
20571 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20572 * any interesting requests and then jump to the real instruction
20573 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20574 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20575 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20576 * bail to the real handler if breakFlags==0.
20577 */
20578    ldrb   r3, [rSELF, #offThread_breakFlags]
20579    adrl   lr, dvmAsmInstructionStart + (266 * 64)
20580    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20581    cmp    r3, #0
20582    bxeq   lr                   @ nothing to do - jump to real handler
20583    EXPORT_PC()
20584    mov    r0, rPC              @ arg0
20585    mov    r1, rFP              @ arg1
20586    mov    r2, rSELF            @ arg2
20587    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20588
20589/* ------------------------------ */
20590    .balign 64
20591.L_ALT_OP_IGET_CHAR_JUMBO: /* 0x10b */
20592/* File: armv5te/alt_stub.S */
20593/*
20594 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20595 * any interesting requests and then jump to the real instruction
20596 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20597 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20598 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20599 * bail to the real handler if breakFlags==0.
20600 */
20601    ldrb   r3, [rSELF, #offThread_breakFlags]
20602    adrl   lr, dvmAsmInstructionStart + (267 * 64)
20603    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20604    cmp    r3, #0
20605    bxeq   lr                   @ nothing to do - jump to real handler
20606    EXPORT_PC()
20607    mov    r0, rPC              @ arg0
20608    mov    r1, rFP              @ arg1
20609    mov    r2, rSELF            @ arg2
20610    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20611
20612/* ------------------------------ */
20613    .balign 64
20614.L_ALT_OP_IGET_SHORT_JUMBO: /* 0x10c */
20615/* File: armv5te/alt_stub.S */
20616/*
20617 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20618 * any interesting requests and then jump to the real instruction
20619 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20620 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20621 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20622 * bail to the real handler if breakFlags==0.
20623 */
20624    ldrb   r3, [rSELF, #offThread_breakFlags]
20625    adrl   lr, dvmAsmInstructionStart + (268 * 64)
20626    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20627    cmp    r3, #0
20628    bxeq   lr                   @ nothing to do - jump to real handler
20629    EXPORT_PC()
20630    mov    r0, rPC              @ arg0
20631    mov    r1, rFP              @ arg1
20632    mov    r2, rSELF            @ arg2
20633    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20634
20635/* ------------------------------ */
20636    .balign 64
20637.L_ALT_OP_IPUT_JUMBO: /* 0x10d */
20638/* File: armv5te/alt_stub.S */
20639/*
20640 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20641 * any interesting requests and then jump to the real instruction
20642 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20643 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20644 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20645 * bail to the real handler if breakFlags==0.
20646 */
20647    ldrb   r3, [rSELF, #offThread_breakFlags]
20648    adrl   lr, dvmAsmInstructionStart + (269 * 64)
20649    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20650    cmp    r3, #0
20651    bxeq   lr                   @ nothing to do - jump to real handler
20652    EXPORT_PC()
20653    mov    r0, rPC              @ arg0
20654    mov    r1, rFP              @ arg1
20655    mov    r2, rSELF            @ arg2
20656    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20657
20658/* ------------------------------ */
20659    .balign 64
20660.L_ALT_OP_IPUT_WIDE_JUMBO: /* 0x10e */
20661/* File: armv5te/alt_stub.S */
20662/*
20663 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20664 * any interesting requests and then jump to the real instruction
20665 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20666 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20667 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20668 * bail to the real handler if breakFlags==0.
20669 */
20670    ldrb   r3, [rSELF, #offThread_breakFlags]
20671    adrl   lr, dvmAsmInstructionStart + (270 * 64)
20672    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20673    cmp    r3, #0
20674    bxeq   lr                   @ nothing to do - jump to real handler
20675    EXPORT_PC()
20676    mov    r0, rPC              @ arg0
20677    mov    r1, rFP              @ arg1
20678    mov    r2, rSELF            @ arg2
20679    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20680
20681/* ------------------------------ */
20682    .balign 64
20683.L_ALT_OP_IPUT_OBJECT_JUMBO: /* 0x10f */
20684/* File: armv5te/alt_stub.S */
20685/*
20686 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20687 * any interesting requests and then jump to the real instruction
20688 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20689 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20690 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20691 * bail to the real handler if breakFlags==0.
20692 */
20693    ldrb   r3, [rSELF, #offThread_breakFlags]
20694    adrl   lr, dvmAsmInstructionStart + (271 * 64)
20695    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20696    cmp    r3, #0
20697    bxeq   lr                   @ nothing to do - jump to real handler
20698    EXPORT_PC()
20699    mov    r0, rPC              @ arg0
20700    mov    r1, rFP              @ arg1
20701    mov    r2, rSELF            @ arg2
20702    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20703
20704/* ------------------------------ */
20705    .balign 64
20706.L_ALT_OP_IPUT_BOOLEAN_JUMBO: /* 0x110 */
20707/* File: armv5te/alt_stub.S */
20708/*
20709 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20710 * any interesting requests and then jump to the real instruction
20711 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20712 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20713 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20714 * bail to the real handler if breakFlags==0.
20715 */
20716    ldrb   r3, [rSELF, #offThread_breakFlags]
20717    adrl   lr, dvmAsmInstructionStart + (272 * 64)
20718    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20719    cmp    r3, #0
20720    bxeq   lr                   @ nothing to do - jump to real handler
20721    EXPORT_PC()
20722    mov    r0, rPC              @ arg0
20723    mov    r1, rFP              @ arg1
20724    mov    r2, rSELF            @ arg2
20725    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20726
20727/* ------------------------------ */
20728    .balign 64
20729.L_ALT_OP_IPUT_BYTE_JUMBO: /* 0x111 */
20730/* File: armv5te/alt_stub.S */
20731/*
20732 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20733 * any interesting requests and then jump to the real instruction
20734 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20735 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20736 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20737 * bail to the real handler if breakFlags==0.
20738 */
20739    ldrb   r3, [rSELF, #offThread_breakFlags]
20740    adrl   lr, dvmAsmInstructionStart + (273 * 64)
20741    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20742    cmp    r3, #0
20743    bxeq   lr                   @ nothing to do - jump to real handler
20744    EXPORT_PC()
20745    mov    r0, rPC              @ arg0
20746    mov    r1, rFP              @ arg1
20747    mov    r2, rSELF            @ arg2
20748    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20749
20750/* ------------------------------ */
20751    .balign 64
20752.L_ALT_OP_IPUT_CHAR_JUMBO: /* 0x112 */
20753/* File: armv5te/alt_stub.S */
20754/*
20755 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20756 * any interesting requests and then jump to the real instruction
20757 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20758 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20759 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20760 * bail to the real handler if breakFlags==0.
20761 */
20762    ldrb   r3, [rSELF, #offThread_breakFlags]
20763    adrl   lr, dvmAsmInstructionStart + (274 * 64)
20764    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20765    cmp    r3, #0
20766    bxeq   lr                   @ nothing to do - jump to real handler
20767    EXPORT_PC()
20768    mov    r0, rPC              @ arg0
20769    mov    r1, rFP              @ arg1
20770    mov    r2, rSELF            @ arg2
20771    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20772
20773/* ------------------------------ */
20774    .balign 64
20775.L_ALT_OP_IPUT_SHORT_JUMBO: /* 0x113 */
20776/* File: armv5te/alt_stub.S */
20777/*
20778 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20779 * any interesting requests and then jump to the real instruction
20780 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20781 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20782 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20783 * bail to the real handler if breakFlags==0.
20784 */
20785    ldrb   r3, [rSELF, #offThread_breakFlags]
20786    adrl   lr, dvmAsmInstructionStart + (275 * 64)
20787    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20788    cmp    r3, #0
20789    bxeq   lr                   @ nothing to do - jump to real handler
20790    EXPORT_PC()
20791    mov    r0, rPC              @ arg0
20792    mov    r1, rFP              @ arg1
20793    mov    r2, rSELF            @ arg2
20794    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20795
20796/* ------------------------------ */
20797    .balign 64
20798.L_ALT_OP_SGET_JUMBO: /* 0x114 */
20799/* File: armv5te/alt_stub.S */
20800/*
20801 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20802 * any interesting requests and then jump to the real instruction
20803 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20804 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20805 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20806 * bail to the real handler if breakFlags==0.
20807 */
20808    ldrb   r3, [rSELF, #offThread_breakFlags]
20809    adrl   lr, dvmAsmInstructionStart + (276 * 64)
20810    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20811    cmp    r3, #0
20812    bxeq   lr                   @ nothing to do - jump to real handler
20813    EXPORT_PC()
20814    mov    r0, rPC              @ arg0
20815    mov    r1, rFP              @ arg1
20816    mov    r2, rSELF            @ arg2
20817    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20818
20819/* ------------------------------ */
20820    .balign 64
20821.L_ALT_OP_SGET_WIDE_JUMBO: /* 0x115 */
20822/* File: armv5te/alt_stub.S */
20823/*
20824 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20825 * any interesting requests and then jump to the real instruction
20826 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20827 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20828 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20829 * bail to the real handler if breakFlags==0.
20830 */
20831    ldrb   r3, [rSELF, #offThread_breakFlags]
20832    adrl   lr, dvmAsmInstructionStart + (277 * 64)
20833    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20834    cmp    r3, #0
20835    bxeq   lr                   @ nothing to do - jump to real handler
20836    EXPORT_PC()
20837    mov    r0, rPC              @ arg0
20838    mov    r1, rFP              @ arg1
20839    mov    r2, rSELF            @ arg2
20840    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20841
20842/* ------------------------------ */
20843    .balign 64
20844.L_ALT_OP_SGET_OBJECT_JUMBO: /* 0x116 */
20845/* File: armv5te/alt_stub.S */
20846/*
20847 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20848 * any interesting requests and then jump to the real instruction
20849 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20850 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20851 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20852 * bail to the real handler if breakFlags==0.
20853 */
20854    ldrb   r3, [rSELF, #offThread_breakFlags]
20855    adrl   lr, dvmAsmInstructionStart + (278 * 64)
20856    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20857    cmp    r3, #0
20858    bxeq   lr                   @ nothing to do - jump to real handler
20859    EXPORT_PC()
20860    mov    r0, rPC              @ arg0
20861    mov    r1, rFP              @ arg1
20862    mov    r2, rSELF            @ arg2
20863    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20864
20865/* ------------------------------ */
20866    .balign 64
20867.L_ALT_OP_SGET_BOOLEAN_JUMBO: /* 0x117 */
20868/* File: armv5te/alt_stub.S */
20869/*
20870 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20871 * any interesting requests and then jump to the real instruction
20872 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20873 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20874 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20875 * bail to the real handler if breakFlags==0.
20876 */
20877    ldrb   r3, [rSELF, #offThread_breakFlags]
20878    adrl   lr, dvmAsmInstructionStart + (279 * 64)
20879    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20880    cmp    r3, #0
20881    bxeq   lr                   @ nothing to do - jump to real handler
20882    EXPORT_PC()
20883    mov    r0, rPC              @ arg0
20884    mov    r1, rFP              @ arg1
20885    mov    r2, rSELF            @ arg2
20886    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20887
20888/* ------------------------------ */
20889    .balign 64
20890.L_ALT_OP_SGET_BYTE_JUMBO: /* 0x118 */
20891/* File: armv5te/alt_stub.S */
20892/*
20893 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20894 * any interesting requests and then jump to the real instruction
20895 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20896 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20897 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20898 * bail to the real handler if breakFlags==0.
20899 */
20900    ldrb   r3, [rSELF, #offThread_breakFlags]
20901    adrl   lr, dvmAsmInstructionStart + (280 * 64)
20902    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20903    cmp    r3, #0
20904    bxeq   lr                   @ nothing to do - jump to real handler
20905    EXPORT_PC()
20906    mov    r0, rPC              @ arg0
20907    mov    r1, rFP              @ arg1
20908    mov    r2, rSELF            @ arg2
20909    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20910
20911/* ------------------------------ */
20912    .balign 64
20913.L_ALT_OP_SGET_CHAR_JUMBO: /* 0x119 */
20914/* File: armv5te/alt_stub.S */
20915/*
20916 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20917 * any interesting requests and then jump to the real instruction
20918 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20919 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20920 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20921 * bail to the real handler if breakFlags==0.
20922 */
20923    ldrb   r3, [rSELF, #offThread_breakFlags]
20924    adrl   lr, dvmAsmInstructionStart + (281 * 64)
20925    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20926    cmp    r3, #0
20927    bxeq   lr                   @ nothing to do - jump to real handler
20928    EXPORT_PC()
20929    mov    r0, rPC              @ arg0
20930    mov    r1, rFP              @ arg1
20931    mov    r2, rSELF            @ arg2
20932    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20933
20934/* ------------------------------ */
20935    .balign 64
20936.L_ALT_OP_SGET_SHORT_JUMBO: /* 0x11a */
20937/* File: armv5te/alt_stub.S */
20938/*
20939 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20940 * any interesting requests and then jump to the real instruction
20941 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20942 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20943 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20944 * bail to the real handler if breakFlags==0.
20945 */
20946    ldrb   r3, [rSELF, #offThread_breakFlags]
20947    adrl   lr, dvmAsmInstructionStart + (282 * 64)
20948    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20949    cmp    r3, #0
20950    bxeq   lr                   @ nothing to do - jump to real handler
20951    EXPORT_PC()
20952    mov    r0, rPC              @ arg0
20953    mov    r1, rFP              @ arg1
20954    mov    r2, rSELF            @ arg2
20955    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20956
20957/* ------------------------------ */
20958    .balign 64
20959.L_ALT_OP_SPUT_JUMBO: /* 0x11b */
20960/* File: armv5te/alt_stub.S */
20961/*
20962 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20963 * any interesting requests and then jump to the real instruction
20964 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20965 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20966 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20967 * bail to the real handler if breakFlags==0.
20968 */
20969    ldrb   r3, [rSELF, #offThread_breakFlags]
20970    adrl   lr, dvmAsmInstructionStart + (283 * 64)
20971    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20972    cmp    r3, #0
20973    bxeq   lr                   @ nothing to do - jump to real handler
20974    EXPORT_PC()
20975    mov    r0, rPC              @ arg0
20976    mov    r1, rFP              @ arg1
20977    mov    r2, rSELF            @ arg2
20978    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
20979
20980/* ------------------------------ */
20981    .balign 64
20982.L_ALT_OP_SPUT_WIDE_JUMBO: /* 0x11c */
20983/* File: armv5te/alt_stub.S */
20984/*
20985 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
20986 * any interesting requests and then jump to the real instruction
20987 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
20988 * rIBASE updates won't be seen until a refresh, and we can tell we have a
20989 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
20990 * bail to the real handler if breakFlags==0.
20991 */
20992    ldrb   r3, [rSELF, #offThread_breakFlags]
20993    adrl   lr, dvmAsmInstructionStart + (284 * 64)
20994    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
20995    cmp    r3, #0
20996    bxeq   lr                   @ nothing to do - jump to real handler
20997    EXPORT_PC()
20998    mov    r0, rPC              @ arg0
20999    mov    r1, rFP              @ arg1
21000    mov    r2, rSELF            @ arg2
21001    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21002
21003/* ------------------------------ */
21004    .balign 64
21005.L_ALT_OP_SPUT_OBJECT_JUMBO: /* 0x11d */
21006/* File: armv5te/alt_stub.S */
21007/*
21008 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21009 * any interesting requests and then jump to the real instruction
21010 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21011 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21012 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21013 * bail to the real handler if breakFlags==0.
21014 */
21015    ldrb   r3, [rSELF, #offThread_breakFlags]
21016    adrl   lr, dvmAsmInstructionStart + (285 * 64)
21017    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21018    cmp    r3, #0
21019    bxeq   lr                   @ nothing to do - jump to real handler
21020    EXPORT_PC()
21021    mov    r0, rPC              @ arg0
21022    mov    r1, rFP              @ arg1
21023    mov    r2, rSELF            @ arg2
21024    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21025
21026/* ------------------------------ */
21027    .balign 64
21028.L_ALT_OP_SPUT_BOOLEAN_JUMBO: /* 0x11e */
21029/* File: armv5te/alt_stub.S */
21030/*
21031 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21032 * any interesting requests and then jump to the real instruction
21033 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21034 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21035 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21036 * bail to the real handler if breakFlags==0.
21037 */
21038    ldrb   r3, [rSELF, #offThread_breakFlags]
21039    adrl   lr, dvmAsmInstructionStart + (286 * 64)
21040    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21041    cmp    r3, #0
21042    bxeq   lr                   @ nothing to do - jump to real handler
21043    EXPORT_PC()
21044    mov    r0, rPC              @ arg0
21045    mov    r1, rFP              @ arg1
21046    mov    r2, rSELF            @ arg2
21047    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21048
21049/* ------------------------------ */
21050    .balign 64
21051.L_ALT_OP_SPUT_BYTE_JUMBO: /* 0x11f */
21052/* File: armv5te/alt_stub.S */
21053/*
21054 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21055 * any interesting requests and then jump to the real instruction
21056 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21057 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21058 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21059 * bail to the real handler if breakFlags==0.
21060 */
21061    ldrb   r3, [rSELF, #offThread_breakFlags]
21062    adrl   lr, dvmAsmInstructionStart + (287 * 64)
21063    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21064    cmp    r3, #0
21065    bxeq   lr                   @ nothing to do - jump to real handler
21066    EXPORT_PC()
21067    mov    r0, rPC              @ arg0
21068    mov    r1, rFP              @ arg1
21069    mov    r2, rSELF            @ arg2
21070    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21071
21072/* ------------------------------ */
21073    .balign 64
21074.L_ALT_OP_SPUT_CHAR_JUMBO: /* 0x120 */
21075/* File: armv5te/alt_stub.S */
21076/*
21077 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21078 * any interesting requests and then jump to the real instruction
21079 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21080 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21081 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21082 * bail to the real handler if breakFlags==0.
21083 */
21084    ldrb   r3, [rSELF, #offThread_breakFlags]
21085    adrl   lr, dvmAsmInstructionStart + (288 * 64)
21086    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21087    cmp    r3, #0
21088    bxeq   lr                   @ nothing to do - jump to real handler
21089    EXPORT_PC()
21090    mov    r0, rPC              @ arg0
21091    mov    r1, rFP              @ arg1
21092    mov    r2, rSELF            @ arg2
21093    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21094
21095/* ------------------------------ */
21096    .balign 64
21097.L_ALT_OP_SPUT_SHORT_JUMBO: /* 0x121 */
21098/* File: armv5te/alt_stub.S */
21099/*
21100 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21101 * any interesting requests and then jump to the real instruction
21102 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21103 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21104 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21105 * bail to the real handler if breakFlags==0.
21106 */
21107    ldrb   r3, [rSELF, #offThread_breakFlags]
21108    adrl   lr, dvmAsmInstructionStart + (289 * 64)
21109    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21110    cmp    r3, #0
21111    bxeq   lr                   @ nothing to do - jump to real handler
21112    EXPORT_PC()
21113    mov    r0, rPC              @ arg0
21114    mov    r1, rFP              @ arg1
21115    mov    r2, rSELF            @ arg2
21116    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21117
21118/* ------------------------------ */
21119    .balign 64
21120.L_ALT_OP_INVOKE_VIRTUAL_JUMBO: /* 0x122 */
21121/* File: armv5te/alt_stub.S */
21122/*
21123 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21124 * any interesting requests and then jump to the real instruction
21125 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21126 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21127 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21128 * bail to the real handler if breakFlags==0.
21129 */
21130    ldrb   r3, [rSELF, #offThread_breakFlags]
21131    adrl   lr, dvmAsmInstructionStart + (290 * 64)
21132    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21133    cmp    r3, #0
21134    bxeq   lr                   @ nothing to do - jump to real handler
21135    EXPORT_PC()
21136    mov    r0, rPC              @ arg0
21137    mov    r1, rFP              @ arg1
21138    mov    r2, rSELF            @ arg2
21139    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21140
21141/* ------------------------------ */
21142    .balign 64
21143.L_ALT_OP_INVOKE_SUPER_JUMBO: /* 0x123 */
21144/* File: armv5te/alt_stub.S */
21145/*
21146 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21147 * any interesting requests and then jump to the real instruction
21148 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21149 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21150 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21151 * bail to the real handler if breakFlags==0.
21152 */
21153    ldrb   r3, [rSELF, #offThread_breakFlags]
21154    adrl   lr, dvmAsmInstructionStart + (291 * 64)
21155    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21156    cmp    r3, #0
21157    bxeq   lr                   @ nothing to do - jump to real handler
21158    EXPORT_PC()
21159    mov    r0, rPC              @ arg0
21160    mov    r1, rFP              @ arg1
21161    mov    r2, rSELF            @ arg2
21162    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21163
21164/* ------------------------------ */
21165    .balign 64
21166.L_ALT_OP_INVOKE_DIRECT_JUMBO: /* 0x124 */
21167/* File: armv5te/alt_stub.S */
21168/*
21169 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21170 * any interesting requests and then jump to the real instruction
21171 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21172 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21173 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21174 * bail to the real handler if breakFlags==0.
21175 */
21176    ldrb   r3, [rSELF, #offThread_breakFlags]
21177    adrl   lr, dvmAsmInstructionStart + (292 * 64)
21178    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21179    cmp    r3, #0
21180    bxeq   lr                   @ nothing to do - jump to real handler
21181    EXPORT_PC()
21182    mov    r0, rPC              @ arg0
21183    mov    r1, rFP              @ arg1
21184    mov    r2, rSELF            @ arg2
21185    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21186
21187/* ------------------------------ */
21188    .balign 64
21189.L_ALT_OP_INVOKE_STATIC_JUMBO: /* 0x125 */
21190/* File: armv5te/alt_stub.S */
21191/*
21192 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21193 * any interesting requests and then jump to the real instruction
21194 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21195 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21196 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21197 * bail to the real handler if breakFlags==0.
21198 */
21199    ldrb   r3, [rSELF, #offThread_breakFlags]
21200    adrl   lr, dvmAsmInstructionStart + (293 * 64)
21201    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21202    cmp    r3, #0
21203    bxeq   lr                   @ nothing to do - jump to real handler
21204    EXPORT_PC()
21205    mov    r0, rPC              @ arg0
21206    mov    r1, rFP              @ arg1
21207    mov    r2, rSELF            @ arg2
21208    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21209
21210/* ------------------------------ */
21211    .balign 64
21212.L_ALT_OP_INVOKE_INTERFACE_JUMBO: /* 0x126 */
21213/* File: armv5te/alt_stub.S */
21214/*
21215 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21216 * any interesting requests and then jump to the real instruction
21217 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21218 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21219 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21220 * bail to the real handler if breakFlags==0.
21221 */
21222    ldrb   r3, [rSELF, #offThread_breakFlags]
21223    adrl   lr, dvmAsmInstructionStart + (294 * 64)
21224    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21225    cmp    r3, #0
21226    bxeq   lr                   @ nothing to do - jump to real handler
21227    EXPORT_PC()
21228    mov    r0, rPC              @ arg0
21229    mov    r1, rFP              @ arg1
21230    mov    r2, rSELF            @ arg2
21231    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21232
21233/* ------------------------------ */
21234    .balign 64
21235.L_ALT_OP_UNUSED_27FF: /* 0x127 */
21236/* File: armv5te/alt_stub.S */
21237/*
21238 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21239 * any interesting requests and then jump to the real instruction
21240 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21241 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21242 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21243 * bail to the real handler if breakFlags==0.
21244 */
21245    ldrb   r3, [rSELF, #offThread_breakFlags]
21246    adrl   lr, dvmAsmInstructionStart + (295 * 64)
21247    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21248    cmp    r3, #0
21249    bxeq   lr                   @ nothing to do - jump to real handler
21250    EXPORT_PC()
21251    mov    r0, rPC              @ arg0
21252    mov    r1, rFP              @ arg1
21253    mov    r2, rSELF            @ arg2
21254    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21255
21256/* ------------------------------ */
21257    .balign 64
21258.L_ALT_OP_UNUSED_28FF: /* 0x128 */
21259/* File: armv5te/alt_stub.S */
21260/*
21261 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21262 * any interesting requests and then jump to the real instruction
21263 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21264 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21265 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21266 * bail to the real handler if breakFlags==0.
21267 */
21268    ldrb   r3, [rSELF, #offThread_breakFlags]
21269    adrl   lr, dvmAsmInstructionStart + (296 * 64)
21270    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21271    cmp    r3, #0
21272    bxeq   lr                   @ nothing to do - jump to real handler
21273    EXPORT_PC()
21274    mov    r0, rPC              @ arg0
21275    mov    r1, rFP              @ arg1
21276    mov    r2, rSELF            @ arg2
21277    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21278
21279/* ------------------------------ */
21280    .balign 64
21281.L_ALT_OP_UNUSED_29FF: /* 0x129 */
21282/* File: armv5te/alt_stub.S */
21283/*
21284 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21285 * any interesting requests and then jump to the real instruction
21286 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21287 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21288 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21289 * bail to the real handler if breakFlags==0.
21290 */
21291    ldrb   r3, [rSELF, #offThread_breakFlags]
21292    adrl   lr, dvmAsmInstructionStart + (297 * 64)
21293    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21294    cmp    r3, #0
21295    bxeq   lr                   @ nothing to do - jump to real handler
21296    EXPORT_PC()
21297    mov    r0, rPC              @ arg0
21298    mov    r1, rFP              @ arg1
21299    mov    r2, rSELF            @ arg2
21300    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21301
21302/* ------------------------------ */
21303    .balign 64
21304.L_ALT_OP_UNUSED_2AFF: /* 0x12a */
21305/* File: armv5te/alt_stub.S */
21306/*
21307 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21308 * any interesting requests and then jump to the real instruction
21309 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21310 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21311 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21312 * bail to the real handler if breakFlags==0.
21313 */
21314    ldrb   r3, [rSELF, #offThread_breakFlags]
21315    adrl   lr, dvmAsmInstructionStart + (298 * 64)
21316    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21317    cmp    r3, #0
21318    bxeq   lr                   @ nothing to do - jump to real handler
21319    EXPORT_PC()
21320    mov    r0, rPC              @ arg0
21321    mov    r1, rFP              @ arg1
21322    mov    r2, rSELF            @ arg2
21323    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21324
21325/* ------------------------------ */
21326    .balign 64
21327.L_ALT_OP_UNUSED_2BFF: /* 0x12b */
21328/* File: armv5te/alt_stub.S */
21329/*
21330 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21331 * any interesting requests and then jump to the real instruction
21332 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21333 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21334 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21335 * bail to the real handler if breakFlags==0.
21336 */
21337    ldrb   r3, [rSELF, #offThread_breakFlags]
21338    adrl   lr, dvmAsmInstructionStart + (299 * 64)
21339    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21340    cmp    r3, #0
21341    bxeq   lr                   @ nothing to do - jump to real handler
21342    EXPORT_PC()
21343    mov    r0, rPC              @ arg0
21344    mov    r1, rFP              @ arg1
21345    mov    r2, rSELF            @ arg2
21346    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21347
21348/* ------------------------------ */
21349    .balign 64
21350.L_ALT_OP_UNUSED_2CFF: /* 0x12c */
21351/* File: armv5te/alt_stub.S */
21352/*
21353 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21354 * any interesting requests and then jump to the real instruction
21355 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21356 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21357 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21358 * bail to the real handler if breakFlags==0.
21359 */
21360    ldrb   r3, [rSELF, #offThread_breakFlags]
21361    adrl   lr, dvmAsmInstructionStart + (300 * 64)
21362    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21363    cmp    r3, #0
21364    bxeq   lr                   @ nothing to do - jump to real handler
21365    EXPORT_PC()
21366    mov    r0, rPC              @ arg0
21367    mov    r1, rFP              @ arg1
21368    mov    r2, rSELF            @ arg2
21369    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21370
21371/* ------------------------------ */
21372    .balign 64
21373.L_ALT_OP_UNUSED_2DFF: /* 0x12d */
21374/* File: armv5te/alt_stub.S */
21375/*
21376 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21377 * any interesting requests and then jump to the real instruction
21378 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21379 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21380 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21381 * bail to the real handler if breakFlags==0.
21382 */
21383    ldrb   r3, [rSELF, #offThread_breakFlags]
21384    adrl   lr, dvmAsmInstructionStart + (301 * 64)
21385    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21386    cmp    r3, #0
21387    bxeq   lr                   @ nothing to do - jump to real handler
21388    EXPORT_PC()
21389    mov    r0, rPC              @ arg0
21390    mov    r1, rFP              @ arg1
21391    mov    r2, rSELF            @ arg2
21392    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21393
21394/* ------------------------------ */
21395    .balign 64
21396.L_ALT_OP_UNUSED_2EFF: /* 0x12e */
21397/* File: armv5te/alt_stub.S */
21398/*
21399 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21400 * any interesting requests and then jump to the real instruction
21401 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21402 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21403 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21404 * bail to the real handler if breakFlags==0.
21405 */
21406    ldrb   r3, [rSELF, #offThread_breakFlags]
21407    adrl   lr, dvmAsmInstructionStart + (302 * 64)
21408    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21409    cmp    r3, #0
21410    bxeq   lr                   @ nothing to do - jump to real handler
21411    EXPORT_PC()
21412    mov    r0, rPC              @ arg0
21413    mov    r1, rFP              @ arg1
21414    mov    r2, rSELF            @ arg2
21415    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21416
21417/* ------------------------------ */
21418    .balign 64
21419.L_ALT_OP_UNUSED_2FFF: /* 0x12f */
21420/* File: armv5te/alt_stub.S */
21421/*
21422 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21423 * any interesting requests and then jump to the real instruction
21424 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21425 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21426 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21427 * bail to the real handler if breakFlags==0.
21428 */
21429    ldrb   r3, [rSELF, #offThread_breakFlags]
21430    adrl   lr, dvmAsmInstructionStart + (303 * 64)
21431    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21432    cmp    r3, #0
21433    bxeq   lr                   @ nothing to do - jump to real handler
21434    EXPORT_PC()
21435    mov    r0, rPC              @ arg0
21436    mov    r1, rFP              @ arg1
21437    mov    r2, rSELF            @ arg2
21438    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21439
21440/* ------------------------------ */
21441    .balign 64
21442.L_ALT_OP_UNUSED_30FF: /* 0x130 */
21443/* File: armv5te/alt_stub.S */
21444/*
21445 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21446 * any interesting requests and then jump to the real instruction
21447 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21448 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21449 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21450 * bail to the real handler if breakFlags==0.
21451 */
21452    ldrb   r3, [rSELF, #offThread_breakFlags]
21453    adrl   lr, dvmAsmInstructionStart + (304 * 64)
21454    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21455    cmp    r3, #0
21456    bxeq   lr                   @ nothing to do - jump to real handler
21457    EXPORT_PC()
21458    mov    r0, rPC              @ arg0
21459    mov    r1, rFP              @ arg1
21460    mov    r2, rSELF            @ arg2
21461    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21462
21463/* ------------------------------ */
21464    .balign 64
21465.L_ALT_OP_UNUSED_31FF: /* 0x131 */
21466/* File: armv5te/alt_stub.S */
21467/*
21468 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21469 * any interesting requests and then jump to the real instruction
21470 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21471 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21472 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21473 * bail to the real handler if breakFlags==0.
21474 */
21475    ldrb   r3, [rSELF, #offThread_breakFlags]
21476    adrl   lr, dvmAsmInstructionStart + (305 * 64)
21477    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21478    cmp    r3, #0
21479    bxeq   lr                   @ nothing to do - jump to real handler
21480    EXPORT_PC()
21481    mov    r0, rPC              @ arg0
21482    mov    r1, rFP              @ arg1
21483    mov    r2, rSELF            @ arg2
21484    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21485
21486/* ------------------------------ */
21487    .balign 64
21488.L_ALT_OP_UNUSED_32FF: /* 0x132 */
21489/* File: armv5te/alt_stub.S */
21490/*
21491 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21492 * any interesting requests and then jump to the real instruction
21493 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21494 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21495 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21496 * bail to the real handler if breakFlags==0.
21497 */
21498    ldrb   r3, [rSELF, #offThread_breakFlags]
21499    adrl   lr, dvmAsmInstructionStart + (306 * 64)
21500    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21501    cmp    r3, #0
21502    bxeq   lr                   @ nothing to do - jump to real handler
21503    EXPORT_PC()
21504    mov    r0, rPC              @ arg0
21505    mov    r1, rFP              @ arg1
21506    mov    r2, rSELF            @ arg2
21507    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21508
21509/* ------------------------------ */
21510    .balign 64
21511.L_ALT_OP_UNUSED_33FF: /* 0x133 */
21512/* File: armv5te/alt_stub.S */
21513/*
21514 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21515 * any interesting requests and then jump to the real instruction
21516 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21517 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21518 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21519 * bail to the real handler if breakFlags==0.
21520 */
21521    ldrb   r3, [rSELF, #offThread_breakFlags]
21522    adrl   lr, dvmAsmInstructionStart + (307 * 64)
21523    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21524    cmp    r3, #0
21525    bxeq   lr                   @ nothing to do - jump to real handler
21526    EXPORT_PC()
21527    mov    r0, rPC              @ arg0
21528    mov    r1, rFP              @ arg1
21529    mov    r2, rSELF            @ arg2
21530    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21531
21532/* ------------------------------ */
21533    .balign 64
21534.L_ALT_OP_UNUSED_34FF: /* 0x134 */
21535/* File: armv5te/alt_stub.S */
21536/*
21537 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21538 * any interesting requests and then jump to the real instruction
21539 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21540 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21541 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21542 * bail to the real handler if breakFlags==0.
21543 */
21544    ldrb   r3, [rSELF, #offThread_breakFlags]
21545    adrl   lr, dvmAsmInstructionStart + (308 * 64)
21546    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21547    cmp    r3, #0
21548    bxeq   lr                   @ nothing to do - jump to real handler
21549    EXPORT_PC()
21550    mov    r0, rPC              @ arg0
21551    mov    r1, rFP              @ arg1
21552    mov    r2, rSELF            @ arg2
21553    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21554
21555/* ------------------------------ */
21556    .balign 64
21557.L_ALT_OP_UNUSED_35FF: /* 0x135 */
21558/* File: armv5te/alt_stub.S */
21559/*
21560 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21561 * any interesting requests and then jump to the real instruction
21562 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21563 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21564 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21565 * bail to the real handler if breakFlags==0.
21566 */
21567    ldrb   r3, [rSELF, #offThread_breakFlags]
21568    adrl   lr, dvmAsmInstructionStart + (309 * 64)
21569    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21570    cmp    r3, #0
21571    bxeq   lr                   @ nothing to do - jump to real handler
21572    EXPORT_PC()
21573    mov    r0, rPC              @ arg0
21574    mov    r1, rFP              @ arg1
21575    mov    r2, rSELF            @ arg2
21576    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21577
21578/* ------------------------------ */
21579    .balign 64
21580.L_ALT_OP_UNUSED_36FF: /* 0x136 */
21581/* File: armv5te/alt_stub.S */
21582/*
21583 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21584 * any interesting requests and then jump to the real instruction
21585 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21586 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21587 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21588 * bail to the real handler if breakFlags==0.
21589 */
21590    ldrb   r3, [rSELF, #offThread_breakFlags]
21591    adrl   lr, dvmAsmInstructionStart + (310 * 64)
21592    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21593    cmp    r3, #0
21594    bxeq   lr                   @ nothing to do - jump to real handler
21595    EXPORT_PC()
21596    mov    r0, rPC              @ arg0
21597    mov    r1, rFP              @ arg1
21598    mov    r2, rSELF            @ arg2
21599    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21600
21601/* ------------------------------ */
21602    .balign 64
21603.L_ALT_OP_UNUSED_37FF: /* 0x137 */
21604/* File: armv5te/alt_stub.S */
21605/*
21606 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21607 * any interesting requests and then jump to the real instruction
21608 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21609 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21610 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21611 * bail to the real handler if breakFlags==0.
21612 */
21613    ldrb   r3, [rSELF, #offThread_breakFlags]
21614    adrl   lr, dvmAsmInstructionStart + (311 * 64)
21615    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21616    cmp    r3, #0
21617    bxeq   lr                   @ nothing to do - jump to real handler
21618    EXPORT_PC()
21619    mov    r0, rPC              @ arg0
21620    mov    r1, rFP              @ arg1
21621    mov    r2, rSELF            @ arg2
21622    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21623
21624/* ------------------------------ */
21625    .balign 64
21626.L_ALT_OP_UNUSED_38FF: /* 0x138 */
21627/* File: armv5te/alt_stub.S */
21628/*
21629 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21630 * any interesting requests and then jump to the real instruction
21631 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21632 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21633 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21634 * bail to the real handler if breakFlags==0.
21635 */
21636    ldrb   r3, [rSELF, #offThread_breakFlags]
21637    adrl   lr, dvmAsmInstructionStart + (312 * 64)
21638    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21639    cmp    r3, #0
21640    bxeq   lr                   @ nothing to do - jump to real handler
21641    EXPORT_PC()
21642    mov    r0, rPC              @ arg0
21643    mov    r1, rFP              @ arg1
21644    mov    r2, rSELF            @ arg2
21645    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21646
21647/* ------------------------------ */
21648    .balign 64
21649.L_ALT_OP_UNUSED_39FF: /* 0x139 */
21650/* File: armv5te/alt_stub.S */
21651/*
21652 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21653 * any interesting requests and then jump to the real instruction
21654 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21655 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21656 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21657 * bail to the real handler if breakFlags==0.
21658 */
21659    ldrb   r3, [rSELF, #offThread_breakFlags]
21660    adrl   lr, dvmAsmInstructionStart + (313 * 64)
21661    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21662    cmp    r3, #0
21663    bxeq   lr                   @ nothing to do - jump to real handler
21664    EXPORT_PC()
21665    mov    r0, rPC              @ arg0
21666    mov    r1, rFP              @ arg1
21667    mov    r2, rSELF            @ arg2
21668    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21669
21670/* ------------------------------ */
21671    .balign 64
21672.L_ALT_OP_UNUSED_3AFF: /* 0x13a */
21673/* File: armv5te/alt_stub.S */
21674/*
21675 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21676 * any interesting requests and then jump to the real instruction
21677 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21678 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21679 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21680 * bail to the real handler if breakFlags==0.
21681 */
21682    ldrb   r3, [rSELF, #offThread_breakFlags]
21683    adrl   lr, dvmAsmInstructionStart + (314 * 64)
21684    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21685    cmp    r3, #0
21686    bxeq   lr                   @ nothing to do - jump to real handler
21687    EXPORT_PC()
21688    mov    r0, rPC              @ arg0
21689    mov    r1, rFP              @ arg1
21690    mov    r2, rSELF            @ arg2
21691    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21692
21693/* ------------------------------ */
21694    .balign 64
21695.L_ALT_OP_UNUSED_3BFF: /* 0x13b */
21696/* File: armv5te/alt_stub.S */
21697/*
21698 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21699 * any interesting requests and then jump to the real instruction
21700 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21701 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21702 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21703 * bail to the real handler if breakFlags==0.
21704 */
21705    ldrb   r3, [rSELF, #offThread_breakFlags]
21706    adrl   lr, dvmAsmInstructionStart + (315 * 64)
21707    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21708    cmp    r3, #0
21709    bxeq   lr                   @ nothing to do - jump to real handler
21710    EXPORT_PC()
21711    mov    r0, rPC              @ arg0
21712    mov    r1, rFP              @ arg1
21713    mov    r2, rSELF            @ arg2
21714    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21715
21716/* ------------------------------ */
21717    .balign 64
21718.L_ALT_OP_UNUSED_3CFF: /* 0x13c */
21719/* File: armv5te/alt_stub.S */
21720/*
21721 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21722 * any interesting requests and then jump to the real instruction
21723 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21724 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21725 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21726 * bail to the real handler if breakFlags==0.
21727 */
21728    ldrb   r3, [rSELF, #offThread_breakFlags]
21729    adrl   lr, dvmAsmInstructionStart + (316 * 64)
21730    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21731    cmp    r3, #0
21732    bxeq   lr                   @ nothing to do - jump to real handler
21733    EXPORT_PC()
21734    mov    r0, rPC              @ arg0
21735    mov    r1, rFP              @ arg1
21736    mov    r2, rSELF            @ arg2
21737    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21738
21739/* ------------------------------ */
21740    .balign 64
21741.L_ALT_OP_UNUSED_3DFF: /* 0x13d */
21742/* File: armv5te/alt_stub.S */
21743/*
21744 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21745 * any interesting requests and then jump to the real instruction
21746 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21747 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21748 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21749 * bail to the real handler if breakFlags==0.
21750 */
21751    ldrb   r3, [rSELF, #offThread_breakFlags]
21752    adrl   lr, dvmAsmInstructionStart + (317 * 64)
21753    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21754    cmp    r3, #0
21755    bxeq   lr                   @ nothing to do - jump to real handler
21756    EXPORT_PC()
21757    mov    r0, rPC              @ arg0
21758    mov    r1, rFP              @ arg1
21759    mov    r2, rSELF            @ arg2
21760    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21761
21762/* ------------------------------ */
21763    .balign 64
21764.L_ALT_OP_UNUSED_3EFF: /* 0x13e */
21765/* File: armv5te/alt_stub.S */
21766/*
21767 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21768 * any interesting requests and then jump to the real instruction
21769 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21770 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21771 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21772 * bail to the real handler if breakFlags==0.
21773 */
21774    ldrb   r3, [rSELF, #offThread_breakFlags]
21775    adrl   lr, dvmAsmInstructionStart + (318 * 64)
21776    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21777    cmp    r3, #0
21778    bxeq   lr                   @ nothing to do - jump to real handler
21779    EXPORT_PC()
21780    mov    r0, rPC              @ arg0
21781    mov    r1, rFP              @ arg1
21782    mov    r2, rSELF            @ arg2
21783    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21784
21785/* ------------------------------ */
21786    .balign 64
21787.L_ALT_OP_UNUSED_3FFF: /* 0x13f */
21788/* File: armv5te/alt_stub.S */
21789/*
21790 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21791 * any interesting requests and then jump to the real instruction
21792 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21793 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21794 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21795 * bail to the real handler if breakFlags==0.
21796 */
21797    ldrb   r3, [rSELF, #offThread_breakFlags]
21798    adrl   lr, dvmAsmInstructionStart + (319 * 64)
21799    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21800    cmp    r3, #0
21801    bxeq   lr                   @ nothing to do - jump to real handler
21802    EXPORT_PC()
21803    mov    r0, rPC              @ arg0
21804    mov    r1, rFP              @ arg1
21805    mov    r2, rSELF            @ arg2
21806    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21807
21808/* ------------------------------ */
21809    .balign 64
21810.L_ALT_OP_UNUSED_40FF: /* 0x140 */
21811/* File: armv5te/alt_stub.S */
21812/*
21813 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21814 * any interesting requests and then jump to the real instruction
21815 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21816 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21817 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21818 * bail to the real handler if breakFlags==0.
21819 */
21820    ldrb   r3, [rSELF, #offThread_breakFlags]
21821    adrl   lr, dvmAsmInstructionStart + (320 * 64)
21822    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21823    cmp    r3, #0
21824    bxeq   lr                   @ nothing to do - jump to real handler
21825    EXPORT_PC()
21826    mov    r0, rPC              @ arg0
21827    mov    r1, rFP              @ arg1
21828    mov    r2, rSELF            @ arg2
21829    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21830
21831/* ------------------------------ */
21832    .balign 64
21833.L_ALT_OP_UNUSED_41FF: /* 0x141 */
21834/* File: armv5te/alt_stub.S */
21835/*
21836 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21837 * any interesting requests and then jump to the real instruction
21838 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21839 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21840 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21841 * bail to the real handler if breakFlags==0.
21842 */
21843    ldrb   r3, [rSELF, #offThread_breakFlags]
21844    adrl   lr, dvmAsmInstructionStart + (321 * 64)
21845    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21846    cmp    r3, #0
21847    bxeq   lr                   @ nothing to do - jump to real handler
21848    EXPORT_PC()
21849    mov    r0, rPC              @ arg0
21850    mov    r1, rFP              @ arg1
21851    mov    r2, rSELF            @ arg2
21852    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21853
21854/* ------------------------------ */
21855    .balign 64
21856.L_ALT_OP_UNUSED_42FF: /* 0x142 */
21857/* File: armv5te/alt_stub.S */
21858/*
21859 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21860 * any interesting requests and then jump to the real instruction
21861 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21862 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21863 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21864 * bail to the real handler if breakFlags==0.
21865 */
21866    ldrb   r3, [rSELF, #offThread_breakFlags]
21867    adrl   lr, dvmAsmInstructionStart + (322 * 64)
21868    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21869    cmp    r3, #0
21870    bxeq   lr                   @ nothing to do - jump to real handler
21871    EXPORT_PC()
21872    mov    r0, rPC              @ arg0
21873    mov    r1, rFP              @ arg1
21874    mov    r2, rSELF            @ arg2
21875    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21876
21877/* ------------------------------ */
21878    .balign 64
21879.L_ALT_OP_UNUSED_43FF: /* 0x143 */
21880/* File: armv5te/alt_stub.S */
21881/*
21882 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21883 * any interesting requests and then jump to the real instruction
21884 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21885 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21886 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21887 * bail to the real handler if breakFlags==0.
21888 */
21889    ldrb   r3, [rSELF, #offThread_breakFlags]
21890    adrl   lr, dvmAsmInstructionStart + (323 * 64)
21891    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21892    cmp    r3, #0
21893    bxeq   lr                   @ nothing to do - jump to real handler
21894    EXPORT_PC()
21895    mov    r0, rPC              @ arg0
21896    mov    r1, rFP              @ arg1
21897    mov    r2, rSELF            @ arg2
21898    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21899
21900/* ------------------------------ */
21901    .balign 64
21902.L_ALT_OP_UNUSED_44FF: /* 0x144 */
21903/* File: armv5te/alt_stub.S */
21904/*
21905 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21906 * any interesting requests and then jump to the real instruction
21907 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21908 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21909 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21910 * bail to the real handler if breakFlags==0.
21911 */
21912    ldrb   r3, [rSELF, #offThread_breakFlags]
21913    adrl   lr, dvmAsmInstructionStart + (324 * 64)
21914    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21915    cmp    r3, #0
21916    bxeq   lr                   @ nothing to do - jump to real handler
21917    EXPORT_PC()
21918    mov    r0, rPC              @ arg0
21919    mov    r1, rFP              @ arg1
21920    mov    r2, rSELF            @ arg2
21921    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21922
21923/* ------------------------------ */
21924    .balign 64
21925.L_ALT_OP_UNUSED_45FF: /* 0x145 */
21926/* File: armv5te/alt_stub.S */
21927/*
21928 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21929 * any interesting requests and then jump to the real instruction
21930 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21931 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21932 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21933 * bail to the real handler if breakFlags==0.
21934 */
21935    ldrb   r3, [rSELF, #offThread_breakFlags]
21936    adrl   lr, dvmAsmInstructionStart + (325 * 64)
21937    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21938    cmp    r3, #0
21939    bxeq   lr                   @ nothing to do - jump to real handler
21940    EXPORT_PC()
21941    mov    r0, rPC              @ arg0
21942    mov    r1, rFP              @ arg1
21943    mov    r2, rSELF            @ arg2
21944    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21945
21946/* ------------------------------ */
21947    .balign 64
21948.L_ALT_OP_UNUSED_46FF: /* 0x146 */
21949/* File: armv5te/alt_stub.S */
21950/*
21951 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21952 * any interesting requests and then jump to the real instruction
21953 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21954 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21955 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21956 * bail to the real handler if breakFlags==0.
21957 */
21958    ldrb   r3, [rSELF, #offThread_breakFlags]
21959    adrl   lr, dvmAsmInstructionStart + (326 * 64)
21960    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21961    cmp    r3, #0
21962    bxeq   lr                   @ nothing to do - jump to real handler
21963    EXPORT_PC()
21964    mov    r0, rPC              @ arg0
21965    mov    r1, rFP              @ arg1
21966    mov    r2, rSELF            @ arg2
21967    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21968
21969/* ------------------------------ */
21970    .balign 64
21971.L_ALT_OP_UNUSED_47FF: /* 0x147 */
21972/* File: armv5te/alt_stub.S */
21973/*
21974 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21975 * any interesting requests and then jump to the real instruction
21976 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
21977 * rIBASE updates won't be seen until a refresh, and we can tell we have a
21978 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
21979 * bail to the real handler if breakFlags==0.
21980 */
21981    ldrb   r3, [rSELF, #offThread_breakFlags]
21982    adrl   lr, dvmAsmInstructionStart + (327 * 64)
21983    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
21984    cmp    r3, #0
21985    bxeq   lr                   @ nothing to do - jump to real handler
21986    EXPORT_PC()
21987    mov    r0, rPC              @ arg0
21988    mov    r1, rFP              @ arg1
21989    mov    r2, rSELF            @ arg2
21990    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
21991
21992/* ------------------------------ */
21993    .balign 64
21994.L_ALT_OP_UNUSED_48FF: /* 0x148 */
21995/* File: armv5te/alt_stub.S */
21996/*
21997 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
21998 * any interesting requests and then jump to the real instruction
21999 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22000 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22001 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22002 * bail to the real handler if breakFlags==0.
22003 */
22004    ldrb   r3, [rSELF, #offThread_breakFlags]
22005    adrl   lr, dvmAsmInstructionStart + (328 * 64)
22006    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22007    cmp    r3, #0
22008    bxeq   lr                   @ nothing to do - jump to real handler
22009    EXPORT_PC()
22010    mov    r0, rPC              @ arg0
22011    mov    r1, rFP              @ arg1
22012    mov    r2, rSELF            @ arg2
22013    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22014
22015/* ------------------------------ */
22016    .balign 64
22017.L_ALT_OP_UNUSED_49FF: /* 0x149 */
22018/* File: armv5te/alt_stub.S */
22019/*
22020 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22021 * any interesting requests and then jump to the real instruction
22022 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22023 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22024 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22025 * bail to the real handler if breakFlags==0.
22026 */
22027    ldrb   r3, [rSELF, #offThread_breakFlags]
22028    adrl   lr, dvmAsmInstructionStart + (329 * 64)
22029    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22030    cmp    r3, #0
22031    bxeq   lr                   @ nothing to do - jump to real handler
22032    EXPORT_PC()
22033    mov    r0, rPC              @ arg0
22034    mov    r1, rFP              @ arg1
22035    mov    r2, rSELF            @ arg2
22036    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22037
22038/* ------------------------------ */
22039    .balign 64
22040.L_ALT_OP_UNUSED_4AFF: /* 0x14a */
22041/* File: armv5te/alt_stub.S */
22042/*
22043 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22044 * any interesting requests and then jump to the real instruction
22045 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22046 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22047 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22048 * bail to the real handler if breakFlags==0.
22049 */
22050    ldrb   r3, [rSELF, #offThread_breakFlags]
22051    adrl   lr, dvmAsmInstructionStart + (330 * 64)
22052    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22053    cmp    r3, #0
22054    bxeq   lr                   @ nothing to do - jump to real handler
22055    EXPORT_PC()
22056    mov    r0, rPC              @ arg0
22057    mov    r1, rFP              @ arg1
22058    mov    r2, rSELF            @ arg2
22059    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22060
22061/* ------------------------------ */
22062    .balign 64
22063.L_ALT_OP_UNUSED_4BFF: /* 0x14b */
22064/* File: armv5te/alt_stub.S */
22065/*
22066 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22067 * any interesting requests and then jump to the real instruction
22068 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22069 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22070 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22071 * bail to the real handler if breakFlags==0.
22072 */
22073    ldrb   r3, [rSELF, #offThread_breakFlags]
22074    adrl   lr, dvmAsmInstructionStart + (331 * 64)
22075    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22076    cmp    r3, #0
22077    bxeq   lr                   @ nothing to do - jump to real handler
22078    EXPORT_PC()
22079    mov    r0, rPC              @ arg0
22080    mov    r1, rFP              @ arg1
22081    mov    r2, rSELF            @ arg2
22082    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22083
22084/* ------------------------------ */
22085    .balign 64
22086.L_ALT_OP_UNUSED_4CFF: /* 0x14c */
22087/* File: armv5te/alt_stub.S */
22088/*
22089 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22090 * any interesting requests and then jump to the real instruction
22091 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22092 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22093 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22094 * bail to the real handler if breakFlags==0.
22095 */
22096    ldrb   r3, [rSELF, #offThread_breakFlags]
22097    adrl   lr, dvmAsmInstructionStart + (332 * 64)
22098    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22099    cmp    r3, #0
22100    bxeq   lr                   @ nothing to do - jump to real handler
22101    EXPORT_PC()
22102    mov    r0, rPC              @ arg0
22103    mov    r1, rFP              @ arg1
22104    mov    r2, rSELF            @ arg2
22105    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22106
22107/* ------------------------------ */
22108    .balign 64
22109.L_ALT_OP_UNUSED_4DFF: /* 0x14d */
22110/* File: armv5te/alt_stub.S */
22111/*
22112 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22113 * any interesting requests and then jump to the real instruction
22114 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22115 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22116 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22117 * bail to the real handler if breakFlags==0.
22118 */
22119    ldrb   r3, [rSELF, #offThread_breakFlags]
22120    adrl   lr, dvmAsmInstructionStart + (333 * 64)
22121    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22122    cmp    r3, #0
22123    bxeq   lr                   @ nothing to do - jump to real handler
22124    EXPORT_PC()
22125    mov    r0, rPC              @ arg0
22126    mov    r1, rFP              @ arg1
22127    mov    r2, rSELF            @ arg2
22128    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22129
22130/* ------------------------------ */
22131    .balign 64
22132.L_ALT_OP_UNUSED_4EFF: /* 0x14e */
22133/* File: armv5te/alt_stub.S */
22134/*
22135 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22136 * any interesting requests and then jump to the real instruction
22137 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22138 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22139 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22140 * bail to the real handler if breakFlags==0.
22141 */
22142    ldrb   r3, [rSELF, #offThread_breakFlags]
22143    adrl   lr, dvmAsmInstructionStart + (334 * 64)
22144    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22145    cmp    r3, #0
22146    bxeq   lr                   @ nothing to do - jump to real handler
22147    EXPORT_PC()
22148    mov    r0, rPC              @ arg0
22149    mov    r1, rFP              @ arg1
22150    mov    r2, rSELF            @ arg2
22151    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22152
22153/* ------------------------------ */
22154    .balign 64
22155.L_ALT_OP_UNUSED_4FFF: /* 0x14f */
22156/* File: armv5te/alt_stub.S */
22157/*
22158 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22159 * any interesting requests and then jump to the real instruction
22160 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22161 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22162 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22163 * bail to the real handler if breakFlags==0.
22164 */
22165    ldrb   r3, [rSELF, #offThread_breakFlags]
22166    adrl   lr, dvmAsmInstructionStart + (335 * 64)
22167    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22168    cmp    r3, #0
22169    bxeq   lr                   @ nothing to do - jump to real handler
22170    EXPORT_PC()
22171    mov    r0, rPC              @ arg0
22172    mov    r1, rFP              @ arg1
22173    mov    r2, rSELF            @ arg2
22174    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22175
22176/* ------------------------------ */
22177    .balign 64
22178.L_ALT_OP_UNUSED_50FF: /* 0x150 */
22179/* File: armv5te/alt_stub.S */
22180/*
22181 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22182 * any interesting requests and then jump to the real instruction
22183 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22184 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22185 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22186 * bail to the real handler if breakFlags==0.
22187 */
22188    ldrb   r3, [rSELF, #offThread_breakFlags]
22189    adrl   lr, dvmAsmInstructionStart + (336 * 64)
22190    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22191    cmp    r3, #0
22192    bxeq   lr                   @ nothing to do - jump to real handler
22193    EXPORT_PC()
22194    mov    r0, rPC              @ arg0
22195    mov    r1, rFP              @ arg1
22196    mov    r2, rSELF            @ arg2
22197    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22198
22199/* ------------------------------ */
22200    .balign 64
22201.L_ALT_OP_UNUSED_51FF: /* 0x151 */
22202/* File: armv5te/alt_stub.S */
22203/*
22204 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22205 * any interesting requests and then jump to the real instruction
22206 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22207 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22208 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22209 * bail to the real handler if breakFlags==0.
22210 */
22211    ldrb   r3, [rSELF, #offThread_breakFlags]
22212    adrl   lr, dvmAsmInstructionStart + (337 * 64)
22213    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22214    cmp    r3, #0
22215    bxeq   lr                   @ nothing to do - jump to real handler
22216    EXPORT_PC()
22217    mov    r0, rPC              @ arg0
22218    mov    r1, rFP              @ arg1
22219    mov    r2, rSELF            @ arg2
22220    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22221
22222/* ------------------------------ */
22223    .balign 64
22224.L_ALT_OP_UNUSED_52FF: /* 0x152 */
22225/* File: armv5te/alt_stub.S */
22226/*
22227 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22228 * any interesting requests and then jump to the real instruction
22229 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22230 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22231 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22232 * bail to the real handler if breakFlags==0.
22233 */
22234    ldrb   r3, [rSELF, #offThread_breakFlags]
22235    adrl   lr, dvmAsmInstructionStart + (338 * 64)
22236    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22237    cmp    r3, #0
22238    bxeq   lr                   @ nothing to do - jump to real handler
22239    EXPORT_PC()
22240    mov    r0, rPC              @ arg0
22241    mov    r1, rFP              @ arg1
22242    mov    r2, rSELF            @ arg2
22243    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22244
22245/* ------------------------------ */
22246    .balign 64
22247.L_ALT_OP_UNUSED_53FF: /* 0x153 */
22248/* File: armv5te/alt_stub.S */
22249/*
22250 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22251 * any interesting requests and then jump to the real instruction
22252 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22253 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22254 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22255 * bail to the real handler if breakFlags==0.
22256 */
22257    ldrb   r3, [rSELF, #offThread_breakFlags]
22258    adrl   lr, dvmAsmInstructionStart + (339 * 64)
22259    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22260    cmp    r3, #0
22261    bxeq   lr                   @ nothing to do - jump to real handler
22262    EXPORT_PC()
22263    mov    r0, rPC              @ arg0
22264    mov    r1, rFP              @ arg1
22265    mov    r2, rSELF            @ arg2
22266    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22267
22268/* ------------------------------ */
22269    .balign 64
22270.L_ALT_OP_UNUSED_54FF: /* 0x154 */
22271/* File: armv5te/alt_stub.S */
22272/*
22273 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22274 * any interesting requests and then jump to the real instruction
22275 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22276 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22277 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22278 * bail to the real handler if breakFlags==0.
22279 */
22280    ldrb   r3, [rSELF, #offThread_breakFlags]
22281    adrl   lr, dvmAsmInstructionStart + (340 * 64)
22282    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22283    cmp    r3, #0
22284    bxeq   lr                   @ nothing to do - jump to real handler
22285    EXPORT_PC()
22286    mov    r0, rPC              @ arg0
22287    mov    r1, rFP              @ arg1
22288    mov    r2, rSELF            @ arg2
22289    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22290
22291/* ------------------------------ */
22292    .balign 64
22293.L_ALT_OP_UNUSED_55FF: /* 0x155 */
22294/* File: armv5te/alt_stub.S */
22295/*
22296 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22297 * any interesting requests and then jump to the real instruction
22298 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22299 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22300 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22301 * bail to the real handler if breakFlags==0.
22302 */
22303    ldrb   r3, [rSELF, #offThread_breakFlags]
22304    adrl   lr, dvmAsmInstructionStart + (341 * 64)
22305    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22306    cmp    r3, #0
22307    bxeq   lr                   @ nothing to do - jump to real handler
22308    EXPORT_PC()
22309    mov    r0, rPC              @ arg0
22310    mov    r1, rFP              @ arg1
22311    mov    r2, rSELF            @ arg2
22312    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22313
22314/* ------------------------------ */
22315    .balign 64
22316.L_ALT_OP_UNUSED_56FF: /* 0x156 */
22317/* File: armv5te/alt_stub.S */
22318/*
22319 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22320 * any interesting requests and then jump to the real instruction
22321 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22322 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22323 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22324 * bail to the real handler if breakFlags==0.
22325 */
22326    ldrb   r3, [rSELF, #offThread_breakFlags]
22327    adrl   lr, dvmAsmInstructionStart + (342 * 64)
22328    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22329    cmp    r3, #0
22330    bxeq   lr                   @ nothing to do - jump to real handler
22331    EXPORT_PC()
22332    mov    r0, rPC              @ arg0
22333    mov    r1, rFP              @ arg1
22334    mov    r2, rSELF            @ arg2
22335    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22336
22337/* ------------------------------ */
22338    .balign 64
22339.L_ALT_OP_UNUSED_57FF: /* 0x157 */
22340/* File: armv5te/alt_stub.S */
22341/*
22342 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22343 * any interesting requests and then jump to the real instruction
22344 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22345 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22346 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22347 * bail to the real handler if breakFlags==0.
22348 */
22349    ldrb   r3, [rSELF, #offThread_breakFlags]
22350    adrl   lr, dvmAsmInstructionStart + (343 * 64)
22351    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22352    cmp    r3, #0
22353    bxeq   lr                   @ nothing to do - jump to real handler
22354    EXPORT_PC()
22355    mov    r0, rPC              @ arg0
22356    mov    r1, rFP              @ arg1
22357    mov    r2, rSELF            @ arg2
22358    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22359
22360/* ------------------------------ */
22361    .balign 64
22362.L_ALT_OP_UNUSED_58FF: /* 0x158 */
22363/* File: armv5te/alt_stub.S */
22364/*
22365 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22366 * any interesting requests and then jump to the real instruction
22367 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22368 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22369 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22370 * bail to the real handler if breakFlags==0.
22371 */
22372    ldrb   r3, [rSELF, #offThread_breakFlags]
22373    adrl   lr, dvmAsmInstructionStart + (344 * 64)
22374    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22375    cmp    r3, #0
22376    bxeq   lr                   @ nothing to do - jump to real handler
22377    EXPORT_PC()
22378    mov    r0, rPC              @ arg0
22379    mov    r1, rFP              @ arg1
22380    mov    r2, rSELF            @ arg2
22381    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22382
22383/* ------------------------------ */
22384    .balign 64
22385.L_ALT_OP_UNUSED_59FF: /* 0x159 */
22386/* File: armv5te/alt_stub.S */
22387/*
22388 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22389 * any interesting requests and then jump to the real instruction
22390 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22391 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22392 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22393 * bail to the real handler if breakFlags==0.
22394 */
22395    ldrb   r3, [rSELF, #offThread_breakFlags]
22396    adrl   lr, dvmAsmInstructionStart + (345 * 64)
22397    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22398    cmp    r3, #0
22399    bxeq   lr                   @ nothing to do - jump to real handler
22400    EXPORT_PC()
22401    mov    r0, rPC              @ arg0
22402    mov    r1, rFP              @ arg1
22403    mov    r2, rSELF            @ arg2
22404    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22405
22406/* ------------------------------ */
22407    .balign 64
22408.L_ALT_OP_UNUSED_5AFF: /* 0x15a */
22409/* File: armv5te/alt_stub.S */
22410/*
22411 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22412 * any interesting requests and then jump to the real instruction
22413 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22414 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22415 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22416 * bail to the real handler if breakFlags==0.
22417 */
22418    ldrb   r3, [rSELF, #offThread_breakFlags]
22419    adrl   lr, dvmAsmInstructionStart + (346 * 64)
22420    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22421    cmp    r3, #0
22422    bxeq   lr                   @ nothing to do - jump to real handler
22423    EXPORT_PC()
22424    mov    r0, rPC              @ arg0
22425    mov    r1, rFP              @ arg1
22426    mov    r2, rSELF            @ arg2
22427    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22428
22429/* ------------------------------ */
22430    .balign 64
22431.L_ALT_OP_UNUSED_5BFF: /* 0x15b */
22432/* File: armv5te/alt_stub.S */
22433/*
22434 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22435 * any interesting requests and then jump to the real instruction
22436 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22437 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22438 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22439 * bail to the real handler if breakFlags==0.
22440 */
22441    ldrb   r3, [rSELF, #offThread_breakFlags]
22442    adrl   lr, dvmAsmInstructionStart + (347 * 64)
22443    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22444    cmp    r3, #0
22445    bxeq   lr                   @ nothing to do - jump to real handler
22446    EXPORT_PC()
22447    mov    r0, rPC              @ arg0
22448    mov    r1, rFP              @ arg1
22449    mov    r2, rSELF            @ arg2
22450    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22451
22452/* ------------------------------ */
22453    .balign 64
22454.L_ALT_OP_UNUSED_5CFF: /* 0x15c */
22455/* File: armv5te/alt_stub.S */
22456/*
22457 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22458 * any interesting requests and then jump to the real instruction
22459 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22460 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22461 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22462 * bail to the real handler if breakFlags==0.
22463 */
22464    ldrb   r3, [rSELF, #offThread_breakFlags]
22465    adrl   lr, dvmAsmInstructionStart + (348 * 64)
22466    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22467    cmp    r3, #0
22468    bxeq   lr                   @ nothing to do - jump to real handler
22469    EXPORT_PC()
22470    mov    r0, rPC              @ arg0
22471    mov    r1, rFP              @ arg1
22472    mov    r2, rSELF            @ arg2
22473    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22474
22475/* ------------------------------ */
22476    .balign 64
22477.L_ALT_OP_UNUSED_5DFF: /* 0x15d */
22478/* File: armv5te/alt_stub.S */
22479/*
22480 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22481 * any interesting requests and then jump to the real instruction
22482 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22483 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22484 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22485 * bail to the real handler if breakFlags==0.
22486 */
22487    ldrb   r3, [rSELF, #offThread_breakFlags]
22488    adrl   lr, dvmAsmInstructionStart + (349 * 64)
22489    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22490    cmp    r3, #0
22491    bxeq   lr                   @ nothing to do - jump to real handler
22492    EXPORT_PC()
22493    mov    r0, rPC              @ arg0
22494    mov    r1, rFP              @ arg1
22495    mov    r2, rSELF            @ arg2
22496    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22497
22498/* ------------------------------ */
22499    .balign 64
22500.L_ALT_OP_UNUSED_5EFF: /* 0x15e */
22501/* File: armv5te/alt_stub.S */
22502/*
22503 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22504 * any interesting requests and then jump to the real instruction
22505 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22506 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22507 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22508 * bail to the real handler if breakFlags==0.
22509 */
22510    ldrb   r3, [rSELF, #offThread_breakFlags]
22511    adrl   lr, dvmAsmInstructionStart + (350 * 64)
22512    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22513    cmp    r3, #0
22514    bxeq   lr                   @ nothing to do - jump to real handler
22515    EXPORT_PC()
22516    mov    r0, rPC              @ arg0
22517    mov    r1, rFP              @ arg1
22518    mov    r2, rSELF            @ arg2
22519    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22520
22521/* ------------------------------ */
22522    .balign 64
22523.L_ALT_OP_UNUSED_5FFF: /* 0x15f */
22524/* File: armv5te/alt_stub.S */
22525/*
22526 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22527 * any interesting requests and then jump to the real instruction
22528 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22529 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22530 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22531 * bail to the real handler if breakFlags==0.
22532 */
22533    ldrb   r3, [rSELF, #offThread_breakFlags]
22534    adrl   lr, dvmAsmInstructionStart + (351 * 64)
22535    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22536    cmp    r3, #0
22537    bxeq   lr                   @ nothing to do - jump to real handler
22538    EXPORT_PC()
22539    mov    r0, rPC              @ arg0
22540    mov    r1, rFP              @ arg1
22541    mov    r2, rSELF            @ arg2
22542    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22543
22544/* ------------------------------ */
22545    .balign 64
22546.L_ALT_OP_UNUSED_60FF: /* 0x160 */
22547/* File: armv5te/alt_stub.S */
22548/*
22549 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22550 * any interesting requests and then jump to the real instruction
22551 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22552 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22553 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22554 * bail to the real handler if breakFlags==0.
22555 */
22556    ldrb   r3, [rSELF, #offThread_breakFlags]
22557    adrl   lr, dvmAsmInstructionStart + (352 * 64)
22558    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22559    cmp    r3, #0
22560    bxeq   lr                   @ nothing to do - jump to real handler
22561    EXPORT_PC()
22562    mov    r0, rPC              @ arg0
22563    mov    r1, rFP              @ arg1
22564    mov    r2, rSELF            @ arg2
22565    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22566
22567/* ------------------------------ */
22568    .balign 64
22569.L_ALT_OP_UNUSED_61FF: /* 0x161 */
22570/* File: armv5te/alt_stub.S */
22571/*
22572 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22573 * any interesting requests and then jump to the real instruction
22574 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22575 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22576 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22577 * bail to the real handler if breakFlags==0.
22578 */
22579    ldrb   r3, [rSELF, #offThread_breakFlags]
22580    adrl   lr, dvmAsmInstructionStart + (353 * 64)
22581    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22582    cmp    r3, #0
22583    bxeq   lr                   @ nothing to do - jump to real handler
22584    EXPORT_PC()
22585    mov    r0, rPC              @ arg0
22586    mov    r1, rFP              @ arg1
22587    mov    r2, rSELF            @ arg2
22588    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22589
22590/* ------------------------------ */
22591    .balign 64
22592.L_ALT_OP_UNUSED_62FF: /* 0x162 */
22593/* File: armv5te/alt_stub.S */
22594/*
22595 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22596 * any interesting requests and then jump to the real instruction
22597 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22598 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22599 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22600 * bail to the real handler if breakFlags==0.
22601 */
22602    ldrb   r3, [rSELF, #offThread_breakFlags]
22603    adrl   lr, dvmAsmInstructionStart + (354 * 64)
22604    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22605    cmp    r3, #0
22606    bxeq   lr                   @ nothing to do - jump to real handler
22607    EXPORT_PC()
22608    mov    r0, rPC              @ arg0
22609    mov    r1, rFP              @ arg1
22610    mov    r2, rSELF            @ arg2
22611    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22612
22613/* ------------------------------ */
22614    .balign 64
22615.L_ALT_OP_UNUSED_63FF: /* 0x163 */
22616/* File: armv5te/alt_stub.S */
22617/*
22618 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22619 * any interesting requests and then jump to the real instruction
22620 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22621 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22622 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22623 * bail to the real handler if breakFlags==0.
22624 */
22625    ldrb   r3, [rSELF, #offThread_breakFlags]
22626    adrl   lr, dvmAsmInstructionStart + (355 * 64)
22627    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22628    cmp    r3, #0
22629    bxeq   lr                   @ nothing to do - jump to real handler
22630    EXPORT_PC()
22631    mov    r0, rPC              @ arg0
22632    mov    r1, rFP              @ arg1
22633    mov    r2, rSELF            @ arg2
22634    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22635
22636/* ------------------------------ */
22637    .balign 64
22638.L_ALT_OP_UNUSED_64FF: /* 0x164 */
22639/* File: armv5te/alt_stub.S */
22640/*
22641 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22642 * any interesting requests and then jump to the real instruction
22643 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22644 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22645 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22646 * bail to the real handler if breakFlags==0.
22647 */
22648    ldrb   r3, [rSELF, #offThread_breakFlags]
22649    adrl   lr, dvmAsmInstructionStart + (356 * 64)
22650    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22651    cmp    r3, #0
22652    bxeq   lr                   @ nothing to do - jump to real handler
22653    EXPORT_PC()
22654    mov    r0, rPC              @ arg0
22655    mov    r1, rFP              @ arg1
22656    mov    r2, rSELF            @ arg2
22657    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22658
22659/* ------------------------------ */
22660    .balign 64
22661.L_ALT_OP_UNUSED_65FF: /* 0x165 */
22662/* File: armv5te/alt_stub.S */
22663/*
22664 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22665 * any interesting requests and then jump to the real instruction
22666 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22667 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22668 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22669 * bail to the real handler if breakFlags==0.
22670 */
22671    ldrb   r3, [rSELF, #offThread_breakFlags]
22672    adrl   lr, dvmAsmInstructionStart + (357 * 64)
22673    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22674    cmp    r3, #0
22675    bxeq   lr                   @ nothing to do - jump to real handler
22676    EXPORT_PC()
22677    mov    r0, rPC              @ arg0
22678    mov    r1, rFP              @ arg1
22679    mov    r2, rSELF            @ arg2
22680    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22681
22682/* ------------------------------ */
22683    .balign 64
22684.L_ALT_OP_UNUSED_66FF: /* 0x166 */
22685/* File: armv5te/alt_stub.S */
22686/*
22687 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22688 * any interesting requests and then jump to the real instruction
22689 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22690 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22691 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22692 * bail to the real handler if breakFlags==0.
22693 */
22694    ldrb   r3, [rSELF, #offThread_breakFlags]
22695    adrl   lr, dvmAsmInstructionStart + (358 * 64)
22696    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22697    cmp    r3, #0
22698    bxeq   lr                   @ nothing to do - jump to real handler
22699    EXPORT_PC()
22700    mov    r0, rPC              @ arg0
22701    mov    r1, rFP              @ arg1
22702    mov    r2, rSELF            @ arg2
22703    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22704
22705/* ------------------------------ */
22706    .balign 64
22707.L_ALT_OP_UNUSED_67FF: /* 0x167 */
22708/* File: armv5te/alt_stub.S */
22709/*
22710 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22711 * any interesting requests and then jump to the real instruction
22712 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22713 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22714 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22715 * bail to the real handler if breakFlags==0.
22716 */
22717    ldrb   r3, [rSELF, #offThread_breakFlags]
22718    adrl   lr, dvmAsmInstructionStart + (359 * 64)
22719    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22720    cmp    r3, #0
22721    bxeq   lr                   @ nothing to do - jump to real handler
22722    EXPORT_PC()
22723    mov    r0, rPC              @ arg0
22724    mov    r1, rFP              @ arg1
22725    mov    r2, rSELF            @ arg2
22726    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22727
22728/* ------------------------------ */
22729    .balign 64
22730.L_ALT_OP_UNUSED_68FF: /* 0x168 */
22731/* File: armv5te/alt_stub.S */
22732/*
22733 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22734 * any interesting requests and then jump to the real instruction
22735 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22736 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22737 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22738 * bail to the real handler if breakFlags==0.
22739 */
22740    ldrb   r3, [rSELF, #offThread_breakFlags]
22741    adrl   lr, dvmAsmInstructionStart + (360 * 64)
22742    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22743    cmp    r3, #0
22744    bxeq   lr                   @ nothing to do - jump to real handler
22745    EXPORT_PC()
22746    mov    r0, rPC              @ arg0
22747    mov    r1, rFP              @ arg1
22748    mov    r2, rSELF            @ arg2
22749    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22750
22751/* ------------------------------ */
22752    .balign 64
22753.L_ALT_OP_UNUSED_69FF: /* 0x169 */
22754/* File: armv5te/alt_stub.S */
22755/*
22756 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22757 * any interesting requests and then jump to the real instruction
22758 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22759 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22760 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22761 * bail to the real handler if breakFlags==0.
22762 */
22763    ldrb   r3, [rSELF, #offThread_breakFlags]
22764    adrl   lr, dvmAsmInstructionStart + (361 * 64)
22765    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22766    cmp    r3, #0
22767    bxeq   lr                   @ nothing to do - jump to real handler
22768    EXPORT_PC()
22769    mov    r0, rPC              @ arg0
22770    mov    r1, rFP              @ arg1
22771    mov    r2, rSELF            @ arg2
22772    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22773
22774/* ------------------------------ */
22775    .balign 64
22776.L_ALT_OP_UNUSED_6AFF: /* 0x16a */
22777/* File: armv5te/alt_stub.S */
22778/*
22779 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22780 * any interesting requests and then jump to the real instruction
22781 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22782 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22783 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22784 * bail to the real handler if breakFlags==0.
22785 */
22786    ldrb   r3, [rSELF, #offThread_breakFlags]
22787    adrl   lr, dvmAsmInstructionStart + (362 * 64)
22788    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22789    cmp    r3, #0
22790    bxeq   lr                   @ nothing to do - jump to real handler
22791    EXPORT_PC()
22792    mov    r0, rPC              @ arg0
22793    mov    r1, rFP              @ arg1
22794    mov    r2, rSELF            @ arg2
22795    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22796
22797/* ------------------------------ */
22798    .balign 64
22799.L_ALT_OP_UNUSED_6BFF: /* 0x16b */
22800/* File: armv5te/alt_stub.S */
22801/*
22802 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22803 * any interesting requests and then jump to the real instruction
22804 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22805 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22806 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22807 * bail to the real handler if breakFlags==0.
22808 */
22809    ldrb   r3, [rSELF, #offThread_breakFlags]
22810    adrl   lr, dvmAsmInstructionStart + (363 * 64)
22811    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22812    cmp    r3, #0
22813    bxeq   lr                   @ nothing to do - jump to real handler
22814    EXPORT_PC()
22815    mov    r0, rPC              @ arg0
22816    mov    r1, rFP              @ arg1
22817    mov    r2, rSELF            @ arg2
22818    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22819
22820/* ------------------------------ */
22821    .balign 64
22822.L_ALT_OP_UNUSED_6CFF: /* 0x16c */
22823/* File: armv5te/alt_stub.S */
22824/*
22825 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22826 * any interesting requests and then jump to the real instruction
22827 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22828 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22829 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22830 * bail to the real handler if breakFlags==0.
22831 */
22832    ldrb   r3, [rSELF, #offThread_breakFlags]
22833    adrl   lr, dvmAsmInstructionStart + (364 * 64)
22834    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22835    cmp    r3, #0
22836    bxeq   lr                   @ nothing to do - jump to real handler
22837    EXPORT_PC()
22838    mov    r0, rPC              @ arg0
22839    mov    r1, rFP              @ arg1
22840    mov    r2, rSELF            @ arg2
22841    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22842
22843/* ------------------------------ */
22844    .balign 64
22845.L_ALT_OP_UNUSED_6DFF: /* 0x16d */
22846/* File: armv5te/alt_stub.S */
22847/*
22848 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22849 * any interesting requests and then jump to the real instruction
22850 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22851 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22852 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22853 * bail to the real handler if breakFlags==0.
22854 */
22855    ldrb   r3, [rSELF, #offThread_breakFlags]
22856    adrl   lr, dvmAsmInstructionStart + (365 * 64)
22857    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22858    cmp    r3, #0
22859    bxeq   lr                   @ nothing to do - jump to real handler
22860    EXPORT_PC()
22861    mov    r0, rPC              @ arg0
22862    mov    r1, rFP              @ arg1
22863    mov    r2, rSELF            @ arg2
22864    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22865
22866/* ------------------------------ */
22867    .balign 64
22868.L_ALT_OP_UNUSED_6EFF: /* 0x16e */
22869/* File: armv5te/alt_stub.S */
22870/*
22871 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22872 * any interesting requests and then jump to the real instruction
22873 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22874 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22875 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22876 * bail to the real handler if breakFlags==0.
22877 */
22878    ldrb   r3, [rSELF, #offThread_breakFlags]
22879    adrl   lr, dvmAsmInstructionStart + (366 * 64)
22880    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22881    cmp    r3, #0
22882    bxeq   lr                   @ nothing to do - jump to real handler
22883    EXPORT_PC()
22884    mov    r0, rPC              @ arg0
22885    mov    r1, rFP              @ arg1
22886    mov    r2, rSELF            @ arg2
22887    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22888
22889/* ------------------------------ */
22890    .balign 64
22891.L_ALT_OP_UNUSED_6FFF: /* 0x16f */
22892/* File: armv5te/alt_stub.S */
22893/*
22894 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22895 * any interesting requests and then jump to the real instruction
22896 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22897 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22898 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22899 * bail to the real handler if breakFlags==0.
22900 */
22901    ldrb   r3, [rSELF, #offThread_breakFlags]
22902    adrl   lr, dvmAsmInstructionStart + (367 * 64)
22903    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22904    cmp    r3, #0
22905    bxeq   lr                   @ nothing to do - jump to real handler
22906    EXPORT_PC()
22907    mov    r0, rPC              @ arg0
22908    mov    r1, rFP              @ arg1
22909    mov    r2, rSELF            @ arg2
22910    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22911
22912/* ------------------------------ */
22913    .balign 64
22914.L_ALT_OP_UNUSED_70FF: /* 0x170 */
22915/* File: armv5te/alt_stub.S */
22916/*
22917 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22918 * any interesting requests and then jump to the real instruction
22919 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22920 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22921 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22922 * bail to the real handler if breakFlags==0.
22923 */
22924    ldrb   r3, [rSELF, #offThread_breakFlags]
22925    adrl   lr, dvmAsmInstructionStart + (368 * 64)
22926    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22927    cmp    r3, #0
22928    bxeq   lr                   @ nothing to do - jump to real handler
22929    EXPORT_PC()
22930    mov    r0, rPC              @ arg0
22931    mov    r1, rFP              @ arg1
22932    mov    r2, rSELF            @ arg2
22933    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22934
22935/* ------------------------------ */
22936    .balign 64
22937.L_ALT_OP_UNUSED_71FF: /* 0x171 */
22938/* File: armv5te/alt_stub.S */
22939/*
22940 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22941 * any interesting requests and then jump to the real instruction
22942 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22943 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22944 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22945 * bail to the real handler if breakFlags==0.
22946 */
22947    ldrb   r3, [rSELF, #offThread_breakFlags]
22948    adrl   lr, dvmAsmInstructionStart + (369 * 64)
22949    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22950    cmp    r3, #0
22951    bxeq   lr                   @ nothing to do - jump to real handler
22952    EXPORT_PC()
22953    mov    r0, rPC              @ arg0
22954    mov    r1, rFP              @ arg1
22955    mov    r2, rSELF            @ arg2
22956    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22957
22958/* ------------------------------ */
22959    .balign 64
22960.L_ALT_OP_UNUSED_72FF: /* 0x172 */
22961/* File: armv5te/alt_stub.S */
22962/*
22963 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22964 * any interesting requests and then jump to the real instruction
22965 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22966 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22967 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22968 * bail to the real handler if breakFlags==0.
22969 */
22970    ldrb   r3, [rSELF, #offThread_breakFlags]
22971    adrl   lr, dvmAsmInstructionStart + (370 * 64)
22972    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22973    cmp    r3, #0
22974    bxeq   lr                   @ nothing to do - jump to real handler
22975    EXPORT_PC()
22976    mov    r0, rPC              @ arg0
22977    mov    r1, rFP              @ arg1
22978    mov    r2, rSELF            @ arg2
22979    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
22980
22981/* ------------------------------ */
22982    .balign 64
22983.L_ALT_OP_UNUSED_73FF: /* 0x173 */
22984/* File: armv5te/alt_stub.S */
22985/*
22986 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
22987 * any interesting requests and then jump to the real instruction
22988 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
22989 * rIBASE updates won't be seen until a refresh, and we can tell we have a
22990 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
22991 * bail to the real handler if breakFlags==0.
22992 */
22993    ldrb   r3, [rSELF, #offThread_breakFlags]
22994    adrl   lr, dvmAsmInstructionStart + (371 * 64)
22995    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
22996    cmp    r3, #0
22997    bxeq   lr                   @ nothing to do - jump to real handler
22998    EXPORT_PC()
22999    mov    r0, rPC              @ arg0
23000    mov    r1, rFP              @ arg1
23001    mov    r2, rSELF            @ arg2
23002    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23003
23004/* ------------------------------ */
23005    .balign 64
23006.L_ALT_OP_UNUSED_74FF: /* 0x174 */
23007/* File: armv5te/alt_stub.S */
23008/*
23009 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23010 * any interesting requests and then jump to the real instruction
23011 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23012 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23013 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23014 * bail to the real handler if breakFlags==0.
23015 */
23016    ldrb   r3, [rSELF, #offThread_breakFlags]
23017    adrl   lr, dvmAsmInstructionStart + (372 * 64)
23018    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23019    cmp    r3, #0
23020    bxeq   lr                   @ nothing to do - jump to real handler
23021    EXPORT_PC()
23022    mov    r0, rPC              @ arg0
23023    mov    r1, rFP              @ arg1
23024    mov    r2, rSELF            @ arg2
23025    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23026
23027/* ------------------------------ */
23028    .balign 64
23029.L_ALT_OP_UNUSED_75FF: /* 0x175 */
23030/* File: armv5te/alt_stub.S */
23031/*
23032 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23033 * any interesting requests and then jump to the real instruction
23034 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23035 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23036 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23037 * bail to the real handler if breakFlags==0.
23038 */
23039    ldrb   r3, [rSELF, #offThread_breakFlags]
23040    adrl   lr, dvmAsmInstructionStart + (373 * 64)
23041    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23042    cmp    r3, #0
23043    bxeq   lr                   @ nothing to do - jump to real handler
23044    EXPORT_PC()
23045    mov    r0, rPC              @ arg0
23046    mov    r1, rFP              @ arg1
23047    mov    r2, rSELF            @ arg2
23048    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23049
23050/* ------------------------------ */
23051    .balign 64
23052.L_ALT_OP_UNUSED_76FF: /* 0x176 */
23053/* File: armv5te/alt_stub.S */
23054/*
23055 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23056 * any interesting requests and then jump to the real instruction
23057 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23058 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23059 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23060 * bail to the real handler if breakFlags==0.
23061 */
23062    ldrb   r3, [rSELF, #offThread_breakFlags]
23063    adrl   lr, dvmAsmInstructionStart + (374 * 64)
23064    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23065    cmp    r3, #0
23066    bxeq   lr                   @ nothing to do - jump to real handler
23067    EXPORT_PC()
23068    mov    r0, rPC              @ arg0
23069    mov    r1, rFP              @ arg1
23070    mov    r2, rSELF            @ arg2
23071    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23072
23073/* ------------------------------ */
23074    .balign 64
23075.L_ALT_OP_UNUSED_77FF: /* 0x177 */
23076/* File: armv5te/alt_stub.S */
23077/*
23078 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23079 * any interesting requests and then jump to the real instruction
23080 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23081 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23082 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23083 * bail to the real handler if breakFlags==0.
23084 */
23085    ldrb   r3, [rSELF, #offThread_breakFlags]
23086    adrl   lr, dvmAsmInstructionStart + (375 * 64)
23087    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23088    cmp    r3, #0
23089    bxeq   lr                   @ nothing to do - jump to real handler
23090    EXPORT_PC()
23091    mov    r0, rPC              @ arg0
23092    mov    r1, rFP              @ arg1
23093    mov    r2, rSELF            @ arg2
23094    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23095
23096/* ------------------------------ */
23097    .balign 64
23098.L_ALT_OP_UNUSED_78FF: /* 0x178 */
23099/* File: armv5te/alt_stub.S */
23100/*
23101 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23102 * any interesting requests and then jump to the real instruction
23103 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23104 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23105 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23106 * bail to the real handler if breakFlags==0.
23107 */
23108    ldrb   r3, [rSELF, #offThread_breakFlags]
23109    adrl   lr, dvmAsmInstructionStart + (376 * 64)
23110    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23111    cmp    r3, #0
23112    bxeq   lr                   @ nothing to do - jump to real handler
23113    EXPORT_PC()
23114    mov    r0, rPC              @ arg0
23115    mov    r1, rFP              @ arg1
23116    mov    r2, rSELF            @ arg2
23117    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23118
23119/* ------------------------------ */
23120    .balign 64
23121.L_ALT_OP_UNUSED_79FF: /* 0x179 */
23122/* File: armv5te/alt_stub.S */
23123/*
23124 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23125 * any interesting requests and then jump to the real instruction
23126 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23127 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23128 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23129 * bail to the real handler if breakFlags==0.
23130 */
23131    ldrb   r3, [rSELF, #offThread_breakFlags]
23132    adrl   lr, dvmAsmInstructionStart + (377 * 64)
23133    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23134    cmp    r3, #0
23135    bxeq   lr                   @ nothing to do - jump to real handler
23136    EXPORT_PC()
23137    mov    r0, rPC              @ arg0
23138    mov    r1, rFP              @ arg1
23139    mov    r2, rSELF            @ arg2
23140    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23141
23142/* ------------------------------ */
23143    .balign 64
23144.L_ALT_OP_UNUSED_7AFF: /* 0x17a */
23145/* File: armv5te/alt_stub.S */
23146/*
23147 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23148 * any interesting requests and then jump to the real instruction
23149 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23150 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23151 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23152 * bail to the real handler if breakFlags==0.
23153 */
23154    ldrb   r3, [rSELF, #offThread_breakFlags]
23155    adrl   lr, dvmAsmInstructionStart + (378 * 64)
23156    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23157    cmp    r3, #0
23158    bxeq   lr                   @ nothing to do - jump to real handler
23159    EXPORT_PC()
23160    mov    r0, rPC              @ arg0
23161    mov    r1, rFP              @ arg1
23162    mov    r2, rSELF            @ arg2
23163    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23164
23165/* ------------------------------ */
23166    .balign 64
23167.L_ALT_OP_UNUSED_7BFF: /* 0x17b */
23168/* File: armv5te/alt_stub.S */
23169/*
23170 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23171 * any interesting requests and then jump to the real instruction
23172 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23173 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23174 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23175 * bail to the real handler if breakFlags==0.
23176 */
23177    ldrb   r3, [rSELF, #offThread_breakFlags]
23178    adrl   lr, dvmAsmInstructionStart + (379 * 64)
23179    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23180    cmp    r3, #0
23181    bxeq   lr                   @ nothing to do - jump to real handler
23182    EXPORT_PC()
23183    mov    r0, rPC              @ arg0
23184    mov    r1, rFP              @ arg1
23185    mov    r2, rSELF            @ arg2
23186    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23187
23188/* ------------------------------ */
23189    .balign 64
23190.L_ALT_OP_UNUSED_7CFF: /* 0x17c */
23191/* File: armv5te/alt_stub.S */
23192/*
23193 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23194 * any interesting requests and then jump to the real instruction
23195 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23196 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23197 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23198 * bail to the real handler if breakFlags==0.
23199 */
23200    ldrb   r3, [rSELF, #offThread_breakFlags]
23201    adrl   lr, dvmAsmInstructionStart + (380 * 64)
23202    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23203    cmp    r3, #0
23204    bxeq   lr                   @ nothing to do - jump to real handler
23205    EXPORT_PC()
23206    mov    r0, rPC              @ arg0
23207    mov    r1, rFP              @ arg1
23208    mov    r2, rSELF            @ arg2
23209    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23210
23211/* ------------------------------ */
23212    .balign 64
23213.L_ALT_OP_UNUSED_7DFF: /* 0x17d */
23214/* File: armv5te/alt_stub.S */
23215/*
23216 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23217 * any interesting requests and then jump to the real instruction
23218 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23219 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23220 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23221 * bail to the real handler if breakFlags==0.
23222 */
23223    ldrb   r3, [rSELF, #offThread_breakFlags]
23224    adrl   lr, dvmAsmInstructionStart + (381 * 64)
23225    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23226    cmp    r3, #0
23227    bxeq   lr                   @ nothing to do - jump to real handler
23228    EXPORT_PC()
23229    mov    r0, rPC              @ arg0
23230    mov    r1, rFP              @ arg1
23231    mov    r2, rSELF            @ arg2
23232    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23233
23234/* ------------------------------ */
23235    .balign 64
23236.L_ALT_OP_UNUSED_7EFF: /* 0x17e */
23237/* File: armv5te/alt_stub.S */
23238/*
23239 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23240 * any interesting requests and then jump to the real instruction
23241 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23242 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23243 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23244 * bail to the real handler if breakFlags==0.
23245 */
23246    ldrb   r3, [rSELF, #offThread_breakFlags]
23247    adrl   lr, dvmAsmInstructionStart + (382 * 64)
23248    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23249    cmp    r3, #0
23250    bxeq   lr                   @ nothing to do - jump to real handler
23251    EXPORT_PC()
23252    mov    r0, rPC              @ arg0
23253    mov    r1, rFP              @ arg1
23254    mov    r2, rSELF            @ arg2
23255    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23256
23257/* ------------------------------ */
23258    .balign 64
23259.L_ALT_OP_UNUSED_7FFF: /* 0x17f */
23260/* File: armv5te/alt_stub.S */
23261/*
23262 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23263 * any interesting requests and then jump to the real instruction
23264 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23265 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23266 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23267 * bail to the real handler if breakFlags==0.
23268 */
23269    ldrb   r3, [rSELF, #offThread_breakFlags]
23270    adrl   lr, dvmAsmInstructionStart + (383 * 64)
23271    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23272    cmp    r3, #0
23273    bxeq   lr                   @ nothing to do - jump to real handler
23274    EXPORT_PC()
23275    mov    r0, rPC              @ arg0
23276    mov    r1, rFP              @ arg1
23277    mov    r2, rSELF            @ arg2
23278    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23279
23280/* ------------------------------ */
23281    .balign 64
23282.L_ALT_OP_UNUSED_80FF: /* 0x180 */
23283/* File: armv5te/alt_stub.S */
23284/*
23285 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23286 * any interesting requests and then jump to the real instruction
23287 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23288 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23289 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23290 * bail to the real handler if breakFlags==0.
23291 */
23292    ldrb   r3, [rSELF, #offThread_breakFlags]
23293    adrl   lr, dvmAsmInstructionStart + (384 * 64)
23294    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23295    cmp    r3, #0
23296    bxeq   lr                   @ nothing to do - jump to real handler
23297    EXPORT_PC()
23298    mov    r0, rPC              @ arg0
23299    mov    r1, rFP              @ arg1
23300    mov    r2, rSELF            @ arg2
23301    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23302
23303/* ------------------------------ */
23304    .balign 64
23305.L_ALT_OP_UNUSED_81FF: /* 0x181 */
23306/* File: armv5te/alt_stub.S */
23307/*
23308 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23309 * any interesting requests and then jump to the real instruction
23310 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23311 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23312 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23313 * bail to the real handler if breakFlags==0.
23314 */
23315    ldrb   r3, [rSELF, #offThread_breakFlags]
23316    adrl   lr, dvmAsmInstructionStart + (385 * 64)
23317    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23318    cmp    r3, #0
23319    bxeq   lr                   @ nothing to do - jump to real handler
23320    EXPORT_PC()
23321    mov    r0, rPC              @ arg0
23322    mov    r1, rFP              @ arg1
23323    mov    r2, rSELF            @ arg2
23324    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23325
23326/* ------------------------------ */
23327    .balign 64
23328.L_ALT_OP_UNUSED_82FF: /* 0x182 */
23329/* File: armv5te/alt_stub.S */
23330/*
23331 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23332 * any interesting requests and then jump to the real instruction
23333 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23334 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23335 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23336 * bail to the real handler if breakFlags==0.
23337 */
23338    ldrb   r3, [rSELF, #offThread_breakFlags]
23339    adrl   lr, dvmAsmInstructionStart + (386 * 64)
23340    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23341    cmp    r3, #0
23342    bxeq   lr                   @ nothing to do - jump to real handler
23343    EXPORT_PC()
23344    mov    r0, rPC              @ arg0
23345    mov    r1, rFP              @ arg1
23346    mov    r2, rSELF            @ arg2
23347    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23348
23349/* ------------------------------ */
23350    .balign 64
23351.L_ALT_OP_UNUSED_83FF: /* 0x183 */
23352/* File: armv5te/alt_stub.S */
23353/*
23354 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23355 * any interesting requests and then jump to the real instruction
23356 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23357 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23358 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23359 * bail to the real handler if breakFlags==0.
23360 */
23361    ldrb   r3, [rSELF, #offThread_breakFlags]
23362    adrl   lr, dvmAsmInstructionStart + (387 * 64)
23363    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23364    cmp    r3, #0
23365    bxeq   lr                   @ nothing to do - jump to real handler
23366    EXPORT_PC()
23367    mov    r0, rPC              @ arg0
23368    mov    r1, rFP              @ arg1
23369    mov    r2, rSELF            @ arg2
23370    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23371
23372/* ------------------------------ */
23373    .balign 64
23374.L_ALT_OP_UNUSED_84FF: /* 0x184 */
23375/* File: armv5te/alt_stub.S */
23376/*
23377 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23378 * any interesting requests and then jump to the real instruction
23379 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23380 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23381 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23382 * bail to the real handler if breakFlags==0.
23383 */
23384    ldrb   r3, [rSELF, #offThread_breakFlags]
23385    adrl   lr, dvmAsmInstructionStart + (388 * 64)
23386    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23387    cmp    r3, #0
23388    bxeq   lr                   @ nothing to do - jump to real handler
23389    EXPORT_PC()
23390    mov    r0, rPC              @ arg0
23391    mov    r1, rFP              @ arg1
23392    mov    r2, rSELF            @ arg2
23393    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23394
23395/* ------------------------------ */
23396    .balign 64
23397.L_ALT_OP_UNUSED_85FF: /* 0x185 */
23398/* File: armv5te/alt_stub.S */
23399/*
23400 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23401 * any interesting requests and then jump to the real instruction
23402 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23403 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23404 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23405 * bail to the real handler if breakFlags==0.
23406 */
23407    ldrb   r3, [rSELF, #offThread_breakFlags]
23408    adrl   lr, dvmAsmInstructionStart + (389 * 64)
23409    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23410    cmp    r3, #0
23411    bxeq   lr                   @ nothing to do - jump to real handler
23412    EXPORT_PC()
23413    mov    r0, rPC              @ arg0
23414    mov    r1, rFP              @ arg1
23415    mov    r2, rSELF            @ arg2
23416    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23417
23418/* ------------------------------ */
23419    .balign 64
23420.L_ALT_OP_UNUSED_86FF: /* 0x186 */
23421/* File: armv5te/alt_stub.S */
23422/*
23423 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23424 * any interesting requests and then jump to the real instruction
23425 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23426 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23427 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23428 * bail to the real handler if breakFlags==0.
23429 */
23430    ldrb   r3, [rSELF, #offThread_breakFlags]
23431    adrl   lr, dvmAsmInstructionStart + (390 * 64)
23432    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23433    cmp    r3, #0
23434    bxeq   lr                   @ nothing to do - jump to real handler
23435    EXPORT_PC()
23436    mov    r0, rPC              @ arg0
23437    mov    r1, rFP              @ arg1
23438    mov    r2, rSELF            @ arg2
23439    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23440
23441/* ------------------------------ */
23442    .balign 64
23443.L_ALT_OP_UNUSED_87FF: /* 0x187 */
23444/* File: armv5te/alt_stub.S */
23445/*
23446 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23447 * any interesting requests and then jump to the real instruction
23448 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23449 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23450 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23451 * bail to the real handler if breakFlags==0.
23452 */
23453    ldrb   r3, [rSELF, #offThread_breakFlags]
23454    adrl   lr, dvmAsmInstructionStart + (391 * 64)
23455    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23456    cmp    r3, #0
23457    bxeq   lr                   @ nothing to do - jump to real handler
23458    EXPORT_PC()
23459    mov    r0, rPC              @ arg0
23460    mov    r1, rFP              @ arg1
23461    mov    r2, rSELF            @ arg2
23462    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23463
23464/* ------------------------------ */
23465    .balign 64
23466.L_ALT_OP_UNUSED_88FF: /* 0x188 */
23467/* File: armv5te/alt_stub.S */
23468/*
23469 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23470 * any interesting requests and then jump to the real instruction
23471 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23472 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23473 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23474 * bail to the real handler if breakFlags==0.
23475 */
23476    ldrb   r3, [rSELF, #offThread_breakFlags]
23477    adrl   lr, dvmAsmInstructionStart + (392 * 64)
23478    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23479    cmp    r3, #0
23480    bxeq   lr                   @ nothing to do - jump to real handler
23481    EXPORT_PC()
23482    mov    r0, rPC              @ arg0
23483    mov    r1, rFP              @ arg1
23484    mov    r2, rSELF            @ arg2
23485    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23486
23487/* ------------------------------ */
23488    .balign 64
23489.L_ALT_OP_UNUSED_89FF: /* 0x189 */
23490/* File: armv5te/alt_stub.S */
23491/*
23492 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23493 * any interesting requests and then jump to the real instruction
23494 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23495 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23496 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23497 * bail to the real handler if breakFlags==0.
23498 */
23499    ldrb   r3, [rSELF, #offThread_breakFlags]
23500    adrl   lr, dvmAsmInstructionStart + (393 * 64)
23501    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23502    cmp    r3, #0
23503    bxeq   lr                   @ nothing to do - jump to real handler
23504    EXPORT_PC()
23505    mov    r0, rPC              @ arg0
23506    mov    r1, rFP              @ arg1
23507    mov    r2, rSELF            @ arg2
23508    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23509
23510/* ------------------------------ */
23511    .balign 64
23512.L_ALT_OP_UNUSED_8AFF: /* 0x18a */
23513/* File: armv5te/alt_stub.S */
23514/*
23515 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23516 * any interesting requests and then jump to the real instruction
23517 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23518 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23519 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23520 * bail to the real handler if breakFlags==0.
23521 */
23522    ldrb   r3, [rSELF, #offThread_breakFlags]
23523    adrl   lr, dvmAsmInstructionStart + (394 * 64)
23524    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23525    cmp    r3, #0
23526    bxeq   lr                   @ nothing to do - jump to real handler
23527    EXPORT_PC()
23528    mov    r0, rPC              @ arg0
23529    mov    r1, rFP              @ arg1
23530    mov    r2, rSELF            @ arg2
23531    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23532
23533/* ------------------------------ */
23534    .balign 64
23535.L_ALT_OP_UNUSED_8BFF: /* 0x18b */
23536/* File: armv5te/alt_stub.S */
23537/*
23538 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23539 * any interesting requests and then jump to the real instruction
23540 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23541 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23542 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23543 * bail to the real handler if breakFlags==0.
23544 */
23545    ldrb   r3, [rSELF, #offThread_breakFlags]
23546    adrl   lr, dvmAsmInstructionStart + (395 * 64)
23547    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23548    cmp    r3, #0
23549    bxeq   lr                   @ nothing to do - jump to real handler
23550    EXPORT_PC()
23551    mov    r0, rPC              @ arg0
23552    mov    r1, rFP              @ arg1
23553    mov    r2, rSELF            @ arg2
23554    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23555
23556/* ------------------------------ */
23557    .balign 64
23558.L_ALT_OP_UNUSED_8CFF: /* 0x18c */
23559/* File: armv5te/alt_stub.S */
23560/*
23561 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23562 * any interesting requests and then jump to the real instruction
23563 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23564 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23565 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23566 * bail to the real handler if breakFlags==0.
23567 */
23568    ldrb   r3, [rSELF, #offThread_breakFlags]
23569    adrl   lr, dvmAsmInstructionStart + (396 * 64)
23570    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23571    cmp    r3, #0
23572    bxeq   lr                   @ nothing to do - jump to real handler
23573    EXPORT_PC()
23574    mov    r0, rPC              @ arg0
23575    mov    r1, rFP              @ arg1
23576    mov    r2, rSELF            @ arg2
23577    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23578
23579/* ------------------------------ */
23580    .balign 64
23581.L_ALT_OP_UNUSED_8DFF: /* 0x18d */
23582/* File: armv5te/alt_stub.S */
23583/*
23584 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23585 * any interesting requests and then jump to the real instruction
23586 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23587 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23588 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23589 * bail to the real handler if breakFlags==0.
23590 */
23591    ldrb   r3, [rSELF, #offThread_breakFlags]
23592    adrl   lr, dvmAsmInstructionStart + (397 * 64)
23593    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23594    cmp    r3, #0
23595    bxeq   lr                   @ nothing to do - jump to real handler
23596    EXPORT_PC()
23597    mov    r0, rPC              @ arg0
23598    mov    r1, rFP              @ arg1
23599    mov    r2, rSELF            @ arg2
23600    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23601
23602/* ------------------------------ */
23603    .balign 64
23604.L_ALT_OP_UNUSED_8EFF: /* 0x18e */
23605/* File: armv5te/alt_stub.S */
23606/*
23607 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23608 * any interesting requests and then jump to the real instruction
23609 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23610 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23611 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23612 * bail to the real handler if breakFlags==0.
23613 */
23614    ldrb   r3, [rSELF, #offThread_breakFlags]
23615    adrl   lr, dvmAsmInstructionStart + (398 * 64)
23616    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23617    cmp    r3, #0
23618    bxeq   lr                   @ nothing to do - jump to real handler
23619    EXPORT_PC()
23620    mov    r0, rPC              @ arg0
23621    mov    r1, rFP              @ arg1
23622    mov    r2, rSELF            @ arg2
23623    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23624
23625/* ------------------------------ */
23626    .balign 64
23627.L_ALT_OP_UNUSED_8FFF: /* 0x18f */
23628/* File: armv5te/alt_stub.S */
23629/*
23630 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23631 * any interesting requests and then jump to the real instruction
23632 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23633 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23634 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23635 * bail to the real handler if breakFlags==0.
23636 */
23637    ldrb   r3, [rSELF, #offThread_breakFlags]
23638    adrl   lr, dvmAsmInstructionStart + (399 * 64)
23639    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23640    cmp    r3, #0
23641    bxeq   lr                   @ nothing to do - jump to real handler
23642    EXPORT_PC()
23643    mov    r0, rPC              @ arg0
23644    mov    r1, rFP              @ arg1
23645    mov    r2, rSELF            @ arg2
23646    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23647
23648/* ------------------------------ */
23649    .balign 64
23650.L_ALT_OP_UNUSED_90FF: /* 0x190 */
23651/* File: armv5te/alt_stub.S */
23652/*
23653 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23654 * any interesting requests and then jump to the real instruction
23655 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23656 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23657 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23658 * bail to the real handler if breakFlags==0.
23659 */
23660    ldrb   r3, [rSELF, #offThread_breakFlags]
23661    adrl   lr, dvmAsmInstructionStart + (400 * 64)
23662    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23663    cmp    r3, #0
23664    bxeq   lr                   @ nothing to do - jump to real handler
23665    EXPORT_PC()
23666    mov    r0, rPC              @ arg0
23667    mov    r1, rFP              @ arg1
23668    mov    r2, rSELF            @ arg2
23669    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23670
23671/* ------------------------------ */
23672    .balign 64
23673.L_ALT_OP_UNUSED_91FF: /* 0x191 */
23674/* File: armv5te/alt_stub.S */
23675/*
23676 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23677 * any interesting requests and then jump to the real instruction
23678 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23679 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23680 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23681 * bail to the real handler if breakFlags==0.
23682 */
23683    ldrb   r3, [rSELF, #offThread_breakFlags]
23684    adrl   lr, dvmAsmInstructionStart + (401 * 64)
23685    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23686    cmp    r3, #0
23687    bxeq   lr                   @ nothing to do - jump to real handler
23688    EXPORT_PC()
23689    mov    r0, rPC              @ arg0
23690    mov    r1, rFP              @ arg1
23691    mov    r2, rSELF            @ arg2
23692    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23693
23694/* ------------------------------ */
23695    .balign 64
23696.L_ALT_OP_UNUSED_92FF: /* 0x192 */
23697/* File: armv5te/alt_stub.S */
23698/*
23699 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23700 * any interesting requests and then jump to the real instruction
23701 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23702 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23703 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23704 * bail to the real handler if breakFlags==0.
23705 */
23706    ldrb   r3, [rSELF, #offThread_breakFlags]
23707    adrl   lr, dvmAsmInstructionStart + (402 * 64)
23708    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23709    cmp    r3, #0
23710    bxeq   lr                   @ nothing to do - jump to real handler
23711    EXPORT_PC()
23712    mov    r0, rPC              @ arg0
23713    mov    r1, rFP              @ arg1
23714    mov    r2, rSELF            @ arg2
23715    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23716
23717/* ------------------------------ */
23718    .balign 64
23719.L_ALT_OP_UNUSED_93FF: /* 0x193 */
23720/* File: armv5te/alt_stub.S */
23721/*
23722 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23723 * any interesting requests and then jump to the real instruction
23724 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23725 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23726 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23727 * bail to the real handler if breakFlags==0.
23728 */
23729    ldrb   r3, [rSELF, #offThread_breakFlags]
23730    adrl   lr, dvmAsmInstructionStart + (403 * 64)
23731    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23732    cmp    r3, #0
23733    bxeq   lr                   @ nothing to do - jump to real handler
23734    EXPORT_PC()
23735    mov    r0, rPC              @ arg0
23736    mov    r1, rFP              @ arg1
23737    mov    r2, rSELF            @ arg2
23738    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23739
23740/* ------------------------------ */
23741    .balign 64
23742.L_ALT_OP_UNUSED_94FF: /* 0x194 */
23743/* File: armv5te/alt_stub.S */
23744/*
23745 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23746 * any interesting requests and then jump to the real instruction
23747 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23748 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23749 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23750 * bail to the real handler if breakFlags==0.
23751 */
23752    ldrb   r3, [rSELF, #offThread_breakFlags]
23753    adrl   lr, dvmAsmInstructionStart + (404 * 64)
23754    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23755    cmp    r3, #0
23756    bxeq   lr                   @ nothing to do - jump to real handler
23757    EXPORT_PC()
23758    mov    r0, rPC              @ arg0
23759    mov    r1, rFP              @ arg1
23760    mov    r2, rSELF            @ arg2
23761    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23762
23763/* ------------------------------ */
23764    .balign 64
23765.L_ALT_OP_UNUSED_95FF: /* 0x195 */
23766/* File: armv5te/alt_stub.S */
23767/*
23768 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23769 * any interesting requests and then jump to the real instruction
23770 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23771 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23772 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23773 * bail to the real handler if breakFlags==0.
23774 */
23775    ldrb   r3, [rSELF, #offThread_breakFlags]
23776    adrl   lr, dvmAsmInstructionStart + (405 * 64)
23777    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23778    cmp    r3, #0
23779    bxeq   lr                   @ nothing to do - jump to real handler
23780    EXPORT_PC()
23781    mov    r0, rPC              @ arg0
23782    mov    r1, rFP              @ arg1
23783    mov    r2, rSELF            @ arg2
23784    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23785
23786/* ------------------------------ */
23787    .balign 64
23788.L_ALT_OP_UNUSED_96FF: /* 0x196 */
23789/* File: armv5te/alt_stub.S */
23790/*
23791 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23792 * any interesting requests and then jump to the real instruction
23793 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23794 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23795 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23796 * bail to the real handler if breakFlags==0.
23797 */
23798    ldrb   r3, [rSELF, #offThread_breakFlags]
23799    adrl   lr, dvmAsmInstructionStart + (406 * 64)
23800    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23801    cmp    r3, #0
23802    bxeq   lr                   @ nothing to do - jump to real handler
23803    EXPORT_PC()
23804    mov    r0, rPC              @ arg0
23805    mov    r1, rFP              @ arg1
23806    mov    r2, rSELF            @ arg2
23807    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23808
23809/* ------------------------------ */
23810    .balign 64
23811.L_ALT_OP_UNUSED_97FF: /* 0x197 */
23812/* File: armv5te/alt_stub.S */
23813/*
23814 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23815 * any interesting requests and then jump to the real instruction
23816 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23817 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23818 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23819 * bail to the real handler if breakFlags==0.
23820 */
23821    ldrb   r3, [rSELF, #offThread_breakFlags]
23822    adrl   lr, dvmAsmInstructionStart + (407 * 64)
23823    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23824    cmp    r3, #0
23825    bxeq   lr                   @ nothing to do - jump to real handler
23826    EXPORT_PC()
23827    mov    r0, rPC              @ arg0
23828    mov    r1, rFP              @ arg1
23829    mov    r2, rSELF            @ arg2
23830    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23831
23832/* ------------------------------ */
23833    .balign 64
23834.L_ALT_OP_UNUSED_98FF: /* 0x198 */
23835/* File: armv5te/alt_stub.S */
23836/*
23837 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23838 * any interesting requests and then jump to the real instruction
23839 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23840 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23841 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23842 * bail to the real handler if breakFlags==0.
23843 */
23844    ldrb   r3, [rSELF, #offThread_breakFlags]
23845    adrl   lr, dvmAsmInstructionStart + (408 * 64)
23846    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23847    cmp    r3, #0
23848    bxeq   lr                   @ nothing to do - jump to real handler
23849    EXPORT_PC()
23850    mov    r0, rPC              @ arg0
23851    mov    r1, rFP              @ arg1
23852    mov    r2, rSELF            @ arg2
23853    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23854
23855/* ------------------------------ */
23856    .balign 64
23857.L_ALT_OP_UNUSED_99FF: /* 0x199 */
23858/* File: armv5te/alt_stub.S */
23859/*
23860 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23861 * any interesting requests and then jump to the real instruction
23862 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23863 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23864 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23865 * bail to the real handler if breakFlags==0.
23866 */
23867    ldrb   r3, [rSELF, #offThread_breakFlags]
23868    adrl   lr, dvmAsmInstructionStart + (409 * 64)
23869    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23870    cmp    r3, #0
23871    bxeq   lr                   @ nothing to do - jump to real handler
23872    EXPORT_PC()
23873    mov    r0, rPC              @ arg0
23874    mov    r1, rFP              @ arg1
23875    mov    r2, rSELF            @ arg2
23876    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23877
23878/* ------------------------------ */
23879    .balign 64
23880.L_ALT_OP_UNUSED_9AFF: /* 0x19a */
23881/* File: armv5te/alt_stub.S */
23882/*
23883 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23884 * any interesting requests and then jump to the real instruction
23885 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23886 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23887 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23888 * bail to the real handler if breakFlags==0.
23889 */
23890    ldrb   r3, [rSELF, #offThread_breakFlags]
23891    adrl   lr, dvmAsmInstructionStart + (410 * 64)
23892    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23893    cmp    r3, #0
23894    bxeq   lr                   @ nothing to do - jump to real handler
23895    EXPORT_PC()
23896    mov    r0, rPC              @ arg0
23897    mov    r1, rFP              @ arg1
23898    mov    r2, rSELF            @ arg2
23899    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23900
23901/* ------------------------------ */
23902    .balign 64
23903.L_ALT_OP_UNUSED_9BFF: /* 0x19b */
23904/* File: armv5te/alt_stub.S */
23905/*
23906 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23907 * any interesting requests and then jump to the real instruction
23908 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23909 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23910 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23911 * bail to the real handler if breakFlags==0.
23912 */
23913    ldrb   r3, [rSELF, #offThread_breakFlags]
23914    adrl   lr, dvmAsmInstructionStart + (411 * 64)
23915    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23916    cmp    r3, #0
23917    bxeq   lr                   @ nothing to do - jump to real handler
23918    EXPORT_PC()
23919    mov    r0, rPC              @ arg0
23920    mov    r1, rFP              @ arg1
23921    mov    r2, rSELF            @ arg2
23922    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23923
23924/* ------------------------------ */
23925    .balign 64
23926.L_ALT_OP_UNUSED_9CFF: /* 0x19c */
23927/* File: armv5te/alt_stub.S */
23928/*
23929 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23930 * any interesting requests and then jump to the real instruction
23931 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23932 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23933 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23934 * bail to the real handler if breakFlags==0.
23935 */
23936    ldrb   r3, [rSELF, #offThread_breakFlags]
23937    adrl   lr, dvmAsmInstructionStart + (412 * 64)
23938    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23939    cmp    r3, #0
23940    bxeq   lr                   @ nothing to do - jump to real handler
23941    EXPORT_PC()
23942    mov    r0, rPC              @ arg0
23943    mov    r1, rFP              @ arg1
23944    mov    r2, rSELF            @ arg2
23945    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23946
23947/* ------------------------------ */
23948    .balign 64
23949.L_ALT_OP_UNUSED_9DFF: /* 0x19d */
23950/* File: armv5te/alt_stub.S */
23951/*
23952 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23953 * any interesting requests and then jump to the real instruction
23954 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23955 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23956 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23957 * bail to the real handler if breakFlags==0.
23958 */
23959    ldrb   r3, [rSELF, #offThread_breakFlags]
23960    adrl   lr, dvmAsmInstructionStart + (413 * 64)
23961    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23962    cmp    r3, #0
23963    bxeq   lr                   @ nothing to do - jump to real handler
23964    EXPORT_PC()
23965    mov    r0, rPC              @ arg0
23966    mov    r1, rFP              @ arg1
23967    mov    r2, rSELF            @ arg2
23968    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23969
23970/* ------------------------------ */
23971    .balign 64
23972.L_ALT_OP_UNUSED_9EFF: /* 0x19e */
23973/* File: armv5te/alt_stub.S */
23974/*
23975 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23976 * any interesting requests and then jump to the real instruction
23977 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
23978 * rIBASE updates won't be seen until a refresh, and we can tell we have a
23979 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
23980 * bail to the real handler if breakFlags==0.
23981 */
23982    ldrb   r3, [rSELF, #offThread_breakFlags]
23983    adrl   lr, dvmAsmInstructionStart + (414 * 64)
23984    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
23985    cmp    r3, #0
23986    bxeq   lr                   @ nothing to do - jump to real handler
23987    EXPORT_PC()
23988    mov    r0, rPC              @ arg0
23989    mov    r1, rFP              @ arg1
23990    mov    r2, rSELF            @ arg2
23991    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
23992
23993/* ------------------------------ */
23994    .balign 64
23995.L_ALT_OP_UNUSED_9FFF: /* 0x19f */
23996/* File: armv5te/alt_stub.S */
23997/*
23998 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
23999 * any interesting requests and then jump to the real instruction
24000 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24001 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24002 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24003 * bail to the real handler if breakFlags==0.
24004 */
24005    ldrb   r3, [rSELF, #offThread_breakFlags]
24006    adrl   lr, dvmAsmInstructionStart + (415 * 64)
24007    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24008    cmp    r3, #0
24009    bxeq   lr                   @ nothing to do - jump to real handler
24010    EXPORT_PC()
24011    mov    r0, rPC              @ arg0
24012    mov    r1, rFP              @ arg1
24013    mov    r2, rSELF            @ arg2
24014    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24015
24016/* ------------------------------ */
24017    .balign 64
24018.L_ALT_OP_UNUSED_A0FF: /* 0x1a0 */
24019/* File: armv5te/alt_stub.S */
24020/*
24021 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24022 * any interesting requests and then jump to the real instruction
24023 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24024 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24025 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24026 * bail to the real handler if breakFlags==0.
24027 */
24028    ldrb   r3, [rSELF, #offThread_breakFlags]
24029    adrl   lr, dvmAsmInstructionStart + (416 * 64)
24030    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24031    cmp    r3, #0
24032    bxeq   lr                   @ nothing to do - jump to real handler
24033    EXPORT_PC()
24034    mov    r0, rPC              @ arg0
24035    mov    r1, rFP              @ arg1
24036    mov    r2, rSELF            @ arg2
24037    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24038
24039/* ------------------------------ */
24040    .balign 64
24041.L_ALT_OP_UNUSED_A1FF: /* 0x1a1 */
24042/* File: armv5te/alt_stub.S */
24043/*
24044 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24045 * any interesting requests and then jump to the real instruction
24046 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24047 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24048 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24049 * bail to the real handler if breakFlags==0.
24050 */
24051    ldrb   r3, [rSELF, #offThread_breakFlags]
24052    adrl   lr, dvmAsmInstructionStart + (417 * 64)
24053    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24054    cmp    r3, #0
24055    bxeq   lr                   @ nothing to do - jump to real handler
24056    EXPORT_PC()
24057    mov    r0, rPC              @ arg0
24058    mov    r1, rFP              @ arg1
24059    mov    r2, rSELF            @ arg2
24060    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24061
24062/* ------------------------------ */
24063    .balign 64
24064.L_ALT_OP_UNUSED_A2FF: /* 0x1a2 */
24065/* File: armv5te/alt_stub.S */
24066/*
24067 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24068 * any interesting requests and then jump to the real instruction
24069 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24070 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24071 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24072 * bail to the real handler if breakFlags==0.
24073 */
24074    ldrb   r3, [rSELF, #offThread_breakFlags]
24075    adrl   lr, dvmAsmInstructionStart + (418 * 64)
24076    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24077    cmp    r3, #0
24078    bxeq   lr                   @ nothing to do - jump to real handler
24079    EXPORT_PC()
24080    mov    r0, rPC              @ arg0
24081    mov    r1, rFP              @ arg1
24082    mov    r2, rSELF            @ arg2
24083    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24084
24085/* ------------------------------ */
24086    .balign 64
24087.L_ALT_OP_UNUSED_A3FF: /* 0x1a3 */
24088/* File: armv5te/alt_stub.S */
24089/*
24090 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24091 * any interesting requests and then jump to the real instruction
24092 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24093 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24094 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24095 * bail to the real handler if breakFlags==0.
24096 */
24097    ldrb   r3, [rSELF, #offThread_breakFlags]
24098    adrl   lr, dvmAsmInstructionStart + (419 * 64)
24099    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24100    cmp    r3, #0
24101    bxeq   lr                   @ nothing to do - jump to real handler
24102    EXPORT_PC()
24103    mov    r0, rPC              @ arg0
24104    mov    r1, rFP              @ arg1
24105    mov    r2, rSELF            @ arg2
24106    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24107
24108/* ------------------------------ */
24109    .balign 64
24110.L_ALT_OP_UNUSED_A4FF: /* 0x1a4 */
24111/* File: armv5te/alt_stub.S */
24112/*
24113 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24114 * any interesting requests and then jump to the real instruction
24115 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24116 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24117 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24118 * bail to the real handler if breakFlags==0.
24119 */
24120    ldrb   r3, [rSELF, #offThread_breakFlags]
24121    adrl   lr, dvmAsmInstructionStart + (420 * 64)
24122    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24123    cmp    r3, #0
24124    bxeq   lr                   @ nothing to do - jump to real handler
24125    EXPORT_PC()
24126    mov    r0, rPC              @ arg0
24127    mov    r1, rFP              @ arg1
24128    mov    r2, rSELF            @ arg2
24129    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24130
24131/* ------------------------------ */
24132    .balign 64
24133.L_ALT_OP_UNUSED_A5FF: /* 0x1a5 */
24134/* File: armv5te/alt_stub.S */
24135/*
24136 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24137 * any interesting requests and then jump to the real instruction
24138 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24139 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24140 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24141 * bail to the real handler if breakFlags==0.
24142 */
24143    ldrb   r3, [rSELF, #offThread_breakFlags]
24144    adrl   lr, dvmAsmInstructionStart + (421 * 64)
24145    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24146    cmp    r3, #0
24147    bxeq   lr                   @ nothing to do - jump to real handler
24148    EXPORT_PC()
24149    mov    r0, rPC              @ arg0
24150    mov    r1, rFP              @ arg1
24151    mov    r2, rSELF            @ arg2
24152    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24153
24154/* ------------------------------ */
24155    .balign 64
24156.L_ALT_OP_UNUSED_A6FF: /* 0x1a6 */
24157/* File: armv5te/alt_stub.S */
24158/*
24159 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24160 * any interesting requests and then jump to the real instruction
24161 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24162 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24163 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24164 * bail to the real handler if breakFlags==0.
24165 */
24166    ldrb   r3, [rSELF, #offThread_breakFlags]
24167    adrl   lr, dvmAsmInstructionStart + (422 * 64)
24168    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24169    cmp    r3, #0
24170    bxeq   lr                   @ nothing to do - jump to real handler
24171    EXPORT_PC()
24172    mov    r0, rPC              @ arg0
24173    mov    r1, rFP              @ arg1
24174    mov    r2, rSELF            @ arg2
24175    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24176
24177/* ------------------------------ */
24178    .balign 64
24179.L_ALT_OP_UNUSED_A7FF: /* 0x1a7 */
24180/* File: armv5te/alt_stub.S */
24181/*
24182 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24183 * any interesting requests and then jump to the real instruction
24184 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24185 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24186 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24187 * bail to the real handler if breakFlags==0.
24188 */
24189    ldrb   r3, [rSELF, #offThread_breakFlags]
24190    adrl   lr, dvmAsmInstructionStart + (423 * 64)
24191    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24192    cmp    r3, #0
24193    bxeq   lr                   @ nothing to do - jump to real handler
24194    EXPORT_PC()
24195    mov    r0, rPC              @ arg0
24196    mov    r1, rFP              @ arg1
24197    mov    r2, rSELF            @ arg2
24198    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24199
24200/* ------------------------------ */
24201    .balign 64
24202.L_ALT_OP_UNUSED_A8FF: /* 0x1a8 */
24203/* File: armv5te/alt_stub.S */
24204/*
24205 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24206 * any interesting requests and then jump to the real instruction
24207 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24208 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24209 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24210 * bail to the real handler if breakFlags==0.
24211 */
24212    ldrb   r3, [rSELF, #offThread_breakFlags]
24213    adrl   lr, dvmAsmInstructionStart + (424 * 64)
24214    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24215    cmp    r3, #0
24216    bxeq   lr                   @ nothing to do - jump to real handler
24217    EXPORT_PC()
24218    mov    r0, rPC              @ arg0
24219    mov    r1, rFP              @ arg1
24220    mov    r2, rSELF            @ arg2
24221    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24222
24223/* ------------------------------ */
24224    .balign 64
24225.L_ALT_OP_UNUSED_A9FF: /* 0x1a9 */
24226/* File: armv5te/alt_stub.S */
24227/*
24228 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24229 * any interesting requests and then jump to the real instruction
24230 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24231 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24232 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24233 * bail to the real handler if breakFlags==0.
24234 */
24235    ldrb   r3, [rSELF, #offThread_breakFlags]
24236    adrl   lr, dvmAsmInstructionStart + (425 * 64)
24237    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24238    cmp    r3, #0
24239    bxeq   lr                   @ nothing to do - jump to real handler
24240    EXPORT_PC()
24241    mov    r0, rPC              @ arg0
24242    mov    r1, rFP              @ arg1
24243    mov    r2, rSELF            @ arg2
24244    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24245
24246/* ------------------------------ */
24247    .balign 64
24248.L_ALT_OP_UNUSED_AAFF: /* 0x1aa */
24249/* File: armv5te/alt_stub.S */
24250/*
24251 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24252 * any interesting requests and then jump to the real instruction
24253 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24254 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24255 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24256 * bail to the real handler if breakFlags==0.
24257 */
24258    ldrb   r3, [rSELF, #offThread_breakFlags]
24259    adrl   lr, dvmAsmInstructionStart + (426 * 64)
24260    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24261    cmp    r3, #0
24262    bxeq   lr                   @ nothing to do - jump to real handler
24263    EXPORT_PC()
24264    mov    r0, rPC              @ arg0
24265    mov    r1, rFP              @ arg1
24266    mov    r2, rSELF            @ arg2
24267    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24268
24269/* ------------------------------ */
24270    .balign 64
24271.L_ALT_OP_UNUSED_ABFF: /* 0x1ab */
24272/* File: armv5te/alt_stub.S */
24273/*
24274 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24275 * any interesting requests and then jump to the real instruction
24276 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24277 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24278 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24279 * bail to the real handler if breakFlags==0.
24280 */
24281    ldrb   r3, [rSELF, #offThread_breakFlags]
24282    adrl   lr, dvmAsmInstructionStart + (427 * 64)
24283    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24284    cmp    r3, #0
24285    bxeq   lr                   @ nothing to do - jump to real handler
24286    EXPORT_PC()
24287    mov    r0, rPC              @ arg0
24288    mov    r1, rFP              @ arg1
24289    mov    r2, rSELF            @ arg2
24290    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24291
24292/* ------------------------------ */
24293    .balign 64
24294.L_ALT_OP_UNUSED_ACFF: /* 0x1ac */
24295/* File: armv5te/alt_stub.S */
24296/*
24297 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24298 * any interesting requests and then jump to the real instruction
24299 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24300 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24301 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24302 * bail to the real handler if breakFlags==0.
24303 */
24304    ldrb   r3, [rSELF, #offThread_breakFlags]
24305    adrl   lr, dvmAsmInstructionStart + (428 * 64)
24306    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24307    cmp    r3, #0
24308    bxeq   lr                   @ nothing to do - jump to real handler
24309    EXPORT_PC()
24310    mov    r0, rPC              @ arg0
24311    mov    r1, rFP              @ arg1
24312    mov    r2, rSELF            @ arg2
24313    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24314
24315/* ------------------------------ */
24316    .balign 64
24317.L_ALT_OP_UNUSED_ADFF: /* 0x1ad */
24318/* File: armv5te/alt_stub.S */
24319/*
24320 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24321 * any interesting requests and then jump to the real instruction
24322 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24323 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24324 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24325 * bail to the real handler if breakFlags==0.
24326 */
24327    ldrb   r3, [rSELF, #offThread_breakFlags]
24328    adrl   lr, dvmAsmInstructionStart + (429 * 64)
24329    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24330    cmp    r3, #0
24331    bxeq   lr                   @ nothing to do - jump to real handler
24332    EXPORT_PC()
24333    mov    r0, rPC              @ arg0
24334    mov    r1, rFP              @ arg1
24335    mov    r2, rSELF            @ arg2
24336    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24337
24338/* ------------------------------ */
24339    .balign 64
24340.L_ALT_OP_UNUSED_AEFF: /* 0x1ae */
24341/* File: armv5te/alt_stub.S */
24342/*
24343 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24344 * any interesting requests and then jump to the real instruction
24345 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24346 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24347 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24348 * bail to the real handler if breakFlags==0.
24349 */
24350    ldrb   r3, [rSELF, #offThread_breakFlags]
24351    adrl   lr, dvmAsmInstructionStart + (430 * 64)
24352    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24353    cmp    r3, #0
24354    bxeq   lr                   @ nothing to do - jump to real handler
24355    EXPORT_PC()
24356    mov    r0, rPC              @ arg0
24357    mov    r1, rFP              @ arg1
24358    mov    r2, rSELF            @ arg2
24359    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24360
24361/* ------------------------------ */
24362    .balign 64
24363.L_ALT_OP_UNUSED_AFFF: /* 0x1af */
24364/* File: armv5te/alt_stub.S */
24365/*
24366 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24367 * any interesting requests and then jump to the real instruction
24368 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24369 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24370 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24371 * bail to the real handler if breakFlags==0.
24372 */
24373    ldrb   r3, [rSELF, #offThread_breakFlags]
24374    adrl   lr, dvmAsmInstructionStart + (431 * 64)
24375    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24376    cmp    r3, #0
24377    bxeq   lr                   @ nothing to do - jump to real handler
24378    EXPORT_PC()
24379    mov    r0, rPC              @ arg0
24380    mov    r1, rFP              @ arg1
24381    mov    r2, rSELF            @ arg2
24382    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24383
24384/* ------------------------------ */
24385    .balign 64
24386.L_ALT_OP_UNUSED_B0FF: /* 0x1b0 */
24387/* File: armv5te/alt_stub.S */
24388/*
24389 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24390 * any interesting requests and then jump to the real instruction
24391 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24392 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24393 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24394 * bail to the real handler if breakFlags==0.
24395 */
24396    ldrb   r3, [rSELF, #offThread_breakFlags]
24397    adrl   lr, dvmAsmInstructionStart + (432 * 64)
24398    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24399    cmp    r3, #0
24400    bxeq   lr                   @ nothing to do - jump to real handler
24401    EXPORT_PC()
24402    mov    r0, rPC              @ arg0
24403    mov    r1, rFP              @ arg1
24404    mov    r2, rSELF            @ arg2
24405    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24406
24407/* ------------------------------ */
24408    .balign 64
24409.L_ALT_OP_UNUSED_B1FF: /* 0x1b1 */
24410/* File: armv5te/alt_stub.S */
24411/*
24412 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24413 * any interesting requests and then jump to the real instruction
24414 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24415 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24416 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24417 * bail to the real handler if breakFlags==0.
24418 */
24419    ldrb   r3, [rSELF, #offThread_breakFlags]
24420    adrl   lr, dvmAsmInstructionStart + (433 * 64)
24421    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24422    cmp    r3, #0
24423    bxeq   lr                   @ nothing to do - jump to real handler
24424    EXPORT_PC()
24425    mov    r0, rPC              @ arg0
24426    mov    r1, rFP              @ arg1
24427    mov    r2, rSELF            @ arg2
24428    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24429
24430/* ------------------------------ */
24431    .balign 64
24432.L_ALT_OP_UNUSED_B2FF: /* 0x1b2 */
24433/* File: armv5te/alt_stub.S */
24434/*
24435 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24436 * any interesting requests and then jump to the real instruction
24437 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24438 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24439 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24440 * bail to the real handler if breakFlags==0.
24441 */
24442    ldrb   r3, [rSELF, #offThread_breakFlags]
24443    adrl   lr, dvmAsmInstructionStart + (434 * 64)
24444    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24445    cmp    r3, #0
24446    bxeq   lr                   @ nothing to do - jump to real handler
24447    EXPORT_PC()
24448    mov    r0, rPC              @ arg0
24449    mov    r1, rFP              @ arg1
24450    mov    r2, rSELF            @ arg2
24451    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24452
24453/* ------------------------------ */
24454    .balign 64
24455.L_ALT_OP_UNUSED_B3FF: /* 0x1b3 */
24456/* File: armv5te/alt_stub.S */
24457/*
24458 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24459 * any interesting requests and then jump to the real instruction
24460 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24461 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24462 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24463 * bail to the real handler if breakFlags==0.
24464 */
24465    ldrb   r3, [rSELF, #offThread_breakFlags]
24466    adrl   lr, dvmAsmInstructionStart + (435 * 64)
24467    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24468    cmp    r3, #0
24469    bxeq   lr                   @ nothing to do - jump to real handler
24470    EXPORT_PC()
24471    mov    r0, rPC              @ arg0
24472    mov    r1, rFP              @ arg1
24473    mov    r2, rSELF            @ arg2
24474    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24475
24476/* ------------------------------ */
24477    .balign 64
24478.L_ALT_OP_UNUSED_B4FF: /* 0x1b4 */
24479/* File: armv5te/alt_stub.S */
24480/*
24481 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24482 * any interesting requests and then jump to the real instruction
24483 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24484 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24485 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24486 * bail to the real handler if breakFlags==0.
24487 */
24488    ldrb   r3, [rSELF, #offThread_breakFlags]
24489    adrl   lr, dvmAsmInstructionStart + (436 * 64)
24490    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24491    cmp    r3, #0
24492    bxeq   lr                   @ nothing to do - jump to real handler
24493    EXPORT_PC()
24494    mov    r0, rPC              @ arg0
24495    mov    r1, rFP              @ arg1
24496    mov    r2, rSELF            @ arg2
24497    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24498
24499/* ------------------------------ */
24500    .balign 64
24501.L_ALT_OP_UNUSED_B5FF: /* 0x1b5 */
24502/* File: armv5te/alt_stub.S */
24503/*
24504 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24505 * any interesting requests and then jump to the real instruction
24506 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24507 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24508 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24509 * bail to the real handler if breakFlags==0.
24510 */
24511    ldrb   r3, [rSELF, #offThread_breakFlags]
24512    adrl   lr, dvmAsmInstructionStart + (437 * 64)
24513    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24514    cmp    r3, #0
24515    bxeq   lr                   @ nothing to do - jump to real handler
24516    EXPORT_PC()
24517    mov    r0, rPC              @ arg0
24518    mov    r1, rFP              @ arg1
24519    mov    r2, rSELF            @ arg2
24520    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24521
24522/* ------------------------------ */
24523    .balign 64
24524.L_ALT_OP_UNUSED_B6FF: /* 0x1b6 */
24525/* File: armv5te/alt_stub.S */
24526/*
24527 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24528 * any interesting requests and then jump to the real instruction
24529 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24530 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24531 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24532 * bail to the real handler if breakFlags==0.
24533 */
24534    ldrb   r3, [rSELF, #offThread_breakFlags]
24535    adrl   lr, dvmAsmInstructionStart + (438 * 64)
24536    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24537    cmp    r3, #0
24538    bxeq   lr                   @ nothing to do - jump to real handler
24539    EXPORT_PC()
24540    mov    r0, rPC              @ arg0
24541    mov    r1, rFP              @ arg1
24542    mov    r2, rSELF            @ arg2
24543    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24544
24545/* ------------------------------ */
24546    .balign 64
24547.L_ALT_OP_UNUSED_B7FF: /* 0x1b7 */
24548/* File: armv5te/alt_stub.S */
24549/*
24550 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24551 * any interesting requests and then jump to the real instruction
24552 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24553 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24554 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24555 * bail to the real handler if breakFlags==0.
24556 */
24557    ldrb   r3, [rSELF, #offThread_breakFlags]
24558    adrl   lr, dvmAsmInstructionStart + (439 * 64)
24559    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24560    cmp    r3, #0
24561    bxeq   lr                   @ nothing to do - jump to real handler
24562    EXPORT_PC()
24563    mov    r0, rPC              @ arg0
24564    mov    r1, rFP              @ arg1
24565    mov    r2, rSELF            @ arg2
24566    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24567
24568/* ------------------------------ */
24569    .balign 64
24570.L_ALT_OP_UNUSED_B8FF: /* 0x1b8 */
24571/* File: armv5te/alt_stub.S */
24572/*
24573 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24574 * any interesting requests and then jump to the real instruction
24575 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24576 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24577 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24578 * bail to the real handler if breakFlags==0.
24579 */
24580    ldrb   r3, [rSELF, #offThread_breakFlags]
24581    adrl   lr, dvmAsmInstructionStart + (440 * 64)
24582    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24583    cmp    r3, #0
24584    bxeq   lr                   @ nothing to do - jump to real handler
24585    EXPORT_PC()
24586    mov    r0, rPC              @ arg0
24587    mov    r1, rFP              @ arg1
24588    mov    r2, rSELF            @ arg2
24589    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24590
24591/* ------------------------------ */
24592    .balign 64
24593.L_ALT_OP_UNUSED_B9FF: /* 0x1b9 */
24594/* File: armv5te/alt_stub.S */
24595/*
24596 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24597 * any interesting requests and then jump to the real instruction
24598 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24599 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24600 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24601 * bail to the real handler if breakFlags==0.
24602 */
24603    ldrb   r3, [rSELF, #offThread_breakFlags]
24604    adrl   lr, dvmAsmInstructionStart + (441 * 64)
24605    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24606    cmp    r3, #0
24607    bxeq   lr                   @ nothing to do - jump to real handler
24608    EXPORT_PC()
24609    mov    r0, rPC              @ arg0
24610    mov    r1, rFP              @ arg1
24611    mov    r2, rSELF            @ arg2
24612    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24613
24614/* ------------------------------ */
24615    .balign 64
24616.L_ALT_OP_UNUSED_BAFF: /* 0x1ba */
24617/* File: armv5te/alt_stub.S */
24618/*
24619 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24620 * any interesting requests and then jump to the real instruction
24621 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24622 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24623 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24624 * bail to the real handler if breakFlags==0.
24625 */
24626    ldrb   r3, [rSELF, #offThread_breakFlags]
24627    adrl   lr, dvmAsmInstructionStart + (442 * 64)
24628    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24629    cmp    r3, #0
24630    bxeq   lr                   @ nothing to do - jump to real handler
24631    EXPORT_PC()
24632    mov    r0, rPC              @ arg0
24633    mov    r1, rFP              @ arg1
24634    mov    r2, rSELF            @ arg2
24635    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24636
24637/* ------------------------------ */
24638    .balign 64
24639.L_ALT_OP_UNUSED_BBFF: /* 0x1bb */
24640/* File: armv5te/alt_stub.S */
24641/*
24642 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24643 * any interesting requests and then jump to the real instruction
24644 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24645 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24646 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24647 * bail to the real handler if breakFlags==0.
24648 */
24649    ldrb   r3, [rSELF, #offThread_breakFlags]
24650    adrl   lr, dvmAsmInstructionStart + (443 * 64)
24651    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24652    cmp    r3, #0
24653    bxeq   lr                   @ nothing to do - jump to real handler
24654    EXPORT_PC()
24655    mov    r0, rPC              @ arg0
24656    mov    r1, rFP              @ arg1
24657    mov    r2, rSELF            @ arg2
24658    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24659
24660/* ------------------------------ */
24661    .balign 64
24662.L_ALT_OP_UNUSED_BCFF: /* 0x1bc */
24663/* File: armv5te/alt_stub.S */
24664/*
24665 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24666 * any interesting requests and then jump to the real instruction
24667 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24668 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24669 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24670 * bail to the real handler if breakFlags==0.
24671 */
24672    ldrb   r3, [rSELF, #offThread_breakFlags]
24673    adrl   lr, dvmAsmInstructionStart + (444 * 64)
24674    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24675    cmp    r3, #0
24676    bxeq   lr                   @ nothing to do - jump to real handler
24677    EXPORT_PC()
24678    mov    r0, rPC              @ arg0
24679    mov    r1, rFP              @ arg1
24680    mov    r2, rSELF            @ arg2
24681    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24682
24683/* ------------------------------ */
24684    .balign 64
24685.L_ALT_OP_UNUSED_BDFF: /* 0x1bd */
24686/* File: armv5te/alt_stub.S */
24687/*
24688 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24689 * any interesting requests and then jump to the real instruction
24690 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24691 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24692 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24693 * bail to the real handler if breakFlags==0.
24694 */
24695    ldrb   r3, [rSELF, #offThread_breakFlags]
24696    adrl   lr, dvmAsmInstructionStart + (445 * 64)
24697    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24698    cmp    r3, #0
24699    bxeq   lr                   @ nothing to do - jump to real handler
24700    EXPORT_PC()
24701    mov    r0, rPC              @ arg0
24702    mov    r1, rFP              @ arg1
24703    mov    r2, rSELF            @ arg2
24704    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24705
24706/* ------------------------------ */
24707    .balign 64
24708.L_ALT_OP_UNUSED_BEFF: /* 0x1be */
24709/* File: armv5te/alt_stub.S */
24710/*
24711 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24712 * any interesting requests and then jump to the real instruction
24713 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24714 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24715 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24716 * bail to the real handler if breakFlags==0.
24717 */
24718    ldrb   r3, [rSELF, #offThread_breakFlags]
24719    adrl   lr, dvmAsmInstructionStart + (446 * 64)
24720    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24721    cmp    r3, #0
24722    bxeq   lr                   @ nothing to do - jump to real handler
24723    EXPORT_PC()
24724    mov    r0, rPC              @ arg0
24725    mov    r1, rFP              @ arg1
24726    mov    r2, rSELF            @ arg2
24727    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24728
24729/* ------------------------------ */
24730    .balign 64
24731.L_ALT_OP_UNUSED_BFFF: /* 0x1bf */
24732/* File: armv5te/alt_stub.S */
24733/*
24734 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24735 * any interesting requests and then jump to the real instruction
24736 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24737 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24738 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24739 * bail to the real handler if breakFlags==0.
24740 */
24741    ldrb   r3, [rSELF, #offThread_breakFlags]
24742    adrl   lr, dvmAsmInstructionStart + (447 * 64)
24743    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24744    cmp    r3, #0
24745    bxeq   lr                   @ nothing to do - jump to real handler
24746    EXPORT_PC()
24747    mov    r0, rPC              @ arg0
24748    mov    r1, rFP              @ arg1
24749    mov    r2, rSELF            @ arg2
24750    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24751
24752/* ------------------------------ */
24753    .balign 64
24754.L_ALT_OP_UNUSED_C0FF: /* 0x1c0 */
24755/* File: armv5te/alt_stub.S */
24756/*
24757 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24758 * any interesting requests and then jump to the real instruction
24759 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24760 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24761 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24762 * bail to the real handler if breakFlags==0.
24763 */
24764    ldrb   r3, [rSELF, #offThread_breakFlags]
24765    adrl   lr, dvmAsmInstructionStart + (448 * 64)
24766    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24767    cmp    r3, #0
24768    bxeq   lr                   @ nothing to do - jump to real handler
24769    EXPORT_PC()
24770    mov    r0, rPC              @ arg0
24771    mov    r1, rFP              @ arg1
24772    mov    r2, rSELF            @ arg2
24773    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24774
24775/* ------------------------------ */
24776    .balign 64
24777.L_ALT_OP_UNUSED_C1FF: /* 0x1c1 */
24778/* File: armv5te/alt_stub.S */
24779/*
24780 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24781 * any interesting requests and then jump to the real instruction
24782 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24783 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24784 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24785 * bail to the real handler if breakFlags==0.
24786 */
24787    ldrb   r3, [rSELF, #offThread_breakFlags]
24788    adrl   lr, dvmAsmInstructionStart + (449 * 64)
24789    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24790    cmp    r3, #0
24791    bxeq   lr                   @ nothing to do - jump to real handler
24792    EXPORT_PC()
24793    mov    r0, rPC              @ arg0
24794    mov    r1, rFP              @ arg1
24795    mov    r2, rSELF            @ arg2
24796    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24797
24798/* ------------------------------ */
24799    .balign 64
24800.L_ALT_OP_UNUSED_C2FF: /* 0x1c2 */
24801/* File: armv5te/alt_stub.S */
24802/*
24803 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24804 * any interesting requests and then jump to the real instruction
24805 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24806 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24807 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24808 * bail to the real handler if breakFlags==0.
24809 */
24810    ldrb   r3, [rSELF, #offThread_breakFlags]
24811    adrl   lr, dvmAsmInstructionStart + (450 * 64)
24812    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24813    cmp    r3, #0
24814    bxeq   lr                   @ nothing to do - jump to real handler
24815    EXPORT_PC()
24816    mov    r0, rPC              @ arg0
24817    mov    r1, rFP              @ arg1
24818    mov    r2, rSELF            @ arg2
24819    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24820
24821/* ------------------------------ */
24822    .balign 64
24823.L_ALT_OP_UNUSED_C3FF: /* 0x1c3 */
24824/* File: armv5te/alt_stub.S */
24825/*
24826 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24827 * any interesting requests and then jump to the real instruction
24828 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24829 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24830 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24831 * bail to the real handler if breakFlags==0.
24832 */
24833    ldrb   r3, [rSELF, #offThread_breakFlags]
24834    adrl   lr, dvmAsmInstructionStart + (451 * 64)
24835    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24836    cmp    r3, #0
24837    bxeq   lr                   @ nothing to do - jump to real handler
24838    EXPORT_PC()
24839    mov    r0, rPC              @ arg0
24840    mov    r1, rFP              @ arg1
24841    mov    r2, rSELF            @ arg2
24842    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24843
24844/* ------------------------------ */
24845    .balign 64
24846.L_ALT_OP_UNUSED_C4FF: /* 0x1c4 */
24847/* File: armv5te/alt_stub.S */
24848/*
24849 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24850 * any interesting requests and then jump to the real instruction
24851 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24852 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24853 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24854 * bail to the real handler if breakFlags==0.
24855 */
24856    ldrb   r3, [rSELF, #offThread_breakFlags]
24857    adrl   lr, dvmAsmInstructionStart + (452 * 64)
24858    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24859    cmp    r3, #0
24860    bxeq   lr                   @ nothing to do - jump to real handler
24861    EXPORT_PC()
24862    mov    r0, rPC              @ arg0
24863    mov    r1, rFP              @ arg1
24864    mov    r2, rSELF            @ arg2
24865    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24866
24867/* ------------------------------ */
24868    .balign 64
24869.L_ALT_OP_UNUSED_C5FF: /* 0x1c5 */
24870/* File: armv5te/alt_stub.S */
24871/*
24872 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24873 * any interesting requests and then jump to the real instruction
24874 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24875 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24876 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24877 * bail to the real handler if breakFlags==0.
24878 */
24879    ldrb   r3, [rSELF, #offThread_breakFlags]
24880    adrl   lr, dvmAsmInstructionStart + (453 * 64)
24881    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24882    cmp    r3, #0
24883    bxeq   lr                   @ nothing to do - jump to real handler
24884    EXPORT_PC()
24885    mov    r0, rPC              @ arg0
24886    mov    r1, rFP              @ arg1
24887    mov    r2, rSELF            @ arg2
24888    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24889
24890/* ------------------------------ */
24891    .balign 64
24892.L_ALT_OP_UNUSED_C6FF: /* 0x1c6 */
24893/* File: armv5te/alt_stub.S */
24894/*
24895 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24896 * any interesting requests and then jump to the real instruction
24897 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24898 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24899 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24900 * bail to the real handler if breakFlags==0.
24901 */
24902    ldrb   r3, [rSELF, #offThread_breakFlags]
24903    adrl   lr, dvmAsmInstructionStart + (454 * 64)
24904    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24905    cmp    r3, #0
24906    bxeq   lr                   @ nothing to do - jump to real handler
24907    EXPORT_PC()
24908    mov    r0, rPC              @ arg0
24909    mov    r1, rFP              @ arg1
24910    mov    r2, rSELF            @ arg2
24911    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24912
24913/* ------------------------------ */
24914    .balign 64
24915.L_ALT_OP_UNUSED_C7FF: /* 0x1c7 */
24916/* File: armv5te/alt_stub.S */
24917/*
24918 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24919 * any interesting requests and then jump to the real instruction
24920 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24921 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24922 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24923 * bail to the real handler if breakFlags==0.
24924 */
24925    ldrb   r3, [rSELF, #offThread_breakFlags]
24926    adrl   lr, dvmAsmInstructionStart + (455 * 64)
24927    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24928    cmp    r3, #0
24929    bxeq   lr                   @ nothing to do - jump to real handler
24930    EXPORT_PC()
24931    mov    r0, rPC              @ arg0
24932    mov    r1, rFP              @ arg1
24933    mov    r2, rSELF            @ arg2
24934    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24935
24936/* ------------------------------ */
24937    .balign 64
24938.L_ALT_OP_UNUSED_C8FF: /* 0x1c8 */
24939/* File: armv5te/alt_stub.S */
24940/*
24941 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24942 * any interesting requests and then jump to the real instruction
24943 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24944 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24945 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24946 * bail to the real handler if breakFlags==0.
24947 */
24948    ldrb   r3, [rSELF, #offThread_breakFlags]
24949    adrl   lr, dvmAsmInstructionStart + (456 * 64)
24950    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24951    cmp    r3, #0
24952    bxeq   lr                   @ nothing to do - jump to real handler
24953    EXPORT_PC()
24954    mov    r0, rPC              @ arg0
24955    mov    r1, rFP              @ arg1
24956    mov    r2, rSELF            @ arg2
24957    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24958
24959/* ------------------------------ */
24960    .balign 64
24961.L_ALT_OP_UNUSED_C9FF: /* 0x1c9 */
24962/* File: armv5te/alt_stub.S */
24963/*
24964 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24965 * any interesting requests and then jump to the real instruction
24966 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24967 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24968 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24969 * bail to the real handler if breakFlags==0.
24970 */
24971    ldrb   r3, [rSELF, #offThread_breakFlags]
24972    adrl   lr, dvmAsmInstructionStart + (457 * 64)
24973    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24974    cmp    r3, #0
24975    bxeq   lr                   @ nothing to do - jump to real handler
24976    EXPORT_PC()
24977    mov    r0, rPC              @ arg0
24978    mov    r1, rFP              @ arg1
24979    mov    r2, rSELF            @ arg2
24980    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
24981
24982/* ------------------------------ */
24983    .balign 64
24984.L_ALT_OP_UNUSED_CAFF: /* 0x1ca */
24985/* File: armv5te/alt_stub.S */
24986/*
24987 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
24988 * any interesting requests and then jump to the real instruction
24989 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
24990 * rIBASE updates won't be seen until a refresh, and we can tell we have a
24991 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
24992 * bail to the real handler if breakFlags==0.
24993 */
24994    ldrb   r3, [rSELF, #offThread_breakFlags]
24995    adrl   lr, dvmAsmInstructionStart + (458 * 64)
24996    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
24997    cmp    r3, #0
24998    bxeq   lr                   @ nothing to do - jump to real handler
24999    EXPORT_PC()
25000    mov    r0, rPC              @ arg0
25001    mov    r1, rFP              @ arg1
25002    mov    r2, rSELF            @ arg2
25003    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25004
25005/* ------------------------------ */
25006    .balign 64
25007.L_ALT_OP_UNUSED_CBFF: /* 0x1cb */
25008/* File: armv5te/alt_stub.S */
25009/*
25010 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25011 * any interesting requests and then jump to the real instruction
25012 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25013 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25014 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25015 * bail to the real handler if breakFlags==0.
25016 */
25017    ldrb   r3, [rSELF, #offThread_breakFlags]
25018    adrl   lr, dvmAsmInstructionStart + (459 * 64)
25019    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25020    cmp    r3, #0
25021    bxeq   lr                   @ nothing to do - jump to real handler
25022    EXPORT_PC()
25023    mov    r0, rPC              @ arg0
25024    mov    r1, rFP              @ arg1
25025    mov    r2, rSELF            @ arg2
25026    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25027
25028/* ------------------------------ */
25029    .balign 64
25030.L_ALT_OP_UNUSED_CCFF: /* 0x1cc */
25031/* File: armv5te/alt_stub.S */
25032/*
25033 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25034 * any interesting requests and then jump to the real instruction
25035 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25036 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25037 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25038 * bail to the real handler if breakFlags==0.
25039 */
25040    ldrb   r3, [rSELF, #offThread_breakFlags]
25041    adrl   lr, dvmAsmInstructionStart + (460 * 64)
25042    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25043    cmp    r3, #0
25044    bxeq   lr                   @ nothing to do - jump to real handler
25045    EXPORT_PC()
25046    mov    r0, rPC              @ arg0
25047    mov    r1, rFP              @ arg1
25048    mov    r2, rSELF            @ arg2
25049    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25050
25051/* ------------------------------ */
25052    .balign 64
25053.L_ALT_OP_UNUSED_CDFF: /* 0x1cd */
25054/* File: armv5te/alt_stub.S */
25055/*
25056 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25057 * any interesting requests and then jump to the real instruction
25058 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25059 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25060 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25061 * bail to the real handler if breakFlags==0.
25062 */
25063    ldrb   r3, [rSELF, #offThread_breakFlags]
25064    adrl   lr, dvmAsmInstructionStart + (461 * 64)
25065    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25066    cmp    r3, #0
25067    bxeq   lr                   @ nothing to do - jump to real handler
25068    EXPORT_PC()
25069    mov    r0, rPC              @ arg0
25070    mov    r1, rFP              @ arg1
25071    mov    r2, rSELF            @ arg2
25072    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25073
25074/* ------------------------------ */
25075    .balign 64
25076.L_ALT_OP_UNUSED_CEFF: /* 0x1ce */
25077/* File: armv5te/alt_stub.S */
25078/*
25079 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25080 * any interesting requests and then jump to the real instruction
25081 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25082 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25083 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25084 * bail to the real handler if breakFlags==0.
25085 */
25086    ldrb   r3, [rSELF, #offThread_breakFlags]
25087    adrl   lr, dvmAsmInstructionStart + (462 * 64)
25088    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25089    cmp    r3, #0
25090    bxeq   lr                   @ nothing to do - jump to real handler
25091    EXPORT_PC()
25092    mov    r0, rPC              @ arg0
25093    mov    r1, rFP              @ arg1
25094    mov    r2, rSELF            @ arg2
25095    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25096
25097/* ------------------------------ */
25098    .balign 64
25099.L_ALT_OP_UNUSED_CFFF: /* 0x1cf */
25100/* File: armv5te/alt_stub.S */
25101/*
25102 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25103 * any interesting requests and then jump to the real instruction
25104 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25105 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25106 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25107 * bail to the real handler if breakFlags==0.
25108 */
25109    ldrb   r3, [rSELF, #offThread_breakFlags]
25110    adrl   lr, dvmAsmInstructionStart + (463 * 64)
25111    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25112    cmp    r3, #0
25113    bxeq   lr                   @ nothing to do - jump to real handler
25114    EXPORT_PC()
25115    mov    r0, rPC              @ arg0
25116    mov    r1, rFP              @ arg1
25117    mov    r2, rSELF            @ arg2
25118    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25119
25120/* ------------------------------ */
25121    .balign 64
25122.L_ALT_OP_UNUSED_D0FF: /* 0x1d0 */
25123/* File: armv5te/alt_stub.S */
25124/*
25125 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25126 * any interesting requests and then jump to the real instruction
25127 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25128 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25129 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25130 * bail to the real handler if breakFlags==0.
25131 */
25132    ldrb   r3, [rSELF, #offThread_breakFlags]
25133    adrl   lr, dvmAsmInstructionStart + (464 * 64)
25134    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25135    cmp    r3, #0
25136    bxeq   lr                   @ nothing to do - jump to real handler
25137    EXPORT_PC()
25138    mov    r0, rPC              @ arg0
25139    mov    r1, rFP              @ arg1
25140    mov    r2, rSELF            @ arg2
25141    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25142
25143/* ------------------------------ */
25144    .balign 64
25145.L_ALT_OP_UNUSED_D1FF: /* 0x1d1 */
25146/* File: armv5te/alt_stub.S */
25147/*
25148 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25149 * any interesting requests and then jump to the real instruction
25150 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25151 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25152 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25153 * bail to the real handler if breakFlags==0.
25154 */
25155    ldrb   r3, [rSELF, #offThread_breakFlags]
25156    adrl   lr, dvmAsmInstructionStart + (465 * 64)
25157    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25158    cmp    r3, #0
25159    bxeq   lr                   @ nothing to do - jump to real handler
25160    EXPORT_PC()
25161    mov    r0, rPC              @ arg0
25162    mov    r1, rFP              @ arg1
25163    mov    r2, rSELF            @ arg2
25164    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25165
25166/* ------------------------------ */
25167    .balign 64
25168.L_ALT_OP_UNUSED_D2FF: /* 0x1d2 */
25169/* File: armv5te/alt_stub.S */
25170/*
25171 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25172 * any interesting requests and then jump to the real instruction
25173 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25174 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25175 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25176 * bail to the real handler if breakFlags==0.
25177 */
25178    ldrb   r3, [rSELF, #offThread_breakFlags]
25179    adrl   lr, dvmAsmInstructionStart + (466 * 64)
25180    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25181    cmp    r3, #0
25182    bxeq   lr                   @ nothing to do - jump to real handler
25183    EXPORT_PC()
25184    mov    r0, rPC              @ arg0
25185    mov    r1, rFP              @ arg1
25186    mov    r2, rSELF            @ arg2
25187    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25188
25189/* ------------------------------ */
25190    .balign 64
25191.L_ALT_OP_UNUSED_D3FF: /* 0x1d3 */
25192/* File: armv5te/alt_stub.S */
25193/*
25194 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25195 * any interesting requests and then jump to the real instruction
25196 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25197 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25198 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25199 * bail to the real handler if breakFlags==0.
25200 */
25201    ldrb   r3, [rSELF, #offThread_breakFlags]
25202    adrl   lr, dvmAsmInstructionStart + (467 * 64)
25203    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25204    cmp    r3, #0
25205    bxeq   lr                   @ nothing to do - jump to real handler
25206    EXPORT_PC()
25207    mov    r0, rPC              @ arg0
25208    mov    r1, rFP              @ arg1
25209    mov    r2, rSELF            @ arg2
25210    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25211
25212/* ------------------------------ */
25213    .balign 64
25214.L_ALT_OP_UNUSED_D4FF: /* 0x1d4 */
25215/* File: armv5te/alt_stub.S */
25216/*
25217 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25218 * any interesting requests and then jump to the real instruction
25219 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25220 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25221 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25222 * bail to the real handler if breakFlags==0.
25223 */
25224    ldrb   r3, [rSELF, #offThread_breakFlags]
25225    adrl   lr, dvmAsmInstructionStart + (468 * 64)
25226    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25227    cmp    r3, #0
25228    bxeq   lr                   @ nothing to do - jump to real handler
25229    EXPORT_PC()
25230    mov    r0, rPC              @ arg0
25231    mov    r1, rFP              @ arg1
25232    mov    r2, rSELF            @ arg2
25233    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25234
25235/* ------------------------------ */
25236    .balign 64
25237.L_ALT_OP_UNUSED_D5FF: /* 0x1d5 */
25238/* File: armv5te/alt_stub.S */
25239/*
25240 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25241 * any interesting requests and then jump to the real instruction
25242 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25243 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25244 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25245 * bail to the real handler if breakFlags==0.
25246 */
25247    ldrb   r3, [rSELF, #offThread_breakFlags]
25248    adrl   lr, dvmAsmInstructionStart + (469 * 64)
25249    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25250    cmp    r3, #0
25251    bxeq   lr                   @ nothing to do - jump to real handler
25252    EXPORT_PC()
25253    mov    r0, rPC              @ arg0
25254    mov    r1, rFP              @ arg1
25255    mov    r2, rSELF            @ arg2
25256    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25257
25258/* ------------------------------ */
25259    .balign 64
25260.L_ALT_OP_UNUSED_D6FF: /* 0x1d6 */
25261/* File: armv5te/alt_stub.S */
25262/*
25263 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25264 * any interesting requests and then jump to the real instruction
25265 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25266 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25267 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25268 * bail to the real handler if breakFlags==0.
25269 */
25270    ldrb   r3, [rSELF, #offThread_breakFlags]
25271    adrl   lr, dvmAsmInstructionStart + (470 * 64)
25272    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25273    cmp    r3, #0
25274    bxeq   lr                   @ nothing to do - jump to real handler
25275    EXPORT_PC()
25276    mov    r0, rPC              @ arg0
25277    mov    r1, rFP              @ arg1
25278    mov    r2, rSELF            @ arg2
25279    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25280
25281/* ------------------------------ */
25282    .balign 64
25283.L_ALT_OP_UNUSED_D7FF: /* 0x1d7 */
25284/* File: armv5te/alt_stub.S */
25285/*
25286 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25287 * any interesting requests and then jump to the real instruction
25288 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25289 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25290 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25291 * bail to the real handler if breakFlags==0.
25292 */
25293    ldrb   r3, [rSELF, #offThread_breakFlags]
25294    adrl   lr, dvmAsmInstructionStart + (471 * 64)
25295    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25296    cmp    r3, #0
25297    bxeq   lr                   @ nothing to do - jump to real handler
25298    EXPORT_PC()
25299    mov    r0, rPC              @ arg0
25300    mov    r1, rFP              @ arg1
25301    mov    r2, rSELF            @ arg2
25302    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25303
25304/* ------------------------------ */
25305    .balign 64
25306.L_ALT_OP_UNUSED_D8FF: /* 0x1d8 */
25307/* File: armv5te/alt_stub.S */
25308/*
25309 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25310 * any interesting requests and then jump to the real instruction
25311 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25312 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25313 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25314 * bail to the real handler if breakFlags==0.
25315 */
25316    ldrb   r3, [rSELF, #offThread_breakFlags]
25317    adrl   lr, dvmAsmInstructionStart + (472 * 64)
25318    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25319    cmp    r3, #0
25320    bxeq   lr                   @ nothing to do - jump to real handler
25321    EXPORT_PC()
25322    mov    r0, rPC              @ arg0
25323    mov    r1, rFP              @ arg1
25324    mov    r2, rSELF            @ arg2
25325    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25326
25327/* ------------------------------ */
25328    .balign 64
25329.L_ALT_OP_UNUSED_D9FF: /* 0x1d9 */
25330/* File: armv5te/alt_stub.S */
25331/*
25332 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25333 * any interesting requests and then jump to the real instruction
25334 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25335 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25336 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25337 * bail to the real handler if breakFlags==0.
25338 */
25339    ldrb   r3, [rSELF, #offThread_breakFlags]
25340    adrl   lr, dvmAsmInstructionStart + (473 * 64)
25341    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25342    cmp    r3, #0
25343    bxeq   lr                   @ nothing to do - jump to real handler
25344    EXPORT_PC()
25345    mov    r0, rPC              @ arg0
25346    mov    r1, rFP              @ arg1
25347    mov    r2, rSELF            @ arg2
25348    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25349
25350/* ------------------------------ */
25351    .balign 64
25352.L_ALT_OP_UNUSED_DAFF: /* 0x1da */
25353/* File: armv5te/alt_stub.S */
25354/*
25355 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25356 * any interesting requests and then jump to the real instruction
25357 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25358 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25359 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25360 * bail to the real handler if breakFlags==0.
25361 */
25362    ldrb   r3, [rSELF, #offThread_breakFlags]
25363    adrl   lr, dvmAsmInstructionStart + (474 * 64)
25364    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25365    cmp    r3, #0
25366    bxeq   lr                   @ nothing to do - jump to real handler
25367    EXPORT_PC()
25368    mov    r0, rPC              @ arg0
25369    mov    r1, rFP              @ arg1
25370    mov    r2, rSELF            @ arg2
25371    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25372
25373/* ------------------------------ */
25374    .balign 64
25375.L_ALT_OP_UNUSED_DBFF: /* 0x1db */
25376/* File: armv5te/alt_stub.S */
25377/*
25378 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25379 * any interesting requests and then jump to the real instruction
25380 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25381 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25382 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25383 * bail to the real handler if breakFlags==0.
25384 */
25385    ldrb   r3, [rSELF, #offThread_breakFlags]
25386    adrl   lr, dvmAsmInstructionStart + (475 * 64)
25387    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25388    cmp    r3, #0
25389    bxeq   lr                   @ nothing to do - jump to real handler
25390    EXPORT_PC()
25391    mov    r0, rPC              @ arg0
25392    mov    r1, rFP              @ arg1
25393    mov    r2, rSELF            @ arg2
25394    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25395
25396/* ------------------------------ */
25397    .balign 64
25398.L_ALT_OP_UNUSED_DCFF: /* 0x1dc */
25399/* File: armv5te/alt_stub.S */
25400/*
25401 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25402 * any interesting requests and then jump to the real instruction
25403 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25404 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25405 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25406 * bail to the real handler if breakFlags==0.
25407 */
25408    ldrb   r3, [rSELF, #offThread_breakFlags]
25409    adrl   lr, dvmAsmInstructionStart + (476 * 64)
25410    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25411    cmp    r3, #0
25412    bxeq   lr                   @ nothing to do - jump to real handler
25413    EXPORT_PC()
25414    mov    r0, rPC              @ arg0
25415    mov    r1, rFP              @ arg1
25416    mov    r2, rSELF            @ arg2
25417    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25418
25419/* ------------------------------ */
25420    .balign 64
25421.L_ALT_OP_UNUSED_DDFF: /* 0x1dd */
25422/* File: armv5te/alt_stub.S */
25423/*
25424 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25425 * any interesting requests and then jump to the real instruction
25426 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25427 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25428 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25429 * bail to the real handler if breakFlags==0.
25430 */
25431    ldrb   r3, [rSELF, #offThread_breakFlags]
25432    adrl   lr, dvmAsmInstructionStart + (477 * 64)
25433    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25434    cmp    r3, #0
25435    bxeq   lr                   @ nothing to do - jump to real handler
25436    EXPORT_PC()
25437    mov    r0, rPC              @ arg0
25438    mov    r1, rFP              @ arg1
25439    mov    r2, rSELF            @ arg2
25440    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25441
25442/* ------------------------------ */
25443    .balign 64
25444.L_ALT_OP_UNUSED_DEFF: /* 0x1de */
25445/* File: armv5te/alt_stub.S */
25446/*
25447 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25448 * any interesting requests and then jump to the real instruction
25449 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25450 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25451 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25452 * bail to the real handler if breakFlags==0.
25453 */
25454    ldrb   r3, [rSELF, #offThread_breakFlags]
25455    adrl   lr, dvmAsmInstructionStart + (478 * 64)
25456    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25457    cmp    r3, #0
25458    bxeq   lr                   @ nothing to do - jump to real handler
25459    EXPORT_PC()
25460    mov    r0, rPC              @ arg0
25461    mov    r1, rFP              @ arg1
25462    mov    r2, rSELF            @ arg2
25463    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25464
25465/* ------------------------------ */
25466    .balign 64
25467.L_ALT_OP_UNUSED_DFFF: /* 0x1df */
25468/* File: armv5te/alt_stub.S */
25469/*
25470 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25471 * any interesting requests and then jump to the real instruction
25472 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25473 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25474 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25475 * bail to the real handler if breakFlags==0.
25476 */
25477    ldrb   r3, [rSELF, #offThread_breakFlags]
25478    adrl   lr, dvmAsmInstructionStart + (479 * 64)
25479    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25480    cmp    r3, #0
25481    bxeq   lr                   @ nothing to do - jump to real handler
25482    EXPORT_PC()
25483    mov    r0, rPC              @ arg0
25484    mov    r1, rFP              @ arg1
25485    mov    r2, rSELF            @ arg2
25486    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25487
25488/* ------------------------------ */
25489    .balign 64
25490.L_ALT_OP_UNUSED_E0FF: /* 0x1e0 */
25491/* File: armv5te/alt_stub.S */
25492/*
25493 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25494 * any interesting requests and then jump to the real instruction
25495 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25496 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25497 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25498 * bail to the real handler if breakFlags==0.
25499 */
25500    ldrb   r3, [rSELF, #offThread_breakFlags]
25501    adrl   lr, dvmAsmInstructionStart + (480 * 64)
25502    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25503    cmp    r3, #0
25504    bxeq   lr                   @ nothing to do - jump to real handler
25505    EXPORT_PC()
25506    mov    r0, rPC              @ arg0
25507    mov    r1, rFP              @ arg1
25508    mov    r2, rSELF            @ arg2
25509    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25510
25511/* ------------------------------ */
25512    .balign 64
25513.L_ALT_OP_UNUSED_E1FF: /* 0x1e1 */
25514/* File: armv5te/alt_stub.S */
25515/*
25516 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25517 * any interesting requests and then jump to the real instruction
25518 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25519 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25520 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25521 * bail to the real handler if breakFlags==0.
25522 */
25523    ldrb   r3, [rSELF, #offThread_breakFlags]
25524    adrl   lr, dvmAsmInstructionStart + (481 * 64)
25525    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25526    cmp    r3, #0
25527    bxeq   lr                   @ nothing to do - jump to real handler
25528    EXPORT_PC()
25529    mov    r0, rPC              @ arg0
25530    mov    r1, rFP              @ arg1
25531    mov    r2, rSELF            @ arg2
25532    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25533
25534/* ------------------------------ */
25535    .balign 64
25536.L_ALT_OP_UNUSED_E2FF: /* 0x1e2 */
25537/* File: armv5te/alt_stub.S */
25538/*
25539 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25540 * any interesting requests and then jump to the real instruction
25541 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25542 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25543 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25544 * bail to the real handler if breakFlags==0.
25545 */
25546    ldrb   r3, [rSELF, #offThread_breakFlags]
25547    adrl   lr, dvmAsmInstructionStart + (482 * 64)
25548    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25549    cmp    r3, #0
25550    bxeq   lr                   @ nothing to do - jump to real handler
25551    EXPORT_PC()
25552    mov    r0, rPC              @ arg0
25553    mov    r1, rFP              @ arg1
25554    mov    r2, rSELF            @ arg2
25555    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25556
25557/* ------------------------------ */
25558    .balign 64
25559.L_ALT_OP_UNUSED_E3FF: /* 0x1e3 */
25560/* File: armv5te/alt_stub.S */
25561/*
25562 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25563 * any interesting requests and then jump to the real instruction
25564 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25565 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25566 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25567 * bail to the real handler if breakFlags==0.
25568 */
25569    ldrb   r3, [rSELF, #offThread_breakFlags]
25570    adrl   lr, dvmAsmInstructionStart + (483 * 64)
25571    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25572    cmp    r3, #0
25573    bxeq   lr                   @ nothing to do - jump to real handler
25574    EXPORT_PC()
25575    mov    r0, rPC              @ arg0
25576    mov    r1, rFP              @ arg1
25577    mov    r2, rSELF            @ arg2
25578    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25579
25580/* ------------------------------ */
25581    .balign 64
25582.L_ALT_OP_UNUSED_E4FF: /* 0x1e4 */
25583/* File: armv5te/alt_stub.S */
25584/*
25585 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25586 * any interesting requests and then jump to the real instruction
25587 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25588 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25589 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25590 * bail to the real handler if breakFlags==0.
25591 */
25592    ldrb   r3, [rSELF, #offThread_breakFlags]
25593    adrl   lr, dvmAsmInstructionStart + (484 * 64)
25594    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25595    cmp    r3, #0
25596    bxeq   lr                   @ nothing to do - jump to real handler
25597    EXPORT_PC()
25598    mov    r0, rPC              @ arg0
25599    mov    r1, rFP              @ arg1
25600    mov    r2, rSELF            @ arg2
25601    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25602
25603/* ------------------------------ */
25604    .balign 64
25605.L_ALT_OP_UNUSED_E5FF: /* 0x1e5 */
25606/* File: armv5te/alt_stub.S */
25607/*
25608 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25609 * any interesting requests and then jump to the real instruction
25610 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25611 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25612 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25613 * bail to the real handler if breakFlags==0.
25614 */
25615    ldrb   r3, [rSELF, #offThread_breakFlags]
25616    adrl   lr, dvmAsmInstructionStart + (485 * 64)
25617    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25618    cmp    r3, #0
25619    bxeq   lr                   @ nothing to do - jump to real handler
25620    EXPORT_PC()
25621    mov    r0, rPC              @ arg0
25622    mov    r1, rFP              @ arg1
25623    mov    r2, rSELF            @ arg2
25624    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25625
25626/* ------------------------------ */
25627    .balign 64
25628.L_ALT_OP_UNUSED_E6FF: /* 0x1e6 */
25629/* File: armv5te/alt_stub.S */
25630/*
25631 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25632 * any interesting requests and then jump to the real instruction
25633 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25634 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25635 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25636 * bail to the real handler if breakFlags==0.
25637 */
25638    ldrb   r3, [rSELF, #offThread_breakFlags]
25639    adrl   lr, dvmAsmInstructionStart + (486 * 64)
25640    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25641    cmp    r3, #0
25642    bxeq   lr                   @ nothing to do - jump to real handler
25643    EXPORT_PC()
25644    mov    r0, rPC              @ arg0
25645    mov    r1, rFP              @ arg1
25646    mov    r2, rSELF            @ arg2
25647    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25648
25649/* ------------------------------ */
25650    .balign 64
25651.L_ALT_OP_UNUSED_E7FF: /* 0x1e7 */
25652/* File: armv5te/alt_stub.S */
25653/*
25654 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25655 * any interesting requests and then jump to the real instruction
25656 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25657 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25658 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25659 * bail to the real handler if breakFlags==0.
25660 */
25661    ldrb   r3, [rSELF, #offThread_breakFlags]
25662    adrl   lr, dvmAsmInstructionStart + (487 * 64)
25663    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25664    cmp    r3, #0
25665    bxeq   lr                   @ nothing to do - jump to real handler
25666    EXPORT_PC()
25667    mov    r0, rPC              @ arg0
25668    mov    r1, rFP              @ arg1
25669    mov    r2, rSELF            @ arg2
25670    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25671
25672/* ------------------------------ */
25673    .balign 64
25674.L_ALT_OP_UNUSED_E8FF: /* 0x1e8 */
25675/* File: armv5te/alt_stub.S */
25676/*
25677 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25678 * any interesting requests and then jump to the real instruction
25679 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25680 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25681 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25682 * bail to the real handler if breakFlags==0.
25683 */
25684    ldrb   r3, [rSELF, #offThread_breakFlags]
25685    adrl   lr, dvmAsmInstructionStart + (488 * 64)
25686    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25687    cmp    r3, #0
25688    bxeq   lr                   @ nothing to do - jump to real handler
25689    EXPORT_PC()
25690    mov    r0, rPC              @ arg0
25691    mov    r1, rFP              @ arg1
25692    mov    r2, rSELF            @ arg2
25693    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25694
25695/* ------------------------------ */
25696    .balign 64
25697.L_ALT_OP_UNUSED_E9FF: /* 0x1e9 */
25698/* File: armv5te/alt_stub.S */
25699/*
25700 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25701 * any interesting requests and then jump to the real instruction
25702 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25703 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25704 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25705 * bail to the real handler if breakFlags==0.
25706 */
25707    ldrb   r3, [rSELF, #offThread_breakFlags]
25708    adrl   lr, dvmAsmInstructionStart + (489 * 64)
25709    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25710    cmp    r3, #0
25711    bxeq   lr                   @ nothing to do - jump to real handler
25712    EXPORT_PC()
25713    mov    r0, rPC              @ arg0
25714    mov    r1, rFP              @ arg1
25715    mov    r2, rSELF            @ arg2
25716    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25717
25718/* ------------------------------ */
25719    .balign 64
25720.L_ALT_OP_UNUSED_EAFF: /* 0x1ea */
25721/* File: armv5te/alt_stub.S */
25722/*
25723 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25724 * any interesting requests and then jump to the real instruction
25725 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25726 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25727 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25728 * bail to the real handler if breakFlags==0.
25729 */
25730    ldrb   r3, [rSELF, #offThread_breakFlags]
25731    adrl   lr, dvmAsmInstructionStart + (490 * 64)
25732    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25733    cmp    r3, #0
25734    bxeq   lr                   @ nothing to do - jump to real handler
25735    EXPORT_PC()
25736    mov    r0, rPC              @ arg0
25737    mov    r1, rFP              @ arg1
25738    mov    r2, rSELF            @ arg2
25739    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25740
25741/* ------------------------------ */
25742    .balign 64
25743.L_ALT_OP_UNUSED_EBFF: /* 0x1eb */
25744/* File: armv5te/alt_stub.S */
25745/*
25746 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25747 * any interesting requests and then jump to the real instruction
25748 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25749 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25750 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25751 * bail to the real handler if breakFlags==0.
25752 */
25753    ldrb   r3, [rSELF, #offThread_breakFlags]
25754    adrl   lr, dvmAsmInstructionStart + (491 * 64)
25755    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25756    cmp    r3, #0
25757    bxeq   lr                   @ nothing to do - jump to real handler
25758    EXPORT_PC()
25759    mov    r0, rPC              @ arg0
25760    mov    r1, rFP              @ arg1
25761    mov    r2, rSELF            @ arg2
25762    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25763
25764/* ------------------------------ */
25765    .balign 64
25766.L_ALT_OP_UNUSED_ECFF: /* 0x1ec */
25767/* File: armv5te/alt_stub.S */
25768/*
25769 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25770 * any interesting requests and then jump to the real instruction
25771 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25772 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25773 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25774 * bail to the real handler if breakFlags==0.
25775 */
25776    ldrb   r3, [rSELF, #offThread_breakFlags]
25777    adrl   lr, dvmAsmInstructionStart + (492 * 64)
25778    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25779    cmp    r3, #0
25780    bxeq   lr                   @ nothing to do - jump to real handler
25781    EXPORT_PC()
25782    mov    r0, rPC              @ arg0
25783    mov    r1, rFP              @ arg1
25784    mov    r2, rSELF            @ arg2
25785    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25786
25787/* ------------------------------ */
25788    .balign 64
25789.L_ALT_OP_UNUSED_EDFF: /* 0x1ed */
25790/* File: armv5te/alt_stub.S */
25791/*
25792 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25793 * any interesting requests and then jump to the real instruction
25794 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25795 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25796 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25797 * bail to the real handler if breakFlags==0.
25798 */
25799    ldrb   r3, [rSELF, #offThread_breakFlags]
25800    adrl   lr, dvmAsmInstructionStart + (493 * 64)
25801    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25802    cmp    r3, #0
25803    bxeq   lr                   @ nothing to do - jump to real handler
25804    EXPORT_PC()
25805    mov    r0, rPC              @ arg0
25806    mov    r1, rFP              @ arg1
25807    mov    r2, rSELF            @ arg2
25808    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25809
25810/* ------------------------------ */
25811    .balign 64
25812.L_ALT_OP_UNUSED_EEFF: /* 0x1ee */
25813/* File: armv5te/alt_stub.S */
25814/*
25815 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25816 * any interesting requests and then jump to the real instruction
25817 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25818 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25819 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25820 * bail to the real handler if breakFlags==0.
25821 */
25822    ldrb   r3, [rSELF, #offThread_breakFlags]
25823    adrl   lr, dvmAsmInstructionStart + (494 * 64)
25824    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25825    cmp    r3, #0
25826    bxeq   lr                   @ nothing to do - jump to real handler
25827    EXPORT_PC()
25828    mov    r0, rPC              @ arg0
25829    mov    r1, rFP              @ arg1
25830    mov    r2, rSELF            @ arg2
25831    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25832
25833/* ------------------------------ */
25834    .balign 64
25835.L_ALT_OP_UNUSED_EFFF: /* 0x1ef */
25836/* File: armv5te/alt_stub.S */
25837/*
25838 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25839 * any interesting requests and then jump to the real instruction
25840 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25841 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25842 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25843 * bail to the real handler if breakFlags==0.
25844 */
25845    ldrb   r3, [rSELF, #offThread_breakFlags]
25846    adrl   lr, dvmAsmInstructionStart + (495 * 64)
25847    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25848    cmp    r3, #0
25849    bxeq   lr                   @ nothing to do - jump to real handler
25850    EXPORT_PC()
25851    mov    r0, rPC              @ arg0
25852    mov    r1, rFP              @ arg1
25853    mov    r2, rSELF            @ arg2
25854    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25855
25856/* ------------------------------ */
25857    .balign 64
25858.L_ALT_OP_UNUSED_F0FF: /* 0x1f0 */
25859/* File: armv5te/alt_stub.S */
25860/*
25861 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25862 * any interesting requests and then jump to the real instruction
25863 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25864 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25865 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25866 * bail to the real handler if breakFlags==0.
25867 */
25868    ldrb   r3, [rSELF, #offThread_breakFlags]
25869    adrl   lr, dvmAsmInstructionStart + (496 * 64)
25870    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25871    cmp    r3, #0
25872    bxeq   lr                   @ nothing to do - jump to real handler
25873    EXPORT_PC()
25874    mov    r0, rPC              @ arg0
25875    mov    r1, rFP              @ arg1
25876    mov    r2, rSELF            @ arg2
25877    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25878
25879/* ------------------------------ */
25880    .balign 64
25881.L_ALT_OP_UNUSED_F1FF: /* 0x1f1 */
25882/* File: armv5te/alt_stub.S */
25883/*
25884 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25885 * any interesting requests and then jump to the real instruction
25886 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25887 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25888 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25889 * bail to the real handler if breakFlags==0.
25890 */
25891    ldrb   r3, [rSELF, #offThread_breakFlags]
25892    adrl   lr, dvmAsmInstructionStart + (497 * 64)
25893    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25894    cmp    r3, #0
25895    bxeq   lr                   @ nothing to do - jump to real handler
25896    EXPORT_PC()
25897    mov    r0, rPC              @ arg0
25898    mov    r1, rFP              @ arg1
25899    mov    r2, rSELF            @ arg2
25900    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25901
25902/* ------------------------------ */
25903    .balign 64
25904.L_ALT_OP_INVOKE_OBJECT_INIT_JUMBO: /* 0x1f2 */
25905/* File: armv5te/alt_stub.S */
25906/*
25907 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25908 * any interesting requests and then jump to the real instruction
25909 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25910 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25911 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25912 * bail to the real handler if breakFlags==0.
25913 */
25914    ldrb   r3, [rSELF, #offThread_breakFlags]
25915    adrl   lr, dvmAsmInstructionStart + (498 * 64)
25916    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25917    cmp    r3, #0
25918    bxeq   lr                   @ nothing to do - jump to real handler
25919    EXPORT_PC()
25920    mov    r0, rPC              @ arg0
25921    mov    r1, rFP              @ arg1
25922    mov    r2, rSELF            @ arg2
25923    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25924
25925/* ------------------------------ */
25926    .balign 64
25927.L_ALT_OP_IGET_VOLATILE_JUMBO: /* 0x1f3 */
25928/* File: armv5te/alt_stub.S */
25929/*
25930 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25931 * any interesting requests and then jump to the real instruction
25932 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25933 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25934 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25935 * bail to the real handler if breakFlags==0.
25936 */
25937    ldrb   r3, [rSELF, #offThread_breakFlags]
25938    adrl   lr, dvmAsmInstructionStart + (499 * 64)
25939    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25940    cmp    r3, #0
25941    bxeq   lr                   @ nothing to do - jump to real handler
25942    EXPORT_PC()
25943    mov    r0, rPC              @ arg0
25944    mov    r1, rFP              @ arg1
25945    mov    r2, rSELF            @ arg2
25946    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25947
25948/* ------------------------------ */
25949    .balign 64
25950.L_ALT_OP_IGET_WIDE_VOLATILE_JUMBO: /* 0x1f4 */
25951/* File: armv5te/alt_stub.S */
25952/*
25953 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25954 * any interesting requests and then jump to the real instruction
25955 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25956 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25957 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25958 * bail to the real handler if breakFlags==0.
25959 */
25960    ldrb   r3, [rSELF, #offThread_breakFlags]
25961    adrl   lr, dvmAsmInstructionStart + (500 * 64)
25962    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25963    cmp    r3, #0
25964    bxeq   lr                   @ nothing to do - jump to real handler
25965    EXPORT_PC()
25966    mov    r0, rPC              @ arg0
25967    mov    r1, rFP              @ arg1
25968    mov    r2, rSELF            @ arg2
25969    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25970
25971/* ------------------------------ */
25972    .balign 64
25973.L_ALT_OP_IGET_OBJECT_VOLATILE_JUMBO: /* 0x1f5 */
25974/* File: armv5te/alt_stub.S */
25975/*
25976 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
25977 * any interesting requests and then jump to the real instruction
25978 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
25979 * rIBASE updates won't be seen until a refresh, and we can tell we have a
25980 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
25981 * bail to the real handler if breakFlags==0.
25982 */
25983    ldrb   r3, [rSELF, #offThread_breakFlags]
25984    adrl   lr, dvmAsmInstructionStart + (501 * 64)
25985    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
25986    cmp    r3, #0
25987    bxeq   lr                   @ nothing to do - jump to real handler
25988    EXPORT_PC()
25989    mov    r0, rPC              @ arg0
25990    mov    r1, rFP              @ arg1
25991    mov    r2, rSELF            @ arg2
25992    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
25993
25994/* ------------------------------ */
25995    .balign 64
25996.L_ALT_OP_IPUT_VOLATILE_JUMBO: /* 0x1f6 */
25997/* File: armv5te/alt_stub.S */
25998/*
25999 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26000 * any interesting requests and then jump to the real instruction
26001 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26002 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26003 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26004 * bail to the real handler if breakFlags==0.
26005 */
26006    ldrb   r3, [rSELF, #offThread_breakFlags]
26007    adrl   lr, dvmAsmInstructionStart + (502 * 64)
26008    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26009    cmp    r3, #0
26010    bxeq   lr                   @ nothing to do - jump to real handler
26011    EXPORT_PC()
26012    mov    r0, rPC              @ arg0
26013    mov    r1, rFP              @ arg1
26014    mov    r2, rSELF            @ arg2
26015    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26016
26017/* ------------------------------ */
26018    .balign 64
26019.L_ALT_OP_IPUT_WIDE_VOLATILE_JUMBO: /* 0x1f7 */
26020/* File: armv5te/alt_stub.S */
26021/*
26022 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26023 * any interesting requests and then jump to the real instruction
26024 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26025 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26026 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26027 * bail to the real handler if breakFlags==0.
26028 */
26029    ldrb   r3, [rSELF, #offThread_breakFlags]
26030    adrl   lr, dvmAsmInstructionStart + (503 * 64)
26031    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26032    cmp    r3, #0
26033    bxeq   lr                   @ nothing to do - jump to real handler
26034    EXPORT_PC()
26035    mov    r0, rPC              @ arg0
26036    mov    r1, rFP              @ arg1
26037    mov    r2, rSELF            @ arg2
26038    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26039
26040/* ------------------------------ */
26041    .balign 64
26042.L_ALT_OP_IPUT_OBJECT_VOLATILE_JUMBO: /* 0x1f8 */
26043/* File: armv5te/alt_stub.S */
26044/*
26045 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26046 * any interesting requests and then jump to the real instruction
26047 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26048 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26049 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26050 * bail to the real handler if breakFlags==0.
26051 */
26052    ldrb   r3, [rSELF, #offThread_breakFlags]
26053    adrl   lr, dvmAsmInstructionStart + (504 * 64)
26054    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26055    cmp    r3, #0
26056    bxeq   lr                   @ nothing to do - jump to real handler
26057    EXPORT_PC()
26058    mov    r0, rPC              @ arg0
26059    mov    r1, rFP              @ arg1
26060    mov    r2, rSELF            @ arg2
26061    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26062
26063/* ------------------------------ */
26064    .balign 64
26065.L_ALT_OP_SGET_VOLATILE_JUMBO: /* 0x1f9 */
26066/* File: armv5te/alt_stub.S */
26067/*
26068 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26069 * any interesting requests and then jump to the real instruction
26070 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26071 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26072 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26073 * bail to the real handler if breakFlags==0.
26074 */
26075    ldrb   r3, [rSELF, #offThread_breakFlags]
26076    adrl   lr, dvmAsmInstructionStart + (505 * 64)
26077    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26078    cmp    r3, #0
26079    bxeq   lr                   @ nothing to do - jump to real handler
26080    EXPORT_PC()
26081    mov    r0, rPC              @ arg0
26082    mov    r1, rFP              @ arg1
26083    mov    r2, rSELF            @ arg2
26084    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26085
26086/* ------------------------------ */
26087    .balign 64
26088.L_ALT_OP_SGET_WIDE_VOLATILE_JUMBO: /* 0x1fa */
26089/* File: armv5te/alt_stub.S */
26090/*
26091 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26092 * any interesting requests and then jump to the real instruction
26093 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26094 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26095 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26096 * bail to the real handler if breakFlags==0.
26097 */
26098    ldrb   r3, [rSELF, #offThread_breakFlags]
26099    adrl   lr, dvmAsmInstructionStart + (506 * 64)
26100    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26101    cmp    r3, #0
26102    bxeq   lr                   @ nothing to do - jump to real handler
26103    EXPORT_PC()
26104    mov    r0, rPC              @ arg0
26105    mov    r1, rFP              @ arg1
26106    mov    r2, rSELF            @ arg2
26107    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26108
26109/* ------------------------------ */
26110    .balign 64
26111.L_ALT_OP_SGET_OBJECT_VOLATILE_JUMBO: /* 0x1fb */
26112/* File: armv5te/alt_stub.S */
26113/*
26114 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26115 * any interesting requests and then jump to the real instruction
26116 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26117 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26118 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26119 * bail to the real handler if breakFlags==0.
26120 */
26121    ldrb   r3, [rSELF, #offThread_breakFlags]
26122    adrl   lr, dvmAsmInstructionStart + (507 * 64)
26123    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26124    cmp    r3, #0
26125    bxeq   lr                   @ nothing to do - jump to real handler
26126    EXPORT_PC()
26127    mov    r0, rPC              @ arg0
26128    mov    r1, rFP              @ arg1
26129    mov    r2, rSELF            @ arg2
26130    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26131
26132/* ------------------------------ */
26133    .balign 64
26134.L_ALT_OP_SPUT_VOLATILE_JUMBO: /* 0x1fc */
26135/* File: armv5te/alt_stub.S */
26136/*
26137 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26138 * any interesting requests and then jump to the real instruction
26139 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26140 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26141 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26142 * bail to the real handler if breakFlags==0.
26143 */
26144    ldrb   r3, [rSELF, #offThread_breakFlags]
26145    adrl   lr, dvmAsmInstructionStart + (508 * 64)
26146    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26147    cmp    r3, #0
26148    bxeq   lr                   @ nothing to do - jump to real handler
26149    EXPORT_PC()
26150    mov    r0, rPC              @ arg0
26151    mov    r1, rFP              @ arg1
26152    mov    r2, rSELF            @ arg2
26153    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26154
26155/* ------------------------------ */
26156    .balign 64
26157.L_ALT_OP_SPUT_WIDE_VOLATILE_JUMBO: /* 0x1fd */
26158/* File: armv5te/alt_stub.S */
26159/*
26160 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26161 * any interesting requests and then jump to the real instruction
26162 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26163 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26164 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26165 * bail to the real handler if breakFlags==0.
26166 */
26167    ldrb   r3, [rSELF, #offThread_breakFlags]
26168    adrl   lr, dvmAsmInstructionStart + (509 * 64)
26169    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26170    cmp    r3, #0
26171    bxeq   lr                   @ nothing to do - jump to real handler
26172    EXPORT_PC()
26173    mov    r0, rPC              @ arg0
26174    mov    r1, rFP              @ arg1
26175    mov    r2, rSELF            @ arg2
26176    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26177
26178/* ------------------------------ */
26179    .balign 64
26180.L_ALT_OP_SPUT_OBJECT_VOLATILE_JUMBO: /* 0x1fe */
26181/* File: armv5te/alt_stub.S */
26182/*
26183 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26184 * any interesting requests and then jump to the real instruction
26185 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26186 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26187 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26188 * bail to the real handler if breakFlags==0.
26189 */
26190    ldrb   r3, [rSELF, #offThread_breakFlags]
26191    adrl   lr, dvmAsmInstructionStart + (510 * 64)
26192    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26193    cmp    r3, #0
26194    bxeq   lr                   @ nothing to do - jump to real handler
26195    EXPORT_PC()
26196    mov    r0, rPC              @ arg0
26197    mov    r1, rFP              @ arg1
26198    mov    r2, rSELF            @ arg2
26199    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26200
26201/* ------------------------------ */
26202    .balign 64
26203.L_ALT_OP_THROW_VERIFICATION_ERROR_JUMBO: /* 0x1ff */
26204/* File: armv5te/alt_stub.S */
26205/*
26206 * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
26207 * any interesting requests and then jump to the real instruction
26208 * handler.    Note that the call to dvmCheckBefore is done as a tail call.
26209 * rIBASE updates won't be seen until a refresh, and we can tell we have a
26210 * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
26211 * bail to the real handler if breakFlags==0.
26212 */
26213    ldrb   r3, [rSELF, #offThread_breakFlags]
26214    adrl   lr, dvmAsmInstructionStart + (511 * 64)
26215    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26216    cmp    r3, #0
26217    bxeq   lr                   @ nothing to do - jump to real handler
26218    EXPORT_PC()
26219    mov    r0, rPC              @ arg0
26220    mov    r1, rFP              @ arg1
26221    mov    r2, rSELF            @ arg2
26222    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
26223
26224    .balign 64
26225    .size   dvmAsmAltInstructionStart, .-dvmAsmAltInstructionStart
26226    .global dvmAsmAltInstructionEnd
26227dvmAsmAltInstructionEnd:
26228/* File: armv5te/footer.S */
26229/*
26230 * ===========================================================================
26231 *  Common subroutines and data
26232 * ===========================================================================
26233 */
26234
26235    .text
26236    .align  2
26237
26238#if defined(WITH_JIT)
26239
26240#if defined(WITH_SELF_VERIFICATION)
26241/*
26242 * "longjmp" to a translation after single-stepping.  Before returning
26243 * to translation, must save state for self-verification.
26244 */
26245    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26246dvmJitResumeTranslation:
26247    mov    rSELF, r0                             @ restore self
26248    mov    rPC, r1                               @ restore Dalvik pc
26249    mov    rFP, r2                               @ restore Dalvik fp
26250    ldr    r10, [rSELF,#offThread_jitResumeNPC]  @ resume address
26251    mov    r2, #0
26252    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26253    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26254    b      jitSVShadowRunStart                   @ resume as if cache hit
26255                                                 @ expects resume addr in r10
26256
26257    .global dvmJitToInterpPunt
26258dvmJitToInterpPunt:
26259    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
26260    mov    r3, #0
26261    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26262    b      jitSVShadowRunEnd            @ doesn't return
26263
26264    .global dvmJitToInterpSingleStep
26265dvmJitToInterpSingleStep:
26266    mov    rPC, r0              @ set up dalvik pc
26267    EXPORT_PC()
26268    str    lr, [rSELF,#offThread_jitResumeNPC]
26269    str    sp, [rSELF,#offThread_jitResumeNSP]
26270    str    r1, [rSELF,#offThread_jitResumeDPC]
26271    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
26272    b      jitSVShadowRunEnd            @ doesn't return
26273
26274
26275    .global dvmJitToInterpNoChainNoProfile
26276dvmJitToInterpNoChainNoProfile:
26277    mov    r0,rPC                       @ pass our target PC
26278    mov    r2,#kSVSNoProfile            @ r2<- interpreter entry point
26279    mov    r3, #0                       @ 0 means !inJitCodeCache
26280    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26281    b      jitSVShadowRunEnd            @ doesn't return
26282
26283    .global dvmJitToInterpTraceSelectNoChain
26284dvmJitToInterpTraceSelectNoChain:
26285    mov    r0,rPC                       @ pass our target PC
26286    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26287    mov    r3, #0                       @ 0 means !inJitCodeCache
26288    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26289    b      jitSVShadowRunEnd            @ doesn't return
26290
26291    .global dvmJitToInterpTraceSelect
26292dvmJitToInterpTraceSelect:
26293    ldr    r0,[lr, #-1]                 @ pass our target PC
26294    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
26295    mov    r3, #0                       @ 0 means !inJitCodeCache
26296    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26297    b      jitSVShadowRunEnd            @ doesn't return
26298
26299    .global dvmJitToInterpBackwardBranch
26300dvmJitToInterpBackwardBranch:
26301    ldr    r0,[lr, #-1]                 @ pass our target PC
26302    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
26303    mov    r3, #0                       @ 0 means !inJitCodeCache
26304    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26305    b      jitSVShadowRunEnd            @ doesn't return
26306
26307    .global dvmJitToInterpNormal
26308dvmJitToInterpNormal:
26309    ldr    r0,[lr, #-1]                 @ pass our target PC
26310    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
26311    mov    r3, #0                       @ 0 means !inJitCodeCache
26312    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26313    b      jitSVShadowRunEnd            @ doesn't return
26314
26315    .global dvmJitToInterpNoChain
26316dvmJitToInterpNoChain:
26317    mov    r0,rPC                       @ pass our target PC
26318    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
26319    mov    r3, #0                       @ 0 means !inJitCodeCache
26320    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26321    b      jitSVShadowRunEnd            @ doesn't return
26322#else
26323
26324/*
26325 * "longjmp" to a translation after single-stepping.
26326 */
26327    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
26328dvmJitResumeTranslation:
26329    mov    rSELF, r0                             @ restore self
26330    mov    rPC, r1                               @ restore Dalvik pc
26331    mov    rFP, r2                               @ restore Dalvik fp
26332    ldr    r0, [rSELF,#offThread_jitResumeNPC]
26333    mov    r2, #0
26334    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
26335    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
26336    bx     r0                                    @ resume translation
26337
26338/*
26339 * Return from the translation cache to the interpreter when the compiler is
26340 * having issues translating/executing a Dalvik instruction. We have to skip
26341 * the code cache lookup otherwise it is possible to indefinitely bouce
26342 * between the interpreter and the code cache if the instruction that fails
26343 * to be compiled happens to be at a trace start.
26344 */
26345    .global dvmJitToInterpPunt
26346dvmJitToInterpPunt:
26347    mov    rPC, r0
26348#if defined(WITH_JIT_TUNING)
26349    mov    r0,lr
26350    bl     dvmBumpPunt;
26351#endif
26352    EXPORT_PC()
26353    mov    r0, #0
26354    str    r0, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
26355    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26356    FETCH_INST()
26357    GET_INST_OPCODE(ip)
26358    GOTO_OPCODE(ip)
26359
26360/*
26361 * Return to the interpreter to handle a single instruction.
26362 * We'll use the normal single-stepping mechanism via interpBreak,
26363 * but also save the native pc of the resume point in the translation
26364 * and the native sp so that we can later do the equivalent of a
26365 * longjmp() to resume.
26366 * On entry:
26367 *    dPC <= Dalvik PC of instrucion to interpret
26368 *    lr <= resume point in translation
26369 *    r1 <= Dalvik PC of next instruction
26370 */
26371    .global dvmJitToInterpSingleStep
26372dvmJitToInterpSingleStep:
26373    mov    rPC, r0              @ set up dalvik pc
26374    EXPORT_PC()
26375    str    lr, [rSELF,#offThread_jitResumeNPC]
26376    str    sp, [rSELF,#offThread_jitResumeNSP]
26377    str    r1, [rSELF,#offThread_jitResumeDPC]
26378    mov    r1, #1
26379    str    r1, [rSELF,#offThread_singleStepCount]  @ just step once
26380    mov    r0, rSELF
26381    mov    r1, #kSubModeCountedStep
26382    bl     dvmEnableSubMode     @ (self, newMode)
26383    ldr    rIBASE, [rSELF,#offThread_curHandlerTable]
26384    FETCH_INST()
26385    GET_INST_OPCODE(ip)
26386    GOTO_OPCODE(ip)
26387
26388/*
26389 * Return from the translation cache and immediately request
26390 * a translation for the exit target.  Commonly used for callees.
26391 */
26392    .global dvmJitToInterpTraceSelectNoChain
26393dvmJitToInterpTraceSelectNoChain:
26394#if defined(WITH_JIT_TUNING)
26395    bl     dvmBumpNoChain
26396#endif
26397    mov    r0,rPC
26398    mov    r1,rSELF
26399    bl     dvmJitGetTraceAddrThread @ (pc, self)
26400    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26401    mov    r1, rPC                  @ arg1 of translation may need this
26402    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26403    cmp    r0,#0                    @ !0 means translation exists
26404    bxne   r0                       @ continue native execution if so
26405    b      2f                       @ branch over to use the interpreter
26406
26407/*
26408 * Return from the translation cache and immediately request
26409 * a translation for the exit target.  Commonly used following
26410 * invokes.
26411 */
26412    .global dvmJitToInterpTraceSelect
26413dvmJitToInterpTraceSelect:
26414    ldr    rPC,[lr, #-1]           @ get our target PC
26415    add    rINST,lr,#-5            @ save start of chain branch
26416    add    rINST, #-4              @  .. which is 9 bytes back
26417    mov    r0,rPC
26418    mov    r1,rSELF
26419    bl     dvmJitGetTraceAddrThread @ (pc, self)
26420    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26421    cmp    r0,#0
26422    beq    2f
26423    mov    r1,rINST
26424    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26425    mov    r1, rPC                  @ arg1 of translation may need this
26426    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
26427    cmp    r0,#0                    @ successful chain?
26428    bxne   r0                       @ continue native execution
26429    b      toInterpreter            @ didn't chain - resume with interpreter
26430
26431/* No translation, so request one if profiling isn't disabled*/
264322:
26433    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26434    ldr    r0, [rSELF, #offThread_pJitProfTable]
26435    FETCH_INST()
26436    cmp    r0, #0
26437    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
26438    bne    common_selectTrace
26439    GET_INST_OPCODE(ip)
26440    GOTO_OPCODE(ip)
26441
26442/*
26443 * Return from the translation cache to the interpreter.
26444 * The return was done with a BLX from thumb mode, and
26445 * the following 32-bit word contains the target rPC value.
26446 * Note that lr (r14) will have its low-order bit set to denote
26447 * its thumb-mode origin.
26448 *
26449 * We'll need to stash our lr origin away, recover the new
26450 * target and then check to see if there is a translation available
26451 * for our new target.  If so, we do a translation chain and
26452 * go back to native execution.  Otherwise, it's back to the
26453 * interpreter (after treating this entry as a potential
26454 * trace start).
26455 */
26456    .global dvmJitToInterpNormal
26457dvmJitToInterpNormal:
26458    ldr    rPC,[lr, #-1]           @ get our target PC
26459    add    rINST,lr,#-5            @ save start of chain branch
26460    add    rINST,#-4               @ .. which is 9 bytes back
26461#if defined(WITH_JIT_TUNING)
26462    bl     dvmBumpNormal
26463#endif
26464    mov    r0,rPC
26465    mov    r1,rSELF
26466    bl     dvmJitGetTraceAddrThread @ (pc, self)
26467    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26468    cmp    r0,#0
26469    beq    toInterpreter            @ go if not, otherwise do chain
26470    mov    r1,rINST
26471    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
26472    mov    r1, rPC                  @ arg1 of translation may need this
26473    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26474    cmp    r0,#0                    @ successful chain?
26475    bxne   r0                       @ continue native execution
26476    b      toInterpreter            @ didn't chain - resume with interpreter
26477
26478/*
26479 * Return from the translation cache to the interpreter to do method invocation.
26480 * Check if translation exists for the callee, but don't chain to it.
26481 */
26482    .global dvmJitToInterpNoChainNoProfile
26483dvmJitToInterpNoChainNoProfile:
26484#if defined(WITH_JIT_TUNING)
26485    bl     dvmBumpNoChain
26486#endif
26487    mov    r0,rPC
26488    mov    r1,rSELF
26489    bl     dvmJitGetTraceAddrThread @ (pc, self)
26490    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26491    mov    r1, rPC                  @ arg1 of translation may need this
26492    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26493    cmp    r0,#0
26494    bxne   r0                       @ continue native execution if so
26495    EXPORT_PC()
26496    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26497    FETCH_INST()
26498    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26499    GOTO_OPCODE(ip)                     @ jump to next instruction
26500
26501/*
26502 * Return from the translation cache to the interpreter to do method invocation.
26503 * Check if translation exists for the callee, but don't chain to it.
26504 */
26505    .global dvmJitToInterpNoChain
26506dvmJitToInterpNoChain:
26507#if defined(WITH_JIT_TUNING)
26508    bl     dvmBumpNoChain
26509#endif
26510    mov    r0,rPC
26511    mov    r1,rSELF
26512    bl     dvmJitGetTraceAddrThread @ (pc, self)
26513    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26514    mov    r1, rPC                  @ arg1 of translation may need this
26515    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
26516    cmp    r0,#0
26517    bxne   r0                       @ continue native execution if so
26518#endif
26519
26520/*
26521 * No translation, restore interpreter regs and start interpreting.
26522 * rSELF & rFP were preserved in the translated code, and rPC has
26523 * already been restored by the time we get here.  We'll need to set
26524 * up rIBASE & rINST, and load the address of the JitTable into r0.
26525 */
26526toInterpreter:
26527    EXPORT_PC()
26528    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26529    FETCH_INST()
26530    ldr    r0, [rSELF, #offThread_pJitProfTable]
26531    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26532    @ NOTE: intended fallthrough
26533
26534/*
26535 * Similar to common_updateProfile, but tests for null pJitProfTable
26536 * r0 holds pJifProfTAble, rINST is loaded, rPC is current and
26537 * rIBASE has been recently refreshed.
26538 */
26539common_testUpdateProfile:
26540    cmp     r0, #0               @ JIT switched off?
26541    beq     4f                   @ return to interp if so
26542
26543/*
26544 * Common code to update potential trace start counter, and initiate
26545 * a trace-build if appropriate.
26546 * On entry here:
26547 *    r0    <= pJitProfTable (verified non-NULL)
26548 *    rPC   <= Dalvik PC
26549 *    rINST <= next instruction
26550 */
26551common_updateProfile:
26552    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
26553    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
26554    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
26555    GET_INST_OPCODE(ip)
26556    subs    r1,r1,#1           @ decrement counter
26557    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
26558    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
26559
26560    /* Looks good, reset the counter */
26561    ldr     r1, [rSELF, #offThread_jitThreshold]
26562    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
26563    EXPORT_PC()
26564    mov     r0,rPC
26565    mov     r1,rSELF
26566    bl      dvmJitGetTraceAddrThread    @ (pc, self)
26567    str     r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
26568    mov     r1, rPC                     @ arg1 of translation may need this
26569    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
26570    cmp     r0,#0
26571#if !defined(WITH_SELF_VERIFICATION)
26572    bxne    r0                          @ jump to the translation
26573    mov     r2,#kJitTSelectRequest      @ ask for trace selection
26574    @ fall-through to common_selectTrace
26575#else
26576    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
26577    beq     common_selectTrace
26578    /*
26579     * At this point, we have a target translation.  However, if
26580     * that translation is actually the interpret-only pseudo-translation
26581     * we want to treat it the same as no translation.
26582     */
26583    mov     r10, r0                     @ save target
26584    bl      dvmCompilerGetInterpretTemplate
26585    cmp     r0, r10                     @ special case?
26586    bne     jitSVShadowRunStart         @ set up self verification shadow space
26587    @ Need to clear the inJitCodeCache flag
26588    mov    r3, #0                       @ 0 means not in the JIT code cache
26589    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
26590    GET_INST_OPCODE(ip)
26591    GOTO_OPCODE(ip)
26592    /* no return */
26593#endif
26594
26595/*
26596 * On entry:
26597 *  r2 is jit state.
26598 */
26599common_selectTrace:
26600    ldrh    r0,[rSELF,#offThread_subMode]
26601    ands    r0, #(kSubModeJitTraceBuild | kSubModeJitSV)
26602    bne     3f                         @ already doing JIT work, continue
26603    str     r2,[rSELF,#offThread_jitState]
26604    mov     r0, rSELF
26605/*
26606 * Call out to validate trace-building request.  If successful,
26607 * rIBASE will be swapped to to send us into single-stepping trace
26608 * building mode, so we need to refresh before we continue.
26609 */
26610    EXPORT_PC()
26611    SAVE_PC_FP_TO_SELF()                 @ copy of pc/fp to Thread
26612    bl      dvmJitCheckTraceRequest
266133:
26614    FETCH_INST()
26615    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
266164:
26617    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26618    GOTO_OPCODE(ip)
26619    /* no return */
26620#endif
26621
26622#if defined(WITH_SELF_VERIFICATION)
26623/*
26624 * Save PC and registers to shadow memory for self verification mode
26625 * before jumping to native translation.
26626 * On entry:
26627 *    rPC, rFP, rSELF: the values that they should contain
26628 *    r10: the address of the target translation.
26629 */
26630jitSVShadowRunStart:
26631    mov     r0,rPC                      @ r0<- program counter
26632    mov     r1,rFP                      @ r1<- frame pointer
26633    mov     r2,rSELF                    @ r2<- self (Thread) pointer
26634    mov     r3,r10                      @ r3<- target translation
26635    bl      dvmSelfVerificationSaveState @ save registers to shadow space
26636    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
26637    bx      r10                         @ jump to the translation
26638
26639/*
26640 * Restore PC, registers, and interpreter state to original values
26641 * before jumping back to the interpreter.
26642 * On entry:
26643 *   r0:  dPC
26644 *   r2:  self verification state
26645 */
26646jitSVShadowRunEnd:
26647    mov    r1,rFP                        @ pass ending fp
26648    mov    r3,rSELF                      @ pass self ptr for convenience
26649    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
26650    LOAD_PC_FP_FROM_SELF()               @ restore pc, fp
26651    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
26652    cmp    r1,#0                         @ check for punt condition
26653    beq    1f
26654    @ Set up SV single-stepping
26655    mov    r0, rSELF
26656    mov    r1, #kSubModeJitSV
26657    bl     dvmEnableSubMode              @ (self, subMode)
26658    mov    r2,#kJitSelfVerification      @ ask for self verification
26659    str    r2,[rSELF,#offThread_jitState]
26660    @ intentional fallthrough
266611:                                       @ exit to interpreter without check
26662    EXPORT_PC()
26663    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
26664    FETCH_INST()
26665    GET_INST_OPCODE(ip)
26666    GOTO_OPCODE(ip)
26667#endif
26668
26669/*
26670 * The equivalent of "goto bail", this calls through the "bail handler".
26671 * It will end this interpreter activation, and return to the caller
26672 * of dvmMterpStdRun.
26673 *
26674 * State registers will be saved to the "thread" area before bailing
26675 * debugging purposes
26676 */
26677common_gotoBail:
26678    SAVE_PC_FP_TO_SELF()                @ export state to "thread"
26679    mov     r0, rSELF                   @ r0<- self ptr
26680    b       dvmMterpStdBail             @ call(self, changeInterp)
26681
26682/*
26683 * The JIT's invoke method needs to remember the callsite class and
26684 * target pair.  Save them here so that they are available to
26685 * dvmCheckJit following the interpretation of this invoke.
26686 */
26687#if defined(WITH_JIT)
26688save_callsiteinfo:
26689    cmp     r9, #0
26690    ldrne   r9, [r9, #offObject_clazz]
26691    str     r0, [rSELF, #offThread_methodToCall]
26692    str     r9, [rSELF, #offThread_callsiteClass]
26693    bx      lr
26694#endif
26695
26696/*
26697 * Common code for jumbo method invocation.
26698 * NOTE: this adjusts rPC to account for the difference in instruction width.
26699 * As a result, the savedPc in the stack frame will not be wholly accurate. So
26700 * long as that is only used for source file line number calculations, we're
26701 * okay.
26702 */
26703common_invokeMethodJumboNoThis:
26704#if defined(WITH_JIT)
26705 /* On entry: r0 is "Method* methodToCall */
26706    mov     r9, #0                      @ clear "this"
26707#endif
26708common_invokeMethodJumbo:
26709 /* On entry: r0 is "Method* methodToCall, r9 is "this" */
26710.LinvokeNewJumbo:
26711#if defined(WITH_JIT)
26712    ldrh    r1, [rSELF, #offThread_subMode]
26713    ands    r1, #kSubModeJitTraceBuild
26714    blne    save_callsiteinfo
26715#endif
26716    @ prepare to copy args to "outs" area of current frame
26717    add     rPC, rPC, #4                @ adjust pc to make return consistent
26718    FETCH(r2, 1)                        @ r2<- BBBB (arg count)
26719    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26720    cmp     r2, #0                      @ no args?
26721    beq     .LinvokeArgsDone            @ if no args, skip the rest
26722    FETCH(r1, 2)                        @ r1<- CCCC
26723    b       .LinvokeRangeArgs           @ handle args like invoke range
26724
26725/*
26726 * Common code for method invocation with range.
26727 *
26728 * On entry:
26729 *  r0 is "Method* methodToCall", r9 is "this"
26730 */
26731common_invokeMethodRange:
26732.LinvokeNewRange:
26733#if defined(WITH_JIT)
26734    ldrh    r1, [rSELF, #offThread_subMode]
26735    ands    r1, #kSubModeJitTraceBuild
26736    blne    save_callsiteinfo
26737#endif
26738    @ prepare to copy args to "outs" area of current frame
26739    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
26740    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26741    beq     .LinvokeArgsDone            @ if no args, skip the rest
26742    FETCH(r1, 2)                        @ r1<- CCCC
26743
26744.LinvokeRangeArgs:
26745    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
26746    @ (very few methods have > 10 args; could unroll for common cases)
26747    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
26748    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
267491:  ldr     r1, [r3], #4                @ val = *fp++
26750    subs    r2, r2, #1                  @ count--
26751    str     r1, [r10], #4               @ *outs++ = val
26752    bne     1b                          @ ...while count != 0
26753    b       .LinvokeArgsDone
26754
26755/*
26756 * Common code for method invocation without range.
26757 *
26758 * On entry:
26759 *  r0 is "Method* methodToCall", r9 is "this"
26760 */
26761common_invokeMethodNoRange:
26762.LinvokeNewNoRange:
26763#if defined(WITH_JIT)
26764    ldrh    r1, [rSELF, #offThread_subMode]
26765    ands    r1, #kSubModeJitTraceBuild
26766    blne    save_callsiteinfo
26767#endif
26768    @ prepare to copy args to "outs" area of current frame
26769    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
26770    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
26771    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
26772    beq     .LinvokeArgsDone
26773
26774    @ r0=methodToCall, r1=GFED, r2=count, r10=outs
26775.LinvokeNonRange:
26776    rsb     r2, r2, #5                  @ r2<- 5-r2
26777    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
26778    bl      common_abort                @ (skipped due to ARM prefetch)
267795:  and     ip, rINST, #0x0f00          @ isolate A
26780    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
26781    mov     r0, r0                      @ nop
26782    str     r2, [r10, #-4]!             @ *--outs = vA
267834:  and     ip, r1, #0xf000             @ isolate G
26784    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
26785    mov     r0, r0                      @ nop
26786    str     r2, [r10, #-4]!             @ *--outs = vG
267873:  and     ip, r1, #0x0f00             @ isolate F
26788    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
26789    mov     r0, r0                      @ nop
26790    str     r2, [r10, #-4]!             @ *--outs = vF
267912:  and     ip, r1, #0x00f0             @ isolate E
26792    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
26793    mov     r0, r0                      @ nop
26794    str     r2, [r10, #-4]!             @ *--outs = vE
267951:  and     ip, r1, #0x000f             @ isolate D
26796    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
26797    mov     r0, r0                      @ nop
26798    str     r2, [r10, #-4]!             @ *--outs = vD
267990:  @ fall through to .LinvokeArgsDone
26800
26801.LinvokeArgsDone: @ r0=methodToCall
26802    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
26803    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
26804    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
26805    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
26806    @ find space for the new stack frame, check for overflow
26807    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
26808    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
26809    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
26810@    bl      common_dumpRegs
26811    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
26812    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
26813    cmp     r3, r9                      @ bottom < interpStackEnd?
26814    ldrh    lr, [rSELF, #offThread_subMode]
26815    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
26816    blo     .LstackOverflow             @ yes, this frame will overflow stack
26817
26818    @ set up newSaveArea
26819#ifdef EASY_GDB
26820    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
26821    str     ip, [r10, #offStackSaveArea_prevSave]
26822#endif
26823    str     rFP, [r10, #offStackSaveArea_prevFrame]
26824    str     rPC, [r10, #offStackSaveArea_savedPc]
26825#if defined(WITH_JIT)
26826    mov     r9, #0
26827    str     r9, [r10, #offStackSaveArea_returnAddr]
26828#endif
26829    str     r0, [r10, #offStackSaveArea_method]
26830
26831    @ Profiling?
26832    cmp     lr, #0                      @ any special modes happening?
26833    bne     2f                          @ go if so
268341:
26835    tst     r3, #ACC_NATIVE
26836    bne     .LinvokeNative
26837
26838    /*
26839    stmfd   sp!, {r0-r3}
26840    bl      common_printNewline
26841    mov     r0, rFP
26842    mov     r1, #0
26843    bl      dvmDumpFp
26844    ldmfd   sp!, {r0-r3}
26845    stmfd   sp!, {r0-r3}
26846    mov     r0, r1
26847    mov     r1, r10
26848    bl      dvmDumpFp
26849    bl      common_printNewline
26850    ldmfd   sp!, {r0-r3}
26851    */
26852
26853    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
26854    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
26855    mov     rPC, r2                         @ publish new rPC
26856
26857    @ Update state values for the new method
26858    @ r0=methodToCall, r1=newFp, r3=newMethodClass, r9=newINST
26859    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
26860    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
26861    mov     r2, #1
26862    str     r2, [rSELF, #offThread_debugIsMethodEntry]
26863#if defined(WITH_JIT)
26864    ldr     r0, [rSELF, #offThread_pJitProfTable]
26865    mov     rFP, r1                         @ fp = newFp
26866    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
26867    mov     rINST, r9                       @ publish new rINST
26868    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26869    cmp     r0,#0
26870    bne     common_updateProfile
26871    GOTO_OPCODE(ip)                         @ jump to next instruction
26872#else
26873    mov     rFP, r1                         @ fp = newFp
26874    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
26875    mov     rINST, r9                       @ publish new rINST
26876    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26877    GOTO_OPCODE(ip)                         @ jump to next instruction
26878#endif
26879
268802:
26881    @ Profiling - record method entry.  r0: methodToCall
26882    stmfd   sp!, {r0-r3}                @ preserve r0-r3
26883    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
26884    mov     r1, r0
26885    mov     r0, rSELF
26886    bl      dvmReportInvoke             @ (self, method)
26887    ldmfd   sp!, {r0-r3}                @ restore r0-r3
26888    b       1b
26889
26890.LinvokeNative:
26891    @ Prep for the native call
26892    @ r0=methodToCall, r1=newFp, r10=newSaveArea
26893    ldrh    lr, [rSELF, #offThread_subMode]
26894    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
26895    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
26896    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
26897    mov     r2, r0                      @ r2<- methodToCall
26898    mov     r0, r1                      @ r0<- newFp (points to args)
26899    add     r1, rSELF, #offThread_retval  @ r1<- &retval
26900    mov     r3, rSELF                   @ arg3<- self
26901
26902#ifdef ASSIST_DEBUGGER
26903    /* insert fake function header to help gdb find the stack frame */
26904    b       .Lskip
26905    .type   dalvik_mterp, %function
26906dalvik_mterp:
26907    .fnstart
26908    MTERP_ENTRY1
26909    MTERP_ENTRY2
26910.Lskip:
26911#endif
26912
26913    cmp     lr, #0                      @ any special SubModes active?
26914    bne     11f                         @ go handle them if so
26915    ldr     ip, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
26916    blx     ip
269177:
26918
26919    @ native return; r10=newSaveArea
26920    @ equivalent to dvmPopJniLocals
26921    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
26922    ldr     r1, [rSELF, #offThread_exception] @ check for exception
26923    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
26924    cmp     r1, #0                      @ null?
26925    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
26926    bne     common_exceptionThrown      @ no, handle exception
26927
26928    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
26929    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
26930    GOTO_OPCODE(ip)                     @ jump to next instruction
26931
2693211:
26933    @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
26934    stmfd   sp!, {r0-r3}                @ save all but subModes
26935    mov     r0, r2                      @ r0<- methodToCall
26936    mov     r1, rSELF
26937    mov     r2, rFP
26938    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
26939    ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
26940
26941    @ Call the native method
26942    ldr     ip, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
26943    blx     ip
26944
26945    @ Restore the pre-call arguments
26946    ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
26947
26948    @ Finish up any post-invoke subMode requirements
26949    mov     r0, r2                      @ r0<- methodToCall
26950    mov     r1, rSELF
26951    mov     r2, rFP
26952    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
26953    b       7b                          @ resume
26954
26955.LstackOverflow:    @ r0=methodToCall
26956    mov     r1, r0                      @ r1<- methodToCall
26957    mov     r0, rSELF                   @ r0<- self
26958    bl      dvmHandleStackOverflow
26959    b       common_exceptionThrown
26960#ifdef ASSIST_DEBUGGER
26961    .fnend
26962    .size   dalvik_mterp, .-dalvik_mterp
26963#endif
26964
26965
26966    /*
26967     * Common code for method invocation, calling through "glue code".
26968     *
26969     * TODO: now that we have range and non-range invoke handlers, this
26970     *       needs to be split into two.  Maybe just create entry points
26971     *       that set r9 and jump here?
26972     *
26973     * On entry:
26974     *  r0 is "Method* methodToCall", the method we're trying to call
26975     *  r9 is "bool methodCallRange", indicating if this is a /range variant
26976     */
26977     .if    0
26978.LinvokeOld:
26979    sub     sp, sp, #8                  @ space for args + pad
26980    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
26981    mov     r2, r0                      @ A2<- methodToCall
26982    mov     r0, rSELF                   @ A0<- self
26983    SAVE_PC_FP_TO_SELF()                @ export state to "self"
26984    mov     r1, r9                      @ A1<- methodCallRange
26985    mov     r3, rINST, lsr #8           @ A3<- AA
26986    str     ip, [sp, #0]                @ A4<- ip
26987    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
26988    add     sp, sp, #8                  @ remove arg area
26989    b       common_resumeAfterGlueCall  @ continue to next instruction
26990    .endif
26991
26992
26993
26994/*
26995 * Common code for handling a return instruction.
26996 *
26997 * This does not return.
26998 */
26999common_returnFromMethod:
27000.LreturnNew:
27001    ldrh    lr, [rSELF, #offThread_subMode]
27002    SAVEAREA_FROM_FP(r0, rFP)
27003    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
27004    cmp     lr, #0                      @ any special subMode handling needed?
27005    bne     19f
2700614:
27007    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
27008    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
27009                                        @ r2<- method we're returning to
27010    cmp     r2, #0                      @ is this a break frame?
27011#if defined(WORKAROUND_CORTEX_A9_745320)
27012    /* Don't use conditional loads if the HW defect exists */
27013    beq     15f
27014    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
2701515:
27016#else
27017    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
27018#endif
27019    beq     common_gotoBail             @ break frame, bail out completely
27020
27021    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
27022    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
27023    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
27024    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
27025    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
27026#if defined(WITH_JIT)
27027    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
27028    mov     rPC, r9                     @ publish new rPC
27029    str     r1, [rSELF, #offThread_methodClassDex]
27030    str     r10, [rSELF, #offThread_inJitCodeCache]  @ may return to JIT'ed land
27031    cmp     r10, #0                      @ caller is compiled code
27032    blxne   r10
27033    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27034    GOTO_OPCODE(ip)                     @ jump to next instruction
27035#else
27036    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27037    mov     rPC, r9                     @ publish new rPC
27038    str     r1, [rSELF, #offThread_methodClassDex]
27039    GOTO_OPCODE(ip)                     @ jump to next instruction
27040#endif
27041
2704219:
27043    @ Handle special actions
27044    @ On entry, r0: StackSaveArea
27045    ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
27046    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
27047    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
27048    mov     r0, rSELF
27049    bl      dvmReportReturn             @ (self)
27050    SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
27051    b       14b                         @ continue
27052
27053    /*
27054     * Return handling, calls through "glue code".
27055     */
27056     .if    0
27057.LreturnOld:
27058    SAVE_PC_FP_TO_SELF()                @ export state
27059    mov     r0, rSELF                   @ arg to function
27060    bl      dvmMterp_returnFromMethod
27061    b       common_resumeAfterGlueCall
27062    .endif
27063
27064
27065/*
27066 * Somebody has thrown an exception.  Handle it.
27067 *
27068 * If the exception processing code returns to us (instead of falling
27069 * out of the interpreter), continue with whatever the next instruction
27070 * now happens to be.
27071 *
27072 * This does not return.
27073 */
27074     .global dvmMterpCommonExceptionThrown
27075dvmMterpCommonExceptionThrown:
27076common_exceptionThrown:
27077.LexceptionNew:
27078
27079    EXPORT_PC()
27080
27081    mov     r0, rSELF
27082    bl      dvmCheckSuspendPending
27083
27084    ldr     r9, [rSELF, #offThread_exception] @ r9<- self->exception
27085    mov     r1, rSELF                   @ r1<- self
27086    mov     r0, r9                      @ r0<- exception
27087    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
27088    ldrh    r2, [rSELF, #offThread_subMode]  @ get subMode flags
27089    mov     r3, #0                      @ r3<- NULL
27090    str     r3, [rSELF, #offThread_exception] @ self->exception = NULL
27091
27092    @ Special subMode?
27093    cmp     r2, #0                      @ any special subMode handling needed?
27094    bne     7f                          @ go if so
270958:
27096    /* set up args and a local for "&fp" */
27097    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
27098    str     rFP, [sp, #-4]!             @ *--sp = fp
27099    mov     ip, sp                      @ ip<- &fp
27100    mov     r3, #0                      @ r3<- false
27101    str     ip, [sp, #-4]!              @ *--sp = &fp
27102    ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
27103    mov     r0, rSELF                   @ r0<- self
27104    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
27105    ldrh    lr, [rSELF, #offThread_subMode]  @ lr<- subMode flags
27106    mov     r2, r9                      @ r2<- exception
27107    sub     r1, rPC, r1                 @ r1<- pc - method->insns
27108    mov     r1, r1, asr #1              @ r1<- offset in code units
27109
27110    /* call, r0 gets catchRelPc (a code-unit offset) */
27111    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
27112
27113    /* fix earlier stack overflow if necessary; may trash rFP */
27114    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27115    cmp     r1, #0                      @ did we overflow earlier?
27116    beq     1f                          @ no, skip ahead
27117    mov     rFP, r0                     @ save relPc result in rFP
27118    mov     r0, rSELF                   @ r0<- self
27119    mov     r1, r9                      @ r1<- exception
27120    bl      dvmCleanupStackOverflow     @ call(self)
27121    mov     r0, rFP                     @ restore result
271221:
27123
27124    /* update frame pointer and check result from dvmFindCatchBlock */
27125    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
27126    cmp     r0, #0                      @ is catchRelPc < 0?
27127    add     sp, sp, #8                  @ restore stack
27128    bmi     .LnotCaughtLocally
27129
27130    /* adjust locals to match self->interpSave.curFrame and updated PC */
27131    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
27132    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
27133    str     r1, [rSELF, #offThread_method]  @ self->method = new method
27134    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
27135    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
27136    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
27137    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
27138    str     r2, [rSELF, #offThread_methodClassDex] @ self->pDvmDex = meth...
27139
27140    /* release the tracked alloc on the exception */
27141    mov     r0, r9                      @ r0<- exception
27142    mov     r1, rSELF                   @ r1<- self
27143    bl      dvmReleaseTrackedAlloc      @ release the exception
27144
27145    /* restore the exception if the handler wants it */
27146    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
27147    FETCH_INST()                        @ load rINST from rPC
27148    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27149    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
27150    streq   r9, [rSELF, #offThread_exception] @ yes, restore the exception
27151    GOTO_OPCODE(ip)                     @ jump to next instruction
27152
27153    @ Manage debugger bookkeeping
271547:
27155    str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
27156    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
27157    mov     r0, rSELF                       @ arg0<- self
27158    mov     r1, r9                          @ arg1<- exception
27159    bl      dvmReportExceptionThrow         @ (self, exception)
27160    b       8b                              @ resume with normal handling
27161
27162.LnotCaughtLocally: @ r9=exception
27163    /* fix stack overflow if necessary */
27164    ldrb    r1, [rSELF, #offThread_stackOverflowed]
27165    cmp     r1, #0                      @ did we overflow earlier?
27166    movne   r0, rSELF                   @ if yes: r0<- self
27167    movne   r1, r9                      @ if yes: r1<- exception
27168    blne    dvmCleanupStackOverflow     @ if yes: call(self)
27169
27170    @ may want to show "not caught locally" debug messages here
27171#if DVM_SHOW_EXCEPTION >= 2
27172    /* call __android_log_print(prio, tag, format, ...) */
27173    /* "Exception %s from %s:%d not caught locally" */
27174    @ dvmLineNumFromPC(method, pc - method->insns)
27175    ldr     r0, [rSELF, #offThread_method]
27176    ldr     r1, [r0, #offMethod_insns]
27177    sub     r1, rPC, r1
27178    asr     r1, r1, #1
27179    bl      dvmLineNumFromPC
27180    str     r0, [sp, #-4]!
27181    @ dvmGetMethodSourceFile(method)
27182    ldr     r0, [rSELF, #offThread_method]
27183    bl      dvmGetMethodSourceFile
27184    str     r0, [sp, #-4]!
27185    @ exception->clazz->descriptor
27186    ldr     r3, [r9, #offObject_clazz]
27187    ldr     r3, [r3, #offClassObject_descriptor]
27188    @
27189    ldr     r2, strExceptionNotCaughtLocally
27190    ldr     r1, strLogTag
27191    mov     r0, #3                      @ LOG_DEBUG
27192    bl      __android_log_print
27193#endif
27194    str     r9, [rSELF, #offThread_exception] @ restore exception
27195    mov     r0, r9                      @ r0<- exception
27196    mov     r1, rSELF                   @ r1<- self
27197    bl      dvmReleaseTrackedAlloc      @ release the exception
27198    b       common_gotoBail             @ bail out
27199
27200
27201    /*
27202     * Exception handling, calls through "glue code".
27203     */
27204    .if     0
27205.LexceptionOld:
27206    SAVE_PC_FP_TO_SELF()                @ export state
27207    mov     r0, rSELF                   @ arg to function
27208    bl      dvmMterp_exceptionThrown
27209    b       common_resumeAfterGlueCall
27210    .endif
27211
27212#if defined(WITH_JIT)
27213    /*
27214     * If the JIT is actively building a trace we need to make sure
27215     * that the field is fully resolved before including the current
27216     * instruction.
27217     *
27218     * On entry:
27219     *     r10: &dvmDex->pResFields[field]
27220     *     r0:  field pointer (must preserve)
27221     */
27222common_verifyField:
27223    ldrh    r3, [rSELF, #offThread_subMode]  @ r3 <- submode byte
27224    ands    r3, #kSubModeJitTraceBuild
27225    bxeq    lr                          @ Not building trace, continue
27226    ldr     r1, [r10]                   @ r1<- reload resolved StaticField ptr
27227    cmp     r1, #0                      @ resolution complete?
27228    bxne    lr                          @ yes, continue
27229    stmfd   sp!, {r0-r2,lr}             @ save regs
27230    mov     r0, rSELF
27231    mov     r1, rPC
27232    bl      dvmJitEndTraceSelect        @ (self,pc) end trace before this inst
27233    ldmfd   sp!, {r0-r2, lr}
27234    bx      lr                          @ return
27235#endif
27236
27237/*
27238 * After returning from a "glued" function, pull out the updated
27239 * values and start executing at the next instruction.
27240 */
27241common_resumeAfterGlueCall:
27242    LOAD_PC_FP_FROM_SELF()              @ pull rPC and rFP out of thread
27243    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh
27244    FETCH_INST()                        @ load rINST from rPC
27245    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
27246    GOTO_OPCODE(ip)                     @ jump to next instruction
27247
27248/*
27249 * Invalid array index. Note that our calling convention is strange; we use r1
27250 * and r3 because those just happen to be the registers all our callers are
27251 * using. We move r3 before calling the C function, but r1 happens to match.
27252 * r1: index
27253 * r3: size
27254 */
27255common_errArrayIndex:
27256    EXPORT_PC()
27257    mov     r0, r3
27258    bl      dvmThrowArrayIndexOutOfBoundsException
27259    b       common_exceptionThrown
27260
27261/*
27262 * Integer divide or mod by zero.
27263 */
27264common_errDivideByZero:
27265    EXPORT_PC()
27266    ldr     r0, strDivideByZero
27267    bl      dvmThrowArithmeticException
27268    b       common_exceptionThrown
27269
27270/*
27271 * Attempt to allocate an array with a negative size.
27272 * On entry: length in r1
27273 */
27274common_errNegativeArraySize:
27275    EXPORT_PC()
27276    mov     r0, r1                                @ arg0 <- len
27277    bl      dvmThrowNegativeArraySizeException    @ (len)
27278    b       common_exceptionThrown
27279
27280/*
27281 * Invocation of a non-existent method.
27282 * On entry: method name in r1
27283 */
27284common_errNoSuchMethod:
27285    EXPORT_PC()
27286    mov     r0, r1
27287    bl      dvmThrowNoSuchMethodError
27288    b       common_exceptionThrown
27289
27290/*
27291 * We encountered a null object when we weren't expecting one.  We
27292 * export the PC, throw a NullPointerException, and goto the exception
27293 * processing code.
27294 */
27295common_errNullObject:
27296    EXPORT_PC()
27297    mov     r0, #0
27298    bl      dvmThrowNullPointerException
27299    b       common_exceptionThrown
27300
27301/*
27302 * For debugging, cause an immediate fault.  The source address will
27303 * be in lr (use a bl instruction to jump here).
27304 */
27305common_abort:
27306    ldr     pc, .LdeadFood
27307.LdeadFood:
27308    .word   0xdeadf00d
27309
27310/*
27311 * Spit out a "we were here", preserving all registers.  (The attempt
27312 * to save ip won't work, but we need to save an even number of
27313 * registers for EABI 64-bit stack alignment.)
27314 */
27315    .macro  SQUEAK num
27316common_squeak\num:
27317    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27318    ldr     r0, strSqueak
27319    mov     r1, #\num
27320    bl      printf
27321    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27322    bx      lr
27323    .endm
27324
27325    SQUEAK  0
27326    SQUEAK  1
27327    SQUEAK  2
27328    SQUEAK  3
27329    SQUEAK  4
27330    SQUEAK  5
27331
27332/*
27333 * Spit out the number in r0, preserving registers.
27334 */
27335common_printNum:
27336    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27337    mov     r1, r0
27338    ldr     r0, strSqueak
27339    bl      printf
27340    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27341    bx      lr
27342
27343/*
27344 * Print a newline, preserving registers.
27345 */
27346common_printNewline:
27347    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27348    ldr     r0, strNewline
27349    bl      printf
27350    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27351    bx      lr
27352
27353    /*
27354     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
27355     */
27356common_printHex:
27357    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27358    mov     r1, r0
27359    ldr     r0, strPrintHex
27360    bl      printf
27361    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27362    bx      lr
27363
27364/*
27365 * Print the 64-bit quantity in r0-r1, preserving registers.
27366 */
27367common_printLong:
27368    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27369    mov     r3, r1
27370    mov     r2, r0
27371    ldr     r0, strPrintLong
27372    bl      printf
27373    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27374    bx      lr
27375
27376/*
27377 * Print full method info.  Pass the Method* in r0.  Preserves regs.
27378 */
27379common_printMethod:
27380    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27381    bl      dvmMterpPrintMethod
27382    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27383    bx      lr
27384
27385/*
27386 * Call a C helper function that dumps regs and possibly some
27387 * additional info.  Requires the C function to be compiled in.
27388 */
27389    .if     0
27390common_dumpRegs:
27391    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
27392    bl      dvmMterpDumpArmRegs
27393    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
27394    bx      lr
27395    .endif
27396
27397#if 0
27398/*
27399 * Experiment on VFP mode.
27400 *
27401 * uint32_t setFPSCR(uint32_t val, uint32_t mask)
27402 *
27403 * Updates the bits specified by "mask", setting them to the values in "val".
27404 */
27405setFPSCR:
27406    and     r0, r0, r1                  @ make sure no stray bits are set
27407    fmrx    r2, fpscr                   @ get VFP reg
27408    mvn     r1, r1                      @ bit-invert mask
27409    and     r2, r2, r1                  @ clear masked bits
27410    orr     r2, r2, r0                  @ set specified bits
27411    fmxr    fpscr, r2                   @ set VFP reg
27412    mov     r0, r2                      @ return new value
27413    bx      lr
27414
27415    .align  2
27416    .global dvmConfigureFP
27417    .type   dvmConfigureFP, %function
27418dvmConfigureFP:
27419    stmfd   sp!, {ip, lr}
27420    /* 0x03000000 sets DN/FZ */
27421    /* 0x00009f00 clears the six exception enable flags */
27422    bl      common_squeak0
27423    mov     r0, #0x03000000             @ r0<- 0x03000000
27424    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
27425    bl      setFPSCR
27426    ldmfd   sp!, {ip, pc}
27427#endif
27428
27429
27430/*
27431 * String references, must be close to the code that uses them.
27432 */
27433    .align  2
27434strDivideByZero:
27435    .word   .LstrDivideByZero
27436strLogTag:
27437    .word   .LstrLogTag
27438strExceptionNotCaughtLocally:
27439    .word   .LstrExceptionNotCaughtLocally
27440
27441strNewline:
27442    .word   .LstrNewline
27443strSqueak:
27444    .word   .LstrSqueak
27445strPrintHex:
27446    .word   .LstrPrintHex
27447strPrintLong:
27448    .word   .LstrPrintLong
27449
27450/*
27451 * Zero-terminated ASCII string data.
27452 *
27453 * On ARM we have two choices: do like gcc does, and LDR from a .word
27454 * with the address, or use an ADR pseudo-op to get the address
27455 * directly.  ADR saves 4 bytes and an indirection, but it's using a
27456 * PC-relative addressing mode and hence has a limited range, which
27457 * makes it not work well with mergeable string sections.
27458 */
27459    .section .rodata.str1.4,"aMS",%progbits,1
27460
27461.LstrBadEntryPoint:
27462    .asciz  "Bad entry point %d\n"
27463.LstrFilledNewArrayNotImpl:
27464    .asciz  "filled-new-array only implemented for objects and 'int'"
27465.LstrDivideByZero:
27466    .asciz  "divide by zero"
27467.LstrLogTag:
27468    .asciz  "mterp"
27469.LstrExceptionNotCaughtLocally:
27470    .asciz  "Exception %s from %s:%d not caught locally\n"
27471
27472.LstrNewline:
27473    .asciz  "\n"
27474.LstrSqueak:
27475    .asciz  "<%d>"
27476.LstrPrintHex:
27477    .asciz  "<%#x>"
27478.LstrPrintLong:
27479    .asciz  "<%lld>"
27480
27481