1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This file was generated automatically by gen-mterp.py for 'armv5te'.
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * --> DO NOT EDIT <--
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/header.S */
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
23c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ARMv5 definitions and declarations.
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectARM EABI general notes:
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0-r3 hold first 4 args to a method; they are not preserved across method calls
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr4-r8 are available for general use
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr9 is given special treatment in some situations, but not for us
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr10 (sl) seems to be generally available
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr12 (ip) is scratch -- not preserved across method calls
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr13 (sp) should be managed carefully in case a signal arrives
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr14 (lr) must be preserved
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr15 (pc) can be tinkered with directly
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0 holds returns of <= 4 bytes
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectr0-r1 hold returns of 8 bytes, low word in r0
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenCallee must save/restore r4+ (except r12) if it modifies them.  If VFP
45a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddenis present, registers s16-s31 (a/k/a d8-d15, a/k/a q4-q7) must be preserved,
46a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFaddens0-s15 (d0-d7, q0-a3) do not need to be.
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectStack is "full descending".  Only the arguments that don't fit in the first 4
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectregisters are placed on the stack.  "sp" points at the first stacked argument
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project(i.e. the 5th arg).
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectVFP: single-precision results in s0, double-precision results in d0.
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectIn the EABI, "sp" must be 64-bit aligned on entry to a function, and any
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project64-bit quantities (long long, double) must be 64-bit aligned.
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMterp and ARM notes:
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectThe following registers have fixed assignments:
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  reg nick      purpose
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  r4  rPC       interpreted program counter, used for fetching instructions
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project  r5  rFP       interpreted frame pointer, used for accessing locals and args
669f601a917c8878204482c37aec7005054b6776fabuzbee  r6  rSELF     self (Thread) pointer
671da12167d913efde56ec3b40491524b051679f2cAndy McFadden  r7  rINST     first 16-bit code unit of current instruction
681da12167d913efde56ec3b40491524b051679f2cAndy McFadden  r8  rIBASE    interpreted instruction base pointer, used for computed goto
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectMacros are provided for common operations.  Each macro MUST emit only
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectone instruction to make instruction-counting easier.  They MUST NOT alter
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectunspecified registers or condition codes.
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* single-purpose registers, given names for clarity */
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rPC     r4
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define rFP     r5
789f601a917c8878204482c37aec7005054b6776fabuzbee#define rSELF   r6
791da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rINST   r7
801da12167d913efde56ec3b40491524b051679f2cAndy McFadden#define rIBASE  r8
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
829f601a917c8878204482c37aec7005054b6776fabuzbee/* save/restore the PC and/or FP from the thread struct */
839f601a917c8878204482c37aec7005054b6776fabuzbee#define LOAD_PC_FROM_SELF()     ldr     rPC, [rSELF, #offThread_pc]
849f601a917c8878204482c37aec7005054b6776fabuzbee#define SAVE_PC_TO_SELF()       str     rPC, [rSELF, #offThread_pc]
8530bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee#define LOAD_FP_FROM_SELF()     ldr     rFP, [rSELF, #offThread_curFrame]
8630bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee#define SAVE_FP_TO_SELF()       str     rFP, [rSELF, #offThread_curFrame]
879f601a917c8878204482c37aec7005054b6776fabuzbee#define LOAD_PC_FP_FROM_SELF()  ldmia   rSELF, {rPC, rFP}
889f601a917c8878204482c37aec7005054b6776fabuzbee#define SAVE_PC_FP_TO_SELF()    stmia   rSELF, {rPC, rFP}
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "export" the PC to the stack frame, f/b/o future exception objects.  Must
9298f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee * be done *before* something throws.
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e.
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc)
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It's okay to do this more than once.
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define EXPORT_PC() \
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rPC, [rFP, #(-sizeofStackSaveArea + offStackSaveArea_currentPc)]
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Given a frame pointer, find the stack save area.
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In C this is "((StackSaveArea*)(_fp) -1)".
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SAVEAREA_FROM_FP(_reg, _fpreg) \
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     _reg, _fpreg, #sizeofStackSaveArea
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from rPC into rINST.  Does not advance rPC.
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_INST()            ldrh    rINST, [rPC]
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from the specified offset.  Advances rPC
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to point to the next instruction.  "_count" is in 16-bit code units.
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Because of the limited size of immediate constants on ARM, this is only
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * suitable for small forward movements (i.e. don't try to implement "goto"
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with this).
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This must come AFTER anything that can throw an exception, or the
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * exception catch may miss.  (This also implies that it must come after
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * EXPORT_PC().)
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
12724bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden#define FETCH_ADVANCE_INST(_count) ldrh    rINST, [rPC, #((_count)*2)]!
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
130642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * The operation performed here is similar to FETCH_ADVANCE_INST, except the
131642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * src and dest registers are parameterized (not hard-wired to rPC and rINST).
132642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng */
133642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng#define PREFETCH_ADVANCE_INST(_dreg, _sreg, _count) \
13424bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden        ldrh    _dreg, [_sreg, #((_count)*2)]!
135642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng
136642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng/*
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch the next instruction from an offset specified by _reg.  Updates
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * rPC to point to the next instruction.  "_reg" must specify the distance
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in bytes, *not* 16-bit code units, and may be a signed value.
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
1419a3147c7412f4794434b4c2604aa2ba784867774buzbee * We want to write "ldrh rINST, [rPC, _reg, lsl #1]!", but some of the
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * bits that hold the shift distance are used for the half/byte/sign flags.
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * In some cases we can pre-double _reg for free, so we require a byte offset
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * here.
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define FETCH_ADVANCE_INST_RB(_reg) ldrh    rINST, [rPC, _reg]!
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch a half-word code unit from an offset past the current PC.  The
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "_count" value is in 16-bit code units.  Does not advance rPC.
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "_S" variant works the same but treats the value as signed.
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
15424bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden#define FETCH(_reg, _count)     ldrh    _reg, [rPC, #((_count)*2)]
15524bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden#define FETCH_S(_reg, _count)   ldrsh   _reg, [rPC, #((_count)*2)]
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Fetch one byte from an offset past the current PC.  Pass in the same
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "_count" as you would for FETCH, and an additional 0/1 indicating which
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * byte of the halfword you want (lo/hi).
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16224bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden#define FETCH_B(_reg, _count, _byte) ldrb     _reg, [rPC, #((_count)*2+(_byte))]
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Put the instruction's opcode field into the specified register.
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_INST_OPCODE(_reg)   and     _reg, rINST, #255
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
170642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng * Put the prefetched instruction's opcode field into the specified register.
171642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng */
172642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng#define GET_PREFETCHED_OPCODE(_oreg, _ireg)   and     _oreg, _ireg, #255
173642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng
174642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng/*
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Begin executing the opcode in _reg.  Because this only jumps within the
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * interpreter, we don't have to worry about pre-ARMv5 THUMB interwork.
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GOTO_OPCODE(_reg)       add     pc, rIBASE, _reg, lsl #6
1799a3147c7412f4794434b4c2604aa2ba784867774buzbee#define GOTO_OPCODE_BASE(_base,_reg)  add     pc, _base, _reg, lsl #6
180ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFEQ(_reg)  addeq   pc, rIBASE, _reg, lsl #6
181ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define GOTO_OPCODE_IFNE(_reg)  addne   pc, rIBASE, _reg, lsl #6
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get/set the 32-bit value from a Dalvik register.
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define GET_VREG(_reg, _vreg)   ldr     _reg, [rFP, _vreg, lsl #2]
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define SET_VREG(_reg, _vreg)   str     _reg, [rFP, _vreg, lsl #2]
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
190a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden * Convert a virtual register index into an address.
191a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden */
192a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden#define VREG_INDEX_TO_ADDR(_reg, _vreg) \
193a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden        add     _reg, rFP, _vreg, lsl #2
194a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden
195a80b76553c2b9f33c4063ae8c69c5362d961de81Andy McFadden/*
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is a #include, not a %include, because we want the C pre-processor
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to expand the macros into assembler assignment statements.
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "../common/asm-constants.h"
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2017b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#if defined(WITH_JIT)
2027b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#include "../common/jit-config.h"
2037b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng#endif
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/platform.S */
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  CPU-version-specific defines
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
213c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden * Macro for data memory barrier; not meaningful pre-ARMv6K.
214c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden */
2150890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden.macro  SMP_DMB
216c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.endm
217c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden
2181df319e3674d993a07bc0ff1f56a5915410b5903Andy McFadden/*
2191df319e3674d993a07bc0ff1f56a5915410b5903Andy McFadden * Macro for data memory barrier; not meaningful pre-ARMv6K.
2201df319e3674d993a07bc0ff1f56a5915410b5903Andy McFadden */
2211df319e3674d993a07bc0ff1f56a5915410b5903Andy McFadden.macro  SMP_DMB_ST
2221df319e3674d993a07bc0ff1f56a5915410b5903Andy McFadden.endm
2231df319e3674d993a07bc0ff1f56a5915410b5903Andy McFadden
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/entry.S */
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Interpreter entry point.
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We don't have formal stack frames, so gdb scans upward in the code
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to find the start of the function (a label with the %function type),
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * and then looks at the next few instructions to figure out what
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * got pushed onto the stack.  From this it figures out how to restore
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the registers, including PC, for the previous stack frame.  If gdb
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * sees a non-function label, it stops scanning, so either we need to
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * have nothing but assembler-local labels between the entry point and
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the break, or we need to fake it out.
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * When this is defined, we add some stuff to make gdb less confused.
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define ASSIST_DEBUGGER 1
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdRun
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdRun, %function
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
2659f601a917c8878204482c37aec7005054b6776fabuzbee *  r0  Thread* self
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
2679a3147c7412f4794434b4c2604aa2ba784867774buzbee * The return comes via a call to dvmMterpStdBail().
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdRun:
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MTERP_ENTRY1 \
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .save {r4-r10,fp,lr}; \
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4-r10,fp,lr}         @ save 9 regs
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define MTERP_ENTRY2 \
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .pad    #4; \
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align 64
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* save stack pointer, add magic word for debuggerd */
2829f601a917c8878204482c37aec7005054b6776fabuzbee    str     sp, [r0, #offThread_bailPtr]  @ save SP for eventual return
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* set up "named" registers, figure out entry point */
2859f601a917c8878204482c37aec7005054b6776fabuzbee    mov     rSELF, r0                   @ set rSELF
2869f601a917c8878204482c37aec7005054b6776fabuzbee    LOAD_PC_FP_FROM_SELF()              @ load rPC and rFP from "thread"
287a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    ldr     rIBASE, [rSELF, #offThread_curHandlerTable] @ set rIBASE
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
289ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
290d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng.LentryInstr:
291ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    /* Entry is always a possible trace start */
2929a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
293ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
2947a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov     r1, #0                      @ prepare the value for the new state
2959f601a917c8878204482c37aec7005054b6776fabuzbee    str     r1, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
2967a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    cmp     r0,#0                       @ is profiling disabled?
2977a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#if !defined(WITH_SELF_VERIFICATION)
2987a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    bne     common_updateProfile        @ profiling is enabled
2997a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#else
3009f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_shadowSpace] @ to find out the jit exit state
3017a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    beq     1f                          @ profiling is disabled
3027a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    ldr     r3, [r2, #offShadowSpace_jitExitState]  @ jit exit state
3037a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    cmp     r3, #kSVSTraceSelect        @ hot trace following?
3047a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    moveq   r2,#kJitTSelectRequestHot   @ ask for trace selection
3057a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    beq     common_selectTrace          @ go build the trace
3067a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    cmp     r3, #kSVSNoProfile          @ don't profile the next instruction?
3077a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    beq     1f                          @ intrepret the next instruction
3087a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    b       common_updateProfile        @ collect profiles
3097a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#endif
3107a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng1:
311ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
312ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
313ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* start executing the instruction at rPC */
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
318ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lbad_arg:
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strBadEntryPoint
3225dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel0:  add     r0, pc
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r1 holds value of entryPoint
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAbort
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
327b387fe1b970a216c09d2abc98c893ff1fff3e512Andy McFadden    .size   dvmMterpStdRun, .-dvmMterpStdRun
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3295dfcc78af479937ba8dafceefd9b1931a88dfaafArd BiesheuvelstrBadEntryPoint:
3305dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrBadEntryPoint,0b)
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmMterpStdBail
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmMterpStdBail, %function
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Restore the stack pointer and PC from the save point established on entry.
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This is essentially the same as a longjmp, but should be cheaper.  The
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * last instruction causes us to return to whoever called dvmMterpStdRun.
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We pushed some registers on the stack in dvmMterpStdRun, then saved
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * SP and LR.  Here we restore SP, restore the registers, and then restore
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * LR to PC.
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
3459f601a917c8878204482c37aec7005054b6776fabuzbee *  r0  Thread* self
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmMterpStdBail:
3489a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     sp, [r0, #offThread_bailPtr]    @ sp<- saved SP
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4                      @ un-align 64
350d88756df5b4dbc6fd450afd0019a5f64ebe4432dElliott Hughes    ldmfd   sp!, {r4-r10,fp,pc}             @ restore 9 regs and return
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .global dvmAsmInstructionStart
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dvmAsmInstructionStart, %function
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectdvmAsmInstructionStart = .L_OP_NOP
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOP: /* 0x00 */
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOP.S */
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance to next instr, load rINST
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* insert fake function header to help gdb find the stack frame */
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dalvik_inst, %function
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_inst:
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE: /* 0x01 */
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_FROM16: /* 0x02 */
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AA]<- r2
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_16: /* 0x03 */
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- AAAA
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE: /* 0x04 */
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE.S */
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide vA, vB */
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[A]
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[B]
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[A]<- r0/r1
434a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_FROM16: /* 0x05 */
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_FROM16.S */
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/from16 vAA, vBBBB */
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- BBBB
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_WIDE_16: /* 0x06 */
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_WIDE_16.S */
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-wide/16 vAAAA, vBBBB */
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- BBBB
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- AAAA
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BBBB]
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AAAA]
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[BBBB]
464445194bc141dc67e2f678aa1bbd5e59ca66254e5Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AAAA]<- r0/r1
466a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT: /* 0x07 */
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT.S */
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_FROM16: /* 0x08 */
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_FROM16.S */
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_FROM16.S */
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/from16, move-object/from16 */
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBBBB */
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AA]<- r2
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_OBJECT_16: /* 0x09 */
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_OBJECT_16.S */
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_16.S */
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move/16, move-object/16 */
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAAAA, vBBBB */
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- AAAA
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[BBBB]
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[AAAA]<- r2
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT: /* 0x0a */
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5269f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[AA]<- r0
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_WIDE: /* 0x0b */
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_WIDE.S */
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-result-wide vAA */
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
5379f601a917c8878204482c37aec7005054b6776fabuzbee    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- retval.j
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r2, {r0-r1}                 @ fp[AA]<- r0/r1
542a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_RESULT_OBJECT: /* 0x0c */
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT_OBJECT.S */
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_RESULT.S */
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for: move-result, move-result-object */
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5549f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r0, [rSELF, #offThread_retval]    @ r0<- self->retval.i
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[AA]<- r0
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MOVE_EXCEPTION: /* 0x0d */
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE_EXCEPTION.S */
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* move-exception vAA */
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
5669f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_exception]  @ r3<- dvmGetException bypass
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0                      @ r1<- 0
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r3, r2)                    @ fp[AA]<- exception obj
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5719f601a917c8878204482c37aec7005054b6776fabuzbee    str     r1, [rSELF, #offThread_exception]  @ dvmClearException bypass
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_VOID: /* 0x0e */
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_VOID.S */
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN: /* 0x0f */
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5859f601a917c8878204482c37aec7005054b6776fabuzbee     * Return a 32-bit value.  Copies the return value into the "thread"
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vAA
5939f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_WIDE: /* 0x10 */
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_WIDE.S */
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6019f601a917c8878204482c37aec7005054b6776fabuzbee     * Return a 64-bit value.  Copies the return value into the "thread"
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* return-wide vAA */
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[AA]
6079f601a917c8878204482c37aec7005054b6776fabuzbee    add     r3, rSELF, #offThread_retval  @ r3<- &self->retval
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1 <- vAA/vAA+1
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ retval<- r0/r1
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RETURN_OBJECT: /* 0x11 */
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN_OBJECT.S */
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RETURN.S */
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6189f601a917c8878204482c37aec7005054b6776fabuzbee     * Return a 32-bit value.  Copies the return value into the "thread"
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * structure, then jumps to the return handler.
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: return, return-object
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA */
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vAA
6269f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_retval] @ retval.i <- vAA
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_returnFromMethod
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_4: /* 0x12 */
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_4.S */
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/4 vA, #+B */
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsl #16          @ r1<- Bxxx0000
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr #28             @ r1<- sssssssB (sign-extended)
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r0)                    @ fp[A]<- r1
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_16: /* 0x13 */
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_16.S */
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/16 vAA, #+BBBB */
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST: /* 0x14 */
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST.S */
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const vAA, #+BBBBbbbb */
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (high)
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_HIGH16: /* 0x15 */
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_HIGH16.S */
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/high16 vAA, #+BBBB0000 */
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- 0000BBBB (zero-extended)
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsl #16             @ r0<- BBBB0000
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r3)                    @ vAA<- r0
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_16: /* 0x16 */
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_16.S */
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/16 vAA, #+BBBB */
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssBBBB (sign-extended)
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31             @ r1<- ssssssss
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_32: /* 0x17 */
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_32.S */
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/32 vAA, #+BBBBbbbb */
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- 0000bbbb (low)
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r2, 2)                      @ r2<- ssssBBBB (high)
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2, lsl #16         @ r0<- BBBBbbbb
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31             @ r1<- ssssssss
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE: /* 0x18 */
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE.S */
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide vAA, #+HHHHhhhhBBBBbbbb */
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (low middle)
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 3)                        @ r2<- hhhh (high middle)
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb (low word)
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 4)                        @ r3<- HHHH (high)
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r2, r3, lsl #16         @ r1<- HHHHhhhh (high word)
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(5)               @ advance rPC, load rINST
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_WIDE_HIGH16: /* 0x19 */
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_WIDE_HIGH16.S */
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const-wide/high16 vAA, #+BBBB000000000000 */
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- 0000BBBB (zero-extended)
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #0                      @ r0<- 00000000
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsl #16             @ r1<- BBBB0000
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[AA]
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ vAA<- r0/r1
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING: /* 0x1a */
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING.S */
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBB */
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7529f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ not yet resolved?
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_STRING_resolve
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
760a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_STRING_JUMBO: /* 0x1b */
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_STRING_JUMBO.S */
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/string vAA, String@BBBBBBBB */
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (low)
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (high)
7709f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResStrings]   @ r2<- dvmDex->pResStrings
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResStrings[BBBB]
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_STRING_JUMBO_resolve
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
779a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CONST_CLASS: /* 0x1c */
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CONST_CLASS.S */
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* const/class vAA, Class@BBBB */
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7889f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]  @ r2<- self->methodClassDex
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResClasses]   @ r2<- dvmDex->pResClasses
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- pResClasses[BBBB]
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ not yet resolved?
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CONST_CLASS_resolve
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
796a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_ENTER: /* 0x1d */
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_ENTER.S */
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Synchronize on an object.
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-enter vAA */
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (object)
8099f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ r0<- self
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
81101605d2b668e8e1701cfdfa302dde847b9171fc9Carl Shapiro    EXPORT_PC()                         @ need for precise GC
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null object, throw an exception
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmLockObject               @ call(self, obj)
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MONITOR_EXIT: /* 0x1e */
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MONITOR_EXIT.S */
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlock an object.
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exceptions that occur when unlocking a monitor need to appear as
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if they happened at the following instruction.  See the Dalvik
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction spec.
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* monitor-exit vAA */
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ before fetch: export the PC
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (object)
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
8346bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    beq     1f                          @ yes
8359f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ r0<- self
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmUnlockObject             @ r0<- success for unlock(self, obj)
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ before throw: advance rPC, load rINST
8396bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    beq     common_exceptionThrown      @ yes, exception is pending
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
8426bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee1:
8436bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    FETCH_ADVANCE_INST(1)               @ advance before throw
8446bbdd6b005ec5cb567ec9576190a7cd784248c5cBill Buzbee    b      common_errNullObject
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CHECK_CAST: /* 0x1f */
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CHECK_CAST.S */
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if a cast from one class to another is allowed.
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* check-cast vAA, class@BBBB */
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- BBBB
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r3)                    @ r9<- object
8579f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r0, [rSELF, #offThread_methodClassDex]    @ r0<- pDvmDex
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r9, #0                      @ is object null?
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offDvmDex_pResClasses]    @ r0<- pDvmDex->pResClasses
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CHECK_CAST_okay            @ null obj, cast always succeeds
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, r2, lsl #2]        @ r1<- resolved class
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ have we resolved this before?
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_CHECK_CAST_resolve         @ not resolved, do it now
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_resolved:
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r1                      @ same class (trivial success)?
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CHECK_CAST_fullcheck       @ no, do full check
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CHECK_CAST_okay:
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INSTANCE_OF: /* 0x20 */
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INSTANCE_OF.S */
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Check to see if an object reference is an instance of a class.
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Most common situation is a non-null object, being compared against
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an already-resolved class.
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* instance-of vA, vB, class@CCCC */
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB (object)
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15                 @ r9<- A
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is object null?
8899f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- pDvmDex
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_store           @ null obj, not an instance, store r0
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- CCCC
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offDvmDex_pResClasses]    @ r2<- pDvmDex->pResClasses
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r2, r3, lsl #2]        @ r1<- resolved class
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ have we resolved this before?
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_resolve         @ not resolved, do it now
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INSTANCE_OF_resolved: @ r0=obj->clazz, r1=resolved class
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, r1                      @ same class (trivial success)?
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INSTANCE_OF_trivial         @ yes, trivial finish
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INSTANCE_OF_fullcheck       @ no, do full check
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ARRAY_LENGTH: /* 0x21 */
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ARRAY_LENGTH.S */
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return the length of an array.
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A+
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r1)                    @ r0<- vB (object ref)
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- A
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is object null?
914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yup, fail
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- array length
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r3, r2)                    @ vB<- length
919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_INSTANCE: /* 0x22 */
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_INSTANCE.S */
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new instance of a class.
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-instance vAA, class@BBBB */
9299f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
9339a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
9349a3147c7412f4794434b4c2604aa2ba784867774buzbee    add     r10, r3, r1, lsl #2         @ r10<- &resolved_class
9359a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ req'd for init, resolve, alloc
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_NEW_INSTANCE_resolve         @ no, resolve it now
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_resolved:   @ r0=class
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb    r1, [r0, #offClassObject_status]    @ r1<- ClassStatus enum
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #CLASS_INITIALIZED      @ has class been initialized?
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_INSTANCE_needinit        @ no, init class now
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_NEW_INSTANCE_initialized: @ r0=class
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #ALLOC_DONT_TRACK       @ flags for alloc call
945b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    bl      dvmAllocObject              @ r0<- new object
946b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    b       .LOP_NEW_INSTANCE_finish          @ continue
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEW_ARRAY: /* 0x23 */
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEW_ARRAY.S */
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Allocate an array of objects, specified with the array class
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and a count.
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The verifier guarantees that this is an array class, so we don't
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * check for it here.
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* new-array vA, vB, class@CCCC */
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 1)                        @ r2<- CCCC
9629f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r0)                    @ r1<- vB (array length)
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ check length
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r2, lsl #2]        @ r0<- resolved class
9678cb0d098d79af61546e275f633325794f4587602buzbee    bmi     common_errNegativeArraySize @ negative length, bail - len in r1
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ req'd for resolve, alloc
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_NEW_ARRAY_finish          @ resolved, continue
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_NEW_ARRAY_resolve         @ do resolve now
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY: /* 0x24 */
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
9849f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ need for resolve and alloc
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, rINST, lsr #8          @ r10<- AA or BA
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_continue        @ yes, continue on
9929f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_FILLED_NEW_ARRAY_continue
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY_RANGE.S */
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILLED_NEW_ARRAY.S */
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Create a new array with elements filled from registers.
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: filled-new-array, filled-new-array/range
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, type@BBBB */
10129f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResClasses]    @ r3<- pDvmDex->pResClasses
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ need for resolve and alloc
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved class
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, rINST, lsr #8          @ r10<- AA or BA
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_FILLED_NEW_ARRAY_RANGE_continue        @ yes, continue on
10209f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveClass             @ r0<- call(clazz, ref)
1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_FILLED_NEW_ARRAY_RANGE_continue
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FILL_ARRAY_DATA: /* 0x26 */
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FILL_ARRAY_DATA.S */
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fill-array-data vAA, +BBBBBBBB */
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r0, r1, lsl #16         @ r1<- BBBBbbbb
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vAA (array object)
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rPC, r1, lsl #1         @ r1<- PC + BBBBbbbb*2 (array data off.)
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC();
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandleFillArrayData@ fill the array with predefined data
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ 0 means an exception is thrown
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ has exception
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_THROW: /* 0x27 */
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_THROW.S */
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Throw an exception object in the current thread.
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* throw vAA */
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- vAA (exception object)
10588ba2708ea118381f2df5ca55b9bad2ae4c050504Andy McFadden    EXPORT_PC()                         @ exception handler can throw
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null object?
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, throw an NPE instead
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ bypass dvmSetException, just store it
10629f601a917c8878204482c37aec7005054b6776fabuzbee    str     r1, [rSELF, #offThread_exception]  @ thread->exception<- obj
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO: /* 0x28 */
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO.S */
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 8-bit offset.
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto +AA */
10769a3147c7412f4794434b4c2604aa2ba784867774buzbee    /* tuning: use sbfx for 6t2+ targets */
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsl #16          @ r0<- AAxx0000
10789a3147c7412f4794434b4c2604aa2ba784867774buzbee    movs    r1, r0, asr #24             @ r1<- ssssssAA (sign-extended)
10799a3147c7412f4794434b4c2604aa2ba784867774buzbee    add     r2, r1, r1                  @ r2<- byte offset, set flags
10809a3147c7412f4794434b4c2604aa2ba784867774buzbee       @ If backwards branch refresh rIBASE
10819a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
10829a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1083ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
10849a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
10859a3147c7412f4794434b4c2604aa2ba784867774buzbee    bmi     common_testUpdateProfile    @ (r0) check for trace hotness
10869a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1087ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1088ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_16: /* 0x29 */
1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_16.S */
1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 16-bit offset.
1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/16 +AAAA */
1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r0, 1)                      @ r0<- ssssAAAA (sign-extended)
11029a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r1, r0, r0                  @ r1<- byte offset, flags set
11039a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
11049a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
1105ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
11069a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
11079a3147c7412f4794434b4c2604aa2ba784867774buzbee    bmi     common_testUpdateProfile    @ (r0) hot trace head?
11089a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_GOTO_32: /* 0x2a */
1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_GOTO_32.S */
1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unconditional branch, 32-bit offset.
1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The branch distance is a signed code-unit offset, which we need to
1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * double to get a byte offset.
1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most opcodes, this one is allowed to branch to itself, so
11239a3147c7412f4794434b4c2604aa2ba784867774buzbee     * our "backward branch" test must be "<=0" instead of "<0".  Because
11249a3147c7412f4794434b4c2604aa2ba784867774buzbee     * we need the V bit set, we'll use an adds to convert from Dalvik
11259a3147c7412f4794434b4c2604aa2ba784867774buzbee     * offset to byte offset.
1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* goto/32 +AAAAAAAA */
1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- aaaa (lo)
1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- AAAA (hi)
11309a3147c7412f4794434b4c2604aa2ba784867774buzbee    orr     r0, r0, r1, lsl #16         @ r0<- AAAAaaaa
11319a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r1, r0, r0                  @ r1<- byte offset
1132ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
11339a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
11349a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
11359a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
11369a3147c7412f4794434b4c2604aa2ba784867774buzbee    ble     common_testUpdateProfile    @ (r0) hot trace head?
1137ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
11389a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
11399a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
11409a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1141ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1142ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_PACKED_SWITCH: /* 0x2b */
1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */
1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
11559a3147c7412f4794434b4c2604aa2ba784867774buzbee     * When the JIT is present, all targets are considered treated as
11569a3147c7412f4794434b4c2604aa2ba784867774buzbee     * a potential trace heads regardless of branch direction.
11579a3147c7412f4794434b4c2604aa2ba784867774buzbee     *
1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vAA
1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandlePackedSwitch                       @ r0<- code-unit branch offset
11689a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1169ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
11709a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
11719a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
11729a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
11739a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r0, #0
1174ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1175ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
11769a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
11779a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
11789a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPARSE_SWITCH: /* 0x2c */
1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPARSE_SWITCH.S */
1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_PACKED_SWITCH.S */
1187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a packed-switch or sparse-switch instruction.  In both cases
1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * we decode it and hand it off to a helper function.
1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We don't really expect backward branches in a switch statement, but
1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * they're perfectly legal, so we check for them here.
1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
11949a3147c7412f4794434b4c2604aa2ba784867774buzbee     * When the JIT is present, all targets are considered treated as
11959a3147c7412f4794434b4c2604aa2ba784867774buzbee     * a potential trace heads regardless of branch direction.
11969a3147c7412f4794434b4c2604aa2ba784867774buzbee     *
1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: packed-switch, sparse-switch
1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, +BBBB */
1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- bbbb (lo)
1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- BBBB (hi)
1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, lsl #16         @ r0<- BBBBbbbb
1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vAA
1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rPC, r0, lsl #1         @ r0<- PC + BBBBbbbb*2
1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmInterpHandleSparseSwitch                       @ r0<- code-unit branch offset
12079a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r1, r0, r0                  @ r1<- byte offset; clear V
1208ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
12099a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
12109a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
12119a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
12129a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r0, #0
1213ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
1214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
12159a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrle   rIBASE, [rSELF, #offThread_curHandlerTable] @ refresh handler base
12169a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
12179a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1218ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1219ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_FLOAT: /* 0x2d */
1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */
1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The operation we're implementing is:
1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   if (x == y)
1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 0;
1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x < y)
1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return -1;
1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x > y)
1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 1;
1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else
1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return {-1,1};  // one or both operands was NaN
1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The straightforward implementation requires 3 calls to functions
1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that return a result in r0.  We can do it with two calls if our
1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * EABI library supports __aeabi_cfcmple (only one if we want to check
1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for NaN directly):
1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check x <= y
1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return -1
1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if ==, return 0
1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check y <= x
1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return 1
1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   return {-1,1}
1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: cmpl-float, cmpg-float
1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ copy to arg registers
1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPL_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_FLOAT_finish:
1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_FLOAT: /* 0x2e */
1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_FLOAT.S */
1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_FLOAT.S */
1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The operation we're implementing is:
1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   if (x == y)
1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 0;
1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x < y)
1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return -1;
1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else if (x > y)
1293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return 1;
1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   else
1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     return {-1,1};  // one or both operands was NaN
1296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The straightforward implementation requires 3 calls to functions
1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that return a result in r0.  We can do it with two calls if our
1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * EABI library supports __aeabi_cfcmple (only one if we want to check
1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for NaN directly):
1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check x <= y
1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return -1
1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if ==, return 0
1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   check y <= x
1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     if <, return 1
1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   return {-1,1}
1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: cmpl-float, cmpg-float
1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r2)                    @ r9<- vBB
1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r10, r3)                   @ r10<- vCC
1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ copy to arg registers
1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cfcmple             @ cmp <=: C clear if <, Z set if eq
1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPG_FLOAT_gt_or_nan       @ C set and Z clear, disambiguate
1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_FLOAT_finish:
1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPL_DOUBLE: /* 0x2f */
1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */
1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_CMPL_FLOAT for an explanation.
1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: cmpl-double, cmpg-double
1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r0, #255                @ r9<- BB
1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, r0, lsr #8             @ r10<- CC
1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPL_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPL_DOUBLE_finish:
1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMPG_DOUBLE: /* 0x30 */
1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPG_DOUBLE.S */
1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMPL_DOUBLE.S */
1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two floating-point values.  Puts 0, 1, or -1 into the
1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * destination register based on the results of the comparison.
1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Provide a "naninst" instruction that puts 1 or -1 into r1 depending
1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * on what value we'd like to return when one of the operands is NaN.
1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_CMPL_FLOAT for an explanation.
1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: cmpl-double, cmpg-double
1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r0, #255                @ r9<- BB
1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r10, r0, lsr #8             @ r10<- CC
1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[BB]
1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, rFP, r10, lsl #2       @ r10<- &fp[CC]
1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r10, {r2-r3}                @ r2/r3<- vCC/vCC+1
1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_cdcmple             @ cmp <=: C clear if <, Z set if eq
1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMPG_DOUBLE_gt_or_nan       @ C set and Z clear, disambiguate
1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvncc   r1, #0                      @ (less than) r1<- -1
1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    moveq   r1, #0                      @ (equal) r1<- 0, trumps less than
1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_CMPG_DOUBLE_finish:
1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ r3<- AA
1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r3)                    @ vAA<- r1
1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_CMP_LONG: /* 0x31 */
1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_CMP_LONG.S */
1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compare two 64-bit values.  Puts 0, 1, or -1 into the destination
1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * register based on the results of the comparison.
1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We load the full values with LDM, but in practice many values could
1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be resolved by only looking at the high word.  This could be made
1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * faster or slower by splitting the LDM into a pair of LDRs.
1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If we just wanted to set condition flags, we could do this:
1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  subs    ip, r0, r2
1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  sbcs    ip, r1, r3
1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  subeqs  ip, r0, r2
1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Leaving { <0, 0, >0 } in ip.  However, we have to set it to a specific
1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * integer value, which we can do with 2 conditional mov/mvn instructions
1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (set 1, set -1; if they're equal we already have 0 in ip), giving
1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * us a constant 5-cycle path plus a branch at the end to the
1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instruction epilogue code.  The multi-compare approach below needs
1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 2 or 3 cycles + branch if the high word doesn't match, 6 + branch
1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in the worst case (the 64-bit values are equal).
1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* cmp-long vAA, vBB, vCC */
1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare (vBB+1, vCC+1)
1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blt     .LOP_CMP_LONG_less            @ signed compare on high part
1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bgt     .LOP_CMP_LONG_greater
1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r1, r0, r2                  @ r1<- r0 - r2
1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bhi     .LOP_CMP_LONG_greater         @ unsigned compare on low part
1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_CMP_LONG_less
1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_CMP_LONG_finish          @ equal; r1 already holds 0
1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQ: /* 0x32 */
1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQ.S */
1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
14599a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
14619a3147c7412f4794434b4c2604aa2ba784867774buzbee    movne r1, #2                 @ r1<- BYTE branch dist for not-taken
14629a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r2, r1, r1                  @ convert to bytes, check sign
14639a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1464ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
14659a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
14669a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
14679a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r0,#0
14689a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile
1469ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
14709a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
14719a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NE: /* 0x33 */
1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NE.S */
1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
14949a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
14969a3147c7412f4794434b4c2604aa2ba784867774buzbee    moveq r1, #2                 @ r1<- BYTE branch dist for not-taken
14979a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r2, r1, r1                  @ convert to bytes, check sign
14989a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1499ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
15009a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
15019a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
15029a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r0,#0
15039a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile
1504ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
15059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
15069a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LT: /* 0x34 */
1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LT.S */
1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
15299a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
15319a3147c7412f4794434b4c2604aa2ba784867774buzbee    movge r1, #2                 @ r1<- BYTE branch dist for not-taken
15329a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r2, r1, r1                  @ convert to bytes, check sign
15339a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1534ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
15359a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
15369a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
15379a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r0,#0
15389a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile
1539ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
15409a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
15419a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GE: /* 0x35 */
1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GE.S */
1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
15649a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
15669a3147c7412f4794434b4c2604aa2ba784867774buzbee    movlt r1, #2                 @ r1<- BYTE branch dist for not-taken
15679a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r2, r1, r1                  @ convert to bytes, check sign
15689a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1569ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
15709a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
15719a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
15729a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r0,#0
15739a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile
1574ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
15759a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
15769a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GT: /* 0x36 */
1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GT.S */
1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
15999a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
16019a3147c7412f4794434b4c2604aa2ba784867774buzbee    movle r1, #2                 @ r1<- BYTE branch dist for not-taken
16029a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r2, r1, r1                  @ convert to bytes, check sign
16039a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1604ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
16059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
16069a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
16079a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r0,#0
16089a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile
1609ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
16109a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
16119a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LE: /* 0x37 */
1619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LE.S */
1620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/bincmp.S */
1621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic two-operand compare-and-branch operation.  Provide a "revcmp"
1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: if-eq, if-ne, if-lt, if-ge, if-gt, if-le
1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vA, vB, +CCCC */
1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A+
1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r1)                    @ r3<- vB
1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vA
16349a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, r3                      @ compare (vA, vB)
16369a3147c7412f4794434b4c2604aa2ba784867774buzbee    movgt r1, #2                 @ r1<- BYTE branch dist for not-taken
16379a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r2, r1, r1                  @ convert to bytes, check sign
16389a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r2)           @ update rPC, load rINST
1639ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
16409a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
16419a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
16429a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r0,#0
16439a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile
1644ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
16459a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
16469a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_EQZ: /* 0x38 */
1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_EQZ.S */
1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
16669a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
16689a3147c7412f4794434b4c2604aa2ba784867774buzbee    movne r1, #2                 @ r1<- inst branch dist for not-taken
16699a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r1, r1, r1                  @ convert to bytes & set flags
16709a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1671ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
16729a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
16739a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1674ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
16759a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile        @ test for JIT off at target
1676ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
16779a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
16789a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1679ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1680ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_NEZ: /* 0x39 */
1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_NEZ.S */
1687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
16989a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
17009a3147c7412f4794434b4c2604aa2ba784867774buzbee    moveq r1, #2                 @ r1<- inst branch dist for not-taken
17019a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r1, r1, r1                  @ convert to bytes & set flags
17029a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1703ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
17049a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
17059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1706ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
17079a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile        @ test for JIT off at target
1708ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
17099a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
17109a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1711ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1712ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LTZ: /* 0x3a */
1718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LTZ.S */
1719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
17309a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
17329a3147c7412f4794434b4c2604aa2ba784867774buzbee    movge r1, #2                 @ r1<- inst branch dist for not-taken
17339a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r1, r1, r1                  @ convert to bytes & set flags
17349a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1735ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
17369a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
17379a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1738ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
17399a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile        @ test for JIT off at target
1740ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
17419a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
17429a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1743ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1744ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GEZ: /* 0x3b */
1750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GEZ.S */
1751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
17629a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
17649a3147c7412f4794434b4c2604aa2ba784867774buzbee    movlt r1, #2                 @ r1<- inst branch dist for not-taken
17659a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r1, r1, r1                  @ convert to bytes & set flags
17669a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1767ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
17689a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
17699a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1770ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
17719a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile        @ test for JIT off at target
1772ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
17739a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
17749a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_GTZ: /* 0x3c */
1782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_GTZ.S */
1783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
17949a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
17969a3147c7412f4794434b4c2604aa2ba784867774buzbee    movle r1, #2                 @ r1<- inst branch dist for not-taken
17979a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r1, r1, r1                  @ convert to bytes & set flags
17989a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1799ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
18009a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
18019a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1802ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
18039a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile        @ test for JIT off at target
1804ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
18059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
18069a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IF_LEZ: /* 0x3d */
1814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IF_LEZ.S */
1815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/zcmp.S */
1816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic one-operand compare-and-branch operation.  Provide a "revcmp"
1818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fragment that specifies the *reverse* comparison to perform, e.g.
1819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for "if-le" you would use "gt".
1820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: if-eqz, if-nez, if-ltz, if-gez, if-gtz, if-lez
1822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* if-cmp vAA, +BBBB */
1824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
1825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vAA
18269a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_S(r1, 1)                      @ r1<- branch offset, in code units
1827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ compare (vA, 0)
18289a3147c7412f4794434b4c2604aa2ba784867774buzbee    movgt r1, #2                 @ r1<- inst branch dist for not-taken
18299a3147c7412f4794434b4c2604aa2ba784867774buzbee    adds    r1, r1, r1                  @ convert to bytes & set flags
18309a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST_RB(r1)           @ update rPC, load rINST
1831ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
18329a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
18339a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
1834ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
18359a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_updateProfile        @ test for JIT off at target
1836ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
18379a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrmi   rIBASE, [rSELF, #offThread_curHandlerTable]   @ refresh table base
18389a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
1839ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1840ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
1841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3E: /* 0x3e */
1846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3E.S */
1847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_3F: /* 0x3f */
1854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_3F.S */
1855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_40: /* 0x40 */
1862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_40.S */
1863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_41: /* 0x41 */
1870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_41.S */
1871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_42: /* 0x42 */
1878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_42.S */
1879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_43: /* 0x43 */
1886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_43.S */
1887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
1888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
1889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET: /* 0x44 */
1894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
1895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
1900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
1905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
1907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
1910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
1911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
1914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
1915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
1919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_WIDE: /* 0x45 */
1924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_WIDE.S */
1925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 64 bits.  vAA <- vBB[vCC].
1927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Arrays of long/double are 64-bit aligned, so it's okay to use LDRD.
1929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* aget-wide vAA, vBB, vCC */
1931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
1932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
1934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
1935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
1938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
1939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
1941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
1942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_AGET_WIDE_finish          @ okay, continue below
1943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
1944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ May want to swap the order of these two branches depending on how the
1945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ branch prediction (if any) handles conditional forward branches vs.
1946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ unconditional forward branches.
1947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_OBJECT: /* 0x46 */
1951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_OBJECT.S */
1952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
1953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
1958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
1963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
1965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
1968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
1969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
1970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
1971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
1972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
1973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
1974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
1975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
1976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
1977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
1978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
1981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
1982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BOOLEAN: /* 0x47 */
1983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BOOLEAN.S */
1984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
1985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
1986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
1987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
1989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
1990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
1991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
1992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
1994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
1995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
1996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
1997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
1998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
1999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_BYTE: /* 0x48 */
2015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_BYTE.S */
2016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrsb   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_CHAR: /* 0x49 */
2047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_CHAR.S */
2048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AGET_SHORT: /* 0x4a */
2079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET_SHORT.S */
2080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AGET.S */
2081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array get, 32 bits or less.  vAA <- vBB[vCC].
2083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aget, aget-object, aget-boolean, aget-byte, aget-char, aget-short
2088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldrsh   r2, [r0, #offArrayObject_contents]  @ r2<- vBB[vCC]
2103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r9)                    @ vAA<- r2
2105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT: /* 0x4b */
2111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #2     @ r0<- arrayObj + index*width
2130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_WIDE: /* 0x4c */
2141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_WIDE.S */
2142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 64 bits.  vBB[vCC] <- vAA.
2144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Arrays of long/double are 64-bit aligned, so it's okay to use STRD.
2146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* aput-wide vAA, vBB, vCC */
2148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #3          @ r0<- arrayObj + index*width
2158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_APUT_WIDE_finish          @ okay, continue below
2161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ May want to swap the order of these two branches depending on how the
2163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ branch prediction (if any) handles conditional forward branches vs.
2164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ unconditional forward branches.
2165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_OBJECT: /* 0x4d */
2169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_OBJECT.S */
2170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Store an object into an array.  vBB[vCC] <- vAA.
2172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
2175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
2177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
2178d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    GET_VREG(rINST, r2)                 @ rINST<- vBB (array object)
2179e877cc41c1a5d4f577c5f6fc6bacbe388dfd1d59Elliott Hughes    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2180d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    cmp     rINST, #0                   @ null array object?
2181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r9)                    @ r9<- vAA
2182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2183d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    ldr     r3, [rINST, #offArrayObject_length]   @ r3<- arrayObj->length
2184e877cc41c1a5d4f577c5f6fc6bacbe388dfd1d59Elliott Hughes    add     r10, rINST, r1, lsl #2      @ r10<- arrayObj + index*width
2185e877cc41c1a5d4f577c5f6fc6bacbe388dfd1d59Elliott Hughes    cmp     r1, r3                      @ compare unsigned index, length
2186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcc     .LOP_APUT_OBJECT_finish          @ we're okay, continue on
2187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errArrayIndex        @ index >= length, bail
2188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BOOLEAN: /* 0x4e */
2193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BOOLEAN.S */
2194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_BYTE: /* 0x4f */
2225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_BYTE.S */
2226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #0     @ r0<- arrayObj + index*width
2245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strb  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_CHAR: /* 0x50 */
2257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_CHAR.S */
2258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_APUT_SHORT: /* 0x51 */
2289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT_SHORT.S */
2290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_APUT.S */
2291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Array put, 32 bits or less.  vBB[vCC] <- vAA.
2293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Note: using the usual FETCH/and/shift stuff, this fits in exactly 17
2295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instructions.  We use a pair of FETCH_Bs instead.
2296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: aput, aput-boolean, aput-byte, aput-char, aput-short
2298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, vBB, vCC */
2300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r2, 1, 0)                   @ r2<- BB
2301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
2302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_B(r3, 1, 1)                   @ r3<- CC
2303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB (array object)
2304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC (requested index)
2305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ null array object?
2306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, bail
2307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r0, #offArrayObject_length]    @ r3<- arrayObj->length
2308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1, lsl #1     @ r0<- arrayObj + index*width
2309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, r3                      @ compare unsigned index, length
2310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bcs     common_errArrayIndex        @ index >= length, bail
2311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r9)                    @ r2<- vAA
2313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strh  r2, [r0, #offArrayObject_contents]  @ vBB[vCC]<- r2
2315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET: /* 0x52 */
2321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
23299f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_finish          @ no, already resolved
23369f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_finish
2342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE: /* 0x53 */
2347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE.S */
2348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Wide 32-bit instance field get.
2350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iget-wide vA, vB, field@CCCC */
2352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
23539f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_WIDE_finish          @ no, already resolved
23609f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_WIDE_finish
2366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT: /* 0x54 */
2371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT.S */
2372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
23809f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_OBJECT_finish          @ no, already resolved
23879f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_OBJECT_finish
2393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BOOLEAN: /* 0x55 */
2399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BOOLEAN.S */
2400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrb", "sqnum":"1" }
2401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
24099f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BOOLEAN_finish          @ no, already resolved
24169f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BOOLEAN_finish
2422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_BYTE: /* 0x56 */
2428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_BYTE.S */
2429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsb", "sqnum":"2" }
2430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
24389f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BYTE_finish          @ no, already resolved
24459f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_BYTE_finish
2451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_CHAR: /* 0x57 */
2457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_CHAR.S */
2458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrh", "sqnum":"3" }
2459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
24679f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_CHAR_finish          @ no, already resolved
24749f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_CHAR_finish
2480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_SHORT: /* 0x58 */
2486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_SHORT.S */
2487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IGET.S" { "load":"ldrsh", "sqnum":"4" }
2488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET.S */
2489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field get.
2491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
2493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
24969f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_SHORT_finish          @ no, already resolved
25039f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0
2508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IGET_SHORT_finish
2509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT: /* 0x59 */
2515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2519919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
25239f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_finish          @ no, already resolved
25309f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_finish          @ yes, finish up
2536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE: /* 0x5a */
2541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE.S */
2542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iput-wide vA, vB, field@CCCC */
2543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
25449f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
2547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_WIDE_finish          @ no, already resolved
25519f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
2552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_WIDE_finish          @ yes, finish up
2557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT: /* 0x5b */
2562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT.S */
2563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2564919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * 32-bit instance field put.
2565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2566919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput-object, iput-object-volatile
2567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
25709f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_OBJECT_finish          @ no, already resolved
25779f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_OBJECT_finish          @ yes, finish up
2583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BOOLEAN: /* 0x5c */
2588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BOOLEAN.S */
2589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"1" }
2590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2594919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
25989f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BOOLEAN_finish          @ no, already resolved
26059f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BOOLEAN_finish          @ yes, finish up
2611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_BYTE: /* 0x5d */
2617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_BYTE.S */
2618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strb", "sqnum":"2" }
2619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2623919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
26279f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BYTE_finish          @ no, already resolved
26349f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_BYTE_finish          @ yes, finish up
2640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_CHAR: /* 0x5e */
2646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_CHAR.S */
2647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"3" }
2648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2652919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
26569f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_CHAR_finish          @ no, already resolved
26639f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_CHAR_finish          @ yes, finish up
2669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_SHORT: /* 0x5f */
2675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_SHORT.S */
2676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/OP_IPUT.S" { "store":"strh", "sqnum":"4" }
2677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT.S */
2678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit instance field put.
2680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2681919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
2682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, field@CCCC */
2684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
26859f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
2686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref CCCC
2687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
2688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
2689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
2690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_SHORT_finish          @ no, already resolved
26929f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
2693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
2694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
2695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
2696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ success?
2697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_IPUT_SHORT_finish          @ yes, finish up
2698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
2699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET: /* 0x60 */
2704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
27119f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
27139a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
27149a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_resolve         @ yes, do resolve
2717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_finish: @ field ptr in r0
2718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
27190890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_WIDE: /* 0x61 */
2729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_WIDE.S */
2730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SGET handler.
2732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sget-wide vAA, field@BBBB */
27349f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
27369a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
27379a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_WIDE_resolve         @ yes, do resolve
2740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_WIDE_finish:
2741861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
2742861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
2743861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r0, #offStaticField_value @ r0<- pointer to data
27446e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
2745861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
2746861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
2747861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
2748861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2750861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
2751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_OBJECT: /* 0x62 */
2757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_OBJECT.S */
2758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
27659f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
27679a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
27689a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_OBJECT_resolve         @ yes, do resolve
2771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_OBJECT_finish: @ field ptr in r0
2772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
27730890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BOOLEAN: /* 0x63 */
2784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BOOLEAN.S */
2785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
27929f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
27949a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
27959a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_BOOLEAN_resolve         @ yes, do resolve
2798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BOOLEAN_finish: @ field ptr in r0
2799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
28000890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_BYTE: /* 0x64 */
2811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_BYTE.S */
2812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
28199f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
28219a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
28229a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_BYTE_resolve         @ yes, do resolve
2825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_BYTE_finish: @ field ptr in r0
2826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
28270890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_CHAR: /* 0x65 */
2838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_CHAR.S */
2839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
28469f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
28489a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
28499a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_CHAR_resolve         @ yes, do resolve
2852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_CHAR_finish: @ field ptr in r0
2853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
28540890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SGET_SHORT: /* 0x66 */
2865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET_SHORT.S */
2866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SGET.S */
2867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SGET handler.
2869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
2871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
28739f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
28759a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
28769a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
2877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SGET_SHORT_resolve         @ yes, do resolve
2879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SGET_SHORT_finish: @ field ptr in r0
2880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
28810890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    @ no-op                             @ acquiring load
2882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r2)                    @ fp[AA]<- r1
2885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
2886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT: /* 0x67 */
2892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
2893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2896919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
28999f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
29019a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
29029a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_resolve         @ yes, do resolve
2905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_finish:   @ field ptr in r0
2906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
29104185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op                        @ releasing store
2911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
29124185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op
2913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_WIDE: /* 0x68 */
2918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_WIDE.S */
2919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 64-bit SPUT handler.
2921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* sput-wide vAA, field@BBBB */
29239f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
2924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
29259a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
2926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
29279a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
2928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
2929861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
2930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_WIDE_resolve         @ yes, do resolve
2931861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_finish: @ field ptr in r2, AA in r9
2932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2933861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
2934861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
2935861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 0
2936861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
29374185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
2938861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
2939861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
2940861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
2941861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
2942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_OBJECT: /* 0x69 */
2946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_OBJECT.S */
2947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2948919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * 32-bit SPUT handler for objects
2949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2950919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput-object, sput-object-volatile
2951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
29539f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
29559a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
29569a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
29589a3147c7412f4794434b4c2604aa2ba784867774buzbee    beq     .LOP_SPUT_OBJECT_resolve         @ yes, do resolve
29599a3147c7412f4794434b4c2604aa2ba784867774buzbee.LOP_SPUT_OBJECT_finish:   @ field ptr in r0
29609a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r2, rINST, lsr #8           @ r2<- AA
29619a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
29629a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r1, r2)                    @ r1<- fp[AA]
29639a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
29649a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
29659a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
29664185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op                         @ releasing store
29679a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       .LOP_SPUT_OBJECT_end
2968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BOOLEAN: /* 0x6a */
2972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BOOLEAN.S */
2973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
2974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
2975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
2976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
2977919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
2978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
29809f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
2981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
29829a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
29839a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
2984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
2985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_BOOLEAN_resolve         @ yes, do resolve
2986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BOOLEAN_finish:   @ field ptr in r0
2987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
2988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
2989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
2990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
29914185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op                        @ releasing store
2992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
29934185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op
2994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
2995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
2998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
2999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_BYTE: /* 0x6b */
3000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_BYTE.S */
3001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3005919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
30089f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
30109a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
30119a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_BYTE_resolve         @ yes, do resolve
3014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_BYTE_finish:   @ field ptr in r0
3015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
30194185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op                        @ releasing store
3020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
30214185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op
3022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_CHAR: /* 0x6c */
3028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_CHAR.S */
3029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3033919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
30369f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
30389a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
30399a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_CHAR_resolve         @ yes, do resolve
3042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_CHAR_finish:   @ field ptr in r0
3043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
30474185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op                        @ releasing store
3048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
30494185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op
3050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SPUT_SHORT: /* 0x6d */
3056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT_SHORT.S */
3057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SPUT.S */
3058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * General 32-bit SPUT handler.
3060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3061919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
3062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, field@BBBB */
30649f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
3065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field ref BBBB
30669a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
30679a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
3068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is resolved entry null?
3069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_SPUT_SHORT_resolve         @ yes, do resolve
3070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_SPUT_SHORT_finish:   @ field ptr in r0
3071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- AA
3072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
3073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r2)                    @ r1<- fp[AA]
3074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
30754185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op                        @ releasing store
3076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r0, #offStaticField_value] @ field<- vAA
30774185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    @ no-op
3078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL: /* 0x6e */
3084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
3087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
3089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
30929f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_continue        @ yes, continue on
31039f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_continue        @ no, continue
3109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER: /* 0x6f */
3114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */
3115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
3117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
3119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
31239f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
31299a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
31319a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0                      @ null "this"?
31329a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
3134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
31359a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_continue        @ resolved, continue on
3138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INVOKE_SUPER_resolve         @ do resolve now
3139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT: /* 0x70 */
3143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */
3144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
3146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
3148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
3149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
3150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
3151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
3153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
31569f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
31669a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INVOKE_DIRECT_resolve         @ not resolved, do it now
3168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_finish:
31699a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0                      @ null "this" ref?
31709a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_invokeMethodNoRange   @ r0=method, r9="this"
3171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNullObject        @ yes, throw exception
3172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC: /* 0x71 */
3176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */
3177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
31849f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
31879a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r9, #0                      @ null "this" in delay slot
3188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
31899a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
31909a3147c7412f4794434b4c2604aa2ba784867774buzbee    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
31919a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
3192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodNoRange @ yes, continue on
31959a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       .LOP_INVOKE_STATIC_resolve
3196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE: /* 0x72 */
3200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */
3201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
3211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
32149a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
32159f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
32169a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0                      @ null obj?
32179f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, fail
32199a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
3222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
32239a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       common_invokeMethodNoRange @ (r0=method, r9="this")
3224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_73: /* 0x73 */
3228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_73.S */
3229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
3236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_RANGE.S */
3237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL.S */
3238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a virtual method call.
3240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-virtual, invoke-virtual/range
3242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
32459f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
3250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ yes, continue on
32569f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
3257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
3258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #METHOD_VIRTUAL         @ resolver method type
3259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
3260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
3261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_VIRTUAL_RANGE_continue        @ no, continue
3262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown      @ yes, handle exception
3263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_RANGE: /* 0x75 */
3268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_RANGE.S */
3269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER.S */
3270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a "super" method call.
3272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-super, invoke-super/range
3274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
32789f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
32849a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved baseMethod
32869a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0                      @ null "this"?
32879a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [rSELF, #offThread_method] @ r10<- current method
3288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
3289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
32909a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r10, #offMethod_clazz]  @ r10<- method->clazz
3291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ resolved, continue on
3293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_INVOKE_SUPER_RANGE_resolve         @ do resolve now
3294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
3299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT_RANGE.S */
3300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_DIRECT.S */
3301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a direct method call.
3303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (We could defer the "is 'this' pointer null" test to the common
3305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method invocation code, and use a flag to indicate that static
3306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * calls don't count.  If we do this as part of copying the arguments
3307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * out we could avoiding loading the first arg twice.)
3308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-direct, invoke-direct/range
3310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
33139f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
3316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
3317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
3318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
3320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
33239a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r9, r10)                   @ r9<- "this" ptr
3324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LOP_INVOKE_DIRECT_RANGE_resolve         @ not resolved, do it now
3325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LOP_INVOKE_DIRECT_RANGE_finish:
33269a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0                      @ null "this" ref?
33279a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     common_invokeMethodRange   @ r0=method, r9="this"
3328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_errNullObject        @ yes, throw exception
3329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_STATIC_RANGE: /* 0x77 */
3334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC_RANGE.S */
3335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_STATIC.S */
3336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle a static method call.
3338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-static, invoke-static/range
3340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
33439f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- pDvmDex
3344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offDvmDex_pResMethods]    @ r3<- pDvmDex->pResMethods
33469a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r9, #0                      @ null "this" in delay slot
3347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1, lsl #2]        @ r0<- resolved methodToCall
33489a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
33499a3147c7412f4794434b4c2604aa2ba784867774buzbee    add     r10, r3, r1, lsl #2         @ r10<- &resolved_methodToCall
33509a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
3351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ already resolved?
3352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
3353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_invokeMethodRange @ yes, continue on
33549a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       .LOP_INVOKE_STATIC_RANGE_resolve
3355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
3360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE_RANGE.S */
3361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_INTERFACE.S */
3362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an interface method call.
3364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: invoke-interface, invoke-interface/range
3366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
3368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
3369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r2, 2)                        @ r2<- FEDC or CCCC
3370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
3371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
3372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15                 @ r2<- C (or stays CCCC)
3373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
3374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
33759a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r9, r2)                    @ r9<- first arg ("this")
33769f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- methodClassDex
33779a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0                      @ null obj?
33789f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_method]  @ r2<- method
3379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ yes, fail
33809a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r9, #offObject_clazz]  @ r0<- thisPtr->clazz
3381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindInterfaceMethodInCache @ r0<- call(class, ref, method, dex)
3382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ failed?
3383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
33849a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       common_invokeMethodRange @ (r0=method, r9="this")
3385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_79: /* 0x79 */
3390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_79.S */
3391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_UNUSED_7A: /* 0x7a */
3398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_UNUSED_7A.S */
3399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unused.S */
3400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort
3401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_INT: /* 0x7b */
3406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_INT.S */
3407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, #0                              @ r0<- op, r0-r3 changed
3424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_INT: /* 0x7c */
3433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_INT.S */
3434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r0, r0                              @ r0<- op, r0-r3 changed
3451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_LONG: /* 0x7d */
3460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_LONG.S */
3461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsbs    r0, r0, #0                           @ optional op; may set condition codes
3478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsc     r1, r1, #0                              @ r0/r1<- op, r2-r3 changed
3479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NOT_LONG: /* 0x7e */
3488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NOT_LONG.S */
3489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r0, r0                           @ optional op; may set condition codes
3506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvn     r1, r1                              @ r0/r1<- op, r2-r3 changed
3507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_FLOAT: /* 0x7f */
3516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_FLOAT.S */
3517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, #0x80000000                              @ r0<- op, r0-r3 changed
3534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_NEG_DOUBLE: /* 0x80 */
3543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_NEG_DOUBLE.S */
3544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, r1, #0x80000000                              @ r0/r1<- op, r2-r3 changed
3562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_LONG: /* 0x81 */
3571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_LONG.S */
3572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0, asr #31                              @ r0<- op, r0-r3 changed
3589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_FLOAT: /* 0x82 */
3598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_FLOAT.S */
3599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_i2f                              @ r0<- op, r0-r3 changed
3616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_DOUBLE: /* 0x83 */
3625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_DOUBLE.S */
3626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_i2d                              @ r0<- op, r0-r3 changed
3643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_INT: /* 0x84 */
3652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_INT.S */
3653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* we ignore the high word, making this equivalent to a 32-bit reg move */
3654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MOVE.S */
3655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* for move, move-object, long-to-int */
3656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB */
3657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B from 15:12
3658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A from 11:8
3659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B]
3661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
3662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
3663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r2, r0)                    @ fp[A]<- r2
3664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute next instruction
3665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_FLOAT: /* 0x85 */
3670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_FLOAT.S */
3671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
3672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
3675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
3676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
3678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
3680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
3681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_l2f                              @ r0<- op, r0-r3 changed
3691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
3693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_LONG_TO_DOUBLE: /* 0x86 */
3700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_LONG_TO_DOUBLE.S */
3701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_l2d                              @ r0/r1<- op, r2-r3 changed
3719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_INT: /* 0x87 */
3728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_INT.S */
3729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
3738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2iz                              @ r0<- op, r0-r3 changed
3747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
3749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
3751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0
3754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unop.S" {"instr":"bl      f2i_doconv"}
3755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break
3756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
3757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the float in r0 to an int in r0.
3758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
3759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification.  The
3760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
3761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
3762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectf2i_doconv:
3764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, lr}
3765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0x4f000000             @ (float)maxint
3766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r4, r0
3767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpge              @ is arg >= maxint?
3768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mvnne   r0, #0x80000000             @ return maxint (7fffffff)
3770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
3771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0xcf000000             @ (float)minint
3774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmple              @ is arg <= minint?
3775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0x80000000             @ return minint (80000000)
3777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmnefd sp!, {r4, pc}
3778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r4
3781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fcmpeq              @ is arg == self?
3782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
3783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmeqfd sp!, {r4, pc}               @ return zero for NaN
3784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2iz                @ convert float to int
3787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, pc}
3788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
3789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_LONG: /* 0x88 */
3793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_LONG.S */
3794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWider.S" {"instr":"bl      __aeabi_f2lz"}
3795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      f2l_doconv                              @ r0<- op, r0-r3 changed
3812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_FLOAT_TO_DOUBLE: /* 0x89 */
3822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_FLOAT_TO_DOUBLE.S */
3823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWider.S */
3824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32bit-to-64bit unary operation.  Provide an "instr" line
3826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0", where
3827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 64-bit quantity in r0/r1.
3828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: int-to-long, int-to-double, float-to-long, float-to-double
3830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
3836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_f2d                              @ r0<- op, r0-r3 changed
3840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vA/vA+1<- r0/r1
3842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_INT: /* 0x8a */
3849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_INT.S */
3850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI appears to have Java-style conversions of +inf/-inf/NaN */
3851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
3852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
3855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
3856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
3858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
3860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
3861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2iz                              @ r0<- op, r0-r3 changed
3871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
3873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if 0
3878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopNarrower.S" {"instr":"bl      d2i_doconv"}
3879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@break
3880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
3881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Convert the double in r0/r1 to an int in r0.
3882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
3883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We have to clip values to int min/max per the specification.  The
3884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * expected common case is a "reasonable" value that converts directly
3885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to modest integer.  The EABI convert function isn't doing this for us.
3886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
3887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectd2i_doconv:
3888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r4, r5, lr}           @ save regs
38895162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0x80000000             @ maxint, as a double (low word)
38905162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, r2, asr #9              @  0xffc00000
3891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #4                  @ align for EABI
38925162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mvn     r3, #0xbe000000             @ maxint, as a double (high word)
38935162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    sub     r3, r3, #0x00200000         @  0x41dfffff
38945162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r4, r0                      @ save a copy of r0
3895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r5, r1                      @  and r1
3896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpge              @ is arg >= maxint?
3897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
38985162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mvnne   r0, #0x80000000             @ return maxint (0x7fffffff)
3899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
3900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
39035162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r3, #0xc1000000             @ minint, as a double (high word)
39045162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    add     r3, r3, #0x00e00000         @  0xc1e00000
39055162c5fbc20b7ba7791e79c640ac51b9fcd7937aAndy McFadden    mov     r2, #0                      @ minint, as a double (low word)
3906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmple              @ is arg <= minint?
3907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ nonzero == yes
3908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movne   r0, #0x80000000             @ return minint (80000000)
3909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1f
3910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
3913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r4                      @ compare against self
3914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r5
3915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dcmpeq              @ is arg == self?
3916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ zero == no
3917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f                          @ return zero for NaN
3918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r4                      @ recover arg
3920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r5
3921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2iz                @ convert double to int
3922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
3924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #4
3925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r4, r5, pc}
3926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
3927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_LONG: /* 0x8b */
3931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_LONG.S */
3932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@include "armv5te/unopWide.S" {"instr":"bl      __aeabi_d2lz"}
3933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopWide.S */
3934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit unary operation.  Provide an "instr" line that
3936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0/r1".
3937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: neg-long, not-long, neg-double, long-to-double, double-to-long
3940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
3947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vAA
3948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      d2l_doconv                              @ r0/r1<- op, r2-r3 changed
3951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0-r1}                 @ vAA<- r0/r1
3953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-13 instructions */
3955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DOUBLE_TO_FLOAT: /* 0x8c */
3961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DOUBLE_TO_FLOAT.S */
3962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unopNarrower.S */
3963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64bit-to-32bit unary operation.  Provide an "instr" line
3965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = op r0/r1", where
3966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * "result" is a 32-bit quantity in r0.
3967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: long-to-float, double-to-int, double-to-float
3969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (This would work for long-to-int, but that instruction is actually
3971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * an exact match for OP_MOVE.)
3972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
3973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
3974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
3975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
3976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[B]
3977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
3978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vB/vB+1
3979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
3980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
3981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_d2f                              @ r0<- op, r0-r3 changed
3982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
3983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vA<- r0
3984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
3985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-11 instructions */
3986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
3989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
3990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_BYTE: /* 0x8d */
3991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_BYTE.S */
3992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
3993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
3995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
3996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
3997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
3999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #24                           @ optional op; may set condition codes
4007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr #24                              @ r0<- op, r0-r3 changed
4009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_CHAR: /* 0x8e */
4018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_CHAR.S */
4019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #16                              @ r0<- op, r0-r3 changed
4036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INT_TO_SHORT: /* 0x8f */
4045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INT_TO_SHORT.S */
4046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/unop.S */
4047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit unary operation.  Provide an "instr" line that
4049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = op r0".
4050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.
4051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: neg-int, not-int, neg-float, int-to-float, float-to-int,
4053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      int-to-byte, int-to-char, int-to-short
4054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* unop vA, vB */
4056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
4057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
4058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r3)                    @ r0<- vB
4059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
4060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl #16                           @ optional op; may set condition codes
4061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
4062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr #16                              @ r0<- op, r0-r3 changed
4063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)                    @ vAA<- r0
4065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 9-10 instructions */
4067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT: /* 0x90 */
4072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT.S */
4073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
4104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT: /* 0x91 */
4113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT.S */
4114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
4145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT: /* 0x92 */
4154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT.S */
4155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
4156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
4187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT: /* 0x93 */
4196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT.S */
4197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
4228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT: /* 0x94 */
4237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT.S */
4238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
4239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
4270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
4272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT: /* 0x95 */
4279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT.S */
4280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
4311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT: /* 0x96 */
4320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT.S */
4321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
4352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT: /* 0x97 */
4361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT.S */
4362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
4393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT: /* 0x98 */
4402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT.S */
4403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
4434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT: /* 0x99 */
4443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT.S */
4444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
4475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT: /* 0x9a */
4484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT.S */
4485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
4515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
4516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG: /* 0x9b */
4525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG.S */
4526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adds    r0, r0, r2                           @ optional op; may set condition codes
4559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
4560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG: /* 0x9c */
4569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG.S */
4570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r0, r0, r2                           @ optional op; may set condition codes
4603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
4604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG: /* 0x9d */
4613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG.S */
4614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply.
4616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Consider WXxYZ (r1r0 x r3r2) with a long multiply:
4618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        WX
4619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      x YZ
4620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  --------
4621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     ZW ZX
4622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  YW YX
4623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * The low word of the result holds ZX, the high word holds
4625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (ZW+YX) + (the high overflow from ZX).  YW doesn't matter because
4626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * it doesn't fit in the low 64 bits.
4627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Unlike most ARM math operations, multiply instructions have
4629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * restrictions on using the same register more than once (Rd and Rm
4630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * cannot be the same).
4631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long vAA, vBB, vCC */
4633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     ip, r2, r1                  @  ip<- ZxW
4641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
4642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
4643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- AA
4644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
4645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, rFP, r0, lsl #2         @ r0<- &fp[AA]
4646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_MUL_LONG_finish
4648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG: /* 0x9e */
4652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG.S */
4653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG: /* 0x9f */
4696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG.S */
4697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
4698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
4725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
4732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
4734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG: /* 0xa0 */
4741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG.S */
4742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r2                           @ optional op; may set condition codes
4775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, r3                              @ result<- op, r0-r3 changed
4776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG: /* 0xa1 */
4785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG.S */
4786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2                           @ optional op; may set condition codes
4819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
4820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG: /* 0xa2 */
4829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG.S */
4830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
4831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
4833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
4834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
4839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
4841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
4842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
4843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
4845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
4853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
4854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
4856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
4858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r2                           @ optional op; may set condition codes
4863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
4864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
4866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
4868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG: /* 0xa3 */
4873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG.S */
4874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
4879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long vAA, vBB, vCC */
4881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
4884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
4885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
4887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
4889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asl r2              @  r1<- r1 << r2
4892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
4893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
4894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
4895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
4896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHL_LONG_finish
4898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG: /* 0xa4 */
4902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG.S */
4903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
4908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long vAA, vBB, vCC */
4910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
4913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
4914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
4916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
4922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
4924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
4925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHR_LONG_finish
4927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG: /* 0xa5 */
4931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG.S */
4932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift.  This is different from the generic 32/64-bit
4934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * binary operations because vAA/vBB are 64-bit but vCC (the shift
4935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * distance) is 32-bit.  Also, Dalvik requires us to mask off the low
4936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 6 bits of the shift distance.
4937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ushr-long vAA, vBB, vCC */
4939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r0, #255                @ r3<- BB
4942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr #8              @ r0<- CC
4943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[BB]
4944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r0)                    @ r2<- vCC
4945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- vBB/vBB+1
4946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r0<- r0 & 0x3f
4947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
4948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
4950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
4951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
4952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
4953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
4954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_USHR_LONG_finish
4956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
4959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT: /* 0xa6 */
4960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT.S */
4961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
4962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
4963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
4964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
4965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
4966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
4967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
4969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
4970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
4971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
4972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
4973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
4974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
4975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
4976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
4977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
4978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
4979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
4980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
4981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
4982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
4983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
4984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
4985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
4986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
4987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
4988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
4990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
4991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
4992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
4993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
4994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
4995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
4996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
4999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT: /* 0xa7 */
5001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT.S */
5002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
5033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT: /* 0xa8 */
5042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT.S */
5043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
5074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT: /* 0xa9 */
5083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT.S */
5084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
5115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT: /* 0xaa */
5124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT.S */
5125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */
5126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop.S */
5127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit binary operation.  Provide an "instr" line that
5129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0 op r1".
5130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.  Note that we
5135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * *don't* check for (INT_MIN / -1) here, because the ARM math lib
5136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * handles it correctly.
5137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int, sub-int, mul-int, div-int, rem-int, and-int, or-int,
5139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-int, shl-int, shr-int, ushr-int, add-float, sub-float,
5140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      mul-float, div-float, rem-float
5141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vCC
5148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
5149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmodf                              @ r0<- op, r0-r3 changed
5157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 11-14 instructions */
5161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE: /* 0xab */
5166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE.S */
5167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
5201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE: /* 0xac */
5210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE.S */
5211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
5245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE: /* 0xad */
5254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE.S */
5255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
5289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE: /* 0xae */
5298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE.S */
5299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
5333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE: /* 0xaf */
5342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE.S */
5343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */
5344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide.S */
5345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit binary operation.  Provide an "instr" line that
5347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * specifies an instruction that performs "result = r0-r1 op r2-r3".
5348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: add-long, sub-long, div-long, rem-long, and-long, or-long,
5355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      xor-long, add-double, sub-double, mul-double, div-double,
5356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double
5357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * IMPORTANT: you may specify "chkzero" or "preinstr" but not both.
5359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop vAA, vBB, vCC */
5361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r0, 1)                        @ r0<- CCBB
5362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
5363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r0, #255                @ r2<- BB
5364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r0, lsr #8              @ r3<- CC
5365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
5366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r2, rFP, r2, lsl #2         @ r2<- &fp[BB]
5367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r3, lsl #2         @ r3<- &fp[CC]
5368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r2, {r0-r1}                 @ r0/r1<- vBB/vBB+1
5369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r2-r3}                 @ r2/r3<- vCC/vCC+1
5370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
5375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmod                              @ result<- op, r0-r3 changed
5378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 14-17 instructions */
5382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_2ADDR: /* 0xb0 */
5387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_2ADDR.S */
5388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5408a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
5417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_INT_2ADDR: /* 0xb1 */
5426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_INT_2ADDR.S */
5427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5447a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r0, r0, r1                              @ r0<- op, r0-r3 changed
5456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_2ADDR: /* 0xb2 */
5465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_2ADDR.S */
5466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
5467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5487a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
5496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_2ADDR: /* 0xb3 */
5505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_2ADDR.S */
5506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5526a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
5535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_2ADDR: /* 0xb4 */
5544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_2ADDR.S */
5545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
5546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5566a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
5575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
5577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_2ADDR: /* 0xb5 */
5584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_2ADDR.S */
5585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5605a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
5614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_2ADDR: /* 0xb6 */
5623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_2ADDR.S */
5624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5644a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
5653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_2ADDR: /* 0xb7 */
5662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_2ADDR.S */
5663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5683a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
5692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_2ADDR: /* 0xb8 */
5701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_2ADDR.S */
5702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5722a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
5731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_2ADDR: /* 0xb9 */
5740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_2ADDR.S */
5741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5761a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
5770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_2ADDR: /* 0xba */
5779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_2ADDR.S */
5780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
5781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
5783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
5784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
5791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
5792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
5793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
5794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
5798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
5800a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
5801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
5803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
5808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
5809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
5811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
5813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_LONG_2ADDR: /* 0xbb */
5818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_LONG_2ADDR.S */
5819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
5820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
5833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adds    r0, r0, r2                           @ optional op; may set condition codes
5849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    adc     r1, r1, r3                              @ result<- op, r0-r3 changed
5850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
5854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_LONG_2ADDR: /* 0xbc */
5859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_LONG_2ADDR.S */
5860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
5861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
5874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
5884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r0, r0, r2                           @ optional op; may set condition codes
5890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sbc     r1, r1, r3                              @ result<- op, r0-r3 changed
5891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
5895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_LONG_2ADDR: /* 0xbd */
5900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_LONG_2ADDR.S */
5901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply, "/2addr" version.
5903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * See OP_MUL_LONG for an explanation.
5905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We get a little tight on registers, so to avoid looking up &fp[A]
5907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * again we stuff it into rINST.
5908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long/2addr vA, vB */
5910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rINST, rFP, r9, lsl #2      @ rINST<- &fp[A]
5915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   rINST, {r0-r1}              @ r0/r1<- vAA/vAA+1
5917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     ip, r2, r1                  @  ip<- ZxW
5918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    umull   r9, r10, r2, r0             @  r9/r10 <- ZxX
5919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mla     r2, r0, r3, ip              @  r2<- YxX + (ZxW)
5920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST                   @ r0<- &fp[A] (free up rINST)
5921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r10, r2, r10                @  r10<- r10 + low(ZxW + (YxX))
5923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
5925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_LONG_2ADDR: /* 0xbe */
5930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_LONG_2ADDR.S */
5931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
5932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
5945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
5958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
5959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
5961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
5962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
5963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
5964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
5965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
5966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
5969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
5970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_LONG_2ADDR: /* 0xbf */
5971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_LONG_2ADDR.S */
5972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ldivmod returns quotient in r0/r1 and remainder in r2/r3 */
5973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
5974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
5975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
5976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
5977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
5978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
5979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
5981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
5982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
5984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
5985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
5986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
5987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
5988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
5989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
5990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
5991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
5992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
5993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
5994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
5995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
5996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
5997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
5998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
5999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ldivmod                              @ result<- op, r0-r3 changed
6004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r2,r3}     @ vAA/vAA+1<- r2/r3
6006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_LONG_2ADDR: /* 0xc0 */
6013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_LONG_2ADDR.S */
6014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r2                           @ optional op; may set condition codes
6044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, r3                              @ result<- op, r0-r3 changed
6045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_LONG_2ADDR: /* 0xc1 */
6054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_LONG_2ADDR.S */
6055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r2                           @ optional op; may set condition codes
6085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r3                              @ result<- op, r0-r3 changed
6086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_LONG_2ADDR: /* 0xc2 */
6095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_LONG_2ADDR.S */
6096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r2                           @ optional op; may set condition codes
6126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r1, r1, r3                              @ result<- op, r0-r3 changed
6127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_LONG_2ADDR: /* 0xc3 */
6136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_LONG_2ADDR.S */
6137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shl-long/2addr vA, vB */
6142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asl r2              @  r1<- r1 << r2
6151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r1, r1, r0, lsr r3          @  r1<- r1 | (r0 << (32-r2))
6153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r1, r0, asl ip              @  if r2 >= 32, r1<- r0 << (r2-32)
6156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r2              @  r0<- r0 << r2
6157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHL_LONG_2ADDR_finish
6158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_LONG_2ADDR: /* 0xc4 */
6162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_LONG_2ADDR.S */
6163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* shr-long/2addr vA, vB */
6168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, asr ip              @  if r2 >= 32, r0<-r1 >> (r2-32)
6182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr r2              @  r1<- r1 >> r2
6183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_SHR_LONG_2ADDR_finish
6184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_LONG_2ADDR: /* 0xc5 */
6188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_LONG_2ADDR.S */
6189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Long integer shift, 2addr version.  vA is 64-bit value/result, vB is
6191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 32-bit shift distance.
6192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* ushr-long/2addr vA, vB */
6194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r3)                    @ r2<- vB
6198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #63                 @ r2<- r2 & 0x3f
6200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r2              @  r0<- r2 >> r2
6203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r3, r2, #32                 @  r3<- 32 - r2
6204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1, asl r3          @  r0<- r0 | (r1 << (32-r2))
6205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    ip, r2, #32                 @  ip<- r2 - 32
6206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movpl   r0, r1, lsr ip              @  if r2 >= 32, r0<-r1 >>> (r2-32)
6208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
6209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LOP_USHR_LONG_2ADDR_finish
6210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
6214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_FLOAT_2ADDR.S */
6215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6235a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fadd                              @ r0<- op, r0-r3 changed
6244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
6253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_FLOAT_2ADDR.S */
6254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6274a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fsub                              @ r0<- op, r0-r3 changed
6283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
6292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_FLOAT_2ADDR.S */
6293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6313a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fmul                              @ r0<- op, r0-r3 changed
6322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
6331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_FLOAT_2ADDR.S */
6332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6352a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_fdiv                              @ r0<- op, r0-r3 changed
6361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_FLOAT_2ADDR: /* 0xca */
6370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_FLOAT_2ADDR.S */
6371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a float remainder function, but libm does */
6372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binop2addr.S */
6373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "/2addr" binary operation.  Provide an "instr" line
6375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/2addr, sub-int/2addr, mul-int/2addr, div-int/2addr,
6383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/2addr, and-int/2addr, or-int/2addr, xor-int/2addr,
6384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/2addr, shr-int/2addr, ushr-int/2addr, add-float/2addr,
6385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-float/2addr, mul-float/2addr, div-float/2addr, rem-float/2addr
6386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #12          @ r3<- B
6390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r1, r3)                    @ r1<- vB
6392a5069fb7eb2da846ff1fc2c903ebd8ce9fa3647fAndy McFadden    GET_VREG(r0, r9)                    @ r0<- vA
6393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmodf                              @ r0<- op, r0-r3 changed
6401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
6410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_DOUBLE_2ADDR.S */
6411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dadd                              @ result<- op, r0-r3 changed
6442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
6451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SUB_DOUBLE_2ADDR.S */
6452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dsub                              @ result<- op, r0-r3 changed
6483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
6492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_DOUBLE_2ADDR.S */
6493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_dmul                              @ result<- op, r0-r3 changed
6524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_DOUBLE_2ADDR: /* 0xce */
6533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_DOUBLE_2ADDR.S */
6534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_ddiv                              @ result<- op, r0-r3 changed
6565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_DOUBLE_2ADDR: /* 0xcf */
6574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_DOUBLE_2ADDR.S */
6575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* EABI doesn't define a double remainder function, but libm does */
6576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopWide2addr.S */
6577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 64-bit "/2addr" binary operation.  Provide an "instr" line
6579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0-r1 op r2-r3".
6580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-long/2addr, sub-long/2addr, div-long/2addr, rem-long/2addr,
6587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      and-long/2addr, or-long/2addr, xor-long/2addr, add-double/2addr,
6588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      sub-double/2addr, mul-double/2addr, div-double/2addr,
6589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-double/2addr
6590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/2addr vA, vB */
6592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
6594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r1, rFP, r1, lsl #2         @ r1<- &fp[B]
6596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r9, rFP, r9, lsl #2         @ r9<- &fp[A]
6597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r1, {r2-r3}                 @ r2/r3<- vBB/vBB+1
6598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
6599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orrs    ip, r2, r3                  @ second arg (r2-r3) is zero?
6601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(1)               @ advance rPC, load rINST
6604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      fmod                              @ result<- op, r0-r3 changed
6607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r9, {r0,r1}     @ vAA/vAA+1<- r0/r1
6609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 12-15 instructions */
6611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT16: /* 0xd0 */
6616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT16.S */
6617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT: /* 0xd1 */
6652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT.S */
6653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* this op is "rsub-int", but can be thought of as "rsub-int/lit16" */
6654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT16: /* 0xd2 */
6689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT16.S */
6690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
6717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT16: /* 0xd3 */
6726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT16.S */
6727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
6753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT16: /* 0xd4 */
6762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT16.S */
6763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
6764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
6784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
6790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
6792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT16: /* 0xd5 */
6799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT16.S */
6800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
6826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT16: /* 0xd6 */
6835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT16.S */
6836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
6862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT16: /* 0xd7 */
6871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT16.S */
6872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit16.S */
6873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit16" binary operation.  Provide an "instr" line
6875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit16, rsub-int, mul-int/lit16, div-int/lit16,
6883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit16, and-int/lit16, or-int/lit16, xor-int/lit16
6884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit16 vA, vB, #+CCCC */
6886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r1, 1)                      @ r1<- ssssCCCC (sign-extended)
6887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
6888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- A+
6889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vB
6890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r9, r9, #15
6891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ is second operand zero?
6893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
6898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-13 instructions */
6902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_ADD_INT_LIT8: /* 0xd8 */
6907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_ADD_INT_LIT8.S */
6908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
6909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
6923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
6925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
6926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
6927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
6930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r0, r0, r1                              @ r0<- op, r0-r3 changed
6936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
6940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_RSUB_INT_LIT8: /* 0xd9 */
6945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_RSUB_INT_LIT8.S */
6946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
6947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
6961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
6962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
6963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
6964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
6965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
6966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
6967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
6968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
6969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
6970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
6971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
6973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r0, r0, r1                              @ r0<- op, r0-r3 changed
6974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
6975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
6976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
6977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
6978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
6981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
6982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_MUL_INT_LIT8: /* 0xda */
6983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_MUL_INT_LIT8.S */
6984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* must be "mul r0, r1, r0" -- "r0, r0, r1" is illegal */
6985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
6986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
6987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
6988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
6989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
6990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
6991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
6993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
6994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
6996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
6997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
6998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
6999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mul     r0, r1, r0                              @ r0<- op, r0-r3 changed
7013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_DIV_INT_LIT8: /* 0xdb */
7022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_DIV_INT_LIT8.S */
7023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl     __aeabi_idiv                              @ r0<- op, r0-r3 changed
7051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_REM_INT_LIT8: /* 0xdc */
7060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_REM_INT_LIT8.S */
7061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* idivmod returns quotient in r0 and remainder in r1 */
7062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 1
7083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __aeabi_idivmod                              @ r1<- op, r0-r3 changed
7090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r1, r9)               @ vAA<- r1
7092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_AND_INT_LIT8: /* 0xdd */
7099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_AND_INT_LIT8.S */
7100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, r1                              @ r0<- op, r0-r3 changed
7128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_OR_INT_LIT8: /* 0xde */
7137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_OR_INT_LIT8.S */
7138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    orr     r0, r0, r1                              @ r0<- op, r0-r3 changed
7166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_XOR_INT_LIT8: /* 0xdf */
7175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_XOR_INT_LIT8.S */
7176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                               @ optional op; may set condition codes
7203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    eor     r0, r0, r1                              @ r0<- op, r0-r3 changed
7204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHL_INT_LIT8: /* 0xe0 */
7213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHL_INT_LIT8.S */
7214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asl r1                              @ r0<- op, r0-r3 changed
7242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_SHR_INT_LIT8: /* 0xe1 */
7251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_SHR_INT_LIT8.S */
7252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, asr r1                              @ r0<- op, r0-r3 changed
7280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_USHR_INT_LIT8: /* 0xe2 */
7289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_USHR_INT_LIT8.S */
7290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/binopLit8.S */
7291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Generic 32-bit "lit8" binary operation.  Provide an "instr" line
7293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * that specifies an instruction that performs "result = r0 op r1".
7294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This could be an ARM instruction or a function call.  (If the result
7295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * comes back in a register other than r0, you can override "result".)
7296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If "chkzero" is set to 1, we perform a divide-by-zero check on
7298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * vCC (r1).  Useful for integer division and modulus.
7299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * For: add-int/lit8, rsub-int/lit8, mul-int/lit8, div-int/lit8,
7301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      rem-int/lit8, and-int/lit8, or-int/lit8, xor-int/lit8,
7302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *      shl-int/lit8, shr-int/lit8, ushr-int/lit8
7303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* binop/lit8 vAA, vBB, #+CC */
7305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_S(r3, 1)                      @ r3<- ssssCCBB (sign-extended for CC)
7306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r9, rINST, lsr #8           @ r9<- AA
7307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r3, #255                @ r2<- BB
7308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- vBB
7309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r1, r3, asr #8              @ r1<- ssssssCC (sign extended)
7310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if 0
7311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @cmp     r1, #0                      @ is second operand zero?
7312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errDivideByZero
7313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r1, r1, #31                           @ optional op; may set condition codes
7317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0, lsr r1                              @ r0<- op, r0-r3 changed
7318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r9)               @ vAA<- r0
7320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* 10-12 instructions */
7322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7326c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IGET_VOLATILE: /* 0xe3 */
7327c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET_VOLATILE.S */
7328c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET.S */
7329c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7330c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit instance field get.
7331c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7332c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7333c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7334c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vA, vB, field@CCCC */
7335c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
73369f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7337c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
7338c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7339c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7340c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7341c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7342c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IGET_VOLATILE_finish          @ no, already resolved
73439f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7344c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw
7345c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7346c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7347c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0
7348c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IGET_VOLATILE_finish
7349c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown
7350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7354c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IPUT_VOLATILE: /* 0xe4 */
7355c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT_VOLATILE.S */
7356c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT.S */
7357c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7358c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit instance field put.
7359c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7360919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput, iput-boolean, iput-byte, iput-char, iput-short
7361c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7362c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vA, vB, field@CCCC */
7363c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
73649f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7365c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
7366c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7367c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7368c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7369c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7370c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IPUT_VOLATILE_finish          @ no, already resolved
73719f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7372c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw
7373c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7374c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7375c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ success?
7376c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IPUT_VOLATILE_finish          @ yes, finish up
7377c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown
7378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7382c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SGET_VOLATILE: /* 0xe5 */
7383c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET_VOLATILE.S */
7384c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET.S */
7385c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7386c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit SGET handler.
7387c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7388c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7389c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7390c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vAA, field@BBBB */
73919f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7392c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
73939a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
73949a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7395c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7396c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    beq     .LOP_SGET_VOLATILE_resolve         @ yes, do resolve
7397c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_VOLATILE_finish: @ field ptr in r0
7398c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
73990890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    SMP_DMB                            @ acquiring load
7400c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
7401c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7402c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7403c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7404c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7409c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SPUT_VOLATILE: /* 0xe6 */
7410c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT_VOLATILE.S */
7411c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT.S */
7412c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7413c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit SPUT handler.
7414c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7415919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput, sput-boolean, sput-byte, sput-char, sput-short
7416c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7417c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vAA, field@BBBB */
74189f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7419c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
74209a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
74219a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
7422c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7423c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    beq     .LOP_SPUT_VOLATILE_resolve         @ yes, do resolve
7424c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SPUT_VOLATILE_finish:   @ field ptr in r0
7425c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
7426c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7427c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r1, r2)                    @ r1<- fp[AA]
7428c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
74294185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    SMP_DMB_ST                        @ releasing store
7430c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    str     r1, [r0, #offStaticField_value] @ field<- vAA
74314185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    SMP_DMB
7432c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7437c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
7438c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */
7439c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IGET.S */
7440c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7441c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit instance field get.
7442c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7443c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short
7444c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7445c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vA, vB, field@CCCC */
7446c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
74479f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7448c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
7449c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7450c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7451c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7452c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7453c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IGET_OBJECT_VOLATILE_finish          @ no, already resolved
74549f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7455c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw
7456c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7457c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7458c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0
7459c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IGET_OBJECT_VOLATILE_finish
7460c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown
7461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
74655387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
74665387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE_VOLATILE.S */
74675387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IGET_WIDE.S */
74685387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
74695387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * Wide 32-bit instance field get.
74705387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
74715387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* iget-wide vA, vB, field@CCCC */
74725387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
74739f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
74745387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
74755387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
74765387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
74775387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
74785387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
74795387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IGET_WIDE_VOLATILE_finish          @ no, already resolved
74809f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
74815387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw
74825387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
74835387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
74845387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0
74855387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IGET_WIDE_VOLATILE_finish
74865387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown
7487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
74915387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
74925387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE_VOLATILE.S */
74935387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_IPUT_WIDE.S */
74945387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* iput-wide vA, vB, field@CCCC */
74955387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
74969f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
74975387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
74985387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pResFields
74995387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
75005387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
75015387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
75025387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ no, already resolved
75039f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method] @ r2<- current method
75045387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    EXPORT_PC()                         @ resolve() could throw
75055387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
75065387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
75075387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ success?
75085387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    bne     .LOP_IPUT_WIDE_VOLATILE_finish          @ yes, finish up
75095387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    b       common_exceptionThrown
7510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
75145387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SGET_WIDE_VOLATILE: /* 0xea */
75155387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE_VOLATILE.S */
75165387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SGET_WIDE.S */
75175387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
75185387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * 64-bit SGET handler.
75195387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
75205387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* sget-wide vAA, field@BBBB */
75219f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
75225387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
75239a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
75249a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
75255387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
75265387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     .LOP_SGET_WIDE_VOLATILE_resolve         @ yes, do resolve
75275387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.LOP_SGET_WIDE_VOLATILE_finish:
7528861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
7529861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
7530861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r0, r0, #offStaticField_value @ r0<- pointer to data
75316e10b9aaa72425a4825a25f0043533d0c6fdbba4Andy McFadden    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
7532861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
7533861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldrd    r0, [r0, #offStaticField_value] @ r0/r1<- field value (aligned)
7534861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
7535861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
75365387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7537861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
75385387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
75395387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
75445387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden.L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
75455387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE_VOLATILE.S */
75465387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden/* File: armv5te/OP_SPUT_WIDE.S */
75475387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /*
75485387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     * 64-bit SPUT handler.
75495387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden     */
75505387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    /* sput-wide vAA, field@BBBB */
75519f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r0, [rSELF, #offThread_methodClassDex]  @ r0<- DvmDex
75525387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
75539a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r0, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
75545387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    mov     r9, rINST, lsr #8           @ r9<- AA
75559a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r2, [r10, r1, lsl #2]        @ r2<- resolved StaticField ptr
75565387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
7557861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    cmp     r2, #0                      @ is resolved entry null?
75585387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    beq     .LOP_SPUT_WIDE_VOLATILE_resolve         @ yes, do resolve
7559861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden.LOP_SPUT_WIDE_VOLATILE_finish: @ field ptr in r2, AA in r9
75605387824f19033ed51a945fbc8c2b574998404b3dAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7561861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    ldmia   r9, {r0-r1}                 @ r0/r1<- vAA/vAA+1
7562861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GET_INST_OPCODE(r10)                @ extract opcode from rINST
7563861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .if 1
7564861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    add     r2, r2, #offStaticField_value @ r2<- pointer to data
75654185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
7566861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .else
7567861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    strd    r0, [r2, #offStaticField_value] @ field<- vAA/vAA+1
7568861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    .endif
7569861b33855aff080278ea5125e4372a2d4bf8aef5Andy McFadden    GOTO_OPCODE(r10)                    @ jump to next instruction
7570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
757496516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden.L_OP_BREAKPOINT: /* 0xec */
757596516932f1557d8f48a8b2dbbb885af01a11ef6eAndy McFadden/* File: armv5te/OP_BREAKPOINT.S */
75769a3147c7412f4794434b4c2604aa2ba784867774buzbee    /*
75779a3147c7412f4794434b4c2604aa2ba784867774buzbee     * Breakpoint handler.
75789a3147c7412f4794434b4c2604aa2ba784867774buzbee     *
75799a3147c7412f4794434b4c2604aa2ba784867774buzbee     * Restart this instruction with the original opcode.  By
75809a3147c7412f4794434b4c2604aa2ba784867774buzbee     * the time we get here, the breakpoint will have already been
75819a3147c7412f4794434b4c2604aa2ba784867774buzbee     * handled.
75829a3147c7412f4794434b4c2604aa2ba784867774buzbee     */
75839a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r0, rPC
75849a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      dvmGetOriginalOpcode        @ (rPC)
75859a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH(rINST, 0)                     @ reload OP_BREAKPOINT + rest of inst
758600ceb87d1c57ccee59966be4deef1292a049285cbuzbee    ldr     r1, [rSELF, #offThread_mainHandlerTable]
75879a3147c7412f4794434b4c2604aa2ba784867774buzbee    and     rINST, #0xff00
75889a3147c7412f4794434b4c2604aa2ba784867774buzbee    orr     rINST, rINST, r0
758900ceb87d1c57ccee59966be4deef1292a049285cbuzbee    GOTO_OPCODE_BASE(r1, r0)
7590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
75933a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden.L_OP_THROW_VERIFICATION_ERROR: /* 0xed */
75943a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden/* File: armv5te/OP_THROW_VERIFICATION_ERROR.S */
75953a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    /*
75963a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * Handle a throw-verification-error instruction.  This throws an
75973a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * exception for an error discovered during verification.  The
75983a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     * exception is indicated by AA, with some detail provided by BBBB.
75993a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden     */
76003a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    /* op AA, ref@BBBB */
76019f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
76023a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    FETCH(r2, 1)                        @ r2<- BBBB
7603b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden    EXPORT_PC()                         @ export the PC
76043a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    mov     r1, rINST, lsr #8           @ r1<- AA
76053a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    bl      dvmThrowVerificationError   @ always throws
76063a1aedbc9777eab6275a360b93b81b079464238eAndy McFadden    b       common_exceptionThrown      @ handle exception
7607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_EXECUTE_INLINE: /* 0xee */
7611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_EXECUTE_INLINE.S */
7612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Execute a "native inline" instruction.
7614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7615b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * We need to call an InlineOp4Func:
7616b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7618b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * The first four args are in r0-r3, pointer to return value storage
7619b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * is on the stack.  The function's return value is a flag that tells
7620b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * us if an exception was thrown.
76219a3147c7412f4794434b4c2604aa2ba784867774buzbee     *
76229a3147c7412f4794434b4c2604aa2ba784867774buzbee     * TUNING: could maintain two tables, pointer in Thread and
76239a3147c7412f4794434b4c2604aa2ba784867774buzbee     * swap if profiler/debuggger active.
7624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */
7626389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    r2, [rSELF, #offThread_subMode]
7627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 1)                       @ r10<- BBBB
7628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ can throw
76299a3147c7412f4794434b4c2604aa2ba784867774buzbee    ands    r2, #kSubModeDebugProfile   @ Any going on?
76309a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     .LOP_EXECUTE_INLINE_debugmode       @ yes - take slow path
76319a3147c7412f4794434b4c2604aa2ba784867774buzbee.LOP_EXECUTE_INLINE_resume:
76329a3147c7412f4794434b4c2604aa2ba784867774buzbee    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7633b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #12          @ r0<- B
76359f601a917c8878204482c37aec7005054b6776fabuzbee    str     r1, [sp]                    @ push &self->retval
7636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
7637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ pop stack
7638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ test boolean result of inline
7639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ returned false, handle exception
7640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7646b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden.L_OP_EXECUTE_INLINE_RANGE: /* 0xef */
7647b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden/* File: armv5te/OP_EXECUTE_INLINE_RANGE.S */
7648b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /*
7649b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Execute a "native inline" instruction, using "/range" semantics.
7650b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * Same idea as execute-inline, but we get the args differently.
7651b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *
7652b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * We need to call an InlineOp4Func:
7653b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *  bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult)
7654b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     *
7655b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * The first four args are in r0-r3, pointer to return value storage
7656b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * is on the stack.  The function's return value is a flag that tells
7657b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     * us if an exception was thrown.
7658b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden     */
7659b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    /* [opt] execute-inline/range {vCCCC..v(CCCC+AA-1)}, inline@BBBB */
7660389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    r2, [rSELF, #offThread_subMode]
7661b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH(r10, 1)                       @ r10<- BBBB
7662b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    EXPORT_PC()                         @ can throw
76639a3147c7412f4794434b4c2604aa2ba784867774buzbee    ands    r2, #kSubModeDebugProfile   @ Any going on?
76649a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     .LOP_EXECUTE_INLINE_RANGE_debugmode       @ yes - take slow path
76659a3147c7412f4794434b4c2604aa2ba784867774buzbee.LOP_EXECUTE_INLINE_RANGE_resume:
76669a3147c7412f4794434b4c2604aa2ba784867774buzbee    add     r1, rSELF, #offThread_retval  @ r1<- &self->retval
7667b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    sub     sp, sp, #8                  @ make room for arg, +64 bit align
7668b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    mov     r0, rINST, lsr #8           @ r0<- AA
76699f601a917c8878204482c37aec7005054b6776fabuzbee    str     r1, [sp]                    @ push &self->retval
7670b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
7671b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    add     sp, sp, #8                  @ pop stack
7672b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    cmp     r0, #0                      @ test boolean result of inline
7673b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    beq     common_exceptionThrown      @ returned false, handle exception
7674b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
7675b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7676b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
76800346e9dcddccd449c731e42ef83708ff6d8f0976Andy McFadden.L_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
76810346e9dcddccd449c731e42ef83708ff6d8f0976Andy McFadden/* File: armv5te/OP_INVOKE_OBJECT_INIT_RANGE.S */
7682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
76836af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden     * Invoke Object.<init> on an object.  In practice we know that
76846af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden     * Object's nullary constructor doesn't do anything, so we just
76859a3147c7412f4794434b4c2604aa2ba784867774buzbee     * skip it unless a debugger is active.
76866af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden     */
768724bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden    FETCH(r1, 2)                  @ r1<- CCCC
76886af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden    GET_VREG(r0, r1)                    @ r0<- "this" ptr
76896af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden    cmp     r0, #0                      @ check for NULL
76906af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden    beq     common_errNullObject        @ export PC and throw NPE
76916af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden    ldr     r1, [r0, #offObject_clazz]  @ r1<- obj->clazz
76926af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden    ldr     r2, [r1, #offClassObject_accessFlags] @ r2<- clazz->accessFlags
76936af2ddd107842c3737c04c37343cac9be17f4209Andy McFadden    tst     r2, #CLASS_ISFINALIZABLE    @ is this class finalizable?
76949a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_setFinal        @ yes, go
76959a3147c7412f4794434b4c2604aa2ba784867774buzbee.LOP_INVOKE_OBJECT_INIT_RANGE_finish:
7696389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    r1, [rSELF, #offThread_subMode]
76979a3147c7412f4794434b4c2604aa2ba784867774buzbee    ands    r1, #kSubModeDebuggerActive @ debugger active?
76989a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     .LOP_INVOKE_OBJECT_INIT_RANGE_debugger        @ Yes - skip optimization
76999a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST(2+1)       @ advance to next instr, load rINST
7700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ ip<- opcode from rINST
7701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ execute it
7702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7705291758c5c4902900c6f86794ba8ab9cad9b26197Andy McFadden.L_OP_RETURN_VOID_BARRIER: /* 0xf1 */
7706291758c5c4902900c6f86794ba8ab9cad9b26197Andy McFadden/* File: armv5te/OP_RETURN_VOID_BARRIER.S */
77071df319e3674d993a07bc0ff1f56a5915410b5903Andy McFadden    SMP_DMB_ST
7708291758c5c4902900c6f86794ba8ab9cad9b26197Andy McFadden    b       common_returnFromMethod
7709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_QUICK: /* 0xf2 */
7713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */
7714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
7715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
7727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_WIDE_QUICK: /* 0xf3 */
7732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_WIDE_QUICK.S */
7733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iget-wide-quick vA, vB, offset@CCCC */
7734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7736b48a4d53bc3349b5c99f8b87a396e7374e2d335cDave Butcher    FETCH(ip, 1)                        @ ip<- field byte offset
7737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7740b48a4d53bc3349b5c99f8b87a396e7374e2d335cDave Butcher    ldrd    r0, [r3, ip]                @ r0<- obj.field (64 bits, aligned)
7741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
7744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
7746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IGET_OBJECT_QUICK: /* 0xf4 */
7751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_OBJECT_QUICK.S */
7752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IGET_QUICK.S */
7753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* For: iget-quick, iget-object-quick */
7754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- object we're operating on
7757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, r1]                @ r0<- obj.field (always 32 bits)
7762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SET_VREG(r0, r2)                    @ fp[A]<- r0
7766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_QUICK: /* 0xf5 */
7772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_QUICK.S */
7773919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    /* For: iput-quick */
7774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- fp[A]
7783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_WIDE_QUICK: /* 0xf6 */
7791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_WIDE_QUICK.S */
7792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* iput-wide-quick vA, vB, offset@CCCC */
7793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rINST, lsr #8           @ r0<- A(+)
7794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, rINST, lsr #12          @ r1<- B
7795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r0, r0, #15
7796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r2, r1)                    @ r2<- fp[B], the object pointer
7797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r0, lsl #2         @ r3<- &fp[A]
7798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ check object for null
7799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmia   r3, {r0-r1}                 @ r0/r1<- fp[A]
7800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 1)                        @ r3<- field byte offset
7802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    strd    r0, [r2, r3]                @ obj.field (64 bits, aligned)<- r0/r1
7804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
7810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_IPUT_OBJECT_QUICK.S */
7811919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    /* For: iput-object-quick */
7812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vA, vB, offset@CCCC */
7813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #12          @ r2<- B
7814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r3, r2)                    @ r3<- fp[B], the object pointer
7815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- field byte offset
7816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, #0                      @ check object for null
7817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, rINST, lsr #8           @ r2<- A(+)
7818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ object was null
7819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r2, r2, #15
7820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_VREG(r0, r2)                    @ r0<- fp[A]
78219f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
7822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r3, r1]                @ obj.field (always 32 bits)<- r0
7824919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee    cmp     r0, #0
7825d82097f6b409c5cd48568e54eb701604c3cceb18buzbee    strneb  r2, [r2, r3, lsr #GC_CARD_SHIFT] @ mark card based on obj head
7826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
7828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
7832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
7835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
7843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
78459a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
78469a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0                      @ is "this" null?
7847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
78489a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ invoke must export
7851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
78529a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
7857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */
7858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_VIRTUAL_QUICK.S */
7859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized virtual method call.
7861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-virtual-quick, invoke-virtual-quick/range
7863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r3, 2)                        @ r3<- FEDC or CCCC
7867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
7869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r3, r3, #15                 @ r3<- C (or stays CCCC)
7870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
78719a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r9, r3)                    @ r9<- vC ("this" ptr)
78729a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0                      @ is "this" null?
7873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ null "this", throw exception
78749a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r2, [r9, #offObject_clazz]  @ r2<- thisPtr->clazz
7875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- thisPtr->clazz->vtable
7876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ invoke must export
7877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r3<- vtable[BBBB]
78789a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      common_invokeMethodRange @ (r0=method, r9="this")
7879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK: /* 0xfa */
7884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
7887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
7889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
78939f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!0)
7895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
7900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
79019a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r9, r10)                   @ r9<- "this"
7902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
79039a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0                      @ null "this" ref?
7904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ "this" is null, throw exception
79069a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
7907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
7911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK_RANGE.S */
7912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/OP_INVOKE_SUPER_QUICK.S */
7913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
7914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Handle an optimized "super" method call.
7915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
7916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for: [opt] invoke-super-quick, invoke-super-quick/range
7917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
7918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vB, {vD, vE, vF, vG, vA}, class@CCCC */
7919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* op vAA, {vCCCC..v(CCCC+AA-1)}, meth@BBBB */
7920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r10, 2)                       @ r10<- GFED or CCCC
79219f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     (!1)
7923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    and     r10, r10, #15               @ r10<- D (or stays CCCC)
7924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
7925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 1)                        @ r1<- BBBB
7926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offMethod_clazz]  @ r2<- method->clazz
7927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ must export for invoke
7928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_super]     @ r2<- method->clazz->super
79299a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r9, r10)                   @ r9<- "this"
7930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_vtable]    @ r2<- ...clazz->super->vtable
79319a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0                      @ null "this" ref?
7932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r2, r1, lsl #2]        @ r0<- super->vtable[BBBB]
7933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_errNullObject        @ "this" is null, throw exception
79349a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      common_invokeMethodRange @ (r0=method, r9="this")
7935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7939c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
7940c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */
7941919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee/* File: armv5te/OP_IPUT_OBJECT.S */
7942c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7943919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * 32-bit instance field put.
7944c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7945919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: iput-object, iput-object-volatile
7946c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7947c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vA, vB, field@CCCC */
7948c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r0, rINST, lsr #12          @ r0<- B
79499f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r3, [rSELF, #offThread_methodClassDex]    @ r3<- DvmDex
7950c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref CCCC
7951c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields
7952c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_VREG(r9, r0)                    @ r9<- fp[B], the object pointer
7953c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, r1, lsl #2]        @ r0<- resolved InstField ptr
7954c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7955c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ no, already resolved
79569f601a917c8878204482c37aec7005054b6776fabuzbee8:  ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
7957c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    EXPORT_PC()                         @ resolve() could throw
7958c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
7959c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bl      dvmResolveInstField         @ r0<- resolved InstField ptr
7960c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ success?
7961c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    bne     .LOP_IPUT_OBJECT_VOLATILE_finish          @ yes, finish up
7962c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    b       common_exceptionThrown
7963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7967c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
7968c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */
7969c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SGET.S */
7970c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7971c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * General 32-bit SGET handler.
7972c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
7973c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short
7974c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
7975c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vAA, field@BBBB */
79769f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
7977c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
79789a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
79799a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]       @ r0<- resolved StaticField ptr
7980c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
7981c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    beq     .LOP_SGET_OBJECT_VOLATILE_resolve         @ yes, do resolve
7982c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0
7983c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    ldr     r1, [r0, #offStaticField_value] @ r1<- field value
79840890e5bf0b2a502ca1030e9773fabc16ef1b5981Andy McFadden    SMP_DMB                            @ acquiring load
7985c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    mov     r2, rINST, lsr #8           @ r2<- AA
7986c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
7987c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    SET_VREG(r1, r2)                    @ fp[AA]<- r1
7988c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
7989c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    GOTO_OPCODE(ip)                     @ jump to next instruction
7990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
7993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
7994c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
7995c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */
7996919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee/* File: armv5te/OP_SPUT_OBJECT.S */
7997c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /*
7998919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * 32-bit SPUT handler for objects
7999c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     *
8000919eb063ce4542d3698e10e20aba9a2dfbdd0f82buzbee     * for: sput-object, sput-object-volatile
8001c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden     */
8002c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    /* op vAA, field@BBBB */
80039f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r2, [rSELF, #offThread_methodClassDex]    @ r2<- DvmDex
8004c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    FETCH(r1, 1)                        @ r1<- field ref BBBB
80059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r10, [r2, #offDvmDex_pResFields] @ r10<- dvmDex->pResFields
80069a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [r10, r1, lsl #2]        @ r0<- resolved StaticField ptr
8007c35a2ef53d0cccd6f924eeba36633220ec67c32eAndy McFadden    cmp     r0, #0                      @ is resolved entry null?
80089a3147c7412f4794434b4c2604aa2ba784867774buzbee    beq     .LOP_SPUT_OBJECT_VOLATILE_resolve         @ yes, do resolve
80099a3147c7412f4794434b4c2604aa2ba784867774buzbee.LOP_SPUT_OBJECT_VOLATILE_finish:   @ field ptr in r0
80109a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r2, rINST, lsr #8           @ r2<- AA
80119a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
80129a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_VREG(r1, r2)                    @ r1<- fp[AA]
80139a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
80149a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r9, [r0, #offField_clazz]   @ r9<- field->clazz
80159a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
80164185972e211b0c84b9fe7d90c56b28cc15e474fabuzbee    SMP_DMB_ST                        @ releasing store
80179a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       .LOP_SPUT_OBJECT_VOLATILE_end
8018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* ------------------------------ */
8021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8022ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_OP_UNUSED_FF: /* 0xff */
8023ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* File: armv5te/OP_UNUSED_FF.S */
8024ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* File: armv5te/unused.S */
8025ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_abort
8026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .balign 64
8029ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .size   dvmAsmInstructionStart, .-dvmAsmInstructionStart
8030ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .global dvmAsmInstructionEnd
8031ab35b50311951feea3782151dd5422ee944685c2Elliott HughesdvmAsmInstructionEnd:
8032ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes
8033ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/*
8034ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes * ===========================================================================
8035ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes *  Sister implementations
8036ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes * ===========================================================================
8037ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes */
8038ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .global dvmAsmSisterStart
8039ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .type   dvmAsmSisterStart, %function
8040ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .text
8041ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .balign 4
8042ab35b50311951feea3782151dd5422ee944685c2Elliott HughesdvmAsmSisterStart:
8043ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes
8044ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_CONST_STRING */
8045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8047ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the String has not yet been resolved.
8048ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1: BBBB (String ref)
8049ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9: target register
8050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8051ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CONST_STRING_resolve:
8052ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()
8053ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
8054ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8055ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveString            @ r0<- String reference
8056ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ failed?
8057ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ yup, handle the exception
8058ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8059ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r9)                    @ vAA<- r0
8060a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8061ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
8062ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes
8063ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_CONST_STRING_JUMBO */
8064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8066ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the String has not yet been resolved.
8067ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1: BBBBBBBB (String ref)
8068ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9: target register
8069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8070ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CONST_STRING_JUMBO_resolve:
8071ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()
8072ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
8073ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8074ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveString            @ r0<- String reference
8075ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ failed?
8076ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ yup, handle the exception
8077ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
8078ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r9)                    @ vAA<- r0
8079a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8080ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
8081ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes
8082ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_CONST_CLASS */
8083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8085ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the Class has not yet been resolved.
8086ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1: BBBB (Class ref)
8087ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9: target register
8088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8089ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CONST_CLASS_resolve:
8090ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()
8091ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [rSELF, #offThread_method] @ r0<- self->method
8092ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #1                      @ r2<- true
8093ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8094ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveClass             @ r0<- Class reference
8095ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ failed?
8096ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ yup, handle the exception
8097ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8098ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r9)                    @ vAA<- r0
8099a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8100ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
8101ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes
8102ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_CHECK_CAST */
8103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
810471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    /*
8105ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Trivial test failed, need to perform full check.  This is common.
8106ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds obj->clazz
8107ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1 holds desired class resolved from BBBB
8108ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
810971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     */
8110ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CHECK_CAST_fullcheck:
8111ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r10, r1                     @ avoid ClassObject getting clobbered
8112ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
8113ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ failed?
8114ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_CHECK_CAST_okay            @ no, success
8115ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes
8116ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ A cast has failed.  We need to throw a ClassCastException.
8117ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ about to throw
8118ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz (actual class)
8119ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10                     @ r1<- desired class
8120ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmThrowClassCastException
8121ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown
8122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8124ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Resolution required.  This is the least-likely path.
8125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8126ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r2 holds BBBB
8127ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8129ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CHECK_CAST_resolve:
8130ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw
8131ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
8132ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r2                      @ r1<- BBBB
8133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, #0                      @ r2<- false
8134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8135ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ got null?
8137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_exceptionThrown      @ yes, handle exception
8138ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r0                      @ r1<- class resolved from BBB
8139ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8140ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_CHECK_CAST_resolved        @ pick up where we left off
8141ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes
8142ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_INSTANCE_OF */
8143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8145ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Trivial test failed, need to perform full check.  This is common.
8146ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds obj->clazz
8147ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1 holds class resolved from BBBB
8148ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds A
8149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8150ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INSTANCE_OF_fullcheck:
8151ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmInstanceofNonTrivial     @ r0<- boolean result
8152ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ fall through to OP_INSTANCE_OF_store
8153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8155ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r0 holds boolean result
8156ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r9 holds A
8157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8158ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INSTANCE_OF_store:
8159ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8160ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r9)                    @ vA<- r0
8161ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8162ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
8163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8165ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Trivial test succeeded, save and bail.
8166ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds A
8167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8168ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INSTANCE_OF_trivial:
8169ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, #1                      @ indicate success
8170ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ could b OP_INSTANCE_OF_store, but copying is faster and cheaper
8171ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8172ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r9)                    @ vA<- r0
8173ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8174ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
8175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8177ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Resolution required.  This is the least-likely path.
8178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8179ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r3 holds BBBB
8180ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds A
8181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8182ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INSTANCE_OF_resolve:
8183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()                         @ resolve() could throw
8184ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [rSELF, #offThread_method]    @ r0<- self->method
8185ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r3                      @ r1<- BBBB
8186ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #1                      @ r2<- true
8187ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r0, #offMethod_clazz]  @ r0<- method->clazz
8188ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8189ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ got null?
8190ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ yes, handle exception
8191ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r0                      @ r1<- class resolved from BBB
8192ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r3, rINST, lsr #12          @ r3<- B
8193ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r0, r3)                    @ r0<- vB (object)
8194ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r0, #offObject_clazz]  @ r0<- obj->clazz
8195ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_INSTANCE_OF_resolved        @ pick up where we left off
8196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8197ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_NEW_INSTANCE */
8198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8199ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .balign 32                          @ minimize cache lines
8200ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_NEW_INSTANCE_finish: @ r0=new object
8201ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r3, rINST, lsr #8           @ r3<- AA
8202ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ failed?
8203ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
8204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8205ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * The JIT needs the class to be fully resolved before it can
8206ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * include this instruction in a trace.
8207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8208ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrh    r1, [rSELF, #offThread_subMode]
8209ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ yes, handle the exception
8210ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ands    r1, #kSubModeJitTraceBuild  @ under construction?
8211ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_NEW_INSTANCE_jitCheck
8212ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#else
8213ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ yes, handle the exception
8214ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
8215ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_NEW_INSTANCE_end:
8216ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8217ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r3)                    @ vAA<- r0
8218a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8219ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
8220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8221ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
8222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8223ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Check to see if we need to stop the trace building early.
8224ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r0: new object
8225ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r3: vAA
822671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     */
8227ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_NEW_INSTANCE_jitCheck:
8228ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [r10]                   @ reload resolved class
8229ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r1, #0                      @ okay?
8230ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_NEW_INSTANCE_end             @ yes, finish
8231ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r9, r0                      @ preserve new object
8232ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r10, r3                     @ preserve vAA
8233ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, rSELF
8234ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rPC
8235ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmJitEndTraceSelect        @ (self, pc)
8236ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8237ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r9, r10)                   @ vAA<- new object
8238a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8239ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
8240ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
824171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
824271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    /*
8243ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Class initialization required.
8244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
8245ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds class object
8246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8247ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_NEW_INSTANCE_needinit:
8248ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r9, r0                      @ save r0
8249ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmInitClass                @ initialize class
8250ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ check boolean result
8251ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r9                      @ restore r0
8252ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_NEW_INSTANCE_initialized     @ success, continue
8253ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown      @ failed, deal with init exception
8254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8256ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Resolution required.  This is the least-likely path.
825771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     *
8258ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1 holds BBBB
8259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8260ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_NEW_INSTANCE_resolve:
8261ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
8262ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #0                      @ r2<- false
8263ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8264ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveClass             @ r0<- resolved ClassObject ptr
8265ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ got null?
8266ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_NEW_INSTANCE_resolved        @ no, continue
8267ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown      @ yes, handle exception
8268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8269ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_NEW_ARRAY */
8270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8273ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Resolve class.  (This is an uncommon case.)
827471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     *
8275ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1 holds array length
8276ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r2 holds class ref CCCC
8277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8278ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_NEW_ARRAY_resolve:
8279ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
8280ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r9, r1                      @ r9<- length (save)
8281ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r2                      @ r1<- CCCC
8282ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #0                      @ r2<- false
8283ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
8284ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveClass             @ r0<- call(clazz, ref)
8285ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ got null?
8286ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r9                      @ r1<- length (restore)
8287ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ yes, handle exception
8288ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ fall through to OP_NEW_ARRAY_finish
8289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
8290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
8291ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Finish allocation.
829271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     *
8293ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds class
8294ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1 holds array length
8295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
8296ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_NEW_ARRAY_finish:
8297ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #ALLOC_DONT_TRACK       @ don't track in local refs table
8298ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmAllocArrayByClass        @ r0<- call(clazz, length, flags)
8299ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ failed?
8300ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
8301ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ yes, handle the exception
8302ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8303ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
830471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8305ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r2)                    @ vA<- r0
830671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    GOTO_OPCODE(ip)                     @ jump to next instruction
830771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8308ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_FILLED_NEW_ARRAY */
8309ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes
831071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    /*
8311ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * On entry:
8312ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds array class
8313ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 holds AA or BA
831471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     */
8315ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_FILLED_NEW_ARRAY_continue:
8316ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8317ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8318ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
8319ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .if     0
8320ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10                     @ r1<- AA (length)
832124bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden    .else
8322ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10, lsr #4             @ r1<- B (length)
832324bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden    .endif
8324ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     rINST, #'I'                 @ array of ints?
8325ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmpne   rINST, #'L'                 @ array of objects?
8326ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmpne   rINST, #'['                 @ array of arrays?
8327ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r9, r1                      @ save length in r9
8328ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_FILLED_NEW_ARRAY_notimpl         @ no, not handled yet
8329ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8330ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ null return?
8331ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ alloc failed, handle exception
833271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8333ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8334ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
8335ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
8336ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8337ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    subs    r9, r9, #1                  @ length--, check for neg
8338ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8339ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bmi     2f                          @ was zero, bail
834071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8341ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ copy values from registers into the array
8342ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8343ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .if     0
8344ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8345ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes1:  ldr     r3, [r2], #4                @ r3<- *r2++
8346ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    subs    r9, r9, #1                  @ count--
8347ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r3, [r0], #4                @ *contents++ = vX
8348ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bpl     1b
8349ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ continue at 2
8350ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .else
8351ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #4                      @ length was initially 5?
8352ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r10, #15                @ r2<- A
8353ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     1f                          @ <= 4 args, branch
8354ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r3, r2)                    @ r3<- vA
8355ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    sub     r9, r9, #1                  @ count--
8356ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r3, [r0, #16]               @ contents[4] = vA
8357ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8358ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8359ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8360ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    subs    r9, r9, #1                  @ count--
8361ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r3, [r0], #4                @ *contents++ = vX
8362ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bpl     1b
8363ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ continue at 2
8364ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .endif
836571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8366ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes2:
8367ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
8368ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
8369ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8370ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
8371ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r1, #'I'                         @ Is int array?
8372ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
8373ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                          @ execute it
837471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
837571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    /*
8376ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Throw an exception indicating that we have not implemented this
8377ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * mode of filled-new-array.
837871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     */
8379ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_FILLED_NEW_ARRAY_notimpl:
8380ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY
83815dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel3:  add     r0, pc
8382ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmThrowInternalError
8383ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown
838471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
838571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    /*
8386ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Ideally we'd only define this once, but depending on layout we can
8387ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * exceed the range of the load above.
838871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     */
838971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8390ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY:
83915dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrFilledNewArrayNotImpl,3b)
839271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8393ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_FILLED_NEW_ARRAY_RANGE */
839471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
839571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    /*
8396ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * On entry:
8397ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds array class
8398ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 holds AA or BA
839971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     */
8400ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_FILLED_NEW_ARRAY_RANGE_continue:
8401ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offClassObject_descriptor] @ r3<- arrayClass->descriptor
8402ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #ALLOC_DONT_TRACK       @ r2<- alloc flags
8403ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrb    rINST, [r3, #1]             @ rINST<- descriptor[1]
8404ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .if     1
8405ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10                     @ r1<- AA (length)
8406ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .else
8407ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10, lsr #4             @ r1<- B (length)
8408ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .endif
8409ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     rINST, #'I'                 @ array of ints?
8410ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmpne   rINST, #'L'                 @ array of objects?
8411ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmpne   rINST, #'['                 @ array of arrays?
8412ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r9, r1                      @ save length in r9
8413ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_FILLED_NEW_ARRAY_RANGE_notimpl         @ no, not handled yet
8414ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmAllocArrayByClass        @ r0<- call(arClass, length, flags)
8415ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ null return?
8416ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ alloc failed, handle exception
841771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8418ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH(r1, 2)                        @ r1<- FEDC or CCCC
8419ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r0, [rSELF, #offThread_retval]      @ retval.l <- new array
8420ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     rINST, [rSELF, #offThread_retval+4] @ retval.h <- type
8421ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r0, r0, #offArrayObject_contents @ r0<- newArray->contents
8422ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    subs    r9, r9, #1                  @ length--, check for neg
8423ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(3)               @ advance to next instr, load rINST
8424ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bmi     2f                          @ was zero, bail
8425ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes
8426ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ copy values from registers into the array
8427ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ r0=array, r1=CCCC/FEDC, r9=length (from AA or B), r10=AA/BA
8428ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .if     1
8429ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r2, rFP, r1, lsl #2         @ r2<- &fp[CCCC]
8430ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes1:  ldr     r3, [r2], #4                @ r3<- *r2++
8431ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    subs    r9, r9, #1                  @ count--
8432ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r3, [r0], #4                @ *contents++ = vX
8433ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bpl     1b
8434ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ continue at 2
843524bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden    .else
8436ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #4                      @ length was initially 5?
8437ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r10, #15                @ r2<- A
8438ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     1f                          @ <= 4 args, branch
8439ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r3, r2)                    @ r3<- vA
8440ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    sub     r9, r9, #1                  @ count--
8441ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r3, [r0, #16]               @ contents[4] = vA
8442ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes1:  and     r2, r1, #15                 @ r2<- F/E/D/C
8443ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r3, r2)                    @ r3<- vF/vE/vD/vC
8444ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r1, lsr #4              @ r1<- next reg in low 4
8445ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    subs    r9, r9, #1                  @ count--
8446ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r3, [r0], #4                @ *contents++ = vX
8447ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bpl     1b
8448ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ continue at 2
844924bd4c50bb3ea13be4f049710967961f0546fb2cAndy McFadden    .endif
845071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8451ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes2:
8452ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [rSELF, #offThread_retval]     @ r0<- object
8453ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [rSELF, #offThread_retval+4]   @ r1<- type
84549a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8455ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                      @ ip<- opcode from rINST
8456ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r1, #'I'                         @ Is int array?
8457ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    strneb  r2, [r2, r0, lsr #GC_CARD_SHIFT] @ Mark card based on object head
8458ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                          @ execute it
845971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
846071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    /*
8461ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Throw an exception indicating that we have not implemented this
8462ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * mode of filled-new-array.
846371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     */
8464ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_FILLED_NEW_ARRAY_RANGE_notimpl:
8465ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, .L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE
84665dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel3:  add     r0, pc
8467ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmThrowInternalError
8468ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown
846971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
847071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    /*
8471ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Ideally we'd only define this once, but depending on layout we can
8472ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * exceed the range of the load above.
847371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     */
847471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8475ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_strFilledNewArrayNotImpl_OP_FILLED_NEW_ARRAY_RANGE:
84765dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrFilledNewArrayNotImpl,3b)
847771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8478ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_CMPL_FLOAT */
847971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8480ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ Test for NaN with a second comparison.  EABI forbids testing bit
8481ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8482ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ make the library call.
8483ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CMPL_FLOAT_gt_or_nan:
8484ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r9                      @ reverse order
8485ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r10
8486ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
8487ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bleq    common_abort
8488ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    movcc   r1, #1                      @ (greater than) r1<- 1
8489ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bcc     .LOP_CMPL_FLOAT_finish
8490ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8491ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_CMPL_FLOAT_finish
849271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
849371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8494ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if 0       /* "clasic" form */
8495ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH(r0, 1)                        @ r0<- CCBB
8496ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r0, #255                @ r2<- BB
8497ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r3, r0, lsr #8              @ r3<- CC
8498ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r9, r2)                    @ r9<- vBB
8499ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r10, r3)                   @ r10<- vCC
8500ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r9                      @ r0<- vBB
8501ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10                     @ r1<- vCC
8502ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
8503ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ equal?
8504ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    movne   r1, #0                      @ yes, result is 0
8505ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     OP_CMPL_FLOAT_finish
8506ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r9                      @ r0<- vBB
8507ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10                     @ r1<- vCC
8508ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
8509ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ less than?
8510ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       OP_CMPL_FLOAT_continue
8511ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes@%break
851271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8513ab35b50311951feea3782151dd5422ee944685c2Elliott HughesOP_CMPL_FLOAT_continue:
8514ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mvnne   r1, #0                      @ yes, result is -1
8515ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     OP_CMPL_FLOAT_finish
8516ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r9                      @ r0<- vBB
8517ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10                     @ r1<- vCC
8518ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
8519ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ greater than?
8520ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     OP_CMPL_FLOAT_nan               @ no, must be NaN
8521ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, #1                      @ yes, result is 1
8522ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ fall through to _finish
852371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8524ab35b50311951feea3782151dd5422ee944685c2Elliott HughesOP_CMPL_FLOAT_finish:
8525ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r3, rINST, lsr #8           @ r3<- AA
8526ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8527ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r1, r3)                    @ vAA<- r1
8528ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8529ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
853071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
853171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    /*
8532ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * This is expected to be uncommon, so we double-branch (once to here,
8533ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * again back to _finish).
853471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao     */
8535ab35b50311951feea3782151dd5422ee944685c2Elliott HughesOP_CMPL_FLOAT_nan:
8536ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8537ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       OP_CMPL_FLOAT_finish
853871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
85399a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
854071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8541ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_CMPG_FLOAT */
854271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8543ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ Test for NaN with a second comparison.  EABI forbids testing bit
8544ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8545ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ make the library call.
8546ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CMPG_FLOAT_gt_or_nan:
8547ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r9                      @ reverse order
8548ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r10
8549ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_cfcmple             @ r0<- Z set if eq, C clear if <
8550ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bleq    common_abort
8551ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    movcc   r1, #1                      @ (greater than) r1<- 1
8552ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bcc     .LOP_CMPG_FLOAT_finish
8553ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8554ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_CMPG_FLOAT_finish
855571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
855671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8557ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if 0       /* "clasic" form */
8558ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH(r0, 1)                        @ r0<- CCBB
8559ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r0, #255                @ r2<- BB
8560ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r3, r0, lsr #8              @ r3<- CC
8561ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r9, r2)                    @ r9<- vBB
8562ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r10, r3)                   @ r10<- vCC
8563ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r9                      @ r0<- vBB
8564ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10                     @ r1<- vCC
8565ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_fcmpeq              @ r0<- (vBB == vCC)
8566ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ equal?
8567ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    movne   r1, #0                      @ yes, result is 0
8568ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     OP_CMPG_FLOAT_finish
8569ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r9                      @ r0<- vBB
8570ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10                     @ r1<- vCC
8571ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_fcmplt              @ r0<- (vBB < vCC)
8572ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ less than?
8573ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       OP_CMPG_FLOAT_continue
8574ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes@%break
857571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8576ab35b50311951feea3782151dd5422ee944685c2Elliott HughesOP_CMPG_FLOAT_continue:
8577ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mvnne   r1, #0                      @ yes, result is -1
8578ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     OP_CMPG_FLOAT_finish
8579ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r9                      @ r0<- vBB
8580ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r10                     @ r1<- vCC
8581ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_fcmpgt              @ r0<- (vBB > vCC)
8582ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ greater than?
8583ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     OP_CMPG_FLOAT_nan               @ no, must be NaN
8584ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, #1                      @ yes, result is 1
8585ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ fall through to _finish
858671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8587ab35b50311951feea3782151dd5422ee944685c2Elliott HughesOP_CMPG_FLOAT_finish:
8588ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r3, rINST, lsr #8           @ r3<- AA
8589ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8590ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r1, r3)                    @ vAA<- r1
8591ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8592ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
859371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8594ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8595ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * This is expected to be uncommon, so we double-branch (once to here,
8596ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * again back to _finish).
8597ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8598ab35b50311951feea3782151dd5422ee944685c2Elliott HughesOP_CMPG_FLOAT_nan:
8599ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8600ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       OP_CMPG_FLOAT_finish
860171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8602ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
860371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8604ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_CMPL_DOUBLE */
860571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8606ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ Test for NaN with a second comparison.  EABI forbids testing bit
8607ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8608ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ make the library call.
8609ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CMPL_DOUBLE_gt_or_nan:
8610ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmia   r10, {r0-r1}                @ reverse order
8611ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmia   r9, {r2-r3}
8612ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
8613ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bleq    common_abort
8614ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    movcc   r1, #1                      @ (greater than) r1<- 1
8615ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bcc     .LOP_CMPL_DOUBLE_finish
8616ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mvn     r1, #0                            @ r1<- 1 or -1 for NaN
8617ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_CMPL_DOUBLE_finish
861871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8619ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_CMPG_DOUBLE */
862071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8621ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ Test for NaN with a second comparison.  EABI forbids testing bit
8622ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ patterns, and we can't represent 0x7fc00000 in immediate form, so
8623ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ make the library call.
8624ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CMPG_DOUBLE_gt_or_nan:
8625ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmia   r10, {r0-r1}                @ reverse order
8626ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmia   r9, {r2-r3}
8627ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_cdcmple             @ r0<- Z set if eq, C clear if <
8628ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bleq    common_abort
8629ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    movcc   r1, #1                      @ (greater than) r1<- 1
8630ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bcc     .LOP_CMPG_DOUBLE_finish
8631ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, #1                            @ r1<- 1 or -1 for NaN
8632ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_CMPG_DOUBLE_finish
863371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8634ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_CMP_LONG */
863571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8636ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CMP_LONG_less:
8637ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mvn     r1, #0                      @ r1<- -1
8638ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ Want to cond code the next mov so we can avoid branch, but don't see it;
8639ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ instead, we just replicate the tail end.
8640ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8641ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r1, r9)                    @ vAA<- r1
8642ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8643ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
864471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8645ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CMP_LONG_greater:
8646ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, #1                      @ r1<- 1
8647ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ fall through to _finish
864871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8649ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_CMP_LONG_finish:
8650ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8651ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r1, r9)                    @ vAA<- r1
8652ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8653ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
865471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8655ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_AGET_WIDE */
865671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8657ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_AGET_WIDE_finish:
8658ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8659ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
8660ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r9, rFP, r9, lsl #2         @ r9<- &fp[AA]
8661ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8662ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmia   r9, {r2-r3}                 @ vAA/vAA+1<- r2/r3
8663ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
866471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8665ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_APUT_WIDE */
866671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8667ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_APUT_WIDE_finish:
8668ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8669ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmia   r9, {r2-r3}                 @ r2/r3<- vAA/vAA+1
8670ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8671ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    strd    r2, [r0, #offArrayObject_contents]  @ r2/r3<- vBB[vCC]
8672ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
867371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8674ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_APUT_OBJECT */
8675ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8676ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * On entry:
8677ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  rINST = vBB (arrayObj)
8678ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 = vAA (obj)
8679ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 = offset into array (vBB + vCC * width)
8680ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8681ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_APUT_OBJECT_finish:
8682ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ storing null reference?
8683ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     .LOP_APUT_OBJECT_skip_check      @ yes, skip type checks
8684ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r9, #offObject_clazz]  @ r0<- obj->clazz
8685ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [rINST, #offObject_clazz]  @ r1<- arrayObj->clazz
8686ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmCanPutArrayElement       @ test object type vs. array type
8687ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ okay?
8688ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     .LOP_APUT_OBJECT_throw           @ no
8689ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rINST                   @ r1<- arrayObj
8690ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8691ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_cardTable]     @ get biased CT base
8692ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, #offArrayObject_contents   @ r0<- pointer to slot
8693ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8694ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r9, [r10]                   @ vBB[vCC]<- vAA
8695ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    strb    r2, [r2, r1, lsr #GC_CARD_SHIFT] @ mark card using object head
8696ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
8697ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_APUT_OBJECT_skip_check:
8698ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8699ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r9, [r10, #offArrayObject_contents] @ vBB[vCC]<- vAA
8700a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8701ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
8702ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_APUT_OBJECT_throw:
8703ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ The types don't match.  We need to throw an ArrayStoreException.
8704ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r9, #offObject_clazz]
8705ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [rINST, #offObject_clazz]
8706ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()
8707ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmThrowArrayStoreExceptionIncompatibleElement
8708ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown
870971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8710ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IGET */
871171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8712ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8713ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8714ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8715ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8716ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8717ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IGET_finish:
8718ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak0
8719ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8720ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8721ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8722ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8723ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                             @ acquiring load
8724ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
8725ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8726ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
8727ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8728ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r2)                    @ fp[A]<- r0
8729ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
873071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8731ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IGET_WIDE */
873271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8733ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8734ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8735ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8736ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8737ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8738ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IGET_WIDE_finish:
8739ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8740ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8741ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8742ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .if     0
8743ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r0, r9, r3                  @ r0<- address of field
8744ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
8745ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .else
8746ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
8747ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .endif
8748ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
8749ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8750ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
8751ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
8752ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8753ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
8754ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
875571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8756ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IGET_OBJECT */
875771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8758ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8759ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8760ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8761ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8762ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8763ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IGET_OBJECT_finish:
8764ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak0
8765ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8766ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8767ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8768ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8769ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                             @ acquiring load
8770ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
8771ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8772ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
8773ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8774ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r2)                    @ fp[A]<- r0
8775ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
877671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8777ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IGET_BOOLEAN */
877871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8779ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8780ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8781ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8782ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8783ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8784ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IGET_BOOLEAN_finish:
8785ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak1
8786ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8787ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8788ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8789ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8790ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                             @ acquiring load
8791ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
8792ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8793ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
8794ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8795ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r2)                    @ fp[A]<- r0
8796ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
879771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8798ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IGET_BYTE */
879971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8800ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8801ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8802ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8803ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8804ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8805ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IGET_BYTE_finish:
8806ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak2
8807ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8808ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8809ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8810ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8811ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                             @ acquiring load
8812ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
8813ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8814ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
8815ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8816ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r2)                    @ fp[A]<- r0
8817ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
881871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8819ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IGET_CHAR */
882071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8821ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8822ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8823ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8824ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8825ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8826ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IGET_CHAR_finish:
8827ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak3
8828ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8829ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8830ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8831ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8832ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                             @ acquiring load
8833ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
8834ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8835ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
8836ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8837ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r2)                    @ fp[A]<- r0
8838ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
883971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8840ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IGET_SHORT */
884171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8842ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8843ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8844ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8845ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8846ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8847ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IGET_SHORT_finish:
8848ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak4
8849ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8850ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8851ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8852ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
8853ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                             @ acquiring load
8854ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
8855ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8856ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
8857ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8858ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r2)                    @ fp[A]<- r0
8859ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
886071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8861ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IPUT */
886271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8863ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8864ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8865ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8866ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8867ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8868ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IPUT_finish:
8869ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak0
8870ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rINST, lsr #8           @ r1<- A+
8871ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8872ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r1, r1, #15                 @ r1<- A
8873ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8874ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r0, r1)                    @ r0<- fp[A]
8875ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8876ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8877ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                         @ releasing store
8878ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8879ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op
8880a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8881ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
888271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8883ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IPUT_WIDE */
888471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8885ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8886ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8887ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8888ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8889ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8890ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IPUT_WIDE_finish:
8891ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
8892ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8893ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
8894ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8895ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
8896ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8897ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8898ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
8899ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(r10)                @ extract opcode from rINST
8900ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .if     0
8901ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r2, r9, r3                  @ r2<- target address
8902ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
8903ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .else
8904ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
8905ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .endif
8906ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(r10)                    @ jump to next instruction
890771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8908ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IPUT_OBJECT */
890971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8910ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8911ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8912ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8913ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8914ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8915ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IPUT_OBJECT_finish:
8916ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak0
8917ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rINST, lsr #8           @ r1<- A+
8918ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8919ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r1, r1, #15                 @ r1<- A
8920ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8921ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r0, r1)                    @ r0<- fp[A]
8922ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
8923ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8924ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8925ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                         @ releasing store
8926ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
8927ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op
8928a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8929ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ stored a null reference?
8930ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
8931ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
893271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8933ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IPUT_BOOLEAN */
893471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8935ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8936ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8937ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8938ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8939ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8940ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IPUT_BOOLEAN_finish:
8941ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak1
8942ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rINST, lsr #8           @ r1<- A+
8943ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8944ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r1, r1, #15                 @ r1<- A
8945ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8946ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r0, r1)                    @ r0<- fp[A]
8947ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8948ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8949ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                         @ releasing store
8950ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8951ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op
8952a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8953ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
895471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8955ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IPUT_BYTE */
895671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8957ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8958ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8959ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8960ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8961ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8962ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IPUT_BYTE_finish:
8963ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak2
8964ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rINST, lsr #8           @ r1<- A+
8965ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8966ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r1, r1, #15                 @ r1<- A
8967ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8968ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r0, r1)                    @ r0<- fp[A]
8969ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8970ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8971ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                         @ releasing store
8972ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8973ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op
8974a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8975ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
897671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8977ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IPUT_CHAR */
897871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8979ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
8980ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
8981ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
8982ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
8983ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
8984ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IPUT_CHAR_finish:
8985ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak3
8986ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rINST, lsr #8           @ r1<- A+
8987ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
8988ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r1, r1, #15                 @ r1<- A
8989ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
8990ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r0, r1)                    @ r0<- fp[A]
8991ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
8992ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
8993ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                         @ releasing store
8994ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
8995ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op
8996a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
8997ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
899871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
8999ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IPUT_SHORT */
900071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9001ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9002ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
9003ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
9004ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
9005ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9006ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IPUT_SHORT_finish:
9007ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak4
9008ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rINST, lsr #8           @ r1<- A+
9009ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9010ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r1, r1, #15                 @ r1<- A
9011ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
9012ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r0, r1)                    @ r0<- fp[A]
9013ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
9014ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9015ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op                         @ releasing store
9016ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
9017ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op
9018a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9019ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
902071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9021ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SGET */
902271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9023ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9024ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9025ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9026ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9027ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9028ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SGET_resolve:
9029ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9030ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9031ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9032ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9033ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9034ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9035ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9036ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9037ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9038ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9039ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9040ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9041ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9042ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9043ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9044ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9045ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SGET_finish
904671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9047ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SGET_WIDE */
904871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9049ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9050ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9051ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9052ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9053ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *
9054ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Returns StaticField pointer in r0.
9055ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9056ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SGET_WIDE_resolve:
9057ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9058ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9059ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
9060ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9061ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9062ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9063ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9064ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9065ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9066ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9067ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9068ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9069ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9070ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9071ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9072ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9073ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SGET_WIDE_finish          @ resume
907471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9075ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SGET_OBJECT */
907671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9077ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9078ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9079ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9080ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9081ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9082ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SGET_OBJECT_resolve:
9083ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9084ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9085ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9086ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9087ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9088ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9089ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9090ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9091ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9092ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9093ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9094ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9095ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9096ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9097ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9098ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9099ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SGET_OBJECT_finish
910071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9101ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SGET_BOOLEAN */
910271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9103ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9104ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9105ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9106ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9107ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9108ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SGET_BOOLEAN_resolve:
9109ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9110ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9111ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9112ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9113ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9114ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9115ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9116ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9117ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9118ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9119ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9120ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9121ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9122ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9123ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9124ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9125ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SGET_BOOLEAN_finish
912671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9127ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SGET_BYTE */
912871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9129ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9130ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9131ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9132ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9133ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9134ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SGET_BYTE_resolve:
9135ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9136ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9137ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9138ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9139ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9140ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9141ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9142ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9143ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9144ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9145ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9146ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9147ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9148ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9149ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9150ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9151ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SGET_BYTE_finish
915271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9153ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SGET_CHAR */
915471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9155ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9156ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9157ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9158ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9159ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9160ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SGET_CHAR_resolve:
9161ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9162ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9163ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9164ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9165ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9166ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9167ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9168ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9169ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9170ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9171ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9172ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9173ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9174ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9175ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9176ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9177ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SGET_CHAR_finish
917871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9179ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SGET_SHORT */
918071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9181ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9182ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9183ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9184ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9185ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9186ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SGET_SHORT_resolve:
9187ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9188ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9189ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9190ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9191ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9192ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9193ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9194ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9195ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9196ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9197ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9198ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9199ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9200ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9201ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9202ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9203ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SGET_SHORT_finish
920471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9205ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SPUT */
920671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9207ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9208ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9209ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9210ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9211ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9212ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_resolve:
9213ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9214ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9215ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9216ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9217ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9218ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9219ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9220ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9221ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9222ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9223ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9224ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9225ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9226ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9227ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9228ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9229ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SPUT_finish          @ resume
923071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9231ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SPUT_WIDE */
923271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9233ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9234ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9235ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9236ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9:  &fp[AA]
9237ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9238ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *
9239ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Returns StaticField pointer in r2.
9240ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9241ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_WIDE_resolve:
9242ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9243ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9244ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9245ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9246ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9247ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9248ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9249ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9250ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, r0                      @ copy to r2
9251ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9252ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9253ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9254ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9255ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9256ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9257ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9258ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9259ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SPUT_WIDE_finish          @ resume
926071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9261ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SPUT_OBJECT */
926271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
926371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9264ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_OBJECT_end:
9265ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r1, [r0, #offStaticField_value]  @ field<- vAA
9266ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ no-op
9267ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r1, #0                      @ stored a null object?
9268ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
9269ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
927071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9271ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /* Continuation if the field has not yet been resolved.
9272ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r1:  BBBB field ref
9273ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r10: dvmDex->pResFields
9274ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9275ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_OBJECT_resolve:
9276ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9277ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9278ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9279ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9280ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9281ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9282ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9283ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9284ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9285ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9286ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9287ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9288ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9289ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9290ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9291ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9292ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SPUT_OBJECT_finish          @ resume
929371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
929471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9295ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SPUT_BOOLEAN */
929671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9297ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9298ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9299ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9300ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9301ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9302ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_BOOLEAN_resolve:
9303ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9304ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9305ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9306ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9307ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9308ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9309ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9310ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9311ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9312ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9313ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9314ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9315ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9316ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9317ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9318ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9319ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SPUT_BOOLEAN_finish          @ resume
932071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9321ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SPUT_BYTE */
932271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9323ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9324ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9325ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9326ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9327ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9328ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_BYTE_resolve:
9329ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9330ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9331ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9332ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9333ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9334ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9335ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9336ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9337ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9338ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9339ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9340ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9341ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9342ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9343ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9344ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9345ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SPUT_BYTE_finish          @ resume
934671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9347ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SPUT_CHAR */
934871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9349ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9350ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9351ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9352ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9353ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9354ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_CHAR_resolve:
9355ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9356ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9357ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9358ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9359ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9360ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9361ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9362ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9363ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9364ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9365ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9366ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9367ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9368ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9369ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9370ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9371ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SPUT_CHAR_finish          @ resume
937271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9373ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SPUT_SHORT */
937471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9375ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9376ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9377ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9378ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9379ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9380ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_SHORT_resolve:
9381ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9382ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9383ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9384ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9385ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9386ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9387ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9388ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9389ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9390ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9391ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9392ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9393ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9394ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9395ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9396ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9397ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SPUT_SHORT_finish          @ resume
939871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9399ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_INVOKE_VIRTUAL */
940071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9401ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9402ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * At this point:
9403ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 = resolved base method
9404ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
9405ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9406ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_VIRTUAL_continue:
9407ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r9, r10)                   @ r9<- "this" ptr
9408ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9409ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ is "this" null?
9410ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ null "this", throw exception
9411ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
9412ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
9413ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
9414ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_invokeMethodNoRange @ (r0=method, r9="this")
941571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9416ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_INVOKE_SUPER */
941771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9418ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9419ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * At this point:
9420ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 = resolved base method
9421ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 = method->clazz
9422ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9423ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_SUPER_continue:
9424ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
9425ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9426ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
9427ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ must export for invoke
9428ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
9429ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bcs     .LOP_INVOKE_SUPER_nsm             @ method not present in superclass
9430ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
9431ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
9432ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_invokeMethodNoRange @ continue on
943371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9434ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_SUPER_resolve:
9435ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r10                     @ r0<- method->clazz
9436ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9437ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9438ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ got null?
9439ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_INVOKE_SUPER_continue        @ no, continue
9440ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown      @ yes, handle exception
944171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9442ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9443ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Throw a NoSuchMethodError with the method name as the message.
9444ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 = resolved base method
9445ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9446ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_SUPER_nsm:
9447ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
9448ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_errNoSuchMethod
944971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9450ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_INVOKE_DIRECT */
945171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9452ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9453ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * On entry:
9454ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1 = reference (BBBB or CCCC)
9455ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 = "this" register
9456ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9457ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_DIRECT_resolve:
9458ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
9459ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9460ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #METHOD_DIRECT          @ resolver method type
9461ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9462ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ got null?
9463ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_INVOKE_DIRECT_finish          @ no, continue
9464ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown      @ yes, handle exception
946571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9466ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_INVOKE_STATIC */
946771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
946871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9469ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_STATIC_resolve:
9470ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
9471ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9472ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #METHOD_STATIC          @ resolver method type
9473ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9474ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ got null?
9475ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9476ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9477ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Check to see if we're actively building a trace.  If so,
9478ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * we need to keep this instruction out of it.
9479ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r10: &resolved_methodToCall
9480ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9481ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrh    r2, [rSELF, #offThread_subMode]
9482ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown            @ null, handle exception
9483ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
9484ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_invokeMethodNoRange     @ no (r0=method, r9="this")
9485ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [r10]                         @ reload resolved method
9486ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r1, #0                            @ finished resolving?
9487ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     common_invokeMethodNoRange     @ yes (r0=method, r9="this")
9488ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r10, r0                           @ preserve method
9489ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, rSELF
9490ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rPC
9491ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmJitEndTraceSelect              @ (self, pc)
9492ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r10
9493ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_invokeMethodNoRange     @ whew, finally!
9494ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#else
9495ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     common_invokeMethodNoRange     @ (r0=method, r9="this")
9496ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown            @ yes, handle exception
9497ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
949871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9499ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_INVOKE_VIRTUAL_RANGE */
950071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9501ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9502ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * At this point:
9503ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 = resolved base method
9504ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 = C or CCCC (index of first arg, which is the "this" ptr)
9505ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9506ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_VIRTUAL_RANGE_continue:
9507ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r9, r10)                   @ r9<- "this" ptr
9508ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9509ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ is "this" null?
9510ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ null "this", throw exception
9511ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r9, #offObject_clazz]  @ r3<- thisPtr->clazz
9512ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r3, #offClassObject_vtable]    @ r3<- thisPtr->clazz->vtable
9513ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r3, r2, lsl #2]        @ r3<- vtable[methodIndex]
9514ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_invokeMethodRange @ (r0=method, r9="this")
951571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9516ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_INVOKE_SUPER_RANGE */
951771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9518ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9519ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * At this point:
9520ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 = resolved base method
9521ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 = method->clazz
9522ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9523ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_SUPER_RANGE_continue:
9524ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [r10, #offClassObject_super]    @ r1<- method->clazz->super
9525ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrh    r2, [r0, #offMethod_methodIndex]    @ r2<- baseMethod->methodIndex
9526ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r1, #offClassObject_vtableCount]   @ r3<- super->vtableCount
9527ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ must export for invoke
9528ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r2, r3                      @ compare (methodIndex, vtableCount)
9529ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bcs     .LOP_INVOKE_SUPER_RANGE_nsm             @ method not present in superclass
9530ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [r1, #offClassObject_vtable]    @ r1<- ...clazz->super->vtable
9531ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r1, r2, lsl #2]        @ r3<- vtable[methodIndex]
9532ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_invokeMethodRange @ continue on
953371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9534ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_SUPER_RANGE_resolve:
9535ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r10                     @ r0<- method->clazz
9536ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #METHOD_VIRTUAL         @ resolver method type
9537ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9538ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ got null?
9539ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_INVOKE_SUPER_RANGE_continue        @ no, continue
9540ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown      @ yes, handle exception
954171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9542ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9543ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Throw a NoSuchMethodError with the method name as the message.
9544ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 = resolved base method
9545ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9546ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_SUPER_RANGE_nsm:
9547ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [r0, #offMethod_name]   @ r1<- method name
9548ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_errNoSuchMethod
954971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9550ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_INVOKE_DIRECT_RANGE */
955171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9552ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9553ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * On entry:
9554ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1 = reference (BBBB or CCCC)
9555ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 = "this" register
9556ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9557ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_DIRECT_RANGE_resolve:
9558ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
9559ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9560ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #METHOD_DIRECT          @ resolver method type
9561ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9562ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ got null?
9563ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     .LOP_INVOKE_DIRECT_RANGE_finish          @ no, continue
9564ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown      @ yes, handle exception
956571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9566ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_INVOKE_STATIC_RANGE */
956771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
956871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9569ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_STATIC_RANGE_resolve:
9570ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [rSELF, #offThread_method] @ r3<- self->method
9571ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r3, #offMethod_clazz]  @ r0<- method->clazz
9572ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #METHOD_STATIC          @ resolver method type
9573ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveMethod            @ r0<- call(clazz, ref, flags)
9574ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ got null?
9575ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9576ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9577ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Check to see if we're actively building a trace.  If so,
9578ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * we need to keep this instruction out of it.
9579ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r10: &resolved_methodToCall
9580ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9581ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrh    r2, [rSELF, #offThread_subMode]
9582ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown            @ null, handle exception
9583ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ands    r2, #kSubModeJitTraceBuild        @ trace under construction?
9584ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_invokeMethodRange     @ no (r0=method, r9="this")
9585ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [r10]                         @ reload resolved method
9586ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r1, #0                            @ finished resolving?
9587ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     common_invokeMethodRange     @ yes (r0=method, r9="this")
9588ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r10, r0                           @ preserve method
9589ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, rSELF
9590ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rPC
9591ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmJitEndTraceSelect              @ (self, pc)
9592ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r10
9593ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_invokeMethodRange     @ whew, finally!
9594ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#else
9595ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     common_invokeMethodRange     @ (r0=method, r9="this")
9596ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       common_exceptionThrown            @ yes, handle exception
9597ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
959871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9599ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_FLOAT_TO_LONG */
9600ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/*
9601ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes * Convert the float in r0 to a long in r0/r1.
9602ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes *
9603ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes * We have to clip values to long min/max per the specification.  The
9604ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes * expected common case is a "reasonable" value that converts directly
9605ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes * to modest integer.  The EABI convert function isn't doing this for us.
9606ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes */
9607ab35b50311951feea3782151dd5422ee944685c2Elliott Hughesf2l_doconv:
9608ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmfd   sp!, {r4, lr}
9609ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, #0x5f000000             @ (float)maxlong
9610ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r4, r0
9611ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_fcmpge              @ is arg >= maxlong?
9612ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ nonzero == yes
9613ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mvnne   r0, #0                      @ return maxlong (7fffffff)
9614ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mvnne   r1, #0x80000000
9615ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmnefd sp!, {r4, pc}
961671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9617ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r4                      @ recover arg
9618ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, #0xdf000000             @ (float)minlong
9619ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_fcmple              @ is arg <= minlong?
9620ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ nonzero == yes
9621ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    movne   r0, #0                      @ return minlong (80000000)
9622ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    movne   r1, #0x80000000
9623ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmnefd sp!, {r4, pc}
962471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9625ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r4                      @ recover arg
9626ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r4
9627ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_fcmpeq              @ is arg == self?
9628ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ zero == no
9629ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    moveq   r1, #0                      @ return zero for NaN
9630ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmeqfd sp!, {r4, pc}
963171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9632ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r4                      @ recover arg
9633ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_f2lz                @ convert float to long
9634ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmfd   sp!, {r4, pc}
963571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9636ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_DOUBLE_TO_LONG */
9637ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/*
9638ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes * Convert the double in r0/r1 to a long in r0/r1.
9639ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes *
9640ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes * We have to clip values to long min/max per the specification.  The
9641ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes * expected common case is a "reasonable" value that converts directly
9642ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes * to modest integer.  The EABI convert function isn't doing this for us.
9643ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes */
9644ab35b50311951feea3782151dd5422ee944685c2Elliott Hughesd2l_doconv:
9645ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmfd   sp!, {r4, r5, lr}           @ save regs
9646ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r3, #0x43000000             @ maxlong, as a double (high word)
9647ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r3, #0x00e00000             @  0x43e00000
9648ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #0                      @ maxlong, as a double (low word)
9649ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    sub     sp, sp, #4                  @ align for EABI
9650ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r4, r0                      @ save a copy of r0
9651ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r5, r1                      @  and r1
9652ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_dcmpge              @ is arg >= maxlong?
9653ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ nonzero == yes
9654ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mvnne   r0, #0                      @ return maxlong (7fffffffffffffff)
9655ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mvnne   r1, #0x80000000
9656ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     1f
965771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9658ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r4                      @ recover arg
9659ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r5
9660ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r3, #0xc3000000             @ minlong, as a double (high word)
9661ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r3, #0x00e00000             @  0xc3e00000
9662ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, #0                      @ minlong, as a double (low word)
9663ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_dcmple              @ is arg <= minlong?
9664ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ nonzero == yes
9665ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    movne   r0, #0                      @ return minlong (8000000000000000)
9666ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    movne   r1, #0x80000000
9667ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     1f
966871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9669ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r4                      @ recover arg
9670ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r5
9671ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, r4                      @ compare against self
9672ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r3, r5
9673ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_dcmpeq              @ is arg == self?
9674ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ zero == no
9675ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    moveq   r1, #0                      @ return zero for NaN
9676ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     1f
967771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9678ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r4                      @ recover arg
9679ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r5
9680ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      __aeabi_d2lz                @ convert double to long
968171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9682ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes1:
9683ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     sp, sp, #4
9684ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmfd   sp!, {r4, r5, pc}
968571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9686ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_MUL_LONG */
968771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9688ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_MUL_LONG_finish:
9689ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9690ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmia   r0, {r9-r10}                @ vAA/vAA+1<- r9/r10
9691ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
969271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9693ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SHL_LONG */
969471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9695ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SHL_LONG_finish:
9696ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r0, asl r2              @  r0<- r0 << r2
9697ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9698ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9699ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
970071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9701ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SHR_LONG */
970271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9703ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SHR_LONG_finish:
9704ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r1, asr r2              @  r1<- r1 >> r2
9705ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9706ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9707ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
970871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9709ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_USHR_LONG */
971071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9711ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_USHR_LONG_finish:
9712ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, r1, lsr r2              @  r1<- r1 >>> r2
9713ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9714ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9715ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
971671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9717ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SHL_LONG_2ADDR */
971871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9719ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SHL_LONG_2ADDR_finish:
9720ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9721ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9722ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
972371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9724ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SHR_LONG_2ADDR */
972571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9726ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SHR_LONG_2ADDR_finish:
9727ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9728ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9729ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
973071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9731ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_USHR_LONG_2ADDR */
973271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9733ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_USHR_LONG_2ADDR_finish:
9734ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9735ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmia   r9, {r0-r1}                 @ vAA/vAA+1<- r0/r1
9736ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
973771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9738ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IGET_VOLATILE */
973971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9740ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9741ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
9742ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
9743ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
9744ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9745ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IGET_VOLATILE_finish:
9746ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak0
9747ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
9748ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9749ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
9750ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
9751ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SMP_DMB                            @ acquiring load
9752ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
9753ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9754ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
9755ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9756ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r2)                    @ fp[A]<- r0
9757ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
975871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9759ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IPUT_VOLATILE */
976071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9761ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9762ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
9763ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
9764ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
9765ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9766ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IPUT_VOLATILE_finish:
9767ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak0
9768ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rINST, lsr #8           @ r1<- A+
9769ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9770ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r1, r1, #15                 @ r1<- A
9771ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
9772ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r0, r1)                    @ r0<- fp[A]
9773ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
9774ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9775ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SMP_DMB_ST                        @ releasing store
9776ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str  r0, [r9, r3]                @ obj.field (8/16/32 bits)<- r0
9777ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SMP_DMB
9778a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9779ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
978071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9781ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SGET_VOLATILE */
978271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9783ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9784ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9785ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9786ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9787ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9788ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SGET_VOLATILE_resolve:
9789ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9790ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9791ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9792ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9793ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9794ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9795ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9796ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9797ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9798ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9799ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9800ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9801ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9802ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9803ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9804ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9805ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SGET_VOLATILE_finish
980671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9807ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SPUT_VOLATILE */
980871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9809ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9810ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9811ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9812ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9813ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9814ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_VOLATILE_resolve:
9815ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9816ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9817ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9818ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9819ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9820ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9821ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9822ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9823ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9824ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9825ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9826ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9827ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9828ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9829ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9830ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9831ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SPUT_VOLATILE_finish          @ resume
983271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9833ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IGET_OBJECT_VOLATILE */
983471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9835ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9836ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
9837ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
9838ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
9839ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9840ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IGET_OBJECT_VOLATILE_finish:
9841ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak0
9842ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
9843ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9844ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
9845ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr   r0, [r9, r3]                @ r0<- obj.field (8/16/32 bits)
9846ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SMP_DMB                            @ acquiring load
9847ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
9848ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9849ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
9850ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9851ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SET_VREG(r0, r2)                    @ fp[A]<- r0
9852ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
985371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9854ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IGET_WIDE_VOLATILE */
985571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9856ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9857ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
9858ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
9859ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
9860ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9861ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IGET_WIDE_VOLATILE_finish:
9862ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
9863ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9864ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
9865ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .if     1
9866ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r0, r9, r3                  @ r0<- address of field
9867ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmQuasiAtomicRead64        @ r0/r1<- contents of field
9868ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .else
9869ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldrd    r0, [r9, r3]                @ r0/r1<- obj.field (64-bit align ok)
9870ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .endif
9871ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
9872ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9873ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
9874ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r3, rFP, r2, lsl #2         @ r3<- &fp[A]
9875ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
9876ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    stmia   r3, {r0-r1}                 @ fp[A]<- r0/r1
9877ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
987871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9879ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IPUT_WIDE_VOLATILE */
988071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9881ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9882ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
9883ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
9884ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
9885ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9886ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IPUT_WIDE_VOLATILE_finish:
9887ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, rINST, lsr #8           @ r2<- A+
9888ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
9889ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r2, r2, #15                 @ r2<- A
9890ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
9891ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r2, rFP, r2, lsl #2         @ r3<- &fp[A]
9892ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
9893ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
9894ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldmia   r2, {r0-r1}                 @ r0/r1<- fp[A]
9895ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(r10)                @ extract opcode from rINST
9896ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .if     1
9897ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r2, r9, r3                  @ r2<- target address
9898ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmQuasiAtomicSwap64Sync    @ stores r0/r1 into addr r2
9899ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .else
9900ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    strd    r0, [r9, r3]                @ obj.field (64 bits, aligned)<- r0/r1
9901ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .endif
9902ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(r10)                    @ jump to next instruction
990371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9904ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SGET_WIDE_VOLATILE */
990571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9906ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9907ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9908ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9909ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9910ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *
9911ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Returns StaticField pointer in r0.
9912ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9913ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SGET_WIDE_VOLATILE_resolve:
9914ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9915ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9916ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r1<- &dvmDex->pResFields[field]
9917ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9918ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9919ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9920ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9921ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9922ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9923ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9924ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9925ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9926ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9927ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9928ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9929ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9930ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SGET_WIDE_VOLATILE_finish          @ resume
993171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9932ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SPUT_WIDE_VOLATILE */
993371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9934ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9935ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
9936ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
9937ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9:  &fp[AA]
9938ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
9939ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *
9940ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Returns StaticField pointer in r2.
9941ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9942ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_WIDE_VOLATILE_resolve:
9943ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
9944ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9945ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
9946ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9947ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
9948ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
9949ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
9950ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
9951ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r2, r0                      @ copy to r2
9952ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
9953ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
9954ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9955ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
9956ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
9957ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9958ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
9959ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
9960ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SPUT_WIDE_VOLATILE_finish          @ resume
996171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9962ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_EXECUTE_INLINE */
996371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9964ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9965ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Extract args, call function.
9966ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 = #of args (0-4)
9967ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 = call index
9968ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
9969ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *
9970ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Other ideas:
9971ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * - Use a jump table from the main piece to jump directly into the
9972ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *   AND/LDR pairs.  Costs a data load, saves a branch.
9973ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * - Have five separate pieces that do the loading, so we can work the
9974ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *   interleave a little better.  Increases code size.
9975ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9976ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_EXECUTE_INLINE_continue:
9977ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    rsb     r0, r0, #4                  @ r0<- 4-r0
9978ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH(rINST, 2)                     @ rINST<- FEDC
9979ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
9980ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_abort                @ (skipped due to ARM prefetch)
9981ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes4:  and     ip, rINST, #0xf000          @ isolate F
9982ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [rFP, ip, lsr #10]      @ r3<- vF (shift right 12, left 2)
9983ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes3:  and     ip, rINST, #0x0f00          @ isolate E
9984ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vE
9985ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes2:  and     ip, rINST, #0x00f0          @ isolate D
9986ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [rFP, ip, lsr #2]       @ r1<- vD
9987ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes1:  and     ip, rINST, #0x000f          @ isolate C
9988ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [rFP, ip, lsl #2]       @ r0<- vC
9989ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes0:
9990ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     rINST, .LOP_EXECUTE_INLINE_table    @ table of InlineOperation
99915dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel5:  add     rINST, pc
9992ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     pc, [rINST, r10, lsl #4]    @ sizeof=16, "func" is first entry
9993ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ (not reached)
999471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
9995ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
9996ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * We're debugging or profiling.
9997ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r10: opIndex
9998ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
9999ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_EXECUTE_INLINE_debugmode:
10000ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r10
10001ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveInlineNative
10002ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ did it resolve?
10003ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     .LOP_EXECUTE_INLINE_resume          @ no, just move on
10004ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r9, r0                      @ remember method
10005ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rSELF
10006ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmFastMethodTraceEnter     @ (method, self)
10007ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
10008ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    sub     sp, sp, #8                  @ make room for arg, +64 bit align
10009ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, rINST, lsr #12          @ r0<- B
10010ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r1, [sp]                    @ push &self->retval
10011ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      .LOP_EXECUTE_INLINE_continue        @ make call; will return after
10012ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     rINST, r0                   @ save result of inline
10013ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     sp, sp, #8                  @ pop stack
10014ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r9                      @ r0<- method
10015ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rSELF
10016ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmFastNativeMethodTraceExit @ (method, self)
10017ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     rINST, #0                   @ test boolean result of inline
10018ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ returned false, handle exception
10019ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
10020ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10021ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
1002271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
1002371eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
1002471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
1002571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10026ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_EXECUTE_INLINE_table:
100275dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(gDvmInlineOpsTable,5b)
1002871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10029ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_EXECUTE_INLINE_RANGE */
1003071eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10031ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
10032ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Extract args, call function.
10033ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 = #of args (0-4)
10034ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10 = call index
10035ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  lr = return addr, above  [DO NOT bl out of here w/o preserving LR]
10036ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
10037ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_EXECUTE_INLINE_RANGE_continue:
10038ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    rsb     r0, r0, #4                  @ r0<- 4-r0
10039ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH(r9, 2)                        @ r9<- CCCC
10040ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     pc, pc, r0, lsl #3          @ computed goto, 2 instrs each
10041ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_abort                @ (skipped due to ARM prefetch)
10042ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes4:  add     ip, r9, #3                  @ base+3
10043ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r3, ip)                    @ r3<- vBase[3]
10044ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes3:  add     ip, r9, #2                  @ base+2
10045ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r2, ip)                    @ r2<- vBase[2]
10046ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes2:  add     ip, r9, #1                  @ base+1
10047ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r1, ip)                    @ r1<- vBase[1]
10048ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes1:  add     ip, r9, #0                  @ (nop)
10049ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r0, ip)                    @ r0<- vBase[0]
10050ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes0:
10051ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r9, .LOP_EXECUTE_INLINE_RANGE_table       @ table of InlineOperation
100525dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel5:  add     r9, pc
10053ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     pc, [r9, r10, lsl #4]       @ sizeof=16, "func" is first entry
10054ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @ (not reached)
1005571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
1005671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10057ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
10058ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * We're debugging or profiling.
10059ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r10: opIndex
10060ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
10061ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_EXECUTE_INLINE_RANGE_debugmode:
10062ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, r10
10063ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveInlineNative
10064ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ did it resolve?
10065ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     .LOP_EXECUTE_INLINE_RANGE_resume          @ no, just move on
10066ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r9, r0                      @ remember method
10067ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rSELF
10068ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmFastMethodTraceEnter     @ (method, self)
10069ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r1, rSELF, #offThread_retval@ r1<- &self->retval
10070ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    sub     sp, sp, #8                  @ make room for arg, +64 bit align
10071ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, rINST, lsr #8           @ r0<- B
10072ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     rINST, r9                   @ rINST<- method
10073ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r1, [sp]                    @ push &self->retval
10074ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      .LOP_EXECUTE_INLINE_RANGE_continue        @ make call; will return after
10075ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r9, r0                      @ save result of inline
10076ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     sp, sp, #8                  @ pop stack
10077ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r0, rINST                   @ r0<- method
10078ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rSELF
10079ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmFastNativeMethodTraceExit  @ (method, self)
10080ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ test boolean result of inline
10081ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ returned false, handle exception
10082ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
10083ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10084ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
1008571eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
1008671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
1008771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
1008871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10089ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_EXECUTE_INLINE_RANGE_table:
100905dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(gDvmInlineOpsTable,5b)
1009171eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
1009271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10093ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_INVOKE_OBJECT_INIT_RANGE */
1009471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10095ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_OBJECT_INIT_RANGE_setFinal:
10096ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ can throw
10097ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmSetFinalizable           @ call dvmSetFinalizable(obj)
10098ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [rSELF, #offThread_exception] @ r0<- self->exception
10099ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ exception pending?
10100ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bne     common_exceptionThrown      @ yes, handle it
10101ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_INVOKE_OBJECT_INIT_RANGE_finish
1010271eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10103ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
10104ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * A debugger is attached, so we need to go ahead and do
10105ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * this.  For simplicity, we'll just jump directly to the
10106ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * corresponding handler.  Note that we can't use
10107ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * rIBASE here because it may be in single-step mode.
10108ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Load the primary table base directly.
10109ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
10110ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_INVOKE_OBJECT_INIT_RANGE_debugger:
10111ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r1, [rSELF, #offThread_mainHandlerTable]
10112ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     ip, #OP_INVOKE_DIRECT_RANGE
10113ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE_BASE(r1,ip)             @ execute it
1011471eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10115ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_IPUT_OBJECT_VOLATILE */
1011671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10117ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
10118ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Currently:
10119ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r0 holds resolved field
10120ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r9 holds object
10121ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
10122ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_IPUT_OBJECT_VOLATILE_finish:
10123ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    @bl      common_squeak0
10124ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    mov     r1, rINST, lsr #8           @ r1<- A+
10125ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r3, [r0, #offInstField_byteOffset]  @ r3<- byte offset of field
10126ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    and     r1, r1, #15                 @ r1<- A
10127ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r9, #0                      @ check object for null
10128ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GET_VREG(r0, r1)                    @ r0<- fp[A]
10129ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_cardTable]  @ r2<- card table base
10130ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_errNullObject        @ object was null
10131ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    FETCH_ADVANCE_INST(2)               @ advance rPC, load rINST
10132ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SMP_DMB_ST                        @ releasing store
10133ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r0, [r9, r3]                @ obj.field (32 bits)<- r0
10134ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SMP_DMB
10135a4cc6962da7e71f071f37579d8c011eb4405c36cYou Kim    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
10136ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ stored a null reference?
10137ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card if not
10138ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
1013971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao
10140ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SGET_OBJECT_VOLATILE */
10141a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10142ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
10143ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * Continuation if the field has not yet been resolved.
10144ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r1:  BBBB field ref
10145ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     *  r10: dvmDex->pResFields
10146ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
10147ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SGET_OBJECT_VOLATILE_resolve:
10148ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10149ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
10150ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
10151ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
10152ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
10153ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10154ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
10155ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
10156ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
10157ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
10158ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
10159ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
10160ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
10161ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
10162ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
10163ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
10164ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SGET_OBJECT_VOLATILE_finish
10165a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10166ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes/* continuation for OP_SPUT_OBJECT_VOLATILE */
10167a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10168a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10169ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_OBJECT_VOLATILE_end:
10170ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    str     r1, [r0, #offStaticField_value]  @ field<- vAA
10171ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    SMP_DMB
10172ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r1, #0                      @ stored a null object?
10173ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    strneb  r2, [r2, r9, lsr #GC_CARD_SHIFT]  @ mark card based on obj head
10174ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    GOTO_OPCODE(ip)                     @ jump to next instruction
10175a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10176ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /* Continuation if the field has not yet been resolved.
10177ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r1:  BBBB field ref
10178ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * r10: dvmDex->pResFields
10179ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
10180ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.LOP_SPUT_OBJECT_VOLATILE_resolve:
10181ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r2, [rSELF, #offThread_method]    @ r2<- current method
10182ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
10183ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    add     r10, r10, r1, lsl #2        @ r10<- &dvmDex->pResFields[field]
10184ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
10185ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    EXPORT_PC()                         @ resolve() could throw, so export now
10186ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    ldr     r0, [r2, #offMethod_clazz]  @ r0<- method->clazz
10187ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      dvmResolveStaticField       @ r0<- resolved StaticField ptr
10188ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    cmp     r0, #0                      @ success?
10189ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    beq     common_exceptionThrown      @ no, handle exception
10190ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#if defined(WITH_JIT)
10191ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    /*
10192ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * If the JIT is actively building a trace we need to make sure
10193ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     * that the field is fully resolved before including this instruction.
10194ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes     */
10195ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    bl      common_verifyField
10196ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes#endif
10197ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    b       .LOP_SPUT_OBJECT_VOLATILE_finish          @ resume
10198a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10199a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10200ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .size   dvmAsmSisterStart, .-dvmAsmSisterStart
10201ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .global dvmAsmSisterEnd
10202ab35b50311951feea3782151dd5422ee944685c2Elliott HughesdvmAsmSisterEnd:
10203a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
1020497b22b8d41742fa84812f46d1125e9735420782abuzbee
10205ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .global dvmAsmAltInstructionStart
10206ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .type   dvmAsmAltInstructionStart, %function
10207ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    .text
10208a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10209ab35b50311951feea3782151dd5422ee944685c2Elliott HughesdvmAsmAltInstructionStart = .L_ALT_OP_NOP
10210a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10211a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10212ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_NOP: /* 0x00 */
102133d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10214a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
102159a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10216a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
102179a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
102189a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
102199a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
102209a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10221a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
102229a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10223ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (0 * 64)
102249a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
102259a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
102269a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
102279a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10228a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
102299a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
102309a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
102319a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10232a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10233a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10234a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10235ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE: /* 0x01 */
102363d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10237a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
102389a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10239a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
102409a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
102419a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
102429a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
102439a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10244a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
102459a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10246ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (1 * 64)
102479a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
102489a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
102499a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
102509a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10251a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
102529a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
102539a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
102549a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10255a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10256a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10257a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10258ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_FROM16: /* 0x02 */
102593d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10260a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
102619a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10262a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
102639a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
102649a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
102659a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
102669a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10267a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
102689a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10269ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (2 * 64)
102709a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
102719a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
102729a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
102739a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10274a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
102759a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
102769a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
102779a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10278a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10279a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10280a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10281ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_16: /* 0x03 */
102823d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10283a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
102849a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10285a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
102869a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
102879a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
102889a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
102899a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10290a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
102919a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10292ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (3 * 64)
102939a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
102949a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
102959a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
102969a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10297a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
102989a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
102999a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
103009a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10301a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10302a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10303a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10304ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_WIDE: /* 0x04 */
103053d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10306a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
103079a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10308a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
103099a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
103109a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
103119a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
103129a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10313a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
103149a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10315ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (4 * 64)
103169a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
103179a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
103189a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
103199a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10320a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
103219a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
103229a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
103239a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10324a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10325a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10326a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10327ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_WIDE_FROM16: /* 0x05 */
103283d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10329a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
103309a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10331a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
103329a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
103339a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
103349a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
103359a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10336a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
103379a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10338ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (5 * 64)
103399a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
103409a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
103419a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
103429a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10343a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
103449a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
103459a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
103469a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10347a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10348a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10349a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10350ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_WIDE_16: /* 0x06 */
103513d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10352a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
103539a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10354a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
103559a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
103569a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
103579a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
103589a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10359a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
103609a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10361ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (6 * 64)
103629a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
103639a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
103649a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
103659a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10366a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
103679a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
103689a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
103699a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10370a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10371a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10372a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10373ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_OBJECT: /* 0x07 */
103743d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10375a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
103769a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10377a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
103789a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
103799a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
103809a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
103819a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10382a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
103839a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10384ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (7 * 64)
103859a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
103869a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
103879a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
103889a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10389a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
103909a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
103919a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
103929a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10393a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10394a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10395a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10396ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_OBJECT_FROM16: /* 0x08 */
103973d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10398a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
103999a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10400a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
104019a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
104029a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
104039a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
104049a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10405a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
104069a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10407ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (8 * 64)
104089a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
104099a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
104109a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
104119a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10412a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
104139a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
104149a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
104159a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10416a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10417a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10418a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10419ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_OBJECT_16: /* 0x09 */
104203d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10421a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
104229a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10423a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
104249a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
104259a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
104269a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
104279a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10428a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
104299a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10430ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (9 * 64)
104319a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
104329a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
104339a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
104349a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10435a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
104369a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
104379a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
104389a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10439a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10440a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10441a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10442ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_RESULT: /* 0x0a */
104433d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10444a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
104459a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10446a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
104479a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
104489a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
104499a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
104509a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10451a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
104529a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10453ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (10 * 64)
104549a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
104559a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
104569a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
104579a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10458a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
104599a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
104609a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
104619a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10462a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10463a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10464a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10465ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_RESULT_WIDE: /* 0x0b */
104663d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10467a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
104689a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10469a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
104709a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
104719a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
104729a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
104739a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10474a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
104759a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10476ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (11 * 64)
104779a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
104789a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
104799a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
104809a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10481a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
104829a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
104839a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
104849a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10485a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10486a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10487a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10488ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_RESULT_OBJECT: /* 0x0c */
104893d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10490a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
104919a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10492a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
104939a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
104949a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
104959a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
104969a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10497a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
104989a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10499ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (12 * 64)
105009a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
105019a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
105029a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
105039a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10504a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
105059a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
105069a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
105079a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10508a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10509a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10510a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10511ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MOVE_EXCEPTION: /* 0x0d */
105123d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10513a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
105149a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10515a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
105169a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
105179a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
105189a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
105199a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10520a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
105219a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10522ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (13 * 64)
105239a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
105249a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
105259a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
105269a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10527a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
105289a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
105299a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
105309a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10531a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10532a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10533a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10534ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_RETURN_VOID: /* 0x0e */
105353d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10536a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
105379a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10538a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
105399a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
105409a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
105419a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
105429a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10543a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
105449a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10545ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (14 * 64)
105469a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
105479a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
105489a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
105499a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10550a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
105519a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
105529a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
105539a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10554a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10555a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10556a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10557ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_RETURN: /* 0x0f */
105583d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10559a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
105609a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10561a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
105629a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
105639a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
105649a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
105659a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10566a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
105679a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10568ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (15 * 64)
105699a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
105709a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
105719a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
105729a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10573a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
105749a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
105759a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
105769a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10577a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10578a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10579a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10580ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_RETURN_WIDE: /* 0x10 */
105813d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10582a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
105839a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10584a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
105859a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
105869a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
105879a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
105889a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10589a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
105909a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10591ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (16 * 64)
105929a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
105939a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
105949a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
105959a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10596a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
105979a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
105989a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
105999a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10600a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10601a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10602a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10603ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_RETURN_OBJECT: /* 0x11 */
106043d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10605a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
106069a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10607a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
106089a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
106099a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
106109a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
106119a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10612a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
106139a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10614ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (17 * 64)
106159a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
106169a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
106179a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
106189a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10619a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
106209a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
106219a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
106229a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10623a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10624a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10625a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10626ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST_4: /* 0x12 */
106273d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10628a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
106299a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10630a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
106319a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
106329a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
106339a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
106349a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10635a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
106369a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10637ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (18 * 64)
106389a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
106399a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
106409a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
106419a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10642a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
106439a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
106449a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
106459a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10646a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10647a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10648a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10649ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST_16: /* 0x13 */
106503d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10651a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
106529a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10653a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
106549a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
106559a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
106569a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
106579a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10658a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
106599a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10660ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (19 * 64)
106619a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
106629a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
106639a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
106649a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10665a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
106669a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
106679a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
106689a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10669a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10670a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10671a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10672ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST: /* 0x14 */
106733d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10674a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
106759a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10676a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
106779a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
106789a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
106799a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
106809a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10681a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
106829a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10683ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (20 * 64)
106849a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
106859a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
106869a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
106879a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10688a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
106899a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
106909a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
106919a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10692a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10693a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10694a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10695ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST_HIGH16: /* 0x15 */
106963d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10697a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
106989a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10699a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
107009a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
107019a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
107029a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
107039a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10704a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
107059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10706ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (21 * 64)
107079a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
107089a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
107099a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
107109a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10711a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
107129a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
107139a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
107149a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10715a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10716a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10717a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10718ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST_WIDE_16: /* 0x16 */
107193d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10720a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
107219a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10722a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
107239a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
107249a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
107259a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
107269a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10727a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
107289a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10729ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (22 * 64)
107309a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
107319a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
107329a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
107339a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10734a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
107359a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
107369a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
107379a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10738a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10739a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10740a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10741ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST_WIDE_32: /* 0x17 */
107423d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10743a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
107449a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10745a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
107469a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
107479a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
107489a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
107499a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10750a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
107519a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10752ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (23 * 64)
107539a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
107549a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
107559a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
107569a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10757a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
107589a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
107599a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
107609a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10761a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10762a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10763a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10764ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST_WIDE: /* 0x18 */
107653d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10766a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
107679a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10768a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
107699a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
107709a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
107719a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
107729a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10773a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
107749a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10775ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (24 * 64)
107769a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
107779a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
107789a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
107799a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10780a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
107819a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
107829a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
107839a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10784a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10785a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10786a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10787ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST_WIDE_HIGH16: /* 0x19 */
107883d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10789a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
107909a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10791a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
107929a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
107939a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
107949a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
107959a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10796a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
107979a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10798ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (25 * 64)
107999a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
108009a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
108019a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
108029a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10803a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
108049a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
108059a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
108069a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10807a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10808a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10809a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10810ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST_STRING: /* 0x1a */
108113d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10812a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
108139a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10814a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
108159a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
108169a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
108179a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
108189a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10819a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
108209a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10821ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (26 * 64)
108229a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
108239a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
108249a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
108259a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10826a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
108279a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
108289a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
108299a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10830a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10831a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10832a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10833ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST_STRING_JUMBO: /* 0x1b */
108343d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10835a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
108369a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10837a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
108389a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
108399a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
108409a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
108419a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10842a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
108439a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10844ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (27 * 64)
108459a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
108469a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
108479a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
108489a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10849a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
108509a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
108519a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
108529a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10853a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10854a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10855a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10856ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CONST_CLASS: /* 0x1c */
108573d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10858a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
108599a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10860a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
108619a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
108629a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
108639a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
108649a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10865a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
108669a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10867ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (28 * 64)
108689a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
108699a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
108709a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
108719a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10872a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
108739a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
108749a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
108759a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10876a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10877a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10878a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10879ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MONITOR_ENTER: /* 0x1d */
108803d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10881a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
108829a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10883a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
108849a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
108859a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
108869a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
108879a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10888a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
108899a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10890ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (29 * 64)
108919a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
108929a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
108939a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
108949a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10895a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
108969a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
108979a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
108989a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10899a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10900a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10901a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10902ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MONITOR_EXIT: /* 0x1e */
109033d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10904a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
109059a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10906a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
109079a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
109089a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
109099a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
109109a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10911a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
109129a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10913ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (30 * 64)
109149a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
109159a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
109169a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
109179a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10918a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
109199a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
109209a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
109219a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10922a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10923a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10924a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10925ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CHECK_CAST: /* 0x1f */
109263d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10927a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
109289a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10929a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
109309a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
109319a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
109329a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
109339a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10934a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
109359a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10936ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (31 * 64)
109379a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
109389a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
109399a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
109409a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10941a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
109429a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
109439a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
109449a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10945a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10946a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10947a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10948ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INSTANCE_OF: /* 0x20 */
109493d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10950a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
109519a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10952a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
109539a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
109549a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
109559a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
109569a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10957a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
109589a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10959ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (32 * 64)
109609a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
109619a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
109629a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
109639a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10964a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
109659a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
109669a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
109679a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10968a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10969a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10970a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10971ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ARRAY_LENGTH: /* 0x21 */
109723d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10973a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
109749a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10975a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
109769a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
109779a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
109789a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
109799a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
10980a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
109819a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
10982ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (33 * 64)
109839a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
109849a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
109859a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
109869a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
10987a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
109889a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
109899a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
109909a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
10991a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
10992a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
10993a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
10994ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_NEW_INSTANCE: /* 0x22 */
109953d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
10996a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
109979a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
10998a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
109999a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
110009a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
110019a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
110029a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11003a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
110049a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11005ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (34 * 64)
110069a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
110079a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
110089a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
110099a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11010a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
110119a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
110129a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
110139a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11014a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11015a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11016a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11017ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_NEW_ARRAY: /* 0x23 */
110183d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11019a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
110209a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11021a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
110229a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
110239a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
110249a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
110259a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11026a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
110279a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11028ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (35 * 64)
110299a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
110309a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
110319a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
110329a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11033a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
110349a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
110359a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
110369a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11037a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11038a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11039a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11040ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_FILLED_NEW_ARRAY: /* 0x24 */
110413d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11042a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
110439a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11044a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
110459a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
110469a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
110479a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
110489a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11049a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
110509a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11051ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (36 * 64)
110529a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
110539a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
110549a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
110559a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11056a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
110579a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
110589a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
110599a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11060a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11061a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11062a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11063ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */
110643d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11065a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
110669a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11067a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
110689a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
110699a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
110709a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
110719a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11072a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
110739a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11074ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (37 * 64)
110759a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
110769a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
110779a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
110789a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11079a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
110809a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
110819a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
110829a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11083a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11084a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11085a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11086ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_FILL_ARRAY_DATA: /* 0x26 */
110873d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11088a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
110899a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11090a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
110919a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
110929a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
110939a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
110949a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11095a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
110969a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11097ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (38 * 64)
110989a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
110999a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
111009a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
111019a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11102a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
111039a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
111049a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
111059a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11106a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11107a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11108a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11109ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_THROW: /* 0x27 */
111103d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11111a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
111129a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11113a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
111149a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
111159a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
111169a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
111179a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11118a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
111199a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11120ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (39 * 64)
111219a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
111229a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
111239a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
111249a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11125a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
111269a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
111279a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
111289a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11129a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11130a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11131a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11132ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_GOTO: /* 0x28 */
111333d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11134a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
111359a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11136a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
111379a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
111389a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
111399a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
111409a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11141a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
111429a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11143ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (40 * 64)
111449a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
111459a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
111469a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
111479a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11148a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
111499a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
111509a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
111519a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11152a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11153a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11154a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11155ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_GOTO_16: /* 0x29 */
111563d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11157a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
111589a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11159a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
111609a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
111619a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
111629a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
111639a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11164a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
111659a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11166ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (41 * 64)
111679a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
111689a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
111699a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
111709a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11171a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
111729a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
111739a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
111749a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11175a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11176a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11177a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11178ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_GOTO_32: /* 0x2a */
111793d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11180a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
111819a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11182a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
111839a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
111849a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
111859a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
111869a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11187a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
111889a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11189ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (42 * 64)
111909a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
111919a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
111929a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
111939a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11194a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
111959a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
111969a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
111979a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11198a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11199a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11200a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11201ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_PACKED_SWITCH: /* 0x2b */
112023d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11203a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
112049a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11205a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
112069a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
112079a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
112089a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
112099a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11210a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
112119a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11212ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (43 * 64)
112139a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
112149a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
112159a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
112169a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11217a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
112189a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
112199a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
112209a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11221a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11222a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11223a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11224ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPARSE_SWITCH: /* 0x2c */
112253d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11226a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
112279a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11228a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
112299a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
112309a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
112319a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
112329a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11233a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
112349a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11235ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (44 * 64)
112369a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
112379a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
112389a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
112399a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11240a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
112419a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
112429a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
112439a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11244a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11245a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11246a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11247ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CMPL_FLOAT: /* 0x2d */
112483d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11249a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
112509a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11251a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
112529a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
112539a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
112549a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
112559a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11256a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
112579a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11258ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (45 * 64)
112599a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
112609a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
112619a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
112629a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11263a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
112649a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
112659a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
112669a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11267a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11268a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11269a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11270ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CMPG_FLOAT: /* 0x2e */
112713d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11272a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
112739a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11274a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
112759a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
112769a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
112779a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
112789a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11279a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
112809a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11281ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (46 * 64)
112829a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
112839a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
112849a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
112859a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11286a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
112879a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
112889a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
112899a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11290a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11291a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11292a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11293ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CMPL_DOUBLE: /* 0x2f */
112943d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11295a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
112969a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11297a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
112989a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
112999a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
113009a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
113019a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11302a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
113039a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11304ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (47 * 64)
113059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
113069a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
113079a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
113089a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11309a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
113109a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
113119a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
113129a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11313a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11314a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11315a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11316ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CMPG_DOUBLE: /* 0x30 */
113173d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11318a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
113199a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11320a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
113219a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
113229a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
113239a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
113249a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11325a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
113269a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11327ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (48 * 64)
113289a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
113299a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
113309a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
113319a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11332a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
113339a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
113349a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
113359a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11336a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11337a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11338a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11339ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_CMP_LONG: /* 0x31 */
113403d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11341a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
113429a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11343a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
113449a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
113459a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
113469a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
113479a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11348a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
113499a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11350ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (49 * 64)
113519a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
113529a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
113539a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
113549a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11355a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
113569a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
113579a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
113589a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11359a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11360a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11361a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11362ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_EQ: /* 0x32 */
113633d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11364a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
113659a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11366a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
113679a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
113689a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
113699a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
113709a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11371a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
113729a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11373ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (50 * 64)
113749a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
113759a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
113769a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
113779a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11378a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
113799a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
113809a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
113819a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11382a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11383a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11384a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11385ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_NE: /* 0x33 */
113863d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11387a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
113889a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11389a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
113909a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
113919a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
113929a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
113939a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11394a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
113959a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11396ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (51 * 64)
113979a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
113989a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
113999a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
114009a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11401a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
114029a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
114039a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
114049a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11405a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11406a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11407a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11408ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_LT: /* 0x34 */
114093d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11410a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
114119a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11412a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
114139a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
114149a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
114159a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
114169a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11417a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
114189a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11419ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (52 * 64)
114209a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
114219a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
114229a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
114239a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11424a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
114259a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
114269a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
114279a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11428a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11429a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11430a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11431ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_GE: /* 0x35 */
114323d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11433a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
114349a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11435a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
114369a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
114379a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
114389a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
114399a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11440a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
114419a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11442ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (53 * 64)
114439a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
114449a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
114459a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
114469a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11447a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
114489a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
114499a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
114509a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11451a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11452a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11453a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11454ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_GT: /* 0x36 */
114553d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11456a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
114579a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11458a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
114599a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
114609a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
114619a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
114629a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11463a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
114649a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11465ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (54 * 64)
114669a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
114679a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
114689a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
114699a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11470a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
114719a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
114729a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
114739a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11474a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11475a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11476a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11477ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_LE: /* 0x37 */
114783d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11479a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
114809a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11481a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
114829a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
114839a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
114849a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
114859a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11486a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
114879a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11488ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (55 * 64)
114899a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
114909a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
114919a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
114929a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11493a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
114949a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
114959a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
114969a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11497a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11498a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11499a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11500ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_EQZ: /* 0x38 */
115013d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11502a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
115039a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11504a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
115059a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
115069a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
115079a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
115089a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11509a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
115109a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11511ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (56 * 64)
115129a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
115139a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
115149a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
115159a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11516a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
115179a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
115189a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
115199a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11520a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11521a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11522a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11523ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_NEZ: /* 0x39 */
115243d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11525a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
115269a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11527a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
115289a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
115299a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
115309a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
115319a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11532a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
115339a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11534ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (57 * 64)
115359a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
115369a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
115379a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
115389a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11539a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
115409a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
115419a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
115429a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11543a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11544a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11545a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11546ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_LTZ: /* 0x3a */
115473d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11548a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
115499a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11550a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
115519a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
115529a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
115539a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
115549a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11555a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
115569a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11557ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (58 * 64)
115589a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
115599a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
115609a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
115619a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11562a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
115639a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
115649a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
115659a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11566a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11567a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11568a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11569ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_GEZ: /* 0x3b */
115703d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11571a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
115729a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11573a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
115749a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
115759a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
115769a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
115779a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11578a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
115799a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11580ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (59 * 64)
115819a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
115829a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
115839a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
115849a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11585a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
115869a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
115879a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
115889a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11589a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11590a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11591a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11592ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_GTZ: /* 0x3c */
115933d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11594a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
115959a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11596a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
115979a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
115989a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
115999a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
116009a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11601a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
116029a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11603ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (60 * 64)
116049a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
116059a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
116069a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
116079a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11608a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
116099a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
116109a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
116119a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11612a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11613a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11614a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11615ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IF_LEZ: /* 0x3d */
116163d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11617a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
116189a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11619a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
116209a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
116219a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
116229a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
116239a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11624a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
116259a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11626ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (61 * 64)
116279a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
116289a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
116299a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
116309a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11631a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
116329a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
116339a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
116349a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11635a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11636a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11637a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11638ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_UNUSED_3E: /* 0x3e */
116393d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11640a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
116419a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11642a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
116439a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
116449a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
116459a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
116469a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11647a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
116489a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11649ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (62 * 64)
116509a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
116519a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
116529a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
116539a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11654a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
116559a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
116569a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
116579a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11658a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11659a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11660a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11661ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_UNUSED_3F: /* 0x3f */
116623d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11663a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
116649a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11665a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
116669a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
116679a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
116689a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
116699a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11670a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
116719a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11672ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (63 * 64)
116739a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
116749a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
116759a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
116769a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11677a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
116789a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
116799a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
116809a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11681a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11682a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11683a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11684ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_UNUSED_40: /* 0x40 */
116853d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11686a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
116879a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11688a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
116899a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
116909a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
116919a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
116929a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11693a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
116949a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11695ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (64 * 64)
116969a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
116979a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
116989a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
116999a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11700a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
117019a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
117029a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
117039a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11704a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11705a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11706a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11707ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_UNUSED_41: /* 0x41 */
117083d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11709a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
117109a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11711a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
117129a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
117139a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
117149a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
117159a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11716a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
117179a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11718ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (65 * 64)
117199a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
117209a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
117219a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
117229a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11723a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
117249a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
117259a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
117269a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11727a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11728a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11729a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11730ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_UNUSED_42: /* 0x42 */
117313d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11732a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
117339a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11734a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
117359a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
117369a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
117379a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
117389a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11739a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
117409a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11741ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (66 * 64)
117429a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
117439a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
117449a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
117459a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11746a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
117479a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
117489a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
117499a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11750a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11751a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11752a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11753ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_UNUSED_43: /* 0x43 */
117543d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11755a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
117569a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11757a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
117589a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
117599a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
117609a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
117619a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11762a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
117639a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11764ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (67 * 64)
117659a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
117669a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
117679a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
117689a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11769a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
117709a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
117719a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
117729a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11773a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11774a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11775a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11776ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AGET: /* 0x44 */
117773d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11778a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
117799a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11780a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
117819a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
117829a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
117839a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
117849a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11785a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
117869a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11787ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (68 * 64)
117889a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
117899a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
117909a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
117919a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11792a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
117939a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
117949a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
117959a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11796a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11797a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11798a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11799ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AGET_WIDE: /* 0x45 */
118003d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11801a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
118029a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11803a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
118049a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
118059a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
118069a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
118079a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11808a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
118099a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11810ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (69 * 64)
118119a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
118129a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
118139a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
118149a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11815a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
118169a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
118179a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
118189a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11819a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11820a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11821a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11822ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AGET_OBJECT: /* 0x46 */
118233d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11824a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
118259a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11826a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
118279a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
118289a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
118299a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
118309a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11831a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
118329a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11833ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (70 * 64)
118349a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
118359a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
118369a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
118379a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11838a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
118399a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
118409a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
118419a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11842a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11843a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11844a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11845ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AGET_BOOLEAN: /* 0x47 */
118463d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11847a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
118489a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11849a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
118509a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
118519a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
118529a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
118539a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11854a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
118559a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11856ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (71 * 64)
118579a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
118589a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
118599a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
118609a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11861a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
118629a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
118639a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
118649a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11865a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11866a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11867a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11868ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AGET_BYTE: /* 0x48 */
118693d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11870a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
118719a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11872a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
118739a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
118749a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
118759a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
118769a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11877a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
118789a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11879ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (72 * 64)
118809a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
118819a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
118829a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
118839a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11884a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
118859a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
118869a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
118879a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11888a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11889a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11890a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11891ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AGET_CHAR: /* 0x49 */
118923d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11893a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
118949a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11895a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
118969a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
118979a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
118989a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
118999a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11900a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
119019a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11902ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (73 * 64)
119039a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
119049a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
119059a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
119069a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11907a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
119089a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
119099a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
119109a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11911a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11912a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11913a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11914ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AGET_SHORT: /* 0x4a */
119153d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11916a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
119179a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11918a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
119199a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
119209a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
119219a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
119229a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11923a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
119249a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11925ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (74 * 64)
119269a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
119279a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
119289a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
119299a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11930a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
119319a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
119329a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
119339a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11934a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11935a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11936a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11937ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_APUT: /* 0x4b */
119383d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11939a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
119409a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11941a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
119429a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
119439a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
119449a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
119459a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11946a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
119479a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11948ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (75 * 64)
119499a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
119509a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
119519a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
119529a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11953a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
119549a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
119559a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
119569a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11957a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11958a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11959a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11960ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_APUT_WIDE: /* 0x4c */
119613d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11962a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
119639a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11964a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
119659a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
119669a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
119679a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
119689a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11969a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
119709a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11971ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (76 * 64)
119729a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
119739a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
119749a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
119759a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11976a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
119779a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
119789a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
119799a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
11980a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
11981a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
11982a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
11983ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_APUT_OBJECT: /* 0x4d */
119843d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
11985a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
119869a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
11987a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
119889a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
119899a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
119909a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
119919a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
11992a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
119939a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
11994ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (77 * 64)
119959a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
119969a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
119979a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
119989a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
11999a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
120009a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
120019a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
120029a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12003a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12004a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12005a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12006ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_APUT_BOOLEAN: /* 0x4e */
120073d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12008a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
120099a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12010a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
120119a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
120129a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
120139a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
120149a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12015a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
120169a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12017ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (78 * 64)
120189a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
120199a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
120209a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
120219a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12022a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
120239a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
120249a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
120259a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12026a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12027a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12028a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12029ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_APUT_BYTE: /* 0x4f */
120303d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12031a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
120329a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12033a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
120349a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
120359a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
120369a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
120379a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12038a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
120399a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12040ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (79 * 64)
120419a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
120429a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
120439a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
120449a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12045a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
120469a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
120479a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
120489a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12049a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12050a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12051a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12052ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_APUT_CHAR: /* 0x50 */
120533d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12054a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
120559a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12056a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
120579a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
120589a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
120599a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
120609a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12061a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
120629a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12063ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (80 * 64)
120649a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
120659a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
120669a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
120679a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12068a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
120699a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
120709a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
120719a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12072a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12073a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12074a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12075ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_APUT_SHORT: /* 0x51 */
120763d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12077a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
120789a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12079a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
120809a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
120819a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
120829a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
120839a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12084a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
120859a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12086ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (81 * 64)
120879a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
120889a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
120899a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
120909a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12091a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
120929a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
120939a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
120949a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12095a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12096a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12097a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12098ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET: /* 0x52 */
120993d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12100a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
121019a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12102a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
121039a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
121049a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
121059a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
121069a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12107a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
121089a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12109ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (82 * 64)
121109a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
121119a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
121129a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
121139a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12114a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
121159a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
121169a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
121179a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12118a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12119a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12120a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12121ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_WIDE: /* 0x53 */
121223d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12123a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
121249a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12125a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
121269a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
121279a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
121289a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
121299a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12130a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
121319a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12132ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (83 * 64)
121339a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
121349a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
121359a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
121369a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12137a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
121389a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
121399a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
121409a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12141a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12142a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12143a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12144ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_OBJECT: /* 0x54 */
121453d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12146a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
121479a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12148a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
121499a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
121509a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
121519a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
121529a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12153a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
121549a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12155ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (84 * 64)
121569a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
121579a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
121589a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
121599a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12160a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
121619a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
121629a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
121639a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12164a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12165a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12166a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12167ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_BOOLEAN: /* 0x55 */
121683d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12169a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
121709a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12171a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
121729a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
121739a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
121749a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
121759a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12176a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
121779a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12178ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (85 * 64)
121799a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
121809a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
121819a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
121829a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12183a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
121849a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
121859a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
121869a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12187a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12188a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12189a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12190ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_BYTE: /* 0x56 */
121913d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12192a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
121939a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12194a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
121959a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
121969a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
121979a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
121989a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12199a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
122009a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12201ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (86 * 64)
122029a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
122039a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
122049a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
122059a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12206a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
122079a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
122089a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
122099a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12210a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12211a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12212a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12213ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_CHAR: /* 0x57 */
122143d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12215a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
122169a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12217a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
122189a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
122199a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
122209a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
122219a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12222a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
122239a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12224ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (87 * 64)
122259a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
122269a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
122279a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
122289a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12229a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
122309a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
122319a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
122329a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12233a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12234a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12235a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12236ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_SHORT: /* 0x58 */
122373d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12238a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
122399a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12240a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
122419a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
122429a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
122439a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
122449a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12245a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
122469a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12247ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (88 * 64)
122489a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
122499a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
122509a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
122519a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12252a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
122539a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
122549a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
122559a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12256a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12257a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12258a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12259ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT: /* 0x59 */
122603d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12261a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
122629a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12263a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
122649a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
122659a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
122669a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
122679a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12268a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
122699a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12270ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (89 * 64)
122719a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
122729a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
122739a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
122749a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12275a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
122769a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
122779a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
122789a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12279a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12280a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12281a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12282ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_WIDE: /* 0x5a */
122833d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12284a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
122859a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12286a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
122879a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
122889a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
122899a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
122909a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12291a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
122929a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12293ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (90 * 64)
122949a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
122959a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
122969a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
122979a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12298a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
122999a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
123009a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
123019a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12302a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12303a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12304a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12305ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_OBJECT: /* 0x5b */
123063d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12307a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
123089a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12309a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
123109a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
123119a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
123129a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
123139a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12314a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
123159a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12316ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (91 * 64)
123179a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
123189a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
123199a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
123209a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12321a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
123229a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
123239a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
123249a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12325a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12326a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12327a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12328ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_BOOLEAN: /* 0x5c */
123293d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12330a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
123319a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12332a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
123339a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
123349a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
123359a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
123369a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12337a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
123389a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12339ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (92 * 64)
123409a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
123419a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
123429a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
123439a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12344a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
123459a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
123469a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
123479a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12348a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12349a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12350a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12351ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_BYTE: /* 0x5d */
123523d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12353a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
123549a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12355a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
123569a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
123579a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
123589a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
123599a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12360a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
123619a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12362ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (93 * 64)
123639a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
123649a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
123659a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
123669a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12367a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
123689a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
123699a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
123709a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12371a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12372a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12373a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12374ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_CHAR: /* 0x5e */
123753d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12376a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
123779a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12378a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
123799a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
123809a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
123819a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
123829a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12383a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
123849a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12385ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (94 * 64)
123869a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
123879a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
123889a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
123899a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12390a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
123919a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
123929a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
123939a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12394a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12395a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12396a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12397ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_SHORT: /* 0x5f */
123983d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12399a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
124009a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12401a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
124029a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
124039a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
124049a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
124059a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12406a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
124079a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12408ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (95 * 64)
124099a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
124109a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
124119a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
124129a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12413a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
124149a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
124159a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
124169a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12417a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12418a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12419a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12420ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SGET: /* 0x60 */
124213d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12422a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
124239a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12424a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
124259a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
124269a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
124279a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
124289a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12429a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
124309a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12431ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (96 * 64)
124329a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
124339a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
124349a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
124359a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12436a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
124379a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
124389a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
124399a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12440a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12441a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12442a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12443ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SGET_WIDE: /* 0x61 */
124443d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12445a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
124469a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12447a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
124489a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
124499a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
124509a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
124519a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12452a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
124539a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12454ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (97 * 64)
124559a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
124569a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
124579a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
124589a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12459a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
124609a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
124619a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
124629a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12463a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12464a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12465a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12466ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SGET_OBJECT: /* 0x62 */
124673d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12468a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
124699a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12470a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
124719a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
124729a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
124739a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
124749a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12475a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
124769a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12477ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (98 * 64)
124789a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
124799a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
124809a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
124819a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12482a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
124839a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
124849a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
124859a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12486a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12487a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12488a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12489ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SGET_BOOLEAN: /* 0x63 */
124903d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12491a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
124929a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12493a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
124949a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
124959a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
124969a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
124979a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12498a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
124999a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12500ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (99 * 64)
125019a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
125029a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
125039a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
125049a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12505a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
125069a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
125079a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
125089a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12509a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12510a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12511a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12512ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SGET_BYTE: /* 0x64 */
125133d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12514a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
125159a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12516a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
125179a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
125189a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
125199a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
125209a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12521a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
125229a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12523ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (100 * 64)
125249a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
125259a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
125269a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
125279a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12528a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
125299a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
125309a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
125319a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12532a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12533a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12534a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12535ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SGET_CHAR: /* 0x65 */
125363d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12537a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
125389a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12539a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
125409a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
125419a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
125429a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
125439a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12544a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
125459a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12546ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (101 * 64)
125479a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
125489a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
125499a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
125509a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12551a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
125529a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
125539a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
125549a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12555a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12556a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12557a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12558ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SGET_SHORT: /* 0x66 */
125593d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12560a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
125619a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12562a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
125639a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
125649a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
125659a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
125669a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12567a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
125689a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12569ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (102 * 64)
125709a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
125719a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
125729a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
125739a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12574a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
125759a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
125769a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
125779a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12578a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12579a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12580a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12581ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPUT: /* 0x67 */
125823d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12583a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
125849a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12585a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
125869a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
125879a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
125889a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
125899a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12590a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
125919a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12592ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (103 * 64)
125939a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
125949a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
125959a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
125969a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12597a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
125989a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
125999a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
126009a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12601a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12602a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12603a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12604ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPUT_WIDE: /* 0x68 */
126053d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12606a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
126079a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12608a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
126099a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
126109a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
126119a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
126129a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12613a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
126149a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12615ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (104 * 64)
126169a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
126179a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
126189a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
126199a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12620a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
126219a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
126229a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
126239a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12624a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12625a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12626a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12627ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPUT_OBJECT: /* 0x69 */
126283d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12629a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
126309a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12631a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
126329a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
126339a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
126349a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
126359a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12636a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
126379a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12638ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (105 * 64)
126399a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
126409a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
126419a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
126429a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12643a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
126449a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
126459a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
126469a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12647a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12648a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12649a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12650ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPUT_BOOLEAN: /* 0x6a */
126513d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12652a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
126539a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12654a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
126559a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
126569a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
126579a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
126589a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12659a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
126609a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12661ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (106 * 64)
126629a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
126639a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
126649a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
126659a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12666a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
126679a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
126689a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
126699a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12670a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12671a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12672a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12673ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPUT_BYTE: /* 0x6b */
126743d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12675a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
126769a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12677a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
126789a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
126799a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
126809a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
126819a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12682a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
126839a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12684ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (107 * 64)
126859a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
126869a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
126879a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
126889a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12689a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
126909a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
126919a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
126929a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12693a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12694a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12695a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12696ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPUT_CHAR: /* 0x6c */
126973d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12698a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
126999a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12700a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
127019a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
127029a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
127039a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
127049a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12705a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
127069a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12707ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (108 * 64)
127089a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
127099a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
127109a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
127119a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12712a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
127139a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
127149a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
127159a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12716a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12717a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12718a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12719ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPUT_SHORT: /* 0x6d */
127203d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12721a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
127229a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12723a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
127249a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
127259a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
127269a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
127279a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12728a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
127299a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12730ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (109 * 64)
127319a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
127329a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
127339a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
127349a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12735a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
127369a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
127379a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
127389a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12739a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12740a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12741a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12742ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_VIRTUAL: /* 0x6e */
127433d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12744a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
127459a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12746a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
127479a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
127489a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
127499a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
127509a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12751a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
127529a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12753ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (110 * 64)
127549a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
127559a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
127569a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
127579a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12758a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
127599a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
127609a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
127619a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12762a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12763a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12764a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12765ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_SUPER: /* 0x6f */
127663d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12767a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
127689a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12769a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
127709a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
127719a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
127729a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
127739a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12774a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
127759a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12776ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (111 * 64)
127779a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
127789a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
127799a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
127809a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12781a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
127829a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
127839a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
127849a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12785a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12786a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12787a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12788ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_DIRECT: /* 0x70 */
127893d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12790a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
127919a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12792a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
127939a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
127949a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
127959a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
127969a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12797a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
127989a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12799ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (112 * 64)
128009a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
128019a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
128029a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
128039a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12804a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
128059a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
128069a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
128079a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12808a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12809a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12810a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12811ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_STATIC: /* 0x71 */
128123d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12813a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
128149a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12815a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
128169a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
128179a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
128189a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
128199a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12820a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
128219a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12822ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (113 * 64)
128239a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
128249a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
128259a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
128269a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12827a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
128289a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
128299a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
128309a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12831a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12832a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12833a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12834ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_INTERFACE: /* 0x72 */
128353d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12836a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
128379a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12838a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
128399a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
128409a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
128419a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
128429a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12843a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
128449a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12845ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (114 * 64)
128469a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
128479a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
128489a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
128499a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12850a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
128519a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
128529a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
128539a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12854a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12855a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12856a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12857ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_UNUSED_73: /* 0x73 */
128583d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12859a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
128609a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12861a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
128629a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
128639a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
128649a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
128659a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12866a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
128679a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12868ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (115 * 64)
128699a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
128709a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
128719a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
128729a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12873a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
128749a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
128759a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
128769a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12877a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12878a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12879a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12880ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */
128813d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12882a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
128839a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12884a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
128859a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
128869a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
128879a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
128889a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12889a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
128909a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12891ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (116 * 64)
128929a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
128939a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
128949a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
128959a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12896a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
128979a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
128989a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
128999a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12900a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12901a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12902a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12903ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_SUPER_RANGE: /* 0x75 */
129043d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12905a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
129069a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12907a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
129089a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
129099a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
129109a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
129119a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12912a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
129139a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12914ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (117 * 64)
129159a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
129169a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
129179a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
129189a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12919a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
129209a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
129219a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
129229a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12923a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12924a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12925a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12926ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_DIRECT_RANGE: /* 0x76 */
129273d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12928a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
129299a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12930a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
129319a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
129329a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
129339a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
129349a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12935a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
129369a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12937ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (118 * 64)
129389a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
129399a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
129409a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
129419a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12942a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
129439a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
129449a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
129459a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12946a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12947a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12948a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12949ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_STATIC_RANGE: /* 0x77 */
129503d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12951a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
129529a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12953a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
129549a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
129559a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
129569a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
129579a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12958a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
129599a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12960ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (119 * 64)
129619a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
129629a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
129639a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
129649a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12965a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
129669a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
129679a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
129689a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12969a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12970a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12971a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12972ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */
129733d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12974a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
129759a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12976a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
129779a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
129789a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
129799a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
129809a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
12981a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
129829a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
12983ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (120 * 64)
129849a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
129859a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
129869a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
129879a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
12988a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
129899a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
129909a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
129919a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
12992a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
12993a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
12994a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
12995ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_UNUSED_79: /* 0x79 */
129963d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
12997a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
129989a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
12999a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
130009a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
130019a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
130029a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
130039a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13004a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
130059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13006ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (121 * 64)
130079a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
130089a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
130099a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
130109a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13011a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
130129a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
130139a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
130149a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13015a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13016a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13017a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13018ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_UNUSED_7A: /* 0x7a */
130193d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13020a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
130219a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13022a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
130239a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
130249a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
130259a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
130269a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13027a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
130289a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13029ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (122 * 64)
130309a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
130319a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
130329a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
130339a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13034a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
130359a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
130369a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
130379a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13038a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13039a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13040a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13041ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_NEG_INT: /* 0x7b */
130423d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13043a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
130449a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13045a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
130469a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
130479a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
130489a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
130499a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13050a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
130519a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13052ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (123 * 64)
130539a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
130549a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
130559a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
130569a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13057a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
130589a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
130599a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
130609a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13061a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13062a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13063a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13064ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_NOT_INT: /* 0x7c */
130653d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13066a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
130679a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13068a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
130699a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
130709a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
130719a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
130729a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13073a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
130749a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13075ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (124 * 64)
130769a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
130779a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
130789a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
130799a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13080a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
130819a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
130829a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
130839a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13084a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13085a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13086a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13087ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_NEG_LONG: /* 0x7d */
130883d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13089a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
130909a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13091a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
130929a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
130939a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
130949a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
130959a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13096a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
130979a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13098ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (125 * 64)
130999a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
131009a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
131019a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
131029a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13103a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
131049a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
131059a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
131069a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13107a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13108a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13109a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13110ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_NOT_LONG: /* 0x7e */
131113d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13112a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
131139a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13114a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
131159a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
131169a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
131179a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
131189a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13119a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
131209a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13121ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (126 * 64)
131229a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
131239a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
131249a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
131259a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13126a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
131279a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
131289a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
131299a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13130a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13131a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13132a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13133ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_NEG_FLOAT: /* 0x7f */
131343d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13135a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
131369a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13137a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
131389a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
131399a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
131409a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
131419a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13142a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
131439a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13144ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (127 * 64)
131459a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
131469a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
131479a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
131489a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13149a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
131509a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
131519a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
131529a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13153a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13154a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13155a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13156ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_NEG_DOUBLE: /* 0x80 */
131573d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13158a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
131599a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13160a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
131619a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
131629a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
131639a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
131649a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13165a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
131669a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13167ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (128 * 64)
131689a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
131699a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
131709a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
131719a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13172a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
131739a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
131749a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
131759a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13176a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13177a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13178a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13179ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INT_TO_LONG: /* 0x81 */
131803d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13181a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
131829a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13183a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
131849a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
131859a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
131869a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
131879a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13188a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
131899a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13190ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (129 * 64)
131919a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
131929a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
131939a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
131949a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13195a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
131969a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
131979a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
131989a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13199a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13200a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13201a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13202ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INT_TO_FLOAT: /* 0x82 */
132033d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13204a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
132059a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13206a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
132079a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
132089a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
132099a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
132109a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13211a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
132129a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13213ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (130 * 64)
132149a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
132159a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
132169a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
132179a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13218a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
132199a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
132209a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
132219a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13222a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13223a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13224a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13225ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INT_TO_DOUBLE: /* 0x83 */
132263d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13227a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
132289a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13229a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
132309a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
132319a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
132329a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
132339a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13234a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
132359a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13236ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (131 * 64)
132379a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
132389a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
132399a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
132409a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13241a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
132429a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
132439a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
132449a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13245a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13246a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13247a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13248ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_LONG_TO_INT: /* 0x84 */
132493d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13250a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
132519a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13252a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
132539a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
132549a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
132559a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
132569a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13257a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
132589a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13259ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (132 * 64)
132609a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
132619a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
132629a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
132639a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13264a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
132659a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
132669a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
132679a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13268a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13269a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13270a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13271ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_LONG_TO_FLOAT: /* 0x85 */
132723d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13273a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
132749a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13275a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
132769a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
132779a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
132789a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
132799a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13280a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
132819a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13282ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (133 * 64)
132839a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
132849a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
132859a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
132869a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13287a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
132889a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
132899a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
132909a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13291a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13292a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13293a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13294ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_LONG_TO_DOUBLE: /* 0x86 */
132953d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13296a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
132979a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13298a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
132999a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
133009a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
133019a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
133029a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13303a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
133049a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13305ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (134 * 64)
133069a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
133079a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
133089a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
133099a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13310a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
133119a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
133129a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
133139a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13314a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13315a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13316a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13317ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_FLOAT_TO_INT: /* 0x87 */
133183d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13319a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
133209a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13321a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
133229a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
133239a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
133249a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
133259a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13326a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
133279a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13328ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (135 * 64)
133299a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
133309a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
133319a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
133329a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13333a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
133349a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
133359a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
133369a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13337a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13338a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13339a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13340ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_FLOAT_TO_LONG: /* 0x88 */
133413d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13342a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
133439a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13344a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
133459a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
133469a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
133479a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
133489a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13349a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
133509a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13351ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (136 * 64)
133529a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
133539a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
133549a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
133559a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13356a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
133579a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
133589a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
133599a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13360a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13361a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13362a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13363ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_FLOAT_TO_DOUBLE: /* 0x89 */
133643d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13365a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
133669a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13367a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
133689a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
133699a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
133709a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
133719a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13372a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
133739a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13374ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (137 * 64)
133759a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
133769a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
133779a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
133789a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13379a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
133809a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
133819a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
133829a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13383a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13384a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13385a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13386ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DOUBLE_TO_INT: /* 0x8a */
133873d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13388a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
133899a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13390a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
133919a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
133929a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
133939a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
133949a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13395a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
133969a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13397ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (138 * 64)
133989a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
133999a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
134009a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
134019a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13402a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
134039a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
134049a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
134059a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13406a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13407a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13408a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13409ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DOUBLE_TO_LONG: /* 0x8b */
134103d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13411a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
134129a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13413a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
134149a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
134159a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
134169a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
134179a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13418a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
134199a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13420ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (139 * 64)
134219a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
134229a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
134239a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
134249a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13425a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
134269a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
134279a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
134289a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13429a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13430a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13431a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13432ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DOUBLE_TO_FLOAT: /* 0x8c */
134333d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13434a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
134359a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13436a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
134379a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
134389a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
134399a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
134409a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13441a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
134429a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13443ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (140 * 64)
134449a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
134459a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
134469a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
134479a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13448a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
134499a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
134509a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
134519a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13452a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13453a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13454a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13455ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INT_TO_BYTE: /* 0x8d */
134563d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13457a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
134589a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13459a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
134609a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
134619a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
134629a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
134639a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13464a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
134659a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13466ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (141 * 64)
134679a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
134689a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
134699a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
134709a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13471a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
134729a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
134739a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
134749a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13475a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13476a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13477a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13478ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INT_TO_CHAR: /* 0x8e */
134793d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13480a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
134819a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13482a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
134839a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
134849a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
134859a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
134869a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13487a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
134889a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13489ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (142 * 64)
134909a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
134919a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
134929a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
134939a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13494a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
134959a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
134969a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
134979a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13498a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13499a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13500a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13501ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INT_TO_SHORT: /* 0x8f */
135023d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13503a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
135049a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13505a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
135069a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
135079a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
135089a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
135099a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13510a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
135119a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13512ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (143 * 64)
135139a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
135149a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
135159a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
135169a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13517a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
135189a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
135199a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
135209a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13521a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13522a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13523a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13524ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ADD_INT: /* 0x90 */
135253d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13526a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
135279a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13528a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
135299a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
135309a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
135319a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
135329a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13533a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
135349a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13535ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (144 * 64)
135369a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
135379a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
135389a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
135399a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13540a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
135419a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
135429a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
135439a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13544a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13545a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13546a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13547ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SUB_INT: /* 0x91 */
135483d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13549a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
135509a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13551a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
135529a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
135539a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
135549a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
135559a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13556a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
135579a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13558ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (145 * 64)
135599a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
135609a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
135619a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
135629a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13563a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
135649a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
135659a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
135669a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13567a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13568a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13569a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13570ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MUL_INT: /* 0x92 */
135713d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13572a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
135739a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13574a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
135759a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
135769a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
135779a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
135789a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13579a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
135809a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13581ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (146 * 64)
135829a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
135839a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
135849a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
135859a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13586a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
135879a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
135889a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
135899a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13590a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13591a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13592a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13593ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DIV_INT: /* 0x93 */
135943d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13595a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
135969a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13597a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
135989a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
135999a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
136009a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
136019a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13602a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
136039a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13604ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (147 * 64)
136059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
136069a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
136079a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
136089a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13609a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
136109a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
136119a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
136129a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13613a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13614a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13615a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13616ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_REM_INT: /* 0x94 */
136173d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13618a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
136199a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13620a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
136219a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
136229a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
136239a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
136249a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13625a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
136269a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13627ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (148 * 64)
136289a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
136299a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
136309a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
136319a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13632a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
136339a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
136349a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
136359a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13636a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13637a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13638a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13639ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AND_INT: /* 0x95 */
136403d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13641a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
136429a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13643a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
136449a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
136459a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
136469a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
136479a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13648a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
136499a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13650ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (149 * 64)
136519a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
136529a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
136539a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
136549a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13655a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
136569a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
136579a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
136589a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13659a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13660a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13661a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13662ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_OR_INT: /* 0x96 */
136633d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13664a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
136659a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13666a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
136679a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
136689a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
136699a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
136709a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13671a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
136729a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13673ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (150 * 64)
136749a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
136759a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
136769a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
136779a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13678a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
136799a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
136809a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
136819a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13682a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13683a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13684a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13685ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_XOR_INT: /* 0x97 */
136863d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13687a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
136889a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13689a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
136909a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
136919a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
136929a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
136939a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13694a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
136959a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13696ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (151 * 64)
136979a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
136989a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
136999a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
137009a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13701a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
137029a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
137039a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
137049a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13705a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13706a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13707a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13708ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SHL_INT: /* 0x98 */
137093d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13710a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
137119a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13712a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
137139a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
137149a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
137159a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
137169a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13717a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
137189a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13719ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (152 * 64)
137209a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
137219a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
137229a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
137239a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13724a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
137259a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
137269a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
137279a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13728a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13729a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13730a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13731ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SHR_INT: /* 0x99 */
137323d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13733a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
137349a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13735a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
137369a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
137379a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
137389a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
137399a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13740a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
137419a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13742ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (153 * 64)
137439a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
137449a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
137459a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
137469a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13747a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
137489a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
137499a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
137509a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13751a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13752a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13753a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13754ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_USHR_INT: /* 0x9a */
137553d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13756a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
137579a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13758a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
137599a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
137609a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
137619a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
137629a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13763a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
137649a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13765ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (154 * 64)
137669a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
137679a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
137689a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
137699a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13770a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
137719a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
137729a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
137739a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13774a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13775a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13776a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13777ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ADD_LONG: /* 0x9b */
137783d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13779a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
137809a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13781a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
137829a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
137839a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
137849a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
137859a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13786a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
137879a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13788ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (155 * 64)
137899a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
137909a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
137919a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
137929a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13793a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
137949a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
137959a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
137969a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13797a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13798a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13799a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13800ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SUB_LONG: /* 0x9c */
138013d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13802a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
138039a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13804a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
138059a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
138069a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
138079a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
138089a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13809a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
138109a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13811ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (156 * 64)
138129a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
138139a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
138149a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
138159a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13816a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
138179a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
138189a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
138199a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13820a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13821a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13822a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13823ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MUL_LONG: /* 0x9d */
138243d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13825a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
138269a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13827a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
138289a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
138299a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
138309a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
138319a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13832a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
138339a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13834ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (157 * 64)
138359a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
138369a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
138379a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
138389a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13839a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
138409a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
138419a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
138429a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13843a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13844a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13845a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13846ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DIV_LONG: /* 0x9e */
138473d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13848a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
138499a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13850a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
138519a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
138529a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
138539a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
138549a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13855a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
138569a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13857ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (158 * 64)
138589a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
138599a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
138609a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
138619a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13862a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
138639a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
138649a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
138659a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13866a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13867a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13868a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13869ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_REM_LONG: /* 0x9f */
138703d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13871a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
138729a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13873a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
138749a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
138759a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
138769a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
138779a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13878a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
138799a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13880ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (159 * 64)
138819a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
138829a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
138839a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
138849a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13885a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
138869a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
138879a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
138889a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13889a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13890a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13891a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13892ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AND_LONG: /* 0xa0 */
138933d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13894a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
138959a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13896a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
138979a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
138989a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
138999a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
139009a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13901a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
139029a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13903ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (160 * 64)
139049a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
139059a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
139069a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
139079a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13908a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
139099a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
139109a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
139119a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13912a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13913a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13914a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13915ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_OR_LONG: /* 0xa1 */
139163d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13917a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
139189a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13919a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
139209a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
139219a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
139229a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
139239a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13924a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
139259a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13926ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (161 * 64)
139279a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
139289a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
139299a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
139309a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13931a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
139329a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
139339a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
139349a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13935a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13936a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13937a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13938ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_XOR_LONG: /* 0xa2 */
139393d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13940a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
139419a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13942a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
139439a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
139449a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
139459a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
139469a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13947a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
139489a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13949ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (162 * 64)
139509a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
139519a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
139529a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
139539a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13954a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
139559a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
139569a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
139579a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13958a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13959a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13960a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13961ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SHL_LONG: /* 0xa3 */
139623d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13963a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
139649a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13965a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
139669a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
139679a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
139689a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
139699a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13970a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
139719a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13972ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (163 * 64)
139739a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
139749a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
139759a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
139769a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
13977a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
139789a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
139799a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
139809a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
13981a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
13982a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
13983a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
13984ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SHR_LONG: /* 0xa4 */
139853d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
13986a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
139879a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
13988a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
139899a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
139909a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
139919a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
139929a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
13993a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
139949a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
13995ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (164 * 64)
139969a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
139979a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
139989a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
139999a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14000a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
140019a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
140029a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
140039a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14004a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14005a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14006a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14007ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_USHR_LONG: /* 0xa5 */
140083d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14009a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
140109a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14011a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
140129a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
140139a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
140149a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
140159a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14016a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
140179a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14018ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (165 * 64)
140199a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
140209a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
140219a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
140229a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14023a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
140249a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
140259a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
140269a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14027a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14028a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14029a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14030ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ADD_FLOAT: /* 0xa6 */
140313d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14032a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
140339a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14034a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
140359a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
140369a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
140379a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
140389a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14039a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
140409a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14041ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (166 * 64)
140429a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
140439a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
140449a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
140459a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14046a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
140479a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
140489a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
140499a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14050a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14051a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14052a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14053ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SUB_FLOAT: /* 0xa7 */
140543d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14055a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
140569a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14057a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
140589a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
140599a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
140609a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
140619a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14062a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
140639a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14064ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (167 * 64)
140659a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
140669a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
140679a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
140689a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14069a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
140709a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
140719a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
140729a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14073a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14074a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14075a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14076ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MUL_FLOAT: /* 0xa8 */
140773d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14078a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
140799a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14080a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
140819a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
140829a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
140839a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
140849a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14085a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
140869a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14087ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (168 * 64)
140889a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
140899a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
140909a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
140919a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14092a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
140939a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
140949a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
140959a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14096a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14097a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14098a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14099ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DIV_FLOAT: /* 0xa9 */
141003d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14101a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
141029a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14103a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
141049a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
141059a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
141069a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
141079a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14108a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
141099a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14110ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (169 * 64)
141119a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
141129a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
141139a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
141149a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14115a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
141169a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
141179a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
141189a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14119a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14120a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14121a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14122ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_REM_FLOAT: /* 0xaa */
141233d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14124a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
141259a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14126a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
141279a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
141289a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
141299a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
141309a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14131a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
141329a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14133ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (170 * 64)
141349a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
141359a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
141369a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
141379a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14138a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
141399a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
141409a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
141419a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14142a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14143a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14144a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14145ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ADD_DOUBLE: /* 0xab */
141463d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14147a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
141489a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14149a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
141509a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
141519a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
141529a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
141539a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14154a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
141559a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14156ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (171 * 64)
141579a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
141589a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
141599a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
141609a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14161a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
141629a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
141639a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
141649a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14165a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14166a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14167a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14168ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SUB_DOUBLE: /* 0xac */
141693d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14170a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
141719a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14172a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
141739a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
141749a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
141759a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
141769a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14177a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
141789a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14179ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (172 * 64)
141809a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
141819a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
141829a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
141839a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14184a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
141859a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
141869a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
141879a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14188a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14189a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14190a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14191ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MUL_DOUBLE: /* 0xad */
141923d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14193a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
141949a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14195a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
141969a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
141979a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
141989a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
141999a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14200a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
142019a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14202ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (173 * 64)
142039a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
142049a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
142059a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
142069a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14207a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
142089a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
142099a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
142109a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14211a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14212a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14213a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14214ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DIV_DOUBLE: /* 0xae */
142153d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14216a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
142179a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14218a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
142199a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
142209a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
142219a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
142229a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14223a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
142249a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14225ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (174 * 64)
142269a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
142279a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
142289a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
142299a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14230a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
142319a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
142329a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
142339a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14234a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14235a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14236a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14237ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_REM_DOUBLE: /* 0xaf */
142383d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14239a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
142409a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14241a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
142429a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
142439a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
142449a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
142459a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14246a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
142479a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14248ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (175 * 64)
142499a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
142509a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
142519a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
142529a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14253a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
142549a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
142559a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
142569a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14257a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14258a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14259a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14260ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ADD_INT_2ADDR: /* 0xb0 */
142613d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14262a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
142639a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14264a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
142659a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
142669a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
142679a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
142689a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14269a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
142709a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14271ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (176 * 64)
142729a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
142739a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
142749a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
142759a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14276a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
142779a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
142789a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
142799a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14280a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14281a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14282a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14283ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SUB_INT_2ADDR: /* 0xb1 */
142843d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14285a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
142869a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14287a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
142889a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
142899a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
142909a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
142919a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14292a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
142939a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14294ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (177 * 64)
142959a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
142969a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
142979a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
142989a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14299a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
143009a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
143019a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
143029a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14303a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14304a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14305a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14306ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MUL_INT_2ADDR: /* 0xb2 */
143073d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14308a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
143099a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14310a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
143119a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
143129a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
143139a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
143149a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14315a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
143169a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14317ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (178 * 64)
143189a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
143199a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
143209a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
143219a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14322a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
143239a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
143249a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
143259a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14326a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14327a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14328a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14329ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DIV_INT_2ADDR: /* 0xb3 */
143303d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14331a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
143329a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14333a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
143349a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
143359a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
143369a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
143379a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14338a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
143399a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14340ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (179 * 64)
143419a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
143429a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
143439a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
143449a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14345a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
143469a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
143479a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
143489a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14349a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14350a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14351a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14352ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_REM_INT_2ADDR: /* 0xb4 */
143533d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14354a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
143559a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14356a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
143579a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
143589a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
143599a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
143609a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14361a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
143629a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14363ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (180 * 64)
143649a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
143659a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
143669a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
143679a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14368a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
143699a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
143709a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
143719a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14372a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14373a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14374a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14375ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AND_INT_2ADDR: /* 0xb5 */
143763d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14377a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
143789a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14379a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
143809a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
143819a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
143829a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
143839a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14384a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
143859a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14386ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (181 * 64)
143879a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
143889a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
143899a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
143909a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14391a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
143929a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
143939a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
143949a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14395a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14396a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14397a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14398ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_OR_INT_2ADDR: /* 0xb6 */
143993d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14400a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
144019a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14402a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
144039a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
144049a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
144059a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
144069a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14407a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
144089a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14409ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (182 * 64)
144109a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
144119a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
144129a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
144139a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14414a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
144159a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
144169a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
144179a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14418a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14419a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14420a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14421ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_XOR_INT_2ADDR: /* 0xb7 */
144223d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14423a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
144249a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14425a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
144269a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
144279a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
144289a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
144299a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14430a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
144319a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14432ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (183 * 64)
144339a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
144349a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
144359a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
144369a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14437a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
144389a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
144399a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
144409a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14441a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14442a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14443a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14444ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SHL_INT_2ADDR: /* 0xb8 */
144453d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14446a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
144479a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14448a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
144499a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
144509a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
144519a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
144529a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14453a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
144549a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14455ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (184 * 64)
144569a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
144579a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
144589a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
144599a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14460a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
144619a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
144629a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
144639a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14464a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14465a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14466a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14467ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SHR_INT_2ADDR: /* 0xb9 */
144683d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14469a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
144709a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14471a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
144729a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
144739a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
144749a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
144759a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14476a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
144779a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14478ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (185 * 64)
144799a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
144809a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
144819a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
144829a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14483a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
144849a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
144859a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
144869a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14487a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14488a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14489a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14490ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_USHR_INT_2ADDR: /* 0xba */
144913d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14492a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
144939a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14494a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
144959a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
144969a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
144979a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
144989a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14499a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
145009a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14501ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (186 * 64)
145029a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
145039a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
145049a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
145059a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14506a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
145079a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
145089a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
145099a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14510a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14511a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14512a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14513ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ADD_LONG_2ADDR: /* 0xbb */
145143d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14515a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
145169a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14517a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
145189a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
145199a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
145209a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
145219a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14522a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
145239a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14524ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (187 * 64)
145259a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
145269a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
145279a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
145289a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14529a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
145309a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
145319a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
145329a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14533a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14534a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14535a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14536ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SUB_LONG_2ADDR: /* 0xbc */
145373d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14538a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
145399a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14540a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
145419a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
145429a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
145439a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
145449a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14545a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
145469a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14547ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (188 * 64)
145489a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
145499a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
145509a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
145519a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14552a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
145539a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
145549a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
145559a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14556a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14557a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14558a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14559ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MUL_LONG_2ADDR: /* 0xbd */
145603d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14561a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
145629a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14563a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
145649a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
145659a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
145669a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
145679a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14568a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
145699a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14570ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (189 * 64)
145719a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
145729a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
145739a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
145749a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14575a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
145769a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
145779a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
145789a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14579a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14580a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14581a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14582ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DIV_LONG_2ADDR: /* 0xbe */
145833d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14584a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
145859a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14586a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
145879a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
145889a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
145899a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
145909a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14591a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
145929a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14593ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (190 * 64)
145949a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
145959a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
145969a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
145979a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14598a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
145999a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
146009a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
146019a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14602a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14603a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14604a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14605ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_REM_LONG_2ADDR: /* 0xbf */
146063d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14607a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
146089a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14609a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
146109a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
146119a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
146129a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
146139a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14614a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
146159a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14616ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (191 * 64)
146179a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
146189a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
146199a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
146209a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14621a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
146229a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
146239a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
146249a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14625a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14626a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14627a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14628ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AND_LONG_2ADDR: /* 0xc0 */
146293d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14630a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
146319a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14632a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
146339a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
146349a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
146359a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
146369a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14637a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
146389a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14639ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (192 * 64)
146409a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
146419a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
146429a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
146439a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14644a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
146459a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
146469a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
146479a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14648a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14649a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14650a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14651ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_OR_LONG_2ADDR: /* 0xc1 */
146523d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14653a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
146549a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14655a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
146569a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
146579a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
146589a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
146599a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14660a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
146619a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14662ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (193 * 64)
146639a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
146649a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
146659a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
146669a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14667a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
146689a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
146699a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
146709a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14671a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14672a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14673a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14674ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_XOR_LONG_2ADDR: /* 0xc2 */
146753d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14676a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
146779a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14678a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
146799a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
146809a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
146819a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
146829a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14683a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
146849a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14685ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (194 * 64)
146869a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
146879a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
146889a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
146899a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14690a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
146919a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
146929a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
146939a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14694a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14695a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14696a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14697ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SHL_LONG_2ADDR: /* 0xc3 */
146983d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14699a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
147009a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14701a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
147029a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
147039a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
147049a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
147059a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14706a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
147079a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14708ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (195 * 64)
147099a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
147109a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
147119a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
147129a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14713a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
147149a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
147159a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
147169a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14717a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14718a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14719a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14720ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SHR_LONG_2ADDR: /* 0xc4 */
147213d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14722a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
147239a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14724a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
147259a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
147269a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
147279a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
147289a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14729a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
147309a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14731ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (196 * 64)
147329a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
147339a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
147349a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
147359a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14736a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
147379a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
147389a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
147399a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14740a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14741a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14742a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14743ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_USHR_LONG_2ADDR: /* 0xc5 */
147443d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14745a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
147469a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14747a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
147489a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
147499a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
147509a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
147519a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14752a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
147539a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14754ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (197 * 64)
147559a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
147569a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
147579a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
147589a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14759a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
147609a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
147619a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
147629a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14763a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14764a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14765a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14766ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ADD_FLOAT_2ADDR: /* 0xc6 */
147673d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14768a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
147699a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14770a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
147719a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
147729a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
147739a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
147749a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14775a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
147769a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14777ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (198 * 64)
147789a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
147799a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
147809a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
147819a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14782a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
147839a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
147849a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
147859a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14786a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14787a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14788a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14789ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SUB_FLOAT_2ADDR: /* 0xc7 */
147903d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14791a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
147929a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14793a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
147949a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
147959a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
147969a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
147979a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14798a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
147999a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14800ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (199 * 64)
148019a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
148029a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
148039a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
148049a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14805a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
148069a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
148079a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
148089a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14809a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14810a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14811a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14812ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MUL_FLOAT_2ADDR: /* 0xc8 */
148133d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14814a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
148159a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14816a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
148179a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
148189a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
148199a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
148209a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14821a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
148229a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14823ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (200 * 64)
148249a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
148259a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
148269a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
148279a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14828a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
148299a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
148309a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
148319a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14832a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14833a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14834a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14835ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DIV_FLOAT_2ADDR: /* 0xc9 */
148363d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14837a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
148389a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14839a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
148409a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
148419a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
148429a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
148439a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14844a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
148459a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14846ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (201 * 64)
148479a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
148489a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
148499a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
148509a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14851a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
148529a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
148539a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
148549a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14855a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14856a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14857a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14858ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_REM_FLOAT_2ADDR: /* 0xca */
148593d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14860a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
148619a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14862a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
148639a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
148649a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
148659a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
148669a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14867a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
148689a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14869ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (202 * 64)
148709a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
148719a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
148729a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
148739a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14874a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
148759a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
148769a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
148779a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14878a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14879a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14880a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14881ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ADD_DOUBLE_2ADDR: /* 0xcb */
148823d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14883a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
148849a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14885a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
148869a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
148879a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
148889a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
148899a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14890a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
148919a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14892ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (203 * 64)
148939a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
148949a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
148959a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
148969a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14897a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
148989a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
148999a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
149009a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14901a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14902a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14903a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14904ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SUB_DOUBLE_2ADDR: /* 0xcc */
149053d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14906a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
149079a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14908a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
149099a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
149109a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
149119a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
149129a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14913a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
149149a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14915ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (204 * 64)
149169a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
149179a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
149189a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
149199a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14920a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
149219a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
149229a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
149239a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14924a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14925a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14926a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14927ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MUL_DOUBLE_2ADDR: /* 0xcd */
149283d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14929a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
149309a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14931a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
149329a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
149339a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
149349a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
149359a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14936a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
149379a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14938ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (205 * 64)
149399a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
149409a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
149419a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
149429a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14943a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
149449a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
149459a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
149469a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14947a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14948a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14949a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14950ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DIV_DOUBLE_2ADDR: /* 0xce */
149513d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14952a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
149539a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14954a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
149559a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
149569a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
149579a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
149589a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14959a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
149609a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14961ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (206 * 64)
149629a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
149639a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
149649a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
149659a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14966a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
149679a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
149689a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
149699a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14970a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14971a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14972a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14973ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_REM_DOUBLE_2ADDR: /* 0xcf */
149743d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14975a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
149769a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
14977a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
149789a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
149799a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
149809a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
149819a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
14982a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
149839a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
14984ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (207 * 64)
149859a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
149869a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
149879a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
149889a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
14989a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
149909a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
149919a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
149929a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
14993a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
14994a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
14995a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
14996ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ADD_INT_LIT16: /* 0xd0 */
149973d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
14998a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
149999a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15000a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
150019a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
150029a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
150039a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
150049a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15005a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
150069a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15007ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (208 * 64)
150089a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
150099a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
150109a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
150119a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15012a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
150139a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
150149a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
150159a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15016a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15017a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15018a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15019ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_RSUB_INT: /* 0xd1 */
150203d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15021a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
150229a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15023a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
150249a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
150259a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
150269a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
150279a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15028a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
150299a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15030ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (209 * 64)
150319a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
150329a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
150339a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
150349a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15035a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
150369a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
150379a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
150389a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15039a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15040a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15041a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15042ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MUL_INT_LIT16: /* 0xd2 */
150433d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15044a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
150459a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15046a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
150479a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
150489a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
150499a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
150509a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15051a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
150529a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15053ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (210 * 64)
150549a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
150559a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
150569a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
150579a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15058a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
150599a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
150609a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
150619a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15062a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15063a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15064a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15065ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DIV_INT_LIT16: /* 0xd3 */
150663d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15067a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
150689a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15069a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
150709a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
150719a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
150729a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
150739a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15074a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
150759a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15076ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (211 * 64)
150779a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
150789a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
150799a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
150809a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15081a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
150829a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
150839a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
150849a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15085a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15086a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15087a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15088ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_REM_INT_LIT16: /* 0xd4 */
150893d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15090a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
150919a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15092a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
150939a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
150949a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
150959a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
150969a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15097a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
150989a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15099ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (212 * 64)
151009a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
151019a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
151029a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
151039a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15104a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
151059a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
151069a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
151079a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15108a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15109a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15110a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15111ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AND_INT_LIT16: /* 0xd5 */
151123d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15113a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
151149a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15115a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
151169a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
151179a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
151189a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
151199a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15120a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
151219a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15122ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (213 * 64)
151239a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
151249a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
151259a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
151269a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15127a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
151289a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
151299a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
151309a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15131a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15132a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15133a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15134ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_OR_INT_LIT16: /* 0xd6 */
151353d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15136a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
151379a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15138a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
151399a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
151409a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
151419a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
151429a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15143a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
151449a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15145ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (214 * 64)
151469a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
151479a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
151489a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
151499a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15150a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
151519a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
151529a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
151539a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15154a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15155a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15156a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15157ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_XOR_INT_LIT16: /* 0xd7 */
151583d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15159a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
151609a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15161a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
151629a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
151639a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
151649a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
151659a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15166a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
151679a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15168ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (215 * 64)
151699a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
151709a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
151719a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
151729a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15173a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
151749a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
151759a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
151769a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15177a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15178a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15179a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15180ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_ADD_INT_LIT8: /* 0xd8 */
151813d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15182a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
151839a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15184a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
151859a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
151869a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
151879a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
151889a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15189a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
151909a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15191ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (216 * 64)
151929a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
151939a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
151949a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
151959a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15196a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
151979a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
151989a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
151999a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15200a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15201a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15202a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15203ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_RSUB_INT_LIT8: /* 0xd9 */
152043d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15205a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
152069a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15207a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
152089a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
152099a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
152109a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
152119a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15212a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
152139a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15214ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (217 * 64)
152159a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
152169a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
152179a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
152189a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15219a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
152209a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
152219a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
152229a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15223a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15224a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15225a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15226ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_MUL_INT_LIT8: /* 0xda */
152273d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15228a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
152299a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15230a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
152319a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
152329a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
152339a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
152349a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15235a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
152369a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15237ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (218 * 64)
152389a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
152399a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
152409a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
152419a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15242a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
152439a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
152449a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
152459a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15246a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15247a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15248a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15249ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_DIV_INT_LIT8: /* 0xdb */
152503d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15251a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
152529a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15253a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
152549a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
152559a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
152569a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
152579a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15258a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
152599a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15260ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (219 * 64)
152619a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
152629a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
152639a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
152649a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15265a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
152669a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
152679a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
152689a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15269a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15270a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15271a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15272ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_REM_INT_LIT8: /* 0xdc */
152733d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15274a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
152759a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15276a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
152779a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
152789a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
152799a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
152809a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15281a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
152829a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15283ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (220 * 64)
152849a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
152859a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
152869a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
152879a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15288a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
152899a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
152909a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
152919a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15292a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15293a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15294a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15295ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_AND_INT_LIT8: /* 0xdd */
152963d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15297a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
152989a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15299a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
153009a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
153019a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
153029a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
153039a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15304a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
153059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15306ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (221 * 64)
153079a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
153089a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
153099a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
153109a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15311a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
153129a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
153139a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
153149a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15315a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15316a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15317a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15318ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_OR_INT_LIT8: /* 0xde */
153193d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15320a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
153219a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15322a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
153239a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
153249a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
153259a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
153269a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15327a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
153289a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15329ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (222 * 64)
153309a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
153319a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
153329a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
153339a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15334a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
153359a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
153369a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
153379a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15338a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15339a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15340a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15341ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_XOR_INT_LIT8: /* 0xdf */
153423d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15343a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
153449a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15345a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
153469a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
153479a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
153489a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
153499a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15350a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
153519a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15352ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (223 * 64)
153539a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
153549a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
153559a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
153569a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15357a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
153589a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
153599a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
153609a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15361a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15362a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15363a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15364ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SHL_INT_LIT8: /* 0xe0 */
153653d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15366a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
153679a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15368a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
153699a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
153709a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
153719a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
153729a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15373a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
153749a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15375ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (224 * 64)
153769a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
153779a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
153789a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
153799a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15380a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
153819a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
153829a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
153839a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15384a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15385a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15386a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15387ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SHR_INT_LIT8: /* 0xe1 */
153883d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15389a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
153909a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15391a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
153929a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
153939a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
153949a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
153959a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15396a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
153979a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15398ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (225 * 64)
153999a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
154009a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
154019a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
154029a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15403a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
154049a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
154059a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
154069a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15407a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15408a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15409a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15410ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_USHR_INT_LIT8: /* 0xe2 */
154113d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15412a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
154139a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15414a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
154159a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
154169a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
154179a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
154189a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15419a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
154209a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15421ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (226 * 64)
154229a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
154239a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
154249a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
154259a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15426a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
154279a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
154289a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
154299a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15430a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15431a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15432a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15433ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_VOLATILE: /* 0xe3 */
154343d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15435a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
154369a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15437a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
154389a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
154399a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
154409a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
154419a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15442a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
154439a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15444ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (227 * 64)
154459a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
154469a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
154479a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
154489a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15449a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
154509a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
154519a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
154529a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15453a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15454a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15455a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15456ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_VOLATILE: /* 0xe4 */
154573d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15458a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
154599a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15460a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
154619a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
154629a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
154639a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
154649a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15465a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
154669a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15467ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (228 * 64)
154689a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
154699a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
154709a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
154719a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15472a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
154739a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
154749a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
154759a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15476a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15477a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15478a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15479ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SGET_VOLATILE: /* 0xe5 */
154803d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15481a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
154829a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15483a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
154849a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
154859a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
154869a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
154879a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15488a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
154899a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15490ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (229 * 64)
154919a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
154929a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
154939a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
154949a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15495a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
154969a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
154979a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
154989a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15499a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15500a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15501a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15502ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPUT_VOLATILE: /* 0xe6 */
155033d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15504a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
155059a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15506a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
155079a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
155089a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
155099a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
155109a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15511a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
155129a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15513ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (230 * 64)
155149a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
155159a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
155169a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
155179a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15518a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
155199a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
155209a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
155219a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15522a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15523a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15524a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15525ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */
155263d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15527a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
155289a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15529a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
155309a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
155319a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
155329a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
155339a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15534a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
155359a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15536ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (231 * 64)
155379a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
155389a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
155399a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
155409a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15541a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
155429a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
155439a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
155449a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15545a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15546a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15547a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15548ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_WIDE_VOLATILE: /* 0xe8 */
155493d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15550a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
155519a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15552a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
155539a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
155549a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
155559a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
155569a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15557a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
155589a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15559ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (232 * 64)
155609a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
155619a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
155629a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
155639a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15564a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
155659a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
155669a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
155679a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15568a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15569a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15570a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15571ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */
155723d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15573a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
155749a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15575a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
155769a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
155779a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
155789a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
155799a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15580a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
155819a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15582ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (233 * 64)
155839a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
155849a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
155859a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
155869a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15587a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
155889a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
155899a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
155909a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15591a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15592a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15593a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15594ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SGET_WIDE_VOLATILE: /* 0xea */
155953d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15596a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
155979a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15598a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
155999a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
156009a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
156019a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
156029a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15603a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
156049a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15605ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (234 * 64)
156069a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
156079a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
156089a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
156099a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15610a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
156119a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
156129a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
156139a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15614a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15615a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15616a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15617ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPUT_WIDE_VOLATILE: /* 0xeb */
156183d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15619a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
156209a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15621a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
156229a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
156239a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
156249a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
156259a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15626a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
156279a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15628ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (235 * 64)
156299a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
156309a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
156319a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
156329a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15633a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
156349a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
156359a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
156369a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15637a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15638a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15639a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15640ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_BREAKPOINT: /* 0xec */
156413d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15642a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
156439a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15644a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
156459a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
156469a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
156479a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
156489a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15649a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
156509a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15651ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (236 * 64)
156529a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
156539a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
156549a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
156559a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15656a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
156579a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
156589a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
156599a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15660a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15661a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15662a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15663ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_THROW_VERIFICATION_ERROR: /* 0xed */
156643d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15665a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
156669a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15667a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
156689a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
156699a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
156709a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
156719a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15672a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
156739a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15674ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (237 * 64)
156759a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
156769a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
156779a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
156789a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15679a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
156809a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
156819a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
156829a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15683a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15684a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15685a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15686ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_EXECUTE_INLINE: /* 0xee */
156873d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15688a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
156899a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15690a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
156919a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
156929a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
156939a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
156949a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15695a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
156969a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15697ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (238 * 64)
156989a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
156999a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
157009a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
157019a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15702a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
157039a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
157049a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
157059a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15706a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15707a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15708a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15709ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_EXECUTE_INLINE_RANGE: /* 0xef */
157103d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15711a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
157129a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15713a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
157149a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
157159a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
157169a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
157179a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15718a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
157199a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15720ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (239 * 64)
157219a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
157229a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
157239a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
157249a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15725a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
157269a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
157279a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
157289a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15729a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15730a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15731a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15732ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_OBJECT_INIT_RANGE: /* 0xf0 */
157333d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15734a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
157359a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15736a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
157379a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
157389a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
157399a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
157409a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15741a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
157429a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15743ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (240 * 64)
157449a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
157459a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
157469a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
157479a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15748a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
157499a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
157509a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
157519a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15752a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15753a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15754a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15755ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_RETURN_VOID_BARRIER: /* 0xf1 */
157563d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15757a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
157589a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15759a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
157609a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
157619a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
157629a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
157639a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15764a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
157659a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15766ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (241 * 64)
157679a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
157689a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
157699a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
157709a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15771a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
157729a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
157739a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
157749a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15775a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15776a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15777a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15778ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_QUICK: /* 0xf2 */
157793d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15780a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
157819a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15782a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
157839a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
157849a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
157859a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
157869a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15787a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
157889a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15789ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (242 * 64)
157909a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
157919a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
157929a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
157939a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15794a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
157959a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
157969a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
157979a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15798a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15799a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15800a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15801ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_WIDE_QUICK: /* 0xf3 */
158023d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15803a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
158049a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15805a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
158069a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
158079a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
158089a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
158099a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15810a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
158119a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15812ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (243 * 64)
158139a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
158149a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
158159a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
158169a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15817a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
158189a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
158199a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
158209a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15821a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15822a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15823a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15824ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IGET_OBJECT_QUICK: /* 0xf4 */
158253d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15826a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
158279a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15828a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
158299a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
158309a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
158319a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
158329a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15833a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
158349a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15835ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (244 * 64)
158369a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
158379a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
158389a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
158399a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15840a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
158419a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
158429a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
158439a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15844a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15845a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15846a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15847ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_QUICK: /* 0xf5 */
158483d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15849a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
158509a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15851a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
158529a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
158539a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
158549a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
158559a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15856a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
158579a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15858ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (245 * 64)
158599a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
158609a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
158619a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
158629a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15863a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
158649a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
158659a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
158669a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15867a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15868a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15869a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15870ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_WIDE_QUICK: /* 0xf6 */
158713d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15872a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
158739a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15874a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
158759a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
158769a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
158779a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
158789a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15879a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
158809a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15881ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (246 * 64)
158829a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
158839a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
158849a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
158859a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15886a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
158879a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
158889a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
158899a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15890a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15891a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15892a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15893ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_OBJECT_QUICK: /* 0xf7 */
158943d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15895a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
158969a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15897a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
158989a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
158999a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
159009a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
159019a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15902a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
159039a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15904ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (247 * 64)
159059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
159069a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
159079a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
159089a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15909a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
159109a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
159119a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
159129a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15913a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15914a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15915a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15916ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */
159173d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15918a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
159199a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15920a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
159219a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
159229a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
159239a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
159249a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15925a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
159269a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15927ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (248 * 64)
159289a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
159299a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
159309a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
159319a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15932a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
159339a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
159349a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
159359a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15936a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15937a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15938a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15939ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */
159403d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15941a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
159429a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15943a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
159449a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
159459a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
159469a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
159479a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15948a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
159499a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15950ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (249 * 64)
159519a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
159529a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
159539a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
159549a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15955a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
159569a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
159579a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
159589a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15959a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15960a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15961a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15962ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_SUPER_QUICK: /* 0xfa */
159633d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15964a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
159659a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15966a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
159679a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
159689a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
159699a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
159709a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15971a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
159729a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15973ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (250 * 64)
159749a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
159759a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
159769a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
159779a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
15978a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
159799a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
159809a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
159819a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
15982a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
15983a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
15984a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
15985ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */
159863d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
15987a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
159889a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
15989a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
159909a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
159919a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
159929a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
159939a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
15994a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
159959a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
15996ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (251 * 64)
159979a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
159989a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
159999a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
160009a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
16001a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
160029a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
160039a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
160049a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16005a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
16006a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
16007a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
16008ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */
160093d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
16010a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
160119a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16012a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
160139a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
160149a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
160159a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
160169a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
16017a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
160189a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
16019ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (252 * 64)
160209a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
160219a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
160229a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
160239a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
16024a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
160259a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
160269a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
160279a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16028a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
16029a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
16030a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
16031ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SGET_OBJECT_VOLATILE: /* 0xfd */
160323d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
16033a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
160349a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16035a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
160369a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
160379a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
160389a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
160399a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
16040a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
160419a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
16042ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (253 * 64)
160439a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
160449a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
160459a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
160469a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
16047a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
160489a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
160499a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
160509a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16051a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
16052a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
16053a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
16054ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */
160553d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
16056a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
160579a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16058a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
160599a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
160609a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
160619a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
160629a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
16063a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
160649a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
16065ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (254 * 64)
160669a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
160679a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
160689a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
160699a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
16070a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
160719a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
160729a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
160739a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16074a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
16075a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/* ------------------------------ */
16076a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
16077ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes.L_ALT_OP_UNUSED_FF: /* 0xff */
160783d054be0780e2bee9553711d409608495cc2c19ebuzbee/* File: armv5te/alt_stub.S */
16079a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee/*
160809a3147c7412f4794434b4c2604aa2ba784867774buzbee * Inter-instruction transfer stub.  Call out to dvmCheckBefore to handle
16081a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee * any interesting requests and then jump to the real instruction
160829a3147c7412f4794434b4c2604aa2ba784867774buzbee * handler.    Note that the call to dvmCheckBefore is done as a tail call.
160839a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE updates won't be seen until a refresh, and we can tell we have a
160849a3147c7412f4794434b4c2604aa2ba784867774buzbee * stale rIBASE if breakFlags==0.  Always refresh rIBASE here, and then
160859a3147c7412f4794434b4c2604aa2ba784867774buzbee * bail to the real handler if breakFlags==0.
16086a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee */
160879a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrb   r3, [rSELF, #offThread_breakFlags]
16088ab35b50311951feea3782151dd5422ee944685c2Elliott Hughes    adrl   lr, dvmAsmInstructionStart + (255 * 64)
160899a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
160909a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp    r3, #0
160919a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq   lr                   @ nothing to do - jump to real handler
160929a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
16093a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    mov    r0, rPC              @ arg0
160949a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, rFP              @ arg1
160959a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, rSELF            @ arg2
160969a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      dvmCheckBefore       @ (dPC,dFP,self) tail call
16097a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee
16098a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .balign 64
16099a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .size   dvmAsmAltInstructionStart, .-dvmAsmAltInstructionStart
16100a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    .global dvmAsmAltInstructionEnd
16101a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbeedvmAsmAltInstructionEnd:
16102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* File: armv5te/footer.S */
16103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
16104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
16105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Common subroutines and data
16106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ===========================================================================
16107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .text
16110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .align  2
16111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16112ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
161139a3147c7412f4794434b4c2604aa2ba784867774buzbee
1611497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION)
161159a3147c7412f4794434b4c2604aa2ba784867774buzbee/*
161169a3147c7412f4794434b4c2604aa2ba784867774buzbee * "longjmp" to a translation after single-stepping.  Before returning
161179a3147c7412f4794434b4c2604aa2ba784867774buzbee * to translation, must save state for self-verification.
161189a3147c7412f4794434b4c2604aa2ba784867774buzbee */
161199a3147c7412f4794434b4c2604aa2ba784867774buzbee    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
161209a3147c7412f4794434b4c2604aa2ba784867774buzbeedvmJitResumeTranslation:
161219a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    rSELF, r0                             @ restore self
161229a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    rPC, r1                               @ restore Dalvik pc
161239a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    rFP, r2                               @ restore Dalvik fp
161249a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    r10, [rSELF,#offThread_jitResumeNPC]  @ resume address
161259a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, #0
161269a3147c7412f4794434b4c2604aa2ba784867774buzbee    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
161279a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
161289a3147c7412f4794434b4c2604aa2ba784867774buzbee    b      jitSVShadowRunStart                   @ resume as if cache hit
161299a3147c7412f4794434b4c2604aa2ba784867774buzbee                                                 @ expects resume addr in r10
161309a3147c7412f4794434b4c2604aa2ba784867774buzbee
1613197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpPunt
1613297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpPunt:
1613397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSPunt                 @ r2<- interpreter entry point
16134d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov    r3, #0
161359f601a917c8878204482c37aec7005054b6776fabuzbee    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
16136d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
1613797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1613897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpSingleStep
1613997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpSingleStep:
161409a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    rPC, r0              @ set up dalvik pc
161419a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
161429a3147c7412f4794434b4c2604aa2ba784867774buzbee    str    lr, [rSELF,#offThread_jitResumeNPC]
161439a3147c7412f4794434b4c2604aa2ba784867774buzbee    str    sp, [rSELF,#offThread_jitResumeNSP]
161449a3147c7412f4794434b4c2604aa2ba784867774buzbee    str    r1, [rSELF,#offThread_jitResumeDPC]
1614597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
16146d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
1614797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
161489a3147c7412f4794434b4c2604aa2ba784867774buzbee
161497a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    .global dvmJitToInterpNoChainNoProfile
161507a2697d327936e20ef5484f7819e2e4bf91c891fBen ChengdvmJitToInterpNoChainNoProfile:
161517a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r0,rPC                       @ pass our target PC
161527a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r2,#kSVSNoProfile            @ r2<- interpreter entry point
161537a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
161549f601a917c8878204482c37aec7005054b6776fabuzbee    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
161557a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    b      jitSVShadowRunEnd            @ doesn't return
161567a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng
1615740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelectNoChain
1615840094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain:
1615940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r0,rPC                       @ pass our target PC
161607a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
161617a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
161629f601a917c8878204482c37aec7005054b6776fabuzbee    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
16163d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
1616440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng
1616540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelect
1616640094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect:
161679a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
1616897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
161697a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
161709f601a917c8878204482c37aec7005054b6776fabuzbee    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
16171d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
1617297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1617340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpBackwardBranch
1617440094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpBackwardBranch:
161759a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
1617697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
161777a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
161789f601a917c8878204482c37aec7005054b6776fabuzbee    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
16179d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
1618097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1618197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpNormal
1618297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNormal:
161839a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    r0,[lr, #-1]                 @ pass our target PC
1618497319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSNormal               @ r2<- interpreter entry point
161857a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
161869f601a917c8878204482c37aec7005054b6776fabuzbee    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
16187d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
1618897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1618997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    .global dvmJitToInterpNoChain
1619097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff HaodvmJitToInterpNoChain:
1619197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r0,rPC                       @ pass our target PC
1619297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kSVSNoChain              @ r2<- interpreter entry point
161937a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r3, #0                       @ 0 means !inJitCodeCache
161949f601a917c8878204482c37aec7005054b6776fabuzbee    str    r3, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
16195d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    b      jitSVShadowRunEnd            @ doesn't return
1619697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
161979a3147c7412f4794434b4c2604aa2ba784867774buzbee
161989a3147c7412f4794434b4c2604aa2ba784867774buzbee/*
161999a3147c7412f4794434b4c2604aa2ba784867774buzbee * "longjmp" to a translation after single-stepping.
162009a3147c7412f4794434b4c2604aa2ba784867774buzbee */
162019a3147c7412f4794434b4c2604aa2ba784867774buzbee    .global dvmJitResumeTranslation              @ (Thread* self, u4* dFP)
162029a3147c7412f4794434b4c2604aa2ba784867774buzbeedvmJitResumeTranslation:
162039a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    rSELF, r0                             @ restore self
162049a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    rPC, r1                               @ restore Dalvik pc
162059a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    rFP, r2                               @ restore Dalvik fp
162069a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    r0, [rSELF,#offThread_jitResumeNPC]
162079a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r2, #0
162089a3147c7412f4794434b4c2604aa2ba784867774buzbee    str    r2, [rSELF,#offThread_jitResumeNPC]   @ reset resume address
162099a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    sp, [rSELF,#offThread_jitResumeNSP]   @ cut back native stack
162109a3147c7412f4794434b4c2604aa2ba784867774buzbee    bx     r0                                    @ resume translation
162119a3147c7412f4794434b4c2604aa2ba784867774buzbee
16212ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
16213ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter when the compiler is
16214ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * having issues translating/executing a Dalvik instruction. We have to skip
16215ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the code cache lookup otherwise it is possible to indefinitely bouce
16216ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * between the interpreter and the code cache if the instruction that fails
16217ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * to be compiled happens to be at a trace start.
16218ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
16219ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpPunt
16220ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpPunt:
16221ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    rPC, r0
16222978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
16223ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,lr
16224ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpPunt;
16225ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
16226ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
162277a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov    r0, #0
162289f601a917c8878204482c37aec7005054b6776fabuzbee    str    r0, [rSELF, #offThread_inJitCodeCache] @ Back to the interp land
16229a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16230ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
16231ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
16232ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
16233ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16234ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
16235ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return to the interpreter to handle a single instruction.
162369a3147c7412f4794434b4c2604aa2ba784867774buzbee * We'll use the normal single-stepping mechanism via interpBreak,
162379a3147c7412f4794434b4c2604aa2ba784867774buzbee * but also save the native pc of the resume point in the translation
162389a3147c7412f4794434b4c2604aa2ba784867774buzbee * and the native sp so that we can later do the equivalent of a
162399a3147c7412f4794434b4c2604aa2ba784867774buzbee * longjmp() to resume.
16240ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * On entry:
162419a3147c7412f4794434b4c2604aa2ba784867774buzbee *    dPC <= Dalvik PC of instrucion to interpret
16242ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *    lr <= resume point in translation
162439a3147c7412f4794434b4c2604aa2ba784867774buzbee *    r1 <= Dalvik PC of next instruction
16244ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
16245ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpSingleStep
16246ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpSingleStep:
162479a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    rPC, r0              @ set up dalvik pc
16248ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
162499a3147c7412f4794434b4c2604aa2ba784867774buzbee    str    lr, [rSELF,#offThread_jitResumeNPC]
162509a3147c7412f4794434b4c2604aa2ba784867774buzbee    str    sp, [rSELF,#offThread_jitResumeNSP]
162519a3147c7412f4794434b4c2604aa2ba784867774buzbee    str    r1, [rSELF,#offThread_jitResumeDPC]
162529a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1, #1
162539a3147c7412f4794434b4c2604aa2ba784867774buzbee    str    r1, [rSELF,#offThread_singleStepCount]  @ just step once
162549a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r0, rSELF
16255cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbee    mov    r1, #kSubModeCountedStep
16256cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbee    bl     dvmEnableSubMode     @ (self, newMode)
162579a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF,#offThread_curHandlerTable]
162589a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_INST()
162599a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_INST_OPCODE(ip)
162609a3147c7412f4794434b4c2604aa2ba784867774buzbee    GOTO_OPCODE(ip)
16261ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1626240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/*
1626340094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * Return from the translation cache and immediately request
1626440094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * a translation for the exit target.  Commonly used for callees.
1626540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */
1626640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelectNoChain
1626740094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelectNoChain:
16268978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
1626940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bl     dvmBumpNoChain
1627040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng#endif
1627140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r0,rPC
162729a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1,rSELF
162739a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl     dvmJitGetTraceAddrThread @ (pc, self)
162749f601a917c8878204482c37aec7005054b6776fabuzbee    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
1627540094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    r1, rPC                  @ arg1 of translation may need this
1627640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
162777a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    cmp    r0,#0                    @ !0 means translation exists
1627840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    bxne   r0                       @ continue native execution if so
162797a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    b      2f                       @ branch over to use the interpreter
16280ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16281ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
16282ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache and immediately request
16283ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * a translation for the exit target.  Commonly used following
16284ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * invokes.
16285ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
1628640094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    .global dvmJitToInterpTraceSelect
1628740094c16d9727cc1e047a7d4bddffe04dd566211Ben ChengdvmJitToInterpTraceSelect:
162889a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    rPC,[lr, #-1]           @ get our target PC
162899a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    add    rINST,lr,#-5            @ save start of chain branch
16290bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee    add    rINST, #-4              @  .. which is 9 bytes back
16291ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
162929a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1,rSELF
162939a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl     dvmJitGetTraceAddrThread @ (pc, self)
162949f601a917c8878204482c37aec7005054b6776fabuzbee    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
16295ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
16296ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    beq    2f
16297ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,rINST
16298ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
162999a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
163009a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @ in case target is HANDLER_INTERPRET
1630146cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    cmp    r0,#0                    @ successful chain?
1630246cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    bxne   r0                       @ continue native execution
1630346cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    b      toInterpreter            @ didn't chain - resume with interpreter
16304ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16305ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* No translation, so request one if profiling isn't disabled*/
16306ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng2:
16307a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
163089a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    r0, [rSELF, #offThread_pJitProfTable]
16309ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
16310ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0, #0
1631140094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
16312ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne    common_selectTrace
16313ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
16314ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)
16315ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16316ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
16317ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter.
16318ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * The return was done with a BLX from thumb mode, and
16319ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * the following 32-bit word contains the target rPC value.
16320ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Note that lr (r14) will have its low-order bit set to denote
16321ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * its thumb-mode origin.
16322ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng *
16323ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * We'll need to stash our lr origin away, recover the new
16324ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * target and then check to see if there is a translation available
16325ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * for our new target.  If so, we do a translation chain and
16326ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * go back to native execution.  Otherwise, it's back to the
16327ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * interpreter (after treating this entry as a potential
16328ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * trace start).
16329ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
16330ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpNormal
16331ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNormal:
163329a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    ldr    rPC,[lr, #-1]           @ get our target PC
163339a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    add    rINST,lr,#-5            @ save start of chain branch
16334bd0472480c6e876198fe19c4ffa22350c0ce57daBill Buzbee    add    rINST,#-4               @ .. which is 9 bytes back
16335978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
16336ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpNormal
16337ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
16338ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
163399a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1,rSELF
163409a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl     dvmJitGetTraceAddrThread @ (pc, self)
163419f601a917c8878204482c37aec7005054b6776fabuzbee    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
16342ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
1634346cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    beq    toInterpreter            @ go if not, otherwise do chain
16344ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r1,rINST
16345ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmJitChain              @ r0<- dvmJitChain(codeAddr,chainAddr)
163469a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
163479a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
1634846cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    cmp    r0,#0                    @ successful chain?
1634946cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    bxne   r0                       @ continue native execution
1635046cd5b63c29d3284a9ff3e0d0711fb136f409313Bill Buzbee    b      toInterpreter            @ didn't chain - resume with interpreter
16351ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16352ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
16353ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Return from the translation cache to the interpreter to do method invocation.
16354ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Check if translation exists for the callee, but don't chain to it.
16355ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
163567a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    .global dvmJitToInterpNoChainNoProfile
163577a2697d327936e20ef5484f7819e2e4bf91c891fBen ChengdvmJitToInterpNoChainNoProfile:
163587a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#if defined(WITH_JIT_TUNING)
163597a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    bl     dvmBumpNoChain
163607a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng#endif
163617a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r0,rPC
163629a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1,rSELF
163639a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl     dvmJitGetTraceAddrThread @ (pc, self)
163649f601a917c8878204482c37aec7005054b6776fabuzbee    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
163657a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    r1, rPC                  @ arg1 of translation may need this
163667a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
163677a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    cmp    r0,#0
163687a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    bxne   r0                       @ continue native execution if so
163697a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    EXPORT_PC()
16370a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
163717a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    FETCH_INST()
163727a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
163737a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
163747a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng
163757a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng/*
163767a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng * Return from the translation cache to the interpreter to do method invocation.
163777a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng * Check if translation exists for the callee, but don't chain to it.
163787a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng */
16379ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    .global dvmJitToInterpNoChain
16380ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmJitToInterpNoChain:
16381978738d2cbf9d08fa78c65762eaac3351ab76b9aBen Cheng#if defined(WITH_JIT_TUNING)
16382ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bl     dvmBumpNoChain
16383ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
16384ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov    r0,rPC
163859a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r1,rSELF
163869a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl     dvmJitGetTraceAddrThread @ (pc, self)
163879f601a917c8878204482c37aec7005054b6776fabuzbee    str    r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
163889a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    r1, rPC                  @ arg1 of translation may need this
163899a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
16390ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp    r0,#0
16391ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne   r0                       @ continue native execution if so
1639297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
16393ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
16394ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
16395ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * No translation, restore interpreter regs and start interpreting.
163969f601a917c8878204482c37aec7005054b6776fabuzbee * rSELF & rFP were preserved in the translated code, and rPC has
16397ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * already been restored by the time we get here.  We'll need to set
16398ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * up rIBASE & rINST, and load the address of the JitTable into r0.
16399ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
1640046cd5b63c29d3284a9ff3e0d0711fb136f409313Bill BuzbeetoInterpreter:
16401ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
16402a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16403ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    FETCH_INST()
164049a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    r0, [rSELF, #offThread_pJitProfTable]
164059a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
16406ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    @ NOTE: intended fallthrough
164077a2697d327936e20ef5484f7819e2e4bf91c891fBen Cheng
16408ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/*
164099a3147c7412f4794434b4c2604aa2ba784867774buzbee * Similar to common_updateProfile, but tests for null pJitProfTable
164109a3147c7412f4794434b4c2604aa2ba784867774buzbee * r0 holds pJifProfTAble, rINST is loaded, rPC is current and
164119a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE has been recently refreshed.
16412ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */
16413ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_testUpdateProfile:
164149a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r0, #0               @ JIT switched off?
164159a3147c7412f4794434b4c2604aa2ba784867774buzbee    beq     4f                   @ return to interp if so
16416ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
164179a3147c7412f4794434b4c2604aa2ba784867774buzbee/*
164189a3147c7412f4794434b4c2604aa2ba784867774buzbee * Common code to update potential trace start counter, and initiate
164199a3147c7412f4794434b4c2604aa2ba784867774buzbee * a trace-build if appropriate.
164209a3147c7412f4794434b4c2604aa2ba784867774buzbee * On entry here:
164219a3147c7412f4794434b4c2604aa2ba784867774buzbee *    r0    <= pJitProfTable (verified non-NULL)
164229a3147c7412f4794434b4c2604aa2ba784867774buzbee *    rPC   <= Dalvik PC
164239a3147c7412f4794434b4c2604aa2ba784867774buzbee *    rINST <= next instruction
164249a3147c7412f4794434b4c2604aa2ba784867774buzbee */
16425ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_updateProfile:
16426ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
164277b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    lsl     r3,r3,#(32 - JIT_PROF_SIZE_LOG_2)          @ shift out excess bits
164287b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    ldrb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ get counter
16429ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)
16430ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    subs    r1,r1,#1           @ decrement counter
164317b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ and store it
16432ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
16433ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
164349a3147c7412f4794434b4c2604aa2ba784867774buzbee    /* Looks good, reset the counter */
164359a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r1, [rSELF, #offThread_jitThreshold]
164367b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng    strb    r1,[r0,r3,lsr #(32 - JIT_PROF_SIZE_LOG_2)] @ reset counter
16437ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    EXPORT_PC()
16438ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r0,rPC
164399a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r1,rSELF
164409a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      dvmJitGetTraceAddrThread    @ (pc, self)
164419f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
164427a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     r1, rPC                     @ arg1 of translation may need this
164437a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    mov     lr, #0                      @  in case target is HANDLER_INTERPRET
16444ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
1644597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if !defined(WITH_SELF_VERIFICATION)
16446ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bxne    r0                          @ jump to the translation
1644740094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    mov     r2,#kJitTSelectRequest      @ ask for trace selection
1644840094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    @ fall-through to common_selectTrace
1644997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#else
1645040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
164519a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    beq     common_selectTrace
164529a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /*
164539a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * At this point, we have a target translation.  However, if
164549a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * that translation is actually the interpret-only pseudo-translation
164559a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     * we want to treat it the same as no translation.
164569a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee     */
16457d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    mov     r10, r0                     @ save target
164589a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    bl      dvmCompilerGetInterpretTemplate
16459d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    cmp     r0, r10                     @ special case?
16460d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng    bne     jitSVShadowRunStart         @ set up self verification shadow space
164611a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng    @ Need to clear the inJitCodeCache flag
164621a7b9d7703297358d6b2276dff02eaff6586a6fdBen Cheng    mov    r3, #0                       @ 0 means not in the JIT code cache
164639f601a917c8878204482c37aec7005054b6776fabuzbee    str    r3, [rSELF, #offThread_inJitCodeCache] @ back to the interp land
164649a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    GET_INST_OPCODE(ip)
164659a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    GOTO_OPCODE(ip)
164669a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    /* no return */
1646797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
164689a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee
1646940094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng/*
1647040094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng * On entry:
164719a3147c7412f4794434b4c2604aa2ba784867774buzbee *  r2 is jit state.
1647240094c16d9727cc1e047a7d4bddffe04dd566211Ben Cheng */
16473ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengcommon_selectTrace:
16474cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbee    ldrh    r0,[rSELF,#offThread_subMode]
16475cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbee    ands    r0, #(kSubModeJitTraceBuild | kSubModeJitSV)
164769a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     3f                         @ already doing JIT work, continue
164779f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2,[rSELF,#offThread_jitState]
164789a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r0, rSELF
164799a3147c7412f4794434b4c2604aa2ba784867774buzbee/*
164809a3147c7412f4794434b4c2604aa2ba784867774buzbee * Call out to validate trace-building request.  If successful,
164819a3147c7412f4794434b4c2604aa2ba784867774buzbee * rIBASE will be swapped to to send us into single-stepping trace
164829a3147c7412f4794434b4c2604aa2ba784867774buzbee * building mode, so we need to refresh before we continue.
164839a3147c7412f4794434b4c2604aa2ba784867774buzbee */
164849a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
164859a3147c7412f4794434b4c2604aa2ba784867774buzbee    SAVE_PC_FP_TO_SELF()                 @ copy of pc/fp to Thread
164869a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      dvmJitCheckTraceRequest
164879a3147c7412f4794434b4c2604aa2ba784867774buzbee3:
164889a3147c7412f4794434b4c2604aa2ba784867774buzbee    FETCH_INST()
164899a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
164909a3147c7412f4794434b4c2604aa2ba784867774buzbee4:
164919a3147c7412f4794434b4c2604aa2ba784867774buzbee    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
164929a3147c7412f4794434b4c2604aa2ba784867774buzbee    GOTO_OPCODE(ip)
164939a3147c7412f4794434b4c2604aa2ba784867774buzbee    /* no return */
164949a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
16495ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng
1649697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#if defined(WITH_SELF_VERIFICATION)
1649797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/*
1649897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * Save PC and registers to shadow memory for self verification mode
1649997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping to native translation.
16500d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng * On entry:
165019f601a917c8878204482c37aec7005054b6776fabuzbee *    rPC, rFP, rSELF: the values that they should contain
16502d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben Cheng *    r10: the address of the target translation.
1650397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */
16504d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunStart:
1650597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r0,rPC                      @ r0<- program counter
1650697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov     r1,rFP                      @ r1<- frame pointer
165079f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r2,rSELF                    @ r2<- self (Thread) pointer
165089a8c75adb2abf551d06dbf757bff558c1feded08Bill Buzbee    mov     r3,r10                      @ r3<- target translation
1650997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bl      dvmSelfVerificationSaveState @ save registers to shadow space
16510ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr     rFP,[r0,#offShadowSpace_shadowFP] @ rFP<- fp in shadow space
16511ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    bx      r10                         @ jump to the translation
1651297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
1651397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao/*
165149f601a917c8878204482c37aec7005054b6776fabuzbee * Restore PC, registers, and interpreter state to original values
1651597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao * before jumping back to the interpreter.
165169a3147c7412f4794434b4c2604aa2ba784867774buzbee * On entry:
165179a3147c7412f4794434b4c2604aa2ba784867774buzbee *   r0:  dPC
165189a3147c7412f4794434b4c2604aa2ba784867774buzbee *   r2:  self verification state
1651997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao */
16520d5adae17d71e86a1a5f3ae7825054e3249fb7879Ben ChengjitSVShadowRunEnd:
1652197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r1,rFP                        @ pass ending fp
165229f601a917c8878204482c37aec7005054b6776fabuzbee    mov    r3,rSELF                      @ pass self ptr for convenience
1652397319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    bl     dvmSelfVerificationRestoreState @ restore pc and fp values
165249a3147c7412f4794434b4c2604aa2ba784867774buzbee    LOAD_PC_FP_FROM_SELF()               @ restore pc, fp
16525ccd6c0102d1f898aaea1c94761167fdd083b5275Ben Cheng    ldr    r1,[r0,#offShadowSpace_svState] @ get self verification state
1652697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    cmp    r1,#0                         @ check for punt condition
1652797319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    beq    1f
165289a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ Set up SV single-stepping
165299a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov    r0, rSELF
16530cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbee    mov    r1, #kSubModeJitSV
16531cf2aac7e6a29e7e1e5f622fd6123e0d1a9a75bdabuzbee    bl     dvmEnableSubMode              @ (self, subMode)
1653297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    mov    r2,#kJitSelfVerification      @ ask for self verification
165339f601a917c8878204482c37aec7005054b6776fabuzbee    str    r2,[rSELF,#offThread_jitState]
165349a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ intentional fallthrough
1653597319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao1:                                       @ exit to interpreter without check
1653697319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    EXPORT_PC()
16537a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]
1653897319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    FETCH_INST()
1653997319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    GET_INST_OPCODE(ip)
1654097319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao    GOTO_OPCODE(ip)
1654197319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao#endif
1654297319a8a234e9fe1cf90ca39aa6eca37d729afd5Jeff Hao
16543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
16544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The equivalent of "goto bail", this calls through the "bail handler".
165459a3147c7412f4794434b4c2604aa2ba784867774buzbee * It will end this interpreter activation, and return to the caller
165469a3147c7412f4794434b4c2604aa2ba784867774buzbee * of dvmMterpStdRun.
16547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
165489a3147c7412f4794434b4c2604aa2ba784867774buzbee * State registers will be saved to the "thread" area before bailing
165499a3147c7412f4794434b4c2604aa2ba784867774buzbee * debugging purposes
16550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_gotoBail:
165529f601a917c8878204482c37aec7005054b6776fabuzbee    SAVE_PC_FP_TO_SELF()                @ export state to "thread"
165539f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ r0<- self ptr
165549f601a917c8878204482c37aec7005054b6776fabuzbee    b       dvmMterpStdBail             @ call(self, changeInterp)
16555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
165569a3147c7412f4794434b4c2604aa2ba784867774buzbee/*
165579a3147c7412f4794434b4c2604aa2ba784867774buzbee * The JIT's invoke method needs to remember the callsite class and
165589a3147c7412f4794434b4c2604aa2ba784867774buzbee * target pair.  Save them here so that they are available to
165599a3147c7412f4794434b4c2604aa2ba784867774buzbee * dvmCheckJit following the interpretation of this invoke.
165609a3147c7412f4794434b4c2604aa2ba784867774buzbee */
165619a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
165629a3147c7412f4794434b4c2604aa2ba784867774buzbeesave_callsiteinfo:
165639a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r9, #0
165649a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldrne   r9, [r9, #offObject_clazz]
165659a3147c7412f4794434b4c2604aa2ba784867774buzbee    str     r0, [rSELF, #offThread_methodToCall]
165669a3147c7412f4794434b4c2604aa2ba784867774buzbee    str     r9, [rSELF, #offThread_callsiteClass]
165679a3147c7412f4794434b4c2604aa2ba784867774buzbee    bx      lr
165689a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
16569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
16571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation with range.
16572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
16573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
165749a3147c7412f4794434b4c2604aa2ba784867774buzbee *  r0 is "Method* methodToCall", r9 is "this"
16575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodRange:
16577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewRange:
165789a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
16579389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    r1, [rSELF, #offThread_subMode]
165809a3147c7412f4794434b4c2604aa2ba784867774buzbee    ands    r1, #kSubModeJitTraceBuild
165819a3147c7412f4794434b4c2604aa2ba784867774buzbee    blne    save_callsiteinfo
165829a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
16583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ prepare to copy args to "outs" area of current frame
16584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r2, rINST, lsr #8           @ r2<- AA (arg count) -- test for zero
16585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
16586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     .LinvokeArgsDone            @ if no args, skip the rest
16587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(r1, 2)                        @ r1<- CCCC
16588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1658971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao.LinvokeRangeArgs:
16590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=methodToCall, r1=CCCC, r2=count, r10=outs
16591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ (very few methods have > 10 args; could unroll for common cases)
16592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     r3, rFP, r1, lsl #2         @ r3<- &fp[CCCC]
16593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r10, r10, r2, lsl #2        @ r10<- "outs" area, for call args
16594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  ldr     r1, [r3], #4                @ val = *fp++
16595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    subs    r2, r2, #1                  @ count--
16596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r1, [r10], #4               @ *outs++ = val
16597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     1b                          @ ...while count != 0
16598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .LinvokeArgsDone
16599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
16601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for method invocation without range.
16602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
16603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On entry:
166049a3147c7412f4794434b4c2604aa2ba784867774buzbee *  r0 is "Method* methodToCall", r9 is "this"
16605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_invokeMethodNoRange:
16607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNewNoRange:
166089a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
16609389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    r1, [rSELF, #offThread_subMode]
166109a3147c7412f4794434b4c2604aa2ba784867774buzbee    ands    r1, #kSubModeJitTraceBuild
166119a3147c7412f4794434b4c2604aa2ba784867774buzbee    blne    save_callsiteinfo
166129a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
16613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ prepare to copy args to "outs" area of current frame
16614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    movs    r2, rINST, lsr #12          @ r2<- B (arg count) -- test for zero
16615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, rFP)          @ r10<- stack save area
16616642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    FETCH(r1, 2)                        @ r1<- GFED (load here to hide latency)
16617642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    beq     .LinvokeArgsDone
16618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1661971eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    @ r0=methodToCall, r1=GFED, r2=count, r10=outs
16620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNonRange:
16621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rsb     r2, r2, #5                  @ r2<- 5-r2
16622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     pc, pc, r2, lsl #4          @ computed goto, 4 instrs each
16623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_abort                @ (skipped due to ARM prefetch)
16624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project5:  and     ip, rINST, #0x0f00          @ isolate A
16625642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vA (shift right 8, left 2)
16626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
16627642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vA
16628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4:  and     ip, r1, #0xf000             @ isolate G
16629642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #10]      @ r2<- vG (shift right 12, left 2)
16630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
16631642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vG
16632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3:  and     ip, r1, #0x0f00             @ isolate F
16633642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #6]       @ r2<- vF
16634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
16635642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vF
16636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2:  and     ip, r1, #0x00f0             @ isolate E
16637642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsr #2]       @ r2<- vE
16638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
16639642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vE
16640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:  and     ip, r1, #0x000f             @ isolate D
16641642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [rFP, ip, lsl #2]       @ r2<- vD
16642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r0                      @ nop
16643642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    str     r2, [r10, #-4]!             @ *--outs = vD
16644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0:  @ fall through to .LinvokeArgsDone
16645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1664671eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao.LinvokeArgsDone: @ r0=methodToCall
1664771eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    ldrh    r9, [r0, #offMethod_registersSize]  @ r9<- methodToCall->regsSize
1664871eee1f0c2eb514585fdbee16730c9c2209e8f68jeffhao    ldrh    r3, [r0, #offMethod_outsSize]  @ r3<- methodToCall->outsSize
16649642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r2, [r0, #offMethod_insns]  @ r2<- method->insns
16650642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     rINST, [r0, #offMethod_clazz]  @ rINST<- method->clazz
16651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ find space for the new stack frame, check for overflow
16652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- stack save area
16653642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    sub     r1, r1, r9, lsl #2          @ r1<- newFp (old savearea - regsSize)
16654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r10, r1)           @ r10<- newSaveArea
16655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@    bl      common_dumpRegs
166569f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_interpStackEnd]    @ r9<- interpStackEnd
16657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r3, r10, r3, lsl #2         @ r3<- bottom (newsave - outsSize)
16658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r3, r9                      @ bottom < interpStackEnd?
16659389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    lr, [rSELF, #offThread_subMode]
16660642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [r0, #offMethod_accessFlags] @ r3<- methodToCall->accessFlags
166617a44e4ee0782d24b4c6090be1f0a3c66f971f2c1Andy McFadden    blo     .LstackOverflow             @ yes, this frame will overflow stack
16662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ set up newSaveArea
16664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef EASY_GDB
16665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(ip, rFP)           @ ip<- stack save area
16666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [r10, #offStackSaveArea_prevSave]
16667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
16668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [r10, #offStackSaveArea_prevFrame]
16669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rPC, [r10, #offStackSaveArea_savedPc]
16670ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
16671ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     r9, #0
16672ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    str     r9, [r10, #offStackSaveArea_returnAddr]
16673ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
16674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [r10, #offStackSaveArea_method]
166759a3147c7412f4794434b4c2604aa2ba784867774buzbee
166769a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ Profiling?
166779a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     lr, #0                      @ any special modes happening?
166789a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     2f                          @ go if so
166799a3147c7412f4794434b4c2604aa2ba784867774buzbee1:
16680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    tst     r3, #ACC_NATIVE
16681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     .LinvokeNative
16682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
16684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0-r3}
16685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_printNewline
16686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rFP
16687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #0
16688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmDumpFp
16689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0-r3}
16690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0-r3}
16691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1
16692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r10
16693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmDumpFp
16694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      common_printNewline
16695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0-r3}
16696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    */
16697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16698642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrh    r9, [r2]                        @ r9 <- load INST from new PC
16699642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r3, [rINST, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
16700642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rPC, r2                         @ publish new rPC
16701642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng
167029f601a917c8878204482c37aec7005054b6776fabuzbee    @ Update state values for the new method
167039f601a917c8878204482c37aec7005054b6776fabuzbee    @ r0=methodToCall, r1=newFp, r3=newMethodClass, r9=newINST
167049f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_method]    @ self->method = methodToCall
167059f601a917c8878204482c37aec7005054b6776fabuzbee    str     r3, [rSELF, #offThread_methodClassDex] @ self->methodClassDex = ...
167069a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r2, #1
167079a3147c7412f4794434b4c2604aa2ba784867774buzbee    str     r2, [rSELF, #offThread_debugIsMethodEntry]
16708ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
167099a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r0, [rSELF, #offThread_pJitProfTable]
16710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rFP, r1                         @ fp = newFp
16711642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
16712642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rINST, r9                       @ publish new rINST
1671330bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
16714ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    cmp     r0,#0
16715ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    bne     common_updateProfile
16716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                         @ jump to next instruction
16717ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
16718ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rFP, r1                         @ fp = newFp
16719ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_PREFETCHED_OPCODE(ip, r9)           @ extract prefetched opcode from r9
16720ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rINST, r9                       @ publish new rINST
1672130bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
16722ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                         @ jump to next instruction
16723ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
16724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
167259a3147c7412f4794434b4c2604aa2ba784867774buzbee2:
167269a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ Profiling - record method entry.  r0: methodToCall
167279a3147c7412f4794434b4c2604aa2ba784867774buzbee    stmfd   sp!, {r0-r3}                @ preserve r0-r3
1672899e3e6e72e3471eb85fc2e405866392b01c080febuzbee    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
167299a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r1, r0
167309a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r0, rSELF
167319a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      dvmReportInvoke             @ (self, method)
167329a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldmfd   sp!, {r0-r3}                @ restore r0-r3
167339a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       1b
167349a3147c7412f4794434b4c2604aa2ba784867774buzbee
16735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeNative:
16736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ Prep for the native call
16737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ r0=methodToCall, r1=newFp, r10=newSaveArea
16738389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    lr, [rSELF, #offThread_subMode]
167399f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_jniLocal_topCookie]@r9<-thread->localRef->...
1674030bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     r1, [rSELF, #offThread_curFrame]   @ curFrame = newFp
16741d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    str     r9, [r10, #offStackSaveArea_localRefCookie] @newFp->localRefCookie=top
16742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0                      @ r2<- methodToCall
16743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r1                      @ r0<- newFp (points to args)
167449f601a917c8878204482c37aec7005054b6776fabuzbee    add     r1, rSELF, #offThread_retval  @ r1<- &retval
167459f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r3, rSELF                   @ arg3<- self
16746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
16748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* insert fake function header to help gdb find the stack frame */
16749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       .Lskip
16750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .type   dalvik_mterp, %function
16751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdalvik_mterp:
16752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnstart
16753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY1
16754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    MTERP_ENTRY2
16755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.Lskip:
16756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
16757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
167589a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     lr, #0                      @ any special SubModes active?
167599a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     11f                         @ go handle them if so
167608b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
167618b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
167629a3147c7412f4794434b4c2604aa2ba784867774buzbee7:
16763964a7b06a9134947b5985c7f712d18d57ed665d2Bill Buzbee
167649f601a917c8878204482c37aec7005054b6776fabuzbee    @ native return; r10=newSaveArea
16765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ equivalent to dvmPopJniLocals
16766d5ab726b65d7271be261864c7e224fb90bfe06e0Andy McFadden    ldr     r0, [r10, #offStackSaveArea_localRefCookie] @ r0<- saved top
167679f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r1, [rSELF, #offThread_exception] @ check for exception
1676830bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
16769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ null?
167709f601a917c8878204482c37aec7005054b6776fabuzbee    str     r0, [rSELF, #offThread_jniLocal_topCookie] @ new top <- old top
16771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bne     common_exceptionThrown      @ no, handle exception
16772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_ADVANCE_INST(3)               @ advance rPC, load rINST
16774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
16775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
16776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
167779a3147c7412f4794434b4c2604aa2ba784867774buzbee11:
167789a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ r0=newFp, r1=&retval, r2=methodToCall, r3=self, lr=subModes
167799a3147c7412f4794434b4c2604aa2ba784867774buzbee    stmfd   sp!, {r0-r3}                @ save all but subModes
1678099e3e6e72e3471eb85fc2e405866392b01c080febuzbee    mov     r0, r2                      @ r0<- methodToCall
167819a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r1, rSELF
1678230bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    mov     r2, rFP
1678330bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    bl      dvmReportPreNativeInvoke    @ (methodToCall, self, fp)
167849a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldmfd   sp, {r0-r3}                 @ refresh.  NOTE: no sp autoincrement
167852ff04ab635eeba79c2dad82850c34188abcdfe62Andy McFadden
167869a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ Call the native method
167878b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    ldr     ip, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
167888b095215a4d5bde723819087f3455bdcc250a78fDavid Butcher    blx     ip
167892ff04ab635eeba79c2dad82850c34188abcdfe62Andy McFadden
167909a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ Restore the pre-call arguments
167919a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldmfd   sp!, {r0-r3}                @ r2<- methodToCall (others unneeded)
167929a3147c7412f4794434b4c2604aa2ba784867774buzbee
167939a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ Finish up any post-invoke subMode requirements
1679499e3e6e72e3471eb85fc2e405866392b01c080febuzbee    mov     r0, r2                      @ r0<- methodToCall
167959a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r1, rSELF
1679630bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    mov     r2, rFP
1679730bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    bl      dvmReportPostNativeInvoke   @ (methodToCall, self, fp)
167989a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       7b                          @ resume
167992ff04ab635eeba79c2dad82850c34188abcdfe62Andy McFadden
168006ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden.LstackOverflow:    @ r0=methodToCall
168016ed1a0f396a1857c31b486d3e93ee2dbeb49a6cdAndy McFadden    mov     r1, r0                      @ r1<- methodToCall
168029f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ r0<- self
16803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmHandleStackOverflow
16804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
16805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifdef ASSIST_DEBUGGER
16806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .fnend
16807b387fe1b970a216c09d2abc98c893ff1fff3e512Andy McFadden    .size   dalvik_mterp, .-dalvik_mterp
16808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
16809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
16812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Common code for method invocation, calling through "glue code".
16813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
16814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * TODO: now that we have range and non-range invoke handlers, this
16815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       needs to be split into two.  Maybe just create entry points
16816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *       that set r9 and jump here?
16817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
16818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * On entry:
16819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r0 is "Method* methodToCall", the method we're trying to call
16820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *  r9 is "bool methodCallRange", indicating if this is a /range variant
16821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
16822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     .if    0
16823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LinvokeOld:
16824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     sp, sp, #8                  @ space for args + pad
16825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH(ip, 2)                        @ ip<- FEDC or CCCC
16826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0                      @ A2<- methodToCall
168279f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ A0<- self
168289f601a917c8878204482c37aec7005054b6776fabuzbee    SAVE_PC_FP_TO_SELF()                @ export state to "self"
16829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r9                      @ A1<- methodCallRange
16830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, rINST, lsr #8           @ A3<- AA
16831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [sp, #0]                @ A4<- ip
16832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_invokeMethod       @ call the C invokeMethod
16833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ remove arg area
16834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall  @ continue to next instruction
16835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
16836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
16840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common code for handling a return instruction.
16841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
16842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
16843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_returnFromMethod:
16845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnNew:
16846389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    lr, [rSELF, #offThread_subMode]
1684718fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    SAVEAREA_FROM_FP(r0, rFP)
1684818fba346582c08d81aa96d9508c0e935bad5f36fbuzbee    ldr     r9, [r0, #offStackSaveArea_savedPc] @ r9 = saveArea->savedPc
168499a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     lr, #0                      @ any special subMode handling needed?
168509a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     19f
168519a3147c7412f4794434b4c2604aa2ba784867774buzbee14:
16852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     rFP, [r0, #offStackSaveArea_prevFrame] @ fp = saveArea->prevFrame
16853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [rFP, #(offStackSaveArea_method - sizeofStackSaveArea)]
16854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                                        @ r2<- method we're returning to
16855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r2, #0                      @ is this a break frame?
168568c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#if defined(WORKAROUND_CORTEX_A9_745320)
168578c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    /* Don't use conditional loads if the HW defect exists */
168589a3147c7412f4794434b4c2604aa2ba784867774buzbee    beq     15f
168598c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng    ldr     r10, [r2, #offMethod_clazz] @ r10<- method->clazz
168609a3147c7412f4794434b4c2604aa2ba784867774buzbee15:
168618c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#else
16862642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldrne   r10, [r2, #offMethod_clazz] @ r10<- method->clazz
168638c9ac9ab0ab6fd75b73cb0d99005da3aa90c167cBen Cheng#endif
16864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     common_gotoBail             @ break frame, bail out completely
16865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
168669a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
16867642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    PREFETCH_ADVANCE_INST(rINST, r9, 3) @ advance r9, update new rINST
168689f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_method]@ self->method = newSave->method
16869642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    ldr     r1, [r10, #offClassObject_pDvmDex]   @ r1<- method->clazz->pDvmDex
1687030bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]  @ curFrame = fp
16871ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#if defined(WITH_JIT)
168727a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    ldr     r10, [r0, #offStackSaveArea_returnAddr] @ r10 = saveArea->returnAddr
16873ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    mov     rPC, r9                     @ publish new rPC
168749f601a917c8878204482c37aec7005054b6776fabuzbee    str     r1, [rSELF, #offThread_methodClassDex]
168759f601a917c8878204482c37aec7005054b6776fabuzbee    str     r10, [rSELF, #offThread_inJitCodeCache]  @ may return to JIT'ed land
168767a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    cmp     r10, #0                      @ caller is compiled code
168777a0bcd0de6c4da6499a088a18d1750e51204c2a6Ben Cheng    blxne   r10
16878ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
16879ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng    GOTO_OPCODE(ip)                     @ jump to next instruction
16880ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#else
16881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
16882642d9646f0399648e377ed8e1b36eba9b12f84b2Ben Cheng    mov     rPC, r9                     @ publish new rPC
168839f601a917c8878204482c37aec7005054b6776fabuzbee    str     r1, [rSELF, #offThread_methodClassDex]
16884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
16885ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif
16886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
168879a3147c7412f4794434b4c2604aa2ba784867774buzbee19:
168889a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ Handle special actions
168899a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ On entry, r0: StackSaveArea
1689099e3e6e72e3471eb85fc2e405866392b01c080febuzbee    ldr     r1, [r0, #offStackSaveArea_prevFrame]  @ r2<- prevFP
1689199e3e6e72e3471eb85fc2e405866392b01c080febuzbee    str     rPC, [rSELF, #offThread_pc] @ update interpSave.pc
1689230bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     r1, [rSELF, #offThread_curFrame]   @ update interpSave.curFrame
168939a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r0, rSELF
1689499e3e6e72e3471eb85fc2e405866392b01c080febuzbee    bl      dvmReportReturn             @ (self)
168959a3147c7412f4794434b4c2604aa2ba784867774buzbee    SAVEAREA_FROM_FP(r0, rFP)           @ restore StackSaveArea
168969a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       14b                         @ continue
168979a3147c7412f4794434b4c2604aa2ba784867774buzbee
16898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
16899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Return handling, calls through "glue code".
16900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
16901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     .if    0
16902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LreturnOld:
169039f601a917c8878204482c37aec7005054b6776fabuzbee    SAVE_PC_FP_TO_SELF()                @ export state
169049f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ arg to function
16905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_returnFromMethod
16906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall
16907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
16908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
16911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Somebody has thrown an exception.  Handle it.
16912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
16913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the exception processing code returns to us (instead of falling
16914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * out of the interpreter), continue with whatever the next instruction
16915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * now happens to be.
16916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
16917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This does not return.
16918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16919ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng     .global dvmMterpCommonExceptionThrown
16920ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben ChengdvmMterpCommonExceptionThrown:
16921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_exceptionThrown:
16922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionNew:
169239a3147c7412f4794434b4c2604aa2ba784867774buzbee
169249a3147c7412f4794434b4c2604aa2ba784867774buzbee    EXPORT_PC()
169259a3147c7412f4794434b4c2604aa2ba784867774buzbee
169269a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r0, rSELF
169279a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      dvmCheckSuspendPending
16928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169299f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r9, [rSELF, #offThread_exception] @ r9<- self->exception
169309f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r1, rSELF                   @ r1<- self
16931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
16932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmAddTrackedAlloc          @ don't let the exception be GCed
16933389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    r2, [rSELF, #offThread_subMode]  @ get subMode flags
16934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, #0                      @ r3<- NULL
169359f601a917c8878204482c37aec7005054b6776fabuzbee    str     r3, [rSELF, #offThread_exception] @ self->exception = NULL
16936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169379a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ Special subMode?
169389a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r2, #0                      @ any special subMode handling needed?
169399a3147c7412f4794434b4c2604aa2ba784867774buzbee    bne     7f                          @ go if so
169409a3147c7412f4794434b4c2604aa2ba784867774buzbee8:
16941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* set up args and a local for "&fp" */
16942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* (str sp, [sp, #-4]!  would be perfect here, but is discouraged) */
16943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     rFP, [sp, #-4]!             @ *--sp = fp
16944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     ip, sp                      @ ip<- &fp
16945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, #0                      @ r3<- false
16946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     ip, [sp, #-4]!              @ *--sp = &fp
169479f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r1, [rSELF, #offThread_method] @ r1<- self->method
169489f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ r0<- self
16949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offMethod_insns]  @ r1<- method->insns
16950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r9                      @ r2<- exception
16951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r1, rPC, r1                 @ r1<- pc - method->insns
16952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r1, asr #1              @ r1<- offset in code units
16953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* call, r0 gets catchRelPc (a code-unit offset) */
16955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmFindCatchBlock           @ call(self, relPc, exc, scan?, &fp)
16956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fix earlier stack overflow if necessary; may trash rFP */
169589f601a917c8878204482c37aec7005054b6776fabuzbee    ldrb    r1, [rSELF, #offThread_stackOverflowed]
16959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ did we overflow earlier?
16960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    beq     1f                          @ no, skip ahead
16961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     rFP, r0                     @ save relPc result in rFP
169629f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ r0<- self
169634fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden    mov     r1, r9                      @ r1<- exception
16964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmCleanupStackOverflow     @ call(self)
16965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, rFP                     @ restore result
16966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1:
16967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* update frame pointer and check result from dvmFindCatchBlock */
16969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     rFP, [sp, #4]               @ retrieve the updated rFP
16970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r0, #0                      @ is catchRelPc < 0?
16971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     sp, sp, #8                  @ restore stack
16972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bmi     .LnotCaughtLocally
16973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1697430bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    /* adjust locals to match self->interpSave.curFrame and updated PC */
16975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SAVEAREA_FROM_FP(r1, rFP)           @ r1<- new save area
16976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r1, #offStackSaveArea_method] @ r1<- new method
169779f601a917c8878204482c37aec7005054b6776fabuzbee    str     r1, [rSELF, #offThread_method]  @ self->method = new method
16978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r1, #offMethod_clazz]      @ r2<- method->clazz
16979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r1, #offMethod_insns]      @ r3<- method->insns
16980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, [r2, #offClassObject_pDvmDex] @ r2<- method->clazz->pDvmDex
16981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    add     rPC, r3, r0, asl #1             @ rPC<- method->insns + catchRelPc
169829f601a917c8878204482c37aec7005054b6776fabuzbee    str     r2, [rSELF, #offThread_methodClassDex] @ self->pDvmDex = meth...
16983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* release the tracked alloc on the exception */
16985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
169869f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r1, rSELF                   @ r1<- self
16987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmReleaseTrackedAlloc      @ release the exception
16988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
16989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* restore the exception if the handler wants it */
169909a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr    rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh rIBASE
16991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
16992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
16993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     ip, #OP_MOVE_EXCEPTION      @ is it "move-exception"?
169949f601a917c8878204482c37aec7005054b6776fabuzbee    streq   r9, [rSELF, #offThread_exception] @ yes, restore the exception
16995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
16996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169979a3147c7412f4794434b4c2604aa2ba784867774buzbee    @ Manage debugger bookkeeping
169989a3147c7412f4794434b4c2604aa2ba784867774buzbee7:
1699999e3e6e72e3471eb85fc2e405866392b01c080febuzbee    str     rPC, [rSELF, #offThread_pc]     @ update interpSave.pc
1700030bc0d46ae730d78c42c39cfa56a59ba3025380bbuzbee    str     rFP, [rSELF, #offThread_curFrame]     @ update interpSave.curFrame
170019a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r0, rSELF                       @ arg0<- self
1700299e3e6e72e3471eb85fc2e405866392b01c080febuzbee    mov     r1, r9                          @ arg1<- exception
1700399e3e6e72e3471eb85fc2e405866392b01c080febuzbee    bl      dvmReportExceptionThrow         @ (self, exception)
170049a3147c7412f4794434b4c2604aa2ba784867774buzbee    b       8b                              @ resume with normal handling
170059a3147c7412f4794434b4c2604aa2ba784867774buzbee
170069f601a917c8878204482c37aec7005054b6776fabuzbee.LnotCaughtLocally: @ r9=exception
17007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* fix stack overflow if necessary */
170089f601a917c8878204482c37aec7005054b6776fabuzbee    ldrb    r1, [rSELF, #offThread_stackOverflowed]
17009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp     r1, #0                      @ did we overflow earlier?
170109f601a917c8878204482c37aec7005054b6776fabuzbee    movne   r0, rSELF                   @ if yes: r0<- self
170114fbba1f95b3e27bdc5f5572bb0420b5f928aa54eAndy McFadden    movne   r1, r9                      @ if yes: r1<- exception
17012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    blne    dvmCleanupStackOverflow     @ if yes: call(self)
17013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ may want to show "not caught locally" debug messages here
17015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if DVM_SHOW_EXCEPTION >= 2
17016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* call __android_log_print(prio, tag, format, ...) */
17017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* "Exception %s from %s:%d not caught locally" */
17018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ dvmLineNumFromPC(method, pc - method->insns)
170199f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r0, [rSELF, #offThread_method]
17020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, [r0, #offMethod_insns]
17021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    sub     r1, rPC, r1
17022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    asr     r1, r1, #1
17023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmLineNumFromPC
17024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [sp, #-4]!
17025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ dvmGetMethodSourceFile(method)
170269f601a917c8878204482c37aec7005054b6776fabuzbee    ldr     r0, [rSELF, #offThread_method]
17027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmGetMethodSourceFile
17028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    str     r0, [sp, #-4]!
17029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @ exception->clazz->descriptor
17030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r9, #offObject_clazz]
17031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r3, [r3, #offClassObject_descriptor]
17032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @
17033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r2, strExceptionNotCaughtLocally
170345dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel0:  add     r2, pc
17035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r1, strLogTag
170365dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel1:  add     r1, pc
17037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, #3                      @ LOG_DEBUG
17038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      __android_log_print
17039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
170409f601a917c8878204482c37aec7005054b6776fabuzbee    str     r9, [rSELF, #offThread_exception] @ restore exception
17041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r0, r9                      @ r0<- exception
170429f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r1, rSELF                   @ r1<- self
17043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmReleaseTrackedAlloc      @ release the exception
17044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_gotoBail             @ bail out
17045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
170465dfcc78af479937ba8dafceefd9b1931a88dfaafArd BiesheuvelstrExceptionNotCaughtLocally:
170475dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrExceptionNotCaughtLocally,0b)
170485dfcc78af479937ba8dafceefd9b1931a88dfaafArd BiesheuvelstrLogTag:
170495dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrLogTag,1b)
17050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
17052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Exception handling, calls through "glue code".
17053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
17054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
17055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LexceptionOld:
170569f601a917c8878204482c37aec7005054b6776fabuzbee    SAVE_PC_FP_TO_SELF()                @ export state
170579f601a917c8878204482c37aec7005054b6776fabuzbee    mov     r0, rSELF                   @ arg to function
17058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterp_exceptionThrown
17059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_resumeAfterGlueCall
17060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
17061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
170629a3147c7412f4794434b4c2604aa2ba784867774buzbee#if defined(WITH_JIT)
170639a3147c7412f4794434b4c2604aa2ba784867774buzbee    /*
170649a3147c7412f4794434b4c2604aa2ba784867774buzbee     * If the JIT is actively building a trace we need to make sure
170659a3147c7412f4794434b4c2604aa2ba784867774buzbee     * that the field is fully resolved before including the current
170669a3147c7412f4794434b4c2604aa2ba784867774buzbee     * instruction.
170679a3147c7412f4794434b4c2604aa2ba784867774buzbee     *
170689a3147c7412f4794434b4c2604aa2ba784867774buzbee     * On entry:
170699a3147c7412f4794434b4c2604aa2ba784867774buzbee     *     r10: &dvmDex->pResFields[field]
170709a3147c7412f4794434b4c2604aa2ba784867774buzbee     *     r0:  field pointer (must preserve)
170719a3147c7412f4794434b4c2604aa2ba784867774buzbee     */
170729a3147c7412f4794434b4c2604aa2ba784867774buzbeecommon_verifyField:
17073389e258a5b9b2afb7bfaee3344c615d3310fae4ebuzbee    ldrh    r3, [rSELF, #offThread_subMode]  @ r3 <- submode byte
170749a3147c7412f4794434b4c2604aa2ba784867774buzbee    ands    r3, #kSubModeJitTraceBuild
170759a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxeq    lr                          @ Not building trace, continue
170769a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     r1, [r10]                   @ r1<- reload resolved StaticField ptr
170779a3147c7412f4794434b4c2604aa2ba784867774buzbee    cmp     r1, #0                      @ resolution complete?
170789a3147c7412f4794434b4c2604aa2ba784867774buzbee    bxne    lr                          @ yes, continue
170799a3147c7412f4794434b4c2604aa2ba784867774buzbee    stmfd   sp!, {r0-r2,lr}             @ save regs
170809a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r0, rSELF
170819a3147c7412f4794434b4c2604aa2ba784867774buzbee    mov     r1, rPC
170829a3147c7412f4794434b4c2604aa2ba784867774buzbee    bl      dvmJitEndTraceSelect        @ (self,pc) end trace before this inst
170839a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldmfd   sp!, {r0-r2, lr}
170849a3147c7412f4794434b4c2604aa2ba784867774buzbee    bx      lr                          @ return
170859a3147c7412f4794434b4c2604aa2ba784867774buzbee#endif
17086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * After returning from a "glued" function, pull out the updated
17089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values and start executing at the next instruction.
17090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_resumeAfterGlueCall:
170929f601a917c8878204482c37aec7005054b6776fabuzbee    LOAD_PC_FP_FROM_SELF()              @ pull rPC and rFP out of thread
170939a3147c7412f4794434b4c2604aa2ba784867774buzbee    ldr     rIBASE, [rSELF, #offThread_curHandlerTable]  @ refresh
17094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FETCH_INST()                        @ load rINST from rPC
17095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GET_INST_OPCODE(ip)                 @ extract opcode from rINST
17096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    GOTO_OPCODE(ip)                     @ jump to next instruction
17097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17099d88756df5b4dbc6fd450afd0019a5f64ebe4432dElliott Hughes * Invalid array index. Note that our calling convention is strange; we use r1
17100d88756df5b4dbc6fd450afd0019a5f64ebe4432dElliott Hughes * and r3 because those just happen to be the registers all our callers are
1710147f58250c5177adba475b0b11a36151ac0ce9ab9Dan Bornstein * using. We move r3 before calling the C function, but r1 happens to match.
17102d88756df5b4dbc6fd450afd0019a5f64ebe4432dElliott Hughes * r1: index
17103d88756df5b4dbc6fd450afd0019a5f64ebe4432dElliott Hughes * r3: size
17104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errArrayIndex:
17106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
1710747f58250c5177adba475b0b11a36151ac0ce9ab9Dan Bornstein    mov     r0, r3
1710874501e600dcb5634aa26aee0a3f57f2b45b213f2Dan Bornstein    bl      dvmThrowArrayIndexOutOfBoundsException
17109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
17110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Integer divide or mod by zero.
17113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errDivideByZero:
17115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
1711698f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee    ldr     r0, strDivideByZero
171175dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel0:  add     r0, pc
1711898f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee    bl      dvmThrowArithmeticException
17119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
17120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
171215dfcc78af479937ba8dafceefd9b1931a88dfaafArd BiesheuvelstrDivideByZero:
171225dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrDivideByZero,0b)
171235dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel
17124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Attempt to allocate an array with a negative size.
171268cb0d098d79af61546e275f633325794f4587602buzbee * On entry: length in r1
17127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNegativeArraySize:
17129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
171308cb0d098d79af61546e275f633325794f4587602buzbee    mov     r0, r1                                @ arg0 <- len
171318cb0d098d79af61546e275f633325794f4587602buzbee    bl      dvmThrowNegativeArraySizeException    @ (len)
17132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
17133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Invocation of a non-existent method.
1713698f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee * On entry: method name in r1
17137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNoSuchMethod:
17139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
1714098f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee    mov     r0, r1
1714198f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee    bl      dvmThrowNoSuchMethodError
17142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
17143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We encountered a null object when we weren't expecting one.  We
17146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * export the PC, throw a NullPointerException, and goto the exception
17147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * processing code.
17148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_errNullObject:
17150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    EXPORT_PC()
1715198f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee    mov     r0, #0
1715298f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee    bl      dvmThrowNullPointerException
17153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    b       common_exceptionThrown
17154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For debugging, cause an immediate fault.  The source address will
17157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be in lr (use a bl instruction to jump here).
17158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_abort:
17160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     pc, .LdeadFood
17161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LdeadFood:
17162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .word   0xdeadf00d
17163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out a "we were here", preserving all registers.  (The attempt
17166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to save ip won't work, but we need to save an even number of
17167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * registers for EABI 64-bit stack alignment.)
17168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .macro  SQUEAK num
17170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_squeak\num:
17171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
171725dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    ldr     r0, strSqueak\num
171735dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel0:  add     r0, pc
17174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, #\num
17175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
17176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
17177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
171785dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel
171795dfcc78af479937ba8dafceefd9b1931a88dfaafArd BiesheuvelstrSqueak\num:
171805dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrSqueak,0b)
17181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endm
17182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  0
17184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  1
17185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  2
17186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  3
17187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  4
17188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SQUEAK  5
17189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Spit out the number in r0, preserving registers.
17192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNum:
17194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
17195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0
17196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strSqueak
171975dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel0:  add     r0, pc
17198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
17199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
17200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
17201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
172025dfcc78af479937ba8dafceefd9b1931a88dfaafArd BiesheuvelstrSqueak:
172035dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrSqueak,0b)
172045dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel
17205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print a newline, preserving registers.
17207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printNewline:
17209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
17210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strNewline
172115dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel0:  add     r0, pc
17212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
17213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
17214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
17215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
172165dfcc78af479937ba8dafceefd9b1931a88dfaafArd BiesheuvelstrNewline:
172175dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrNewline,0b)
172185dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel
17219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
17220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Print the 32-bit quantity in r0 as a hex value, preserving registers.
17221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
17222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printHex:
17223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
17224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r1, r0
17225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strPrintHex
172265dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel0:  add     r0, pc
17227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
17228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
17229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
17230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
172315dfcc78af479937ba8dafceefd9b1931a88dfaafArd BiesheuvelstrPrintHex:
172325dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrPrintHex,0b)
172335dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel
17234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print the 64-bit quantity in r0-r1, preserving registers.
17236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printLong:
17238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
17239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r3, r1
17240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    mov     r2, r0
17241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldr     r0, strPrintLong
172425dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel0:  add     r0, pc
17243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      printf
17244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
17245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
17246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
172475dfcc78af479937ba8dafceefd9b1931a88dfaafArd BiesheuvelstrPrintLong:
172485dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel    .word   PCREL_REF(.LstrPrintLong,0b)
172495dfcc78af479937ba8dafceefd9b1931a88dfaafArd Biesheuvel
17250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Print full method info.  Pass the Method* in r0.  Preserves regs.
17252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_printMethod:
17254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
17255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterpPrintMethod
17256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
17257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
17258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Call a C helper function that dumps regs and possibly some
17261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * additional info.  Requires the C function to be compiled in.
17262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .if     0
17264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcommon_dumpRegs:
17265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    stmfd   sp!, {r0, r1, r2, r3, ip, lr}
17266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bl      dvmMterpDumpArmRegs
17267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ldmfd   sp!, {r0, r1, r2, r3, ip, lr}
17268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    bx      lr
17269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .endif
17270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17271d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#if 0
17272d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden/*
17273d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Experiment on VFP mode.
17274d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden *
17275d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * uint32_t setFPSCR(uint32_t val, uint32_t mask)
17276d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden *
17277d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden * Updates the bits specified by "mask", setting them to the values in "val".
17278d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden */
17279d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddensetFPSCR:
17280d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    and     r0, r0, r1                  @ make sure no stray bits are set
17281d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    fmrx    r2, fpscr                   @ get VFP reg
17282d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mvn     r1, r1                      @ bit-invert mask
17283d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    and     r2, r2, r1                  @ clear masked bits
17284d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    orr     r2, r2, r0                  @ set specified bits
17285d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    fmxr    fpscr, r2                   @ set VFP reg
17286d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mov     r0, r2                      @ return new value
17287d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bx      lr
17288d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden
17289d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .align  2
17290d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .global dvmConfigureFP
17291d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    .type   dvmConfigureFP, %function
17292d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFaddendvmConfigureFP:
17293d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    stmfd   sp!, {ip, lr}
17294d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    /* 0x03000000 sets DN/FZ */
17295d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    /* 0x00009f00 clears the six exception enable flags */
17296d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bl      common_squeak0
17297d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    mov     r0, #0x03000000             @ r0<- 0x03000000
17298d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    add     r1, r0, #0x9f00             @ r1<- 0x03009f00
17299d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    bl      setFPSCR
17300d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden    ldmfd   sp!, {ip, pc}
17301d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden#endif
17302d8125c62642bd71df7485a85f787a1c6e2124c48Andy McFadden
17303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Zero-terminated ASCII string data.
17307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
17308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On ARM we have two choices: do like gcc does, and LDR from a .word
17309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * with the address, or use an ADR pseudo-op to get the address
17310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * directly.  ADR saves 4 bytes and an indirection, but it's using a
17311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * PC-relative addressing mode and hence has a limited range, which
17312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * makes it not work well with mergeable string sections.
17313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .section .rodata.str1.4,"aMS",%progbits,1
17315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrBadEntryPoint:
17317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Bad entry point %d\n"
17318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrFilledNewArrayNotImpl:
17319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "filled-new-array only implemented for objects and 'int'"
1732098f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee.LstrDivideByZero:
1732198f3eb12bf2a33c49712e093d5cc2aa713a93aa5buzbee    .asciz  "divide by zero"
17322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrLogTag:
17323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "mterp"
17324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrExceptionNotCaughtLocally:
17325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "Exception %s from %s:%d not caught locally\n"
17326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrNewline:
17328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "\n"
17329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrSqueak:
17330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<%d>"
17331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintHex:
17332291c84f60853d30e1c0d79dd08c5e5164f588e26Dan Bornstein    .asciz  "<%#x>"
17333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.LstrPrintLong:
17334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    .asciz  "<%lld>"
17335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17336